From owner-freebsd-hackers Wed Jul 10 9:33:11 2002 Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E823F37B400; Wed, 10 Jul 2002 09:33:07 -0700 (PDT) Received: from domestos.yandex.ru (domestos.yandex.ru [213.180.193.14]) by mx1.FreeBSD.org (Postfix) with ESMTP id CC44E43E09; Wed, 10 Jul 2002 09:33:06 -0700 (PDT) (envelope-from tzukanov@narod.ru) Received: from dial-092.nross.ru ([195.161.59.219]:1152 "EHLO antares" ident: "NO-IDENT-SERVICE[2]" whoson: "tzukanov" TLS-CIPHER: TLS-PEER: ) by mail.yandex.ru with ESMTP id ; Wed, 10 Jul 2002 20:32:52 +0400 Content-Type: text/plain; charset=US-ASCII From: Serguei Tzukanov To: John Baldwin Subject: Re: A question about S/390 port Date: Wed, 10 Jul 2002 20:33:25 +0400 User-Agent: KMail/1.4.1 Cc: freebsd-hackers@freebsd.org, freebsd-platforms@freebsd.org References: In-Reply-To: MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Message-Id: <200207102033.25184.tzukanov@narod.ru> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG > 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