public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* long long on 32-bit machines
@ 2004-01-28 18:04 H. Peter Anvin
  2004-01-28 19:12 ` Timothy Miller
  2004-01-29 11:02 ` Paul Mackerras
  0 siblings, 2 replies; 8+ messages in thread
From: H. Peter Anvin @ 2004-01-28 18:04 UTC (permalink / raw)
  To: klibc list; +Cc: linux-kernel

Hi all,

Does anyone happen to know if there are *any* 32-bit architectures (on 
which Linux runs) for which the ABI for a "long long" is different from 
passing two "longs" in the appropriate order, i.e. (hi,lo) for bigendian 
or (lo,hi) for littleendian?

I'd like to switch klibc to use the 64-bit file ABI thoughout, but it's 
a considerable porting effort, and I'm trying to figure out how to best 
manage it.

	-hpa

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: long long on 32-bit machines
  2004-01-28 18:04 long long on 32-bit machines H. Peter Anvin
@ 2004-01-28 19:12 ` Timothy Miller
  2004-01-28 19:15   ` David S. Miller
  2004-01-29 11:02 ` Paul Mackerras
  1 sibling, 1 reply; 8+ messages in thread
From: Timothy Miller @ 2004-01-28 19:12 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: klibc list, linux-kernel



H. Peter Anvin wrote:
> Hi all,
> 
> Does anyone happen to know if there are *any* 32-bit architectures (on 
> which Linux runs) for which the ABI for a "long long" is different from 
> passing two "longs" in the appropriate order, i.e. (hi,lo) for bigendian 
> or (lo,hi) for littleendian?
> 
> I'd like to switch klibc to use the 64-bit file ABI thoughout, but it's 
> a considerable porting effort, and I'm trying to figure out how to best 
> manage it.
> 

I don't know how it is for GCC, but when using the Sun compiler, "long 
long" for 32-bit is low-high, while "long long" (or just long) for 
64-bit is high-low.  This has been an annoyance to me.  :)


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: long long on 32-bit machines
  2004-01-28 19:12 ` Timothy Miller
@ 2004-01-28 19:15   ` David S. Miller
  0 siblings, 0 replies; 8+ messages in thread
From: David S. Miller @ 2004-01-28 19:15 UTC (permalink / raw)
  To: Timothy Miller; +Cc: hpa, klibc, linux-kernel

On Wed, 28 Jan 2004 14:12:50 -0500
Timothy Miller <miller@techsource.com> wrote:

> I don't know how it is for GCC, but when using the Sun compiler, "long 
> long" for 32-bit is low-high, while "long long" (or just long) for 
> 64-bit is high-low.  This has been an annoyance to me.  :)

For 64-bit it goes into a single 64-bit register.
And for 32-bit the sequence is high 32-bits low 32-bits.
At least on Sparc.

extern void foo(long long a);
void bar(void)
{
    foo(1);
}
/* gcc -m32 -S -o bar.s bar.c */
bar:
	!#PROLOGUE# 0
	save	%sp, -104, %sp
	!#PROLOGUE# 1
	mov	0, %o0
	mov	1, %o1
	call	foo, 0
	 nop
	nop
	ret
	restore
/* gcc -m64 -S -o bar.s bar.c */
bar:
	!#PROLOGUE# 0
	save	%sp, -192, %sp
	!#PROLOGUE# 1
	mov	1, %o0
	call	foo, 0
	 nop
	nop
	return	%i7+8

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: long long on 32-bit machines
  2004-01-28 18:04 long long on 32-bit machines H. Peter Anvin
  2004-01-28 19:12 ` Timothy Miller
@ 2004-01-29 11:02 ` Paul Mackerras
  2004-01-31  6:08   ` H. Peter Anvin
  1 sibling, 1 reply; 8+ messages in thread
From: Paul Mackerras @ 2004-01-29 11:02 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: klibc list, linux-kernel

H. Peter Anvin writes:

> Does anyone happen to know if there are *any* 32-bit architectures (on 
> which Linux runs) for which the ABI for a "long long" is different from 
> passing two "longs" in the appropriate order, i.e. (hi,lo) for bigendian 
> or (lo,hi) for littleendian?

Are you are talking about passing arguments to a function?  PPC32
passes long long arguments in two registers in the order you would
expect (hi, lo), BUT you have to use an odd/even register pair.  In
other words, if you have a function like this:

	int foo(int a, long long b)

then a will be passed in r3 and b will be passed in r5 and r6, and r4
will be unused.

Regards,
Paul.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: long long on 32-bit machines
  2004-01-29 11:02 ` Paul Mackerras
@ 2004-01-31  6:08   ` H. Peter Anvin
  2004-01-31 12:23     ` [klibc] " Arnd Bergmann
  2004-02-01  0:41     ` Paul Mackerras
  0 siblings, 2 replies; 8+ messages in thread
