Daemon News Ezine BSD News BSD Mall BSD Support Forum BSD Advocacy BSD Updates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: A question about S/390 port

On 10-Jul-2002 Serguei Tzukanov wrote:
>> td_retval[0] is the low word, and td_retval[1] is the high word, you
>> just need to make sure the values from those two words get returned
>> properly to userland.
> 1) syscall returns 32-bit value:
>       r2 = rv[0];
>       r3 = rv[1];
>       r3 is irrelevant here (ABI: "32-bit values returned in r2")
> 2) syscall returns 64-bit value:
>       MI code uses something like
>       *(int64_t *)rv = xxx, so I have to do
>       r2 = rv[0];
>       r3 = rv[1];
>       ABI says "long long shall be returned with the lower
>       addressed half in r2 and the higher in r3"
> 3) syscall folded into __syscall returns 32-bit value (e.g. mmap):
>       MI code does usual
>       r[0] = xxx;
>       svc (syscall) handler does
>       r2 = rv[0];
>       r3 = rv[1]; /* zeroed before */
>       then mmap wrapper in userspace casts this 64-bit to 32-bit
>       (loads r2 with r3 really) and always gets 0.

Why does the cast from 32 to 64 treat r3 as the lower 32-bits when
a 64-bit return value treats r3 as the upper 32-bits and r2 as the
lower 32-bits?  That is inconsistent and you are going to have
problems with either one or the other.  I also don't understand
exactly what you mean by "syscall folded into __syscall".


John Baldwin <jhb@xxxxxxxxxxx>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to majordomo@xxxxxxxxxxx
with "unsubscribe freebsd-platforms" in the body of the message