Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Jul 2002 12:04:41 -0700 (PDT)
From:      Julian Elischer <julian@elischer.org>
To:        Serguei Tzukanov <tzukanov@narod.ru>
Cc:        John Baldwin <jhb@FreeBSD.org>, freebsd-hackers@freebsd.org, freebsd-platforms@freebsd.org
Subject:   Re: A question about S/390 port
Message-ID:  <Pine.BSF.4.21.0207101204110.41638-100000@InterJet.elischer.org>
In-Reply-To: <200207102033.25184.tzukanov@narod.ru>

next in thread | previous in thread | raw e-mail | index | archive | help

OK so I have to ask.. S/390 as in IBM Mainframem S/390?


On Wed, 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.
> 
> 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
> 


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?Pine.BSF.4.21.0207101204110.41638-100000>