From: H. Peter Anvin @ 2004-01-31  6:08 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: klibc list, linux-kernel

Paul Mackerras wrote:
> H. Peter Anvin writes:
> 
> 
>>Does anyone happen to know if there are *any* 32-bit architectures (on 
>>which Linux runs) for which the ABI for a "long long" is different from 
>>passing two "longs" in the appropriate order, i.e. (hi,lo) for bigendian 
>>or (lo,hi) for littleendian?
> 
> 
> Are you are talking about passing arguments to a function?  PPC32
> passes long long arguments in two registers in the order you would
> expect (hi, lo), BUT you have to use an odd/even register pair.  In
> other words, if you have a function like this:
> 
> 	int foo(int a, long long b)
> 
> then a will be passed in r3 and b will be passed in r5 and r6, and r4
> will be unused.
> 

Does system calls follow the same convention?

	-hpa

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [klibc] Re: long long on 32-bit machines
  2004-01-31  6:08   ` H. Peter Anvin
@ 2004-01-31 12:23     ` Arnd Bergmann
  2004-01-31 19:41       ` H. Peter Anvin
  2004-02-01  0:41     ` Paul Mackerras
  1 sibling, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2004-01-31 12:23 UTC (permalink / raw)
  To: H. Peter Anvin, Paul Mackerras; +Cc: klibc list, linux-kernel

On Saturday 31 January 2004 07:08, H. Peter Anvin wrote:
> Does system calls follow the same convention?

I have just looked up in glibc what architectures need this kind
of handling and found that there is no easy rule. The good news
is that none of (hppa m68k s390 sparc x86_64 alpha cris i386 sparc64 
arm ia64) are doing this. 

AFAICS, the padding is done for exactly these system calls:

ppc: truncate64, ftruncate64, pread64, pwrite64
mips: truncate64, ftruncate64, pread64, pwrite64
sh: pread64, pwrite64

fadvise64_64 is another story: 
mips does no padding, ppc32 reorders the arguments (int fd, int advise,
off64_t offset, off64_t len) and s390 passes a struct, for the
reason Uli already explained.

	Arnd <><


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [klibc] Re: long long on 32-bit machines
  2004-01-31 12:23     ` [klibc] " Arnd Bergmann
@ 2004-01-31 19:41       ` H. Peter Anvin
  0 siblings, 0 replies; 8+ messages in thread
From: H. Peter Anvin @ 2004-01-31 19:41 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: Paul Mackerras, klibc list, linux-kernel

Arnd Bergmann wrote:
> On Saturday 31 January 2004 07:08, H. Peter Anvin wrote:
> 
>>Does system calls follow the same convention?
> 
> 
> I have just looked up in glibc what architectures need this kind
> of handling and found that there is no easy rule. The good news
> is that none of (hppa m68k s390 sparc x86_64 alpha cris i386 sparc64 
> arm ia64) are doing this. 
> 
> AFAICS, the padding is done for exactly these system calls:
> 
> ppc: truncate64, ftruncate64, pread64, pwrite64
> mips: truncate64, ftruncate64, pread64, pwrite64
> sh: pread64, pwrite64
> 
> fadvise64_64 is another story: 
> mips does no padding, ppc32 reorders the arguments (int fd, int advise,
> off64_t offset, off64_t len) and s390 passes a struct, for the
> reason Uli already explained.
> 

<BARF>

I hate ad hockery :(  Yet more evidence for the need of a formal 
description of the ABI in the kernel.

	-hpa

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: long long on 32-bit machines
  2004-01-31  6:08   ` H. Peter Anvin
  2004-01-31 12:23     ` [klibc] " Arnd Bergmann
@ 2004-02-01  0:41     ` Paul Mackerras
  1 sibling, 0 replies; 8+ messages in thread
From: Paul Mackerras @ 2004-02-01  0:41 UTC (permalink / raw)
  To: H. Peter Anvin; +Cc: klibc list, linux-kernel

H. Peter Anvin writes:

> Does system calls follow the same convention?

Yes.  A system call with a long long argument will be handled by a C
routine in the kernel.  The system call arguments in r3 - r8 are
unchanged by the system call exception entry code and end up being the
arguments to the C routine.

Paul.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2004-02-01  0:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-01-28 18:04 long long on 32-bit machines H. Peter Anvin
2004-01-28 19:12 ` Timothy Miller
2004-01-28 19:15   ` David S. Miller
2004-01-29 11:02 ` Paul Mackerras
2004-01-31  6:08   ` H. Peter Anvin
2004-01-31 12:23     ` [klibc] " Arnd Bergmann
2004-01-31 19:41       ` H. Peter Anvin
2004-02-01  0:41     ` Paul Mackerras

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox