> 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.

So to make it consistent I have to know size of returned value for every 
syscall and for case 3 do {r3 = rv[0]; r2 = rv[1]}.



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to