From: Serguei Tzukanov <tzukanov@narod.ru> To: John Baldwin <jhb@FreeBSD.org> Cc: freebsd-hackers@freebsd.org, freebsd-platforms@freebsd.org Subject: Re: A question about S/390 port Message-ID: <200207102033.25184.tzukanov@narod.ru> In-Reply-To: <XFMail.20020710113502.jhb@FreeBSD.org> References: <XFMail.20020710113502.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> 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 majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200207102033.25184.tzukanov>