19abd608244d8123868d027f616fa928156615d5anjn
29abd608244d8123868d027f616fa928156615d5anjn/*--------------------------------------------------------------------*/
39abd608244d8123868d027f616fa928156615d5anjn/*--- Doing syscalls.                                  m_syscall.c ---*/
49abd608244d8123868d027f616fa928156615d5anjn/*--------------------------------------------------------------------*/
59abd608244d8123868d027f616fa928156615d5anjn
69abd608244d8123868d027f616fa928156615d5anjn/*
79abd608244d8123868d027f616fa928156615d5anjn   This file is part of Valgrind, a dynamic binary instrumentation
89abd608244d8123868d027f616fa928156615d5anjn   framework.
99abd608244d8123868d027f616fa928156615d5anjn
100f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj   Copyright (C) 2000-2013 Julian Seward
119abd608244d8123868d027f616fa928156615d5anjn      jseward@acm.org
129abd608244d8123868d027f616fa928156615d5anjn
139abd608244d8123868d027f616fa928156615d5anjn   This program is free software; you can redistribute it and/or
149abd608244d8123868d027f616fa928156615d5anjn   modify it under the terms of the GNU General Public License as
159abd608244d8123868d027f616fa928156615d5anjn   published by the Free Software Foundation; either version 2 of the
169abd608244d8123868d027f616fa928156615d5anjn   License, or (at your option) any later version.
179abd608244d8123868d027f616fa928156615d5anjn
189abd608244d8123868d027f616fa928156615d5anjn   This program is distributed in the hope that it will be useful, but
199abd608244d8123868d027f616fa928156615d5anjn   WITHOUT ANY WARRANTY; without even the implied warranty of
209abd608244d8123868d027f616fa928156615d5anjn   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
219abd608244d8123868d027f616fa928156615d5anjn   General Public License for more details.
229abd608244d8123868d027f616fa928156615d5anjn
239abd608244d8123868d027f616fa928156615d5anjn   You should have received a copy of the GNU General Public License
249abd608244d8123868d027f616fa928156615d5anjn   along with this program; if not, write to the Free Software
259abd608244d8123868d027f616fa928156615d5anjn   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
269abd608244d8123868d027f616fa928156615d5anjn   02111-1307, USA.
279abd608244d8123868d027f616fa928156615d5anjn
289abd608244d8123868d027f616fa928156615d5anjn   The GNU General Public License is contained in the file COPYING.
299abd608244d8123868d027f616fa928156615d5anjn*/
309abd608244d8123868d027f616fa928156615d5anjn
31c7561b931e249acf3768ead77638545b0ccaa8f1njn#include "pub_core_basics.h"
32f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#include "pub_core_libcassert.h"
334cfea4f9480393ed6799db463b2e0fb8865a1a2fsewardj#include "pub_core_vki.h"
3417edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj#include "pub_core_vkiscnums.h"
359abd608244d8123868d027f616fa928156615d5anjn#include "pub_core_syscall.h"
369abd608244d8123868d027f616fa928156615d5anjn
379abd608244d8123868d027f616fa928156615d5anjn/* ---------------------------------------------------------------------
389abd608244d8123868d027f616fa928156615d5anjn   Building syscall return values.
399abd608244d8123868d027f616fa928156615d5anjn   ------------------------------------------------------------------ */
409abd608244d8123868d027f616fa928156615d5anjn
41cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#if defined(VGO_linux)
42cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
43cda2f0fbda4c4b2644babc830244be8aed95de1dnjn/* Make a SysRes value from a syscall return value.  This is
449abd608244d8123868d027f616fa928156615d5anjn   Linux-specific.
459abd608244d8123868d027f616fa928156615d5anjn
469abd608244d8123868d027f616fa928156615d5anjn   From:
479abd608244d8123868d027f616fa928156615d5anjn   http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/
489abd608244d8123868d027f616fa928156615d5anjn   linux/i386/sysdep.h?
499abd608244d8123868d027f616fa928156615d5anjn   rev=1.28&content-type=text/x-cvsweb-markup&cvsroot=glibc
509abd608244d8123868d027f616fa928156615d5anjn
519abd608244d8123868d027f616fa928156615d5anjn   Linux uses a negative return value to indicate syscall errors,
529abd608244d8123868d027f616fa928156615d5anjn   unlike most Unices, which use the condition codes' carry flag.
539abd608244d8123868d027f616fa928156615d5anjn
549abd608244d8123868d027f616fa928156615d5anjn   Since version 2.1 the return value of a system call might be
559abd608244d8123868d027f616fa928156615d5anjn   negative even if the call succeeded.  E.g., the 'lseek' system call
569abd608244d8123868d027f616fa928156615d5anjn   might return a large offset.  Therefore we must not anymore test
579abd608244d8123868d027f616fa928156615d5anjn   for < 0, but test for a real error by making sure the value in %eax
589abd608244d8123868d027f616fa928156615d5anjn   is a real error number.  Linus said he will make sure the no
599abd608244d8123868d027f616fa928156615d5anjn   syscall returns a value in -1 .. -4095 as a valid result so we can
609abd608244d8123868d027f616fa928156615d5anjn   safely test with -4095.
619abd608244d8123868d027f616fa928156615d5anjn*/
62cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
63cda2f0fbda4c4b2644babc830244be8aed95de1dnjnSysRes VG_(mk_SysRes_x86_linux) ( Int val ) {
649abd608244d8123868d027f616fa928156615d5anjn   SysRes res;
65cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._isError = val >= -4095 && val <= -1;
66cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   if (res._isError) {
67cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      res._val = (UInt)(-val);
6817edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj   } else {
69cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      res._val = (UInt)val;
7017edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj   }
7185665ca6fa29dd64754dabe50eb98f25896e752acerion   return res;
7285665ca6fa29dd64754dabe50eb98f25896e752acerion}
7385665ca6fa29dd64754dabe50eb98f25896e752acerion
7485665ca6fa29dd64754dabe50eb98f25896e752acerion/* Similarly .. */
75cda2f0fbda4c4b2644babc830244be8aed95de1dnjnSysRes VG_(mk_SysRes_amd64_linux) ( Long val ) {
7685665ca6fa29dd64754dabe50eb98f25896e752acerion   SysRes res;
77cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._isError = val >= -4095 && val <= -1;
78cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   if (res._isError) {
79cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      res._val = (ULong)(-val);
8017edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj   } else {
81cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      res._val = (ULong)val;
8217edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj   }
839abd608244d8123868d027f616fa928156615d5anjn   return res;
849abd608244d8123868d027f616fa928156615d5anjn}
859abd608244d8123868d027f616fa928156615d5anjn
86112711afefcfcd43680c7c4aa8d38ef180e8811esewardjSysRes VG_(mk_SysRes_tilegx_linux) ( Long val ) {
87112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  SysRes res;
88112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  res._isError = val >= -4095 && val <= -1;
89112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  if (res._isError) {
90112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    res._val = (ULong)(-val);
91112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  } else {
92112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    res._val = (ULong)val;
93112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  }
94112711afefcfcd43680c7c4aa8d38ef180e8811esewardj  return res;
95112711afefcfcd43680c7c4aa8d38ef180e8811esewardj}
96112711afefcfcd43680c7c4aa8d38ef180e8811esewardj
9717edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj/* PPC uses the CR7.SO bit to flag an error (CR0 in IBM-speak) */
9839a7c1db997e3653f37258a1b313bfffbb8184edsewardj/* Note this must be in the bottom bit of the second arg */
9939a7c1db997e3653f37258a1b313bfffbb8184edsewardjSysRes VG_(mk_SysRes_ppc32_linux) ( UInt val, UInt cr0so ) {
10085665ca6fa29dd64754dabe50eb98f25896e752acerion   SysRes res;
101cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._isError = (cr0so & 1) != 0;
102cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._val     = val;
10385665ca6fa29dd64754dabe50eb98f25896e752acerion   return res;
10485665ca6fa29dd64754dabe50eb98f25896e752acerion}
10585665ca6fa29dd64754dabe50eb98f25896e752acerion
10638a88b7566d8ac5e09e207e16db3d7aabb1900c8sewardj/* As per ppc32 version, cr0.so must be in l.s.b. of 2nd arg */
10738a88b7566d8ac5e09e207e16db3d7aabb1900c8sewardjSysRes VG_(mk_SysRes_ppc64_linux) ( ULong val, ULong cr0so ) {
1082c48c7b0a453d32375a4df17e153011b797ef28csewardj   SysRes res;
109cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._isError = (cr0so & 1) != 0;
110cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   res._val     = val;
1112c48c7b0a453d32375a4df17e153011b797ef28csewardj   return res;
1122c48c7b0a453d32375a4df17e153011b797ef28csewardj}
1132c48c7b0a453d32375a4df17e153011b797ef28csewardj
114b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjSysRes VG_(mk_SysRes_s390x_linux) ( Long val ) {
115b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   SysRes res;
116b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   res._isError = val >= -4095 && val <= -1;
117b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   if (res._isError) {
118b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      res._val = -val;
119b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } else {
120b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj      res._val = val;
121b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   }
122b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   return res;
123b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
124b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
12559570ffbe31930ab4d678754daaeec0715117a3dsewardjSysRes VG_(mk_SysRes_arm_linux) ( Int val ) {
12659570ffbe31930ab4d678754daaeec0715117a3dsewardj   SysRes res;
12759570ffbe31930ab4d678754daaeec0715117a3dsewardj   res._isError = val >= -4095 && val <= -1;
12859570ffbe31930ab4d678754daaeec0715117a3dsewardj   if (res._isError) {
12959570ffbe31930ab4d678754daaeec0715117a3dsewardj      res._val = (UInt)(-val);
13059570ffbe31930ab4d678754daaeec0715117a3dsewardj   } else {
13159570ffbe31930ab4d678754daaeec0715117a3dsewardj      res._val = (UInt)val;
13259570ffbe31930ab4d678754daaeec0715117a3dsewardj   }
13359570ffbe31930ab4d678754daaeec0715117a3dsewardj   return res;
13459570ffbe31930ab4d678754daaeec0715117a3dsewardj}
13559570ffbe31930ab4d678754daaeec0715117a3dsewardj
136f0c1250e324f6684757c6a15545366447ef1d64fsewardjSysRes VG_(mk_SysRes_arm64_linux) ( Long val ) {
137f0c1250e324f6684757c6a15545366447ef1d64fsewardj   SysRes res;
138f0c1250e324f6684757c6a15545366447ef1d64fsewardj   res._isError = val >= -4095 && val <= -1;
139f0c1250e324f6684757c6a15545366447ef1d64fsewardj   if (res._isError) {
140f0c1250e324f6684757c6a15545366447ef1d64fsewardj      res._val = (ULong)(-val);
141f0c1250e324f6684757c6a15545366447ef1d64fsewardj   } else {
142f0c1250e324f6684757c6a15545366447ef1d64fsewardj      res._val = (ULong)val;
143f0c1250e324f6684757c6a15545366447ef1d64fsewardj   }
144f0c1250e324f6684757c6a15545366447ef1d64fsewardj   return res;
145f0c1250e324f6684757c6a15545366447ef1d64fsewardj}
146f0c1250e324f6684757c6a15545366447ef1d64fsewardj
1479c120ae69abbc7cc57422ae9d973129c4d053099florian#if defined(VGA_mips64) || defined(VGA_mips32)
1485db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* MIPS uses a3 != 0 to flag an error */
1495db15403e889d4db339b342bc2a824ef0bfaa654sewardjSysRes VG_(mk_SysRes_mips32_linux) ( UWord v0, UWord v1, UWord a3 ) {
1505db15403e889d4db339b342bc2a824ef0bfaa654sewardj   SysRes res;
1515db15403e889d4db339b342bc2a824ef0bfaa654sewardj   res._isError = (a3 != (UWord)0);
1525db15403e889d4db339b342bc2a824ef0bfaa654sewardj   res._val     = v0;
1535db15403e889d4db339b342bc2a824ef0bfaa654sewardj   res._valEx   = v1;
1545db15403e889d4db339b342bc2a824ef0bfaa654sewardj   return res;
1555db15403e889d4db339b342bc2a824ef0bfaa654sewardj}
1565db15403e889d4db339b342bc2a824ef0bfaa654sewardj
1574df0bfc0614379192c780c944415dc420d9cfe8epetarj/* MIPS uses a3 != 0 to flag an error */
1584df0bfc0614379192c780c944415dc420d9cfe8epetarjSysRes VG_(mk_SysRes_mips64_linux) ( ULong v0, ULong v1, ULong a3 ) {
1594df0bfc0614379192c780c944415dc420d9cfe8epetarj   SysRes res;
1604df0bfc0614379192c780c944415dc420d9cfe8epetarj   res._isError = (a3 != (ULong)0);
1614df0bfc0614379192c780c944415dc420d9cfe8epetarj   res._val     = v0;
1624df0bfc0614379192c780c944415dc420d9cfe8epetarj   res._valEx   = v1;
1634df0bfc0614379192c780c944415dc420d9cfe8epetarj   return res;
1644df0bfc0614379192c780c944415dc420d9cfe8epetarj}
1659c120ae69abbc7cc57422ae9d973129c4d053099florian#endif
1664df0bfc0614379192c780c944415dc420d9cfe8epetarj
167cda2f0fbda4c4b2644babc830244be8aed95de1dnjn/* Generic constructors. */
168cda2f0fbda4c4b2644babc830244be8aed95de1dnjnSysRes VG_(mk_SysRes_Error) ( UWord err ) {
169cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   SysRes r;
1709c120ae69abbc7cc57422ae9d973129c4d053099florian#if defined(VGA_mips64) || defined(VGA_mips32)
1719c120ae69abbc7cc57422ae9d973129c4d053099florian   r._valEx   = 0;
1729c120ae69abbc7cc57422ae9d973129c4d053099florian#endif
173cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   r._isError = True;
174cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   r._val     = err;
175cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return r;
176cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
177cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
178cda2f0fbda4c4b2644babc830244be8aed95de1dnjnSysRes VG_(mk_SysRes_Success) ( UWord res ) {
179cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   SysRes r;
1809c120ae69abbc7cc57422ae9d973129c4d053099florian#if defined(VGA_mips64) || defined(VGA_mips32)
1819c120ae69abbc7cc57422ae9d973129c4d053099florian   r._valEx   = 0;
1829c120ae69abbc7cc57422ae9d973129c4d053099florian#endif
183cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   r._isError = False;
184cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   r._val     = res;
185cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return r;
186cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
187cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
188cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
189f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGO_darwin)
190f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
191f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* Darwin: Some syscalls return a double-word result. */
192f76d27a697a7b0bf3b84490baf60623fc96a23afnjnSysRes VG_(mk_SysRes_x86_darwin) ( UChar scclass, Bool isErr,
193f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                                   UInt wHI, UInt wLO )
194f76d27a697a7b0bf3b84490baf60623fc96a23afnjn{
195f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   SysRes res;
196f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._wHI  = 0;
197f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._wLO  = 0;
198f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._mode = 0; /* invalid */
199f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   vg_assert(isErr == False || isErr == True);
200f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   vg_assert(sizeof(UWord) == sizeof(UInt));
201f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (scclass) {
202f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_UNIX:
203f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
204f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wHI  = wHI;
205f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = isErr ? SysRes_UNIX_ERR : SysRes_UNIX_OK;
206f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
207f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MACH:
208f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(!isErr);
209f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(wHI == 0);
210f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
211f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = SysRes_MACH;
212f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
213f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MDEP:
214f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(!isErr);
215f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(wHI == 0);
216f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
217f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = SysRes_MDEP;
218f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
219f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      default:
220f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(0);
221f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
222f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return res;
223f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
224f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
225f76d27a697a7b0bf3b84490baf60623fc96a23afnjnSysRes VG_(mk_SysRes_amd64_darwin) ( UChar scclass, Bool isErr,
226f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                                     ULong wHI, ULong wLO )
227f76d27a697a7b0bf3b84490baf60623fc96a23afnjn{
228f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   SysRes res;
229f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._wHI  = 0;
230f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._wLO  = 0;
231f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   res._mode = 0; /* invalid */
232f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   vg_assert(isErr == False || isErr == True);
233f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   vg_assert(sizeof(UWord) == sizeof(ULong));
234f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (scclass) {
235f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_UNIX:
236f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
237f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wHI  = wHI;
238f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = isErr ? SysRes_UNIX_ERR : SysRes_UNIX_OK;
239f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
240f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MACH:
241f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(!isErr);
242f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(wHI == 0);
243f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
244f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = SysRes_MACH;
245f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
246f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MDEP:
247f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(!isErr);
248f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(wHI == 0);
249f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._wLO  = wLO;
250f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         res._mode = SysRes_MDEP;
251f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
252f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      default:
253f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(0);
254f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
255f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return res;
256f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
257f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
258f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* Generic constructors.  We assume (without checking if this makes
259f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   any sense, from the caller's point of view) that these are for the
260f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   UNIX style of syscall. */
261f76d27a697a7b0bf3b84490baf60623fc96a23afnjnSysRes VG_(mk_SysRes_Error) ( UWord err ) {
262f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   SysRes r;
263f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._wHI  = 0;
264f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._wLO  = err;
265f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._mode = SysRes_UNIX_ERR;
266f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return r;
267f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
268f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
269f76d27a697a7b0bf3b84490baf60623fc96a23afnjnSysRes VG_(mk_SysRes_Success) ( UWord res ) {
270f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   SysRes r;
271f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._wHI  = 0;
272f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._wLO  = res;
273f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   r._mode = SysRes_UNIX_OK;
274f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return r;
275f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
276f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
277f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
278cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#else
279cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  error "Unknown OS"
280cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#endif
281cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
282cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
2839abd608244d8123868d027f616fa928156615d5anjn/* ---------------------------------------------------------------------
284cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   VG_(do_syscall): A function for doing syscalls.
2859abd608244d8123868d027f616fa928156615d5anjn   ------------------------------------------------------------------ */
2869abd608244d8123868d027f616fa928156615d5anjn
2879abd608244d8123868d027f616fa928156615d5anjn#if defined(VGP_x86_linux)
2889abd608244d8123868d027f616fa928156615d5anjn/* Incoming args (syscall number + up to 6 args) come on the stack.
2899abd608244d8123868d027f616fa928156615d5anjn   (ie. the C calling convention).
2909abd608244d8123868d027f616fa928156615d5anjn
2919abd608244d8123868d027f616fa928156615d5anjn   The syscall number goes in %eax.  The args are passed to the syscall in
2929abd608244d8123868d027f616fa928156615d5anjn   the regs %ebx, %ecx, %edx, %esi, %edi, %ebp, ie. the kernel's syscall
2939abd608244d8123868d027f616fa928156615d5anjn   calling convention.
2949abd608244d8123868d027f616fa928156615d5anjn
2959abd608244d8123868d027f616fa928156615d5anjn   %eax gets the return value.  Not sure which registers the kernel
2969abd608244d8123868d027f616fa928156615d5anjn   clobbers, so we preserve all the callee-save regs (%esi, %edi, %ebx,
2979abd608244d8123868d027f616fa928156615d5anjn   %ebp).
2989abd608244d8123868d027f616fa928156615d5anjn*/
29903d8aa8639b211357b678fdedad19911ce2ebb85sewardjextern UWord do_syscall_WRK (
30085665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord syscall_no,
30185665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a1, UWord a2, UWord a3,
30285665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a4, UWord a5, UWord a6
30385665ca6fa29dd64754dabe50eb98f25896e752acerion       );
3049abd608244d8123868d027f616fa928156615d5anjnasm(
305d9fc382d8dcfb8da3602e0feef3155e3c98deba2sewardj".text\n"
3069fdca565049e35998c06d96ca97beb84d9c7f39dphilippe".globl do_syscall_WRK\n"
3079abd608244d8123868d027f616fa928156615d5anjn"do_syscall_WRK:\n"
3084ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_startproc\n"
3099abd608244d8123868d027f616fa928156615d5anjn"	push	%esi\n"
3104ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset 4\n"
3112d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_offset %esi, -8\n"
3129abd608244d8123868d027f616fa928156615d5anjn"	push	%edi\n"
3134ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset 4\n"
3142d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_offset %edi, -12\n"
3159abd608244d8123868d027f616fa928156615d5anjn"	push	%ebx\n"
3164ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset 4\n"
3172d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_offset %ebx, -16\n"
3189abd608244d8123868d027f616fa928156615d5anjn"	push	%ebp\n"
3194ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset 4\n"
3202d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_offset %ebp, -20\n"
3219abd608244d8123868d027f616fa928156615d5anjn"	movl	16+ 4(%esp),%eax\n"
3229abd608244d8123868d027f616fa928156615d5anjn"	movl	16+ 8(%esp),%ebx\n"
3239abd608244d8123868d027f616fa928156615d5anjn"	movl	16+12(%esp),%ecx\n"
3249abd608244d8123868d027f616fa928156615d5anjn"	movl	16+16(%esp),%edx\n"
3259abd608244d8123868d027f616fa928156615d5anjn"	movl	16+20(%esp),%esi\n"
3269abd608244d8123868d027f616fa928156615d5anjn"	movl	16+24(%esp),%edi\n"
3279abd608244d8123868d027f616fa928156615d5anjn"	movl	16+28(%esp),%ebp\n"
3289abd608244d8123868d027f616fa928156615d5anjn"	int	$0x80\n"
3299abd608244d8123868d027f616fa928156615d5anjn"	popl	%ebp\n"
3304ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset -4\n"
3312d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_restore %ebp\n"
3329abd608244d8123868d027f616fa928156615d5anjn"	popl	%ebx\n"
3334ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset -4\n"
3342d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_restore %ebx\n"
3359abd608244d8123868d027f616fa928156615d5anjn"	popl	%edi\n"
3364ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset -4\n"
3372d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_restore %edi\n"
3389abd608244d8123868d027f616fa928156615d5anjn"	popl	%esi\n"
3394ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_adjust_cfa_offset -4\n"
3402d616330ecf6a1771461bacb134f5a59ac233525philippe"	.cfi_restore %esi\n"
3419abd608244d8123868d027f616fa928156615d5anjn"	ret\n"
3424ed95fcadfb5923f09226a83b9750373c30f945ephilippe"	.cfi_endproc\n"
3432fedc648b91676a18d736dcb641b6dae6ab32b7asewardj".previous\n"
3449abd608244d8123868d027f616fa928156615d5anjn);
3452c48c7b0a453d32375a4df17e153011b797ef28csewardj
3469abd608244d8123868d027f616fa928156615d5anjn#elif defined(VGP_amd64_linux)
3479abd608244d8123868d027f616fa928156615d5anjn/* Incoming args (syscall number + up to 6 args) come in %rdi, %rsi,
3489abd608244d8123868d027f616fa928156615d5anjn   %rdx, %rcx, %r8, %r9, and the last one on the stack (ie. the C
3499abd608244d8123868d027f616fa928156615d5anjn   calling convention).
3509abd608244d8123868d027f616fa928156615d5anjn
3519abd608244d8123868d027f616fa928156615d5anjn   The syscall number goes in %rax.  The args are passed to the syscall in
3529abd608244d8123868d027f616fa928156615d5anjn   the regs %rdi, %rsi, %rdx, %r10, %r8, %r9 (yes, really %r10, not %rcx),
3539abd608244d8123868d027f616fa928156615d5anjn   ie. the kernel's syscall calling convention.
3549abd608244d8123868d027f616fa928156615d5anjn
3559abd608244d8123868d027f616fa928156615d5anjn   %rax gets the return value.  %rcx and %r11 are clobbered by the syscall;
3569abd608244d8123868d027f616fa928156615d5anjn   no matter, they are caller-save (the syscall clobbers no callee-save
3579abd608244d8123868d027f616fa928156615d5anjn   regs, so we don't have to do any register saving/restoring).
3589abd608244d8123868d027f616fa928156615d5anjn*/
35903d8aa8639b211357b678fdedad19911ce2ebb85sewardjextern UWord do_syscall_WRK (
36085665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord syscall_no,
36185665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a1, UWord a2, UWord a3,
36285665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a4, UWord a5, UWord a6
36385665ca6fa29dd64754dabe50eb98f25896e752acerion       );
3649abd608244d8123868d027f616fa928156615d5anjnasm(
365d9fc382d8dcfb8da3602e0feef3155e3c98deba2sewardj".text\n"
3669fdca565049e35998c06d96ca97beb84d9c7f39dphilippe".globl do_syscall_WRK\n"
3679abd608244d8123868d027f616fa928156615d5anjn"do_syscall_WRK:\n"
3689abd608244d8123868d027f616fa928156615d5anjn        /* Convert function calling convention --> syscall calling
3699abd608244d8123868d027f616fa928156615d5anjn           convention */
3709abd608244d8123868d027f616fa928156615d5anjn"	movq	%rdi, %rax\n"
3719abd608244d8123868d027f616fa928156615d5anjn"	movq	%rsi, %rdi\n"
3729abd608244d8123868d027f616fa928156615d5anjn"	movq	%rdx, %rsi\n"
3739abd608244d8123868d027f616fa928156615d5anjn"	movq	%rcx, %rdx\n"
3749abd608244d8123868d027f616fa928156615d5anjn"	movq	%r8,  %r10\n"
3759abd608244d8123868d027f616fa928156615d5anjn"	movq	%r9,  %r8\n"
3769abd608244d8123868d027f616fa928156615d5anjn"	movq    8(%rsp), %r9\n"	 /* last arg from stack */
3779abd608244d8123868d027f616fa928156615d5anjn"	syscall\n"
3789abd608244d8123868d027f616fa928156615d5anjn"	ret\n"
3792fedc648b91676a18d736dcb641b6dae6ab32b7asewardj".previous\n"
3809abd608244d8123868d027f616fa928156615d5anjn);
3812c48c7b0a453d32375a4df17e153011b797ef28csewardj
38285665ca6fa29dd64754dabe50eb98f25896e752acerion#elif defined(VGP_ppc32_linux)
38339a7c1db997e3653f37258a1b313bfffbb8184edsewardj/* Incoming args (syscall number + up to 6 args) come in %r3:%r9.
38485665ca6fa29dd64754dabe50eb98f25896e752acerion
38585665ca6fa29dd64754dabe50eb98f25896e752acerion   The syscall number goes in %r0.  The args are passed to the syscall in
38685665ca6fa29dd64754dabe50eb98f25896e752acerion   the regs %r3:%r8, i.e. the kernel's syscall calling convention.
38785665ca6fa29dd64754dabe50eb98f25896e752acerion
38885665ca6fa29dd64754dabe50eb98f25896e752acerion   The %cr0.so bit flags an error.
38939a7c1db997e3653f37258a1b313bfffbb8184edsewardj   We return the syscall return value in %r3, and the %cr0.so in
39039a7c1db997e3653f37258a1b313bfffbb8184edsewardj   the lowest bit of %r4.
39185665ca6fa29dd64754dabe50eb98f25896e752acerion   We return a ULong, of which %r3 is the high word, and %r4 the low.
39285665ca6fa29dd64754dabe50eb98f25896e752acerion   No callee-save regs are clobbered, so no saving/restoring is needed.
39385665ca6fa29dd64754dabe50eb98f25896e752acerion*/
39403d8aa8639b211357b678fdedad19911ce2ebb85sewardjextern ULong do_syscall_WRK (
39585665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord syscall_no,
39685665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a1, UWord a2, UWord a3,
39785665ca6fa29dd64754dabe50eb98f25896e752acerion          UWord a4, UWord a5, UWord a6
39885665ca6fa29dd64754dabe50eb98f25896e752acerion       );
39985665ca6fa29dd64754dabe50eb98f25896e752acerionasm(
400d9fc382d8dcfb8da3602e0feef3155e3c98deba2sewardj".text\n"
4019fdca565049e35998c06d96ca97beb84d9c7f39dphilippe".globl do_syscall_WRK\n"
40285665ca6fa29dd64754dabe50eb98f25896e752acerion"do_syscall_WRK:\n"
40385665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      0,3\n"
40485665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      3,4\n"
40585665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      4,5\n"
40685665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      5,6\n"
40785665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      6,7\n"
40885665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      7,8\n"
40985665ca6fa29dd64754dabe50eb98f25896e752acerion"        mr      8,9\n"
41085665ca6fa29dd64754dabe50eb98f25896e752acerion"        sc\n"                  /* syscall: sets %cr0.so on error         */
41185665ca6fa29dd64754dabe50eb98f25896e752acerion"        mfcr    4\n"           /* %cr -> low word of return var          */
41285665ca6fa29dd64754dabe50eb98f25896e752acerion"        rlwinm  4,4,4,31,31\n" /* rotate flag bit so to lsb, and mask it */
41385665ca6fa29dd64754dabe50eb98f25896e752acerion"        blr\n"                 /* and return                             */
4142fedc648b91676a18d736dcb641b6dae6ab32b7asewardj".previous\n"
41585665ca6fa29dd64754dabe50eb98f25896e752acerion);
4162c48c7b0a453d32375a4df17e153011b797ef28csewardj
417cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#elif defined(VGP_ppc64be_linux)
4182c48c7b0a453d32375a4df17e153011b797ef28csewardj/* Due to the need to return 65 bits of result, this is completely
4192c48c7b0a453d32375a4df17e153011b797ef28csewardj   different from the ppc32 case.  The single arg register points to a
4202c48c7b0a453d32375a4df17e153011b797ef28csewardj   7-word block containing the syscall # and the 6 args.  The syscall
4212c48c7b0a453d32375a4df17e153011b797ef28csewardj   result proper is put in [0] of the block, and %cr0.so is in the
422cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   bottom bit of [1]. */
4232c48c7b0a453d32375a4df17e153011b797ef28csewardjextern void do_syscall_WRK ( ULong* argblock );
4242c48c7b0a453d32375a4df17e153011b797ef28csewardjasm(
425297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".align   2\n"
426297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".globl   do_syscall_WRK\n"
427297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".section \".opd\",\"aw\"\n"
428297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".align   3\n"
429297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion"do_syscall_WRK:\n"
430297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".quad    .do_syscall_WRK,.TOC.@tocbase,0\n"
431297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".previous\n"
432297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".type    .do_syscall_WRK,@function\n"
433297c88fbff9fd02b8f8429b8b4d34cfc48f81eeecerion".globl   .do_syscall_WRK\n"
4342c48c7b0a453d32375a4df17e153011b797ef28csewardj".do_syscall_WRK:\n"
4352c48c7b0a453d32375a4df17e153011b797ef28csewardj"        std  3,-16(1)\n"  /* stash arg */
4362c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   8, 48(3)\n"  /* sc arg 6 */
4372c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   7, 40(3)\n"  /* sc arg 5 */
4382c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   6, 32(3)\n"  /* sc arg 4 */
4392c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   5, 24(3)\n"  /* sc arg 3 */
4402c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   4, 16(3)\n"  /* sc arg 2 */
4412c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   0,  0(3)\n"  /* sc number */
4422c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   3,  8(3)\n"  /* sc arg 1 */
4432c48c7b0a453d32375a4df17e153011b797ef28csewardj"        sc\n"             /* result in r3 and cr0.so */
4442c48c7b0a453d32375a4df17e153011b797ef28csewardj"        ld   5,-16(1)\n"  /* reacquire argblock ptr (r5 is caller-save) */
4452c48c7b0a453d32375a4df17e153011b797ef28csewardj"        std  3,0(5)\n"    /* argblock[0] = r3 */
4462c48c7b0a453d32375a4df17e153011b797ef28csewardj"        mfcr 3\n"
4472c48c7b0a453d32375a4df17e153011b797ef28csewardj"        srwi 3,3,28\n"
4482c48c7b0a453d32375a4df17e153011b797ef28csewardj"        andi. 3,3,1\n"
4492c48c7b0a453d32375a4df17e153011b797ef28csewardj"        std  3,8(5)\n"    /* argblock[1] = cr0.s0 & 1 */
4502c48c7b0a453d32375a4df17e153011b797ef28csewardj"        blr\n"
4512c48c7b0a453d32375a4df17e153011b797ef28csewardj);
45217edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj
453582d58245637ab05272d89fb94b12fd0f18fa0f8carll#elif defined(VGP_ppc64le_linux)
454582d58245637ab05272d89fb94b12fd0f18fa0f8carll/* Due to the need to return 65 bits of result, this is completely
455582d58245637ab05272d89fb94b12fd0f18fa0f8carll   different from the ppc32 case.  The single arg register points to a
456582d58245637ab05272d89fb94b12fd0f18fa0f8carll   7-word block containing the syscall # and the 6 args.  The syscall
457582d58245637ab05272d89fb94b12fd0f18fa0f8carll   result proper is put in [0] of the block, and %cr0.so is in the
458582d58245637ab05272d89fb94b12fd0f18fa0f8carll   bottom bit of [1]. */
459582d58245637ab05272d89fb94b12fd0f18fa0f8carllextern void do_syscall_WRK ( ULong* argblock );
460582d58245637ab05272d89fb94b12fd0f18fa0f8carll/* Little Endian supports ELF version 2.  In the future, it may support
461582d58245637ab05272d89fb94b12fd0f18fa0f8carll * other versions as well.
462582d58245637ab05272d89fb94b12fd0f18fa0f8carll */
463582d58245637ab05272d89fb94b12fd0f18fa0f8carllasm(
464582d58245637ab05272d89fb94b12fd0f18fa0f8carll".align   2\n"
465582d58245637ab05272d89fb94b12fd0f18fa0f8carll".globl   do_syscall_WRK\n"
466582d58245637ab05272d89fb94b12fd0f18fa0f8carll".type    do_syscall_WRK,@function\n"
467582d58245637ab05272d89fb94b12fd0f18fa0f8carll"do_syscall_WRK:\n"
468582d58245637ab05272d89fb94b12fd0f18fa0f8carll"#if  _CALL_ELF == 2"               "\n"
469582d58245637ab05272d89fb94b12fd0f18fa0f8carll"0:      addis        2,12,.TOC.-0b@ha\n"
470582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        addi         2,2,.TOC.-0b@l\n"
471582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        .localentry do_syscall_WRK, .-do_syscall_WRK\n"
472582d58245637ab05272d89fb94b12fd0f18fa0f8carll"#endif"                            "\n"
473582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        std  3,-16(1)\n"  /* stash arg */
474582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   8, 48(3)\n"  /* sc arg 6 */
475582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   7, 40(3)\n"  /* sc arg 5 */
476582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   6, 32(3)\n"  /* sc arg 4 */
477582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   5, 24(3)\n"  /* sc arg 3 */
478582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   4, 16(3)\n"  /* sc arg 2 */
479582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   0,  0(3)\n"  /* sc number */
480582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   3,  8(3)\n"  /* sc arg 1 */
481582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        sc\n"             /* result in r3 and cr0.so */
482582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        ld   5,-16(1)\n"  /* reacquire argblock ptr (r5 is caller-save) */
483582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        std  3,0(5)\n"    /* argblock[0] = r3 */
484582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        mfcr 3\n"
485582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        srwi 3,3,28\n"
486582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        andi. 3,3,1\n"
487582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        std  3,8(5)\n"    /* argblock[1] = cr0.s0 & 1 */
488582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        blr\n"
489582d58245637ab05272d89fb94b12fd0f18fa0f8carll"        .size do_syscall_WRK, .-do_syscall_WRK\n"
490582d58245637ab05272d89fb94b12fd0f18fa0f8carll);
491582d58245637ab05272d89fb94b12fd0f18fa0f8carll
49259570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(VGP_arm_linux)
49359570ffbe31930ab4d678754daaeec0715117a3dsewardj/* I think the conventions are:
49459570ffbe31930ab4d678754daaeec0715117a3dsewardj   args  in r0 r1 r2 r3 r4 r5
49559570ffbe31930ab4d678754daaeec0715117a3dsewardj   sysno in r7
49659570ffbe31930ab4d678754daaeec0715117a3dsewardj   return value in r0, w/ same conventions as x86-linux, viz r0 in
49759570ffbe31930ab4d678754daaeec0715117a3dsewardj   -4096 .. -1 is an error value.  All other values are success
49859570ffbe31930ab4d678754daaeec0715117a3dsewardj   values.
49959570ffbe31930ab4d678754daaeec0715117a3dsewardj*/
50059570ffbe31930ab4d678754daaeec0715117a3dsewardjextern UWord do_syscall_WRK (
50159570ffbe31930ab4d678754daaeec0715117a3dsewardj          UWord a1, UWord a2, UWord a3,
50259570ffbe31930ab4d678754daaeec0715117a3dsewardj          UWord a4, UWord a5, UWord a6,
50359570ffbe31930ab4d678754daaeec0715117a3dsewardj          UWord syscall_no
50459570ffbe31930ab4d678754daaeec0715117a3dsewardj       );
50559570ffbe31930ab4d678754daaeec0715117a3dsewardjasm(
50659570ffbe31930ab4d678754daaeec0715117a3dsewardj".text\n"
5079fdca565049e35998c06d96ca97beb84d9c7f39dphilippe".globl do_syscall_WRK\n"
50859570ffbe31930ab4d678754daaeec0715117a3dsewardj"do_syscall_WRK:\n"
50959570ffbe31930ab4d678754daaeec0715117a3dsewardj"         push    {r4, r5, r7}\n"
51059570ffbe31930ab4d678754daaeec0715117a3dsewardj"         ldr     r4, [sp, #12]\n"
51159570ffbe31930ab4d678754daaeec0715117a3dsewardj"         ldr     r5, [sp, #16]\n"
51259570ffbe31930ab4d678754daaeec0715117a3dsewardj"         ldr     r7, [sp, #20]\n"
51359570ffbe31930ab4d678754daaeec0715117a3dsewardj"         svc     0x0\n"
51459570ffbe31930ab4d678754daaeec0715117a3dsewardj"         pop     {r4, r5, r7}\n"
51559570ffbe31930ab4d678754daaeec0715117a3dsewardj"         bx      lr\n"
51659570ffbe31930ab4d678754daaeec0715117a3dsewardj".previous\n"
51759570ffbe31930ab4d678754daaeec0715117a3dsewardj);
51859570ffbe31930ab4d678754daaeec0715117a3dsewardj
519f0c1250e324f6684757c6a15545366447ef1d64fsewardj#elif defined(VGP_arm64_linux)
520f0c1250e324f6684757c6a15545366447ef1d64fsewardj/* I think the conventions are:
521f0c1250e324f6684757c6a15545366447ef1d64fsewardj   args  in r0 r1 r2 r3 r4 r5
522f0c1250e324f6684757c6a15545366447ef1d64fsewardj   sysno in r8
523f0c1250e324f6684757c6a15545366447ef1d64fsewardj   return value in r0, w/ same conventions as x86-linux, viz r0 in
524f0c1250e324f6684757c6a15545366447ef1d64fsewardj   -4096 .. -1 is an error value.  All other values are success
525f0c1250e324f6684757c6a15545366447ef1d64fsewardj   values.
526f0c1250e324f6684757c6a15545366447ef1d64fsewardj
527f0c1250e324f6684757c6a15545366447ef1d64fsewardj   r0 to r5 remain unchanged, but syscall_no is in r6 and needs
528f0c1250e324f6684757c6a15545366447ef1d64fsewardj   to be moved to r8 (??)
529f0c1250e324f6684757c6a15545366447ef1d64fsewardj*/
530f0c1250e324f6684757c6a15545366447ef1d64fsewardjextern UWord do_syscall_WRK (
531f0c1250e324f6684757c6a15545366447ef1d64fsewardj          UWord a1, UWord a2, UWord a3,
532f0c1250e324f6684757c6a15545366447ef1d64fsewardj          UWord a4, UWord a5, UWord a6,
533f0c1250e324f6684757c6a15545366447ef1d64fsewardj          UWord syscall_no
534f0c1250e324f6684757c6a15545366447ef1d64fsewardj       );
535f0c1250e324f6684757c6a15545366447ef1d64fsewardjasm(
536f0c1250e324f6684757c6a15545366447ef1d64fsewardj".text\n"
537f0c1250e324f6684757c6a15545366447ef1d64fsewardj".globl do_syscall_WRK\n"
538f0c1250e324f6684757c6a15545366447ef1d64fsewardj"do_syscall_WRK:\n"
539f0c1250e324f6684757c6a15545366447ef1d64fsewardj"        mov x8, x6\n"
540f0c1250e324f6684757c6a15545366447ef1d64fsewardj"        mov x6, 0\n"
541f0c1250e324f6684757c6a15545366447ef1d64fsewardj"        mov x7, 0\n"
542f0c1250e324f6684757c6a15545366447ef1d64fsewardj"        svc 0\n"
543f0c1250e324f6684757c6a15545366447ef1d64fsewardj"        ret\n"
544f0c1250e324f6684757c6a15545366447ef1d64fsewardj".previous\n"
545f0c1250e324f6684757c6a15545366447ef1d64fsewardj);
546f0c1250e324f6684757c6a15545366447ef1d64fsewardj
547f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGP_x86_darwin)
548f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
549f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* Incoming args (syscall number + up to 8 args) come in on the stack
550f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
551f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   The kernel's syscall calling convention is:
552f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * the syscall number goes in eax
553f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * the args are passed to the syscall on the stack,
554f76d27a697a7b0bf3b84490baf60623fc96a23afnjn     pushed onto the stack R->L (that is, the usual x86
555f76d27a697a7b0bf3b84490baf60623fc96a23afnjn     calling conventions, with the leftmost arg at the lowest
556f76d27a697a7b0bf3b84490baf60623fc96a23afnjn     address)
557f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Call instruction:
558f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: sysenter
559f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: int $0x80
560f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MACH: int $0x81
561f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MDEP: int $0x82
562f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Note that the call type can be determined from the syscall number;
563f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   there is no need to inspect the actual instruction.  Although obviously
564f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   the instruction must match.
565f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Return value:
566f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MACH,MDEP: the return value comes back in eax
567f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: the return value comes back in edx:eax (hi32:lo32)
568f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Error:
569f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MACH,MDEP: no error is returned
570f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: the carry flag indicates success or failure
571f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
572f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   nb here, sizeof(UWord) == sizeof(UInt)
573f76d27a697a7b0bf3b84490baf60623fc96a23afnjn*/
574f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
575f76d27a697a7b0bf3b84490baf60623fc96a23afnjn__private_extern__ ULong
576f76d27a697a7b0bf3b84490baf60623fc96a23afnjndo_syscall_unix_WRK ( UWord a1, UWord a2, UWord a3, /* 4(esp)..12(esp) */
577f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a4, UWord a5, UWord a6, /* 16(esp)..24(esp) */
578f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a7, UWord a8, /* 28(esp)..32(esp) */
579f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord syscall_no, /* 36(esp) */
580f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      /*OUT*/UInt* errflag /* 40(esp) */ );
581f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// Unix syscall: 64-bit return in edx:eax, with LSB in eax
582f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// error indicated by carry flag: clear=good, set=bad
583f76d27a697a7b0bf3b84490baf60623fc96a23afnjnasm(".private_extern _do_syscall_unix_WRK\n"
584f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "_do_syscall_unix_WRK:\n"
585f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    40(%esp), %ecx   \n"  /* assume syscall success */
586f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    $0, (%ecx)       \n"
587f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    36(%esp), %eax   \n"
588f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        int     $0x80            \n"
589f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        jnc     1f               \n"  /* jump if success */
590f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    40(%esp), %ecx   \n"  /* syscall failed - set *errflag */
591f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    $1, (%ecx)       \n"
592f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "    1:  ret                      \n"
593f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    );
594f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
595f76d27a697a7b0bf3b84490baf60623fc96a23afnjn__private_extern__ UInt
596f76d27a697a7b0bf3b84490baf60623fc96a23afnjndo_syscall_mach_WRK ( UWord a1, UWord a2, UWord a3, /* 4(esp)..12(esp) */
597f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a4, UWord a5, UWord a6, /* 16(esp)..24(esp) */
598f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a7, UWord a8, /* 28(esp)..32(esp) */
599f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord syscall_no /* 36(esp) */ );
600f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// Mach trap: 32-bit result in %eax, no error flag
601f76d27a697a7b0bf3b84490baf60623fc96a23afnjnasm(".private_extern _do_syscall_mach_WRK\n"
602f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "_do_syscall_mach_WRK:\n"
603f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    36(%esp), %eax   \n"
604f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        int     $0x81            \n"
605f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        ret                      \n"
606f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    );
607f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
608f76d27a697a7b0bf3b84490baf60623fc96a23afnjn__private_extern__ UInt
609f76d27a697a7b0bf3b84490baf60623fc96a23afnjndo_syscall_mdep_WRK ( UWord a1, UWord a2, UWord a3, /* 4(esp)..12(esp) */
610f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a4, UWord a5, UWord a6, /* 16(esp)..24(esp) */
611f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a7, UWord a8, /* 28(esp)..32(esp) */
612f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord syscall_no /* 36(esp) */ );
613f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// mdep trap: 32-bit result in %eax, no error flag
614f76d27a697a7b0bf3b84490baf60623fc96a23afnjnasm(
615f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    ".private_extern _do_syscall_mdep_WRK\n"
616f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "_do_syscall_mdep_WRK:\n"
617f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movl    36(%esp), %eax   \n"
618f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        int     $0x82            \n"
619f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        ret                      \n"
620f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    );
621f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
622f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
623f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGP_amd64_darwin)
624f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
625f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* Incoming args (syscall number + up to 8 args) come in registers and stack
626f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
627f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   The kernel's syscall calling convention is:
628f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * the syscall number goes in rax
629f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * the args are passed to the syscall in registers and the stack
630f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * the call instruction is 'syscall'
631f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Return value:
632f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MACH,MDEP: the return value comes back in rax
633f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: the return value comes back in rdx:rax (hi64:lo64)
634f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   Error:
635f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * MACH,MDEP: no error is returned
636f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   * UNIX: the carry flag indicates success or failure
637f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
638f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   nb here, sizeof(UWord) == sizeof(ULong)
639f76d27a697a7b0bf3b84490baf60623fc96a23afnjn*/
640f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
641f76d27a697a7b0bf3b84490baf60623fc96a23afnjn__private_extern__ UWord
642f76d27a697a7b0bf3b84490baf60623fc96a23afnjndo_syscall_unix_WRK ( UWord a1, UWord a2, UWord a3, /* rdi, rsi, rdx */
643f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a4, UWord a5, UWord a6, /* rcx, r8,  r9 */
644f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a7, UWord a8,           /* 8(rsp), 16(rsp) */
645f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord syscall_no,             /* 24(rsp) */
646f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      /*OUT*/ULong* errflag,        /* 32(rsp) */
647f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      /*OUT*/ULong* res2 );         /* 40(rsp) */
648f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// Unix syscall: 128-bit return in rax:rdx, with LSB in rax
649f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// error indicated by carry flag: clear=good, set=bad
650f76d27a697a7b0bf3b84490baf60623fc96a23afnjnasm(".private_extern _do_syscall_unix_WRK\n"
651f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "_do_syscall_unix_WRK:\n"
652f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    %rcx, %r10       \n"  /* pass rcx in r10 instead */
653f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    32(%rsp), %rax   \n"  /* assume syscall success */
654f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    $0, (%rax)       \n"
655f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    24(%rsp), %rax   \n"  /* load syscall_no */
656f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        syscall                  \n"
657f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        jnc     1f               \n"  /* jump if success */
658f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    32(%rsp), %rcx   \n"  /* syscall failed - set *errflag */
659f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    $1, (%rcx)       \n"
660f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "    1:  movq    40(%rsp), %rcx   \n"  /* save 2nd result word */
661f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    %rdx, (%rcx)     \n"
662f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        retq                     \n"  /* return 1st result word */
663f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    );
664f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
665f76d27a697a7b0bf3b84490baf60623fc96a23afnjn__private_extern__ UWord
666f76d27a697a7b0bf3b84490baf60623fc96a23afnjndo_syscall_mach_WRK ( UWord a1, UWord a2, UWord a3, /* rdi, rsi, rdx */
667f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a4, UWord a5, UWord a6, /* rcx, r8,  r9 */
668f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord a7, UWord a8,           /* 8(rsp), 16(rsp) */
669f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                      UWord syscall_no );           /* 24(rsp) */
670f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// Mach trap: 64-bit result, no error flag
671f76d27a697a7b0bf3b84490baf60623fc96a23afnjnasm(".private_extern _do_syscall_mach_WRK\n"
672f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "_do_syscall_mach_WRK:\n"
673f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    %rcx, %r10       \n"  /* pass rcx in r10 instead */
674f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        movq    24(%rsp), %rax   \n"  /* load syscall_no */
675f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        syscall                  \n"
676f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "        retq                     \n"
677f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    );
678f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
679b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGP_s390x_linux)
680b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
681b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjstatic UWord do_syscall_WRK (
682b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   UWord syscall_no,
683b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   UWord arg1, UWord arg2, UWord arg3,
684b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   UWord arg4, UWord arg5, UWord arg6
685b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   )
686b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj{
687b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg1 asm("2") = arg1;
688b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg2 asm("3") = arg2;
689b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg3 asm("4") = arg3;
690b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg4 asm("5") = arg4;
691b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg5 asm("6") = arg5;
692b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register UWord __arg6 asm("7") = arg6;
693b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   register ULong __svcres asm("2");
694b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
695b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   __asm__ __volatile__ (
696b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                 "lgr %%r1,%1\n\t"
697b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj                 "svc 0\n\t"
698b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		: "=d" (__svcres)
699b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		: "a" (syscall_no),
700b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "0" (__arg1),
701b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "d" (__arg2),
702b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "d" (__arg3),
703b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "d" (__arg4),
704b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "d" (__arg5),
705b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		  "d" (__arg6)
706b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj		: "1", "cc", "memory");
707b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
708b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   return (UWord) (__svcres);
709b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj}
710b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
7115db15403e889d4db339b342bc2a824ef0bfaa654sewardj#elif defined(VGP_mips32_linux)
7125db15403e889d4db339b342bc2a824ef0bfaa654sewardj/* Incoming args (syscall number + up to 6 args) come in a0 - a3 and stack.
7135db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7145db15403e889d4db339b342bc2a824ef0bfaa654sewardj   The syscall number goes in v0.  The args are passed to the syscall in
7155db15403e889d4db339b342bc2a824ef0bfaa654sewardj   the regs a0 - a3 and stack, i.e. the kernel's syscall calling convention.
7165db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7175db15403e889d4db339b342bc2a824ef0bfaa654sewardj   (a3 != 0) flags an error.
7185db15403e889d4db339b342bc2a824ef0bfaa654sewardj   We return the syscall return value in v0.
7195db15403e889d4db339b342bc2a824ef0bfaa654sewardj   MIPS version
7205db15403e889d4db339b342bc2a824ef0bfaa654sewardj*/
7215db15403e889d4db339b342bc2a824ef0bfaa654sewardjextern int do_syscall_WRK (
7225db15403e889d4db339b342bc2a824ef0bfaa654sewardj          int a1, int a2, int a3,
7235db15403e889d4db339b342bc2a824ef0bfaa654sewardj          int a4, int a5, int a6, int syscall_no, UWord *err,
7245db15403e889d4db339b342bc2a824ef0bfaa654sewardj          UWord *valHi, UWord* valLo
7255db15403e889d4db339b342bc2a824ef0bfaa654sewardj       );
7265db15403e889d4db339b342bc2a824ef0bfaa654sewardjasm(
7275db15403e889d4db339b342bc2a824ef0bfaa654sewardj".globl do_syscall_WRK\n"
7285db15403e889d4db339b342bc2a824ef0bfaa654sewardj".ent do_syscall_WRK\n"
7295db15403e889d4db339b342bc2a824ef0bfaa654sewardj".text\n"
7305db15403e889d4db339b342bc2a824ef0bfaa654sewardj"do_syscall_WRK:\n"
7315db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   lw $2, 24($29)\n"
7325db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   syscall\n"
7335db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   lw $8, 28($29)\n"
7345db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   sw $7, ($8)\n"
7355db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   lw $8, 32($29)\n"
7365db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   sw $3, ($8)\n"   // store valHi
7375db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   lw $8, 36($29)\n"
7385db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   sw $2, ($8)\n"   // store valLo
7395db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   jr $31\n"
7405db15403e889d4db339b342bc2a824ef0bfaa654sewardj"   nop\n"
7415db15403e889d4db339b342bc2a824ef0bfaa654sewardj".previous\n"
7425db15403e889d4db339b342bc2a824ef0bfaa654sewardj".end do_syscall_WRK\n"
7435db15403e889d4db339b342bc2a824ef0bfaa654sewardj);
7445db15403e889d4db339b342bc2a824ef0bfaa654sewardj
7454df0bfc0614379192c780c944415dc420d9cfe8epetarj#elif defined(VGP_mips64_linux)
7464df0bfc0614379192c780c944415dc420d9cfe8epetarjextern UWord do_syscall_WRK ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5,
7474df0bfc0614379192c780c944415dc420d9cfe8epetarj                              UWord a6, UWord syscall_no, ULong* V1_val );
7484df0bfc0614379192c780c944415dc420d9cfe8epetarjasm (
7494df0bfc0614379192c780c944415dc420d9cfe8epetarj".text\n"
7504df0bfc0614379192c780c944415dc420d9cfe8epetarj".globl do_syscall_WRK\n"
7514df0bfc0614379192c780c944415dc420d9cfe8epetarj"do_syscall_WRK:\n"
7524df0bfc0614379192c780c944415dc420d9cfe8epetarj"   daddiu $29, $29, -8\n"
7534df0bfc0614379192c780c944415dc420d9cfe8epetarj"   sd $11, 0($29)\n"
7544df0bfc0614379192c780c944415dc420d9cfe8epetarj"   move $2, $10\n"
7554df0bfc0614379192c780c944415dc420d9cfe8epetarj"   syscall\n"
7564df0bfc0614379192c780c944415dc420d9cfe8epetarj"   ld $11, 0($29)\n"
7574df0bfc0614379192c780c944415dc420d9cfe8epetarj"   daddiu $29, $29, 8\n"
7584df0bfc0614379192c780c944415dc420d9cfe8epetarj"   sd $3, 0($11)\n"  /* store vale of v1 in last param */
7594df0bfc0614379192c780c944415dc420d9cfe8epetarj"   sd $7, 8($11)\n"  /* store vale of a3 in last param */
7604df0bfc0614379192c780c944415dc420d9cfe8epetarj"   jr $31\n"
7614df0bfc0614379192c780c944415dc420d9cfe8epetarj".previous\n"
7624df0bfc0614379192c780c944415dc420d9cfe8epetarj);
7634df0bfc0614379192c780c944415dc420d9cfe8epetarj
764112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#elif defined(VGP_tilegx_linux)
765112711afefcfcd43680c7c4aa8d38ef180e8811esewardjextern UWord do_syscall_WRK (
766112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord syscall_no,
767112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord a1, UWord a2, UWord a3,
768112711afefcfcd43680c7c4aa8d38ef180e8811esewardj          UWord a4, UWord a5, UWord a6
769112711afefcfcd43680c7c4aa8d38ef180e8811esewardj       );
770112711afefcfcd43680c7c4aa8d38ef180e8811esewardjasm(
771112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    ".text\n"
772112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "do_syscall_WRK:\n"
773112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r10, r0\n"
774112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r0,  r1\n"
775112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r1,  r2\n"
776112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r2,  r3\n"
777112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r3,  r4\n"
778112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r4,  r5\n"
779112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "move  r5,  r6\n"
780112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "swint1\n"
781112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    "jrp   lr\n"
782112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    ".previous\n"
783112711afefcfcd43680c7c4aa8d38ef180e8811esewardj    );
784112711afefcfcd43680c7c4aa8d38ef180e8811esewardj
7859abd608244d8123868d027f616fa928156615d5anjn#else
7869abd608244d8123868d027f616fa928156615d5anjn#  error Unknown platform
7879abd608244d8123868d027f616fa928156615d5anjn#endif
7889abd608244d8123868d027f616fa928156615d5anjn
78917edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj
790cda2f0fbda4c4b2644babc830244be8aed95de1dnjn/* Finally, the generic code.  This sends the call to the right
791cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   helper. */
792cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
7939abd608244d8123868d027f616fa928156615d5anjnSysRes VG_(do_syscall) ( UWord sysno, UWord a1, UWord a2, UWord a3,
79417edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj                                      UWord a4, UWord a5, UWord a6,
79517edf03e9361781c8f58033eeeca2c9ef9c21d70sewardj                                      UWord a7, UWord a8 )
7969abd608244d8123868d027f616fa928156615d5anjn{
797cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  if defined(VGP_x86_linux)
798cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   UWord val = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
799cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return VG_(mk_SysRes_x86_linux)( val );
800cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
801cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  elif defined(VGP_amd64_linux)
802cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   UWord val = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
803cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return VG_(mk_SysRes_amd64_linux)( val );
804cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
805cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  elif defined(VGP_ppc32_linux)
806cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   ULong ret     = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
807cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   UInt  val     = (UInt)(ret>>32);
808cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   UInt  cr0so   = (UInt)(ret);
809cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return VG_(mk_SysRes_ppc32_linux)( val, cr0so );
810cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
811cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#  elif defined(VGP_ppc64be_linux) || defined(VGP_ppc64le_linux)
812cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   ULong argblock[7];
813cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[0] = sysno;
814cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[1] = a1;
815cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[2] = a2;
816cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[3] = a3;
817cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[4] = a4;
818cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[5] = a5;
819cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   argblock[6] = a6;
820cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   do_syscall_WRK( &argblock[0] );
821cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return VG_(mk_SysRes_ppc64_linux)( argblock[0], argblock[1] );
822cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
82359570ffbe31930ab4d678754daaeec0715117a3dsewardj#  elif defined(VGP_arm_linux)
82459570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord val = do_syscall_WRK(a1,a2,a3,a4,a5,a6,sysno);
82559570ffbe31930ab4d678754daaeec0715117a3dsewardj   return VG_(mk_SysRes_arm_linux)( val );
82659570ffbe31930ab4d678754daaeec0715117a3dsewardj
827f0c1250e324f6684757c6a15545366447ef1d64fsewardj#  elif defined(VGP_arm64_linux)
828f0c1250e324f6684757c6a15545366447ef1d64fsewardj   UWord val = do_syscall_WRK(a1,a2,a3,a4,a5,a6,sysno);
829f0c1250e324f6684757c6a15545366447ef1d64fsewardj   return VG_(mk_SysRes_arm64_linux)( val );
830f0c1250e324f6684757c6a15545366447ef1d64fsewardj
831f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#  elif defined(VGP_x86_darwin)
832f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   UInt  wLO = 0, wHI = 0, err = 0;
833f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   ULong u64;
834f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   UChar scclass = VG_DARWIN_SYSNO_CLASS(sysno);
835f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (scclass) {
836f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_UNIX:
837f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         u64 = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
8381a1e95c1f385a9b3b4f13f231eebaafff6e56450njn                                   VG_DARWIN_SYSNO_FOR_KERNEL(sysno), &err);
839f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wLO = (UInt)u64;
840f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wHI = (UInt)(u64 >> 32);
841f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
842f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MACH:
843f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wLO = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
8441a1e95c1f385a9b3b4f13f231eebaafff6e56450njn                                   VG_DARWIN_SYSNO_FOR_KERNEL(sysno));
845f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         err = 0;
846f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
847f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MDEP:
848f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wLO = do_syscall_mdep_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
8491a1e95c1f385a9b3b4f13f231eebaafff6e56450njn                                   VG_DARWIN_SYSNO_FOR_KERNEL(sysno));
850f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         err = 0;
851f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
852f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      default:
853f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(0);
854f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
855f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
856f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return VG_(mk_SysRes_x86_darwin)( scclass, err ? True : False, wHI, wLO );
857f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
858f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#  elif defined(VGP_amd64_darwin)
859f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   ULong wLO = 0, wHI = 0, err = 0;
860f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   UChar scclass = VG_DARWIN_SYSNO_CLASS(sysno);
861f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (scclass) {
862f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_UNIX:
863f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wLO = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
8641a1e95c1f385a9b3b4f13f231eebaafff6e56450njn                                   VG_DARWIN_SYSNO_FOR_KERNEL(sysno), &err, &wHI);
865f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
866f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MACH:
867f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case VG_DARWIN_SYSCALL_CLASS_MDEP:
868f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         wLO = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
8691a1e95c1f385a9b3b4f13f231eebaafff6e56450njn                                   VG_DARWIN_SYSNO_FOR_KERNEL(sysno));
870f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         err = 0;
871f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
872f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      default:
873f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         vg_assert(0);
874f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         break;
875f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
876f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return VG_(mk_SysRes_amd64_darwin)( scclass, err ? True : False, wHI, wLO );
877f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
878b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGP_s390x_linux)
879b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   UWord val;
880b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
881b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   if (sysno == __NR_mmap) {
882b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     ULong argbuf[6];
883b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
884b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[0] = a1;
885b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[1] = a2;
886b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[2] = a3;
887b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[3] = a4;
888b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[4] = a5;
889b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     argbuf[5] = a6;
890b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     val = do_syscall_WRK(sysno,(UWord)&argbuf[0],0,0,0,0,0);
891b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   } else {
892b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj     val = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
893b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   }
894b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj
895b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj   return VG_(mk_SysRes_s390x_linux)( val );
8965db15403e889d4db339b342bc2a824ef0bfaa654sewardj
8975db15403e889d4db339b342bc2a824ef0bfaa654sewardj#elif defined(VGP_mips32_linux)
8985db15403e889d4db339b342bc2a824ef0bfaa654sewardj   UWord err   = 0;
8995db15403e889d4db339b342bc2a824ef0bfaa654sewardj   UWord valHi = 0;
9005db15403e889d4db339b342bc2a824ef0bfaa654sewardj   UWord valLo = 0;
9015db15403e889d4db339b342bc2a824ef0bfaa654sewardj   (void) do_syscall_WRK(a1,a2,a3,a4,a5,a6, sysno,&err,&valHi,&valLo);
9025db15403e889d4db339b342bc2a824ef0bfaa654sewardj   return VG_(mk_SysRes_mips32_linux)( valLo, valHi, (ULong)err );
9034df0bfc0614379192c780c944415dc420d9cfe8epetarj
9044df0bfc0614379192c780c944415dc420d9cfe8epetarj#elif defined(VGP_mips64_linux)
9054df0bfc0614379192c780c944415dc420d9cfe8epetarj   ULong v1_a3[2];
9064df0bfc0614379192c780c944415dc420d9cfe8epetarj   v1_a3[0] = 0xFF00;
9074df0bfc0614379192c780c944415dc420d9cfe8epetarj   v1_a3[1] = 0xFF00;
9084df0bfc0614379192c780c944415dc420d9cfe8epetarj   ULong V0 = do_syscall_WRK(a1,a2,a3,a4,a5,a6,sysno,v1_a3);
9094df0bfc0614379192c780c944415dc420d9cfe8epetarj   ULong V1 = (ULong)v1_a3[0];
9104df0bfc0614379192c780c944415dc420d9cfe8epetarj   ULong A3 = (ULong)v1_a3[1];
9114df0bfc0614379192c780c944415dc420d9cfe8epetarj   return VG_(mk_SysRes_mips64_linux)( V0, V1, A3 );
9124df0bfc0614379192c780c944415dc420d9cfe8epetarj
913112711afefcfcd43680c7c4aa8d38ef180e8811esewardj#  elif defined(VGP_tilegx_linux)
914112711afefcfcd43680c7c4aa8d38ef180e8811esewardj   UWord val = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
915112711afefcfcd43680c7c4aa8d38ef180e8811esewardj
916112711afefcfcd43680c7c4aa8d38ef180e8811esewardj   return VG_(mk_SysRes_tilegx_linux)( val );
917112711afefcfcd43680c7c4aa8d38ef180e8811esewardj
91885665ca6fa29dd64754dabe50eb98f25896e752acerion#else
91985665ca6fa29dd64754dabe50eb98f25896e752acerion#  error Unknown platform
92085665ca6fa29dd64754dabe50eb98f25896e752acerion#endif
9219abd608244d8123868d027f616fa928156615d5anjn}
9229abd608244d8123868d027f616fa928156615d5anjn
92345f4e7c91119c7d01a59f5e827c67841632c9314sewardj/* ---------------------------------------------------------------------
92445f4e7c91119c7d01a59f5e827c67841632c9314sewardj   Names of errors.
92545f4e7c91119c7d01a59f5e827c67841632c9314sewardj   ------------------------------------------------------------------ */
92645f4e7c91119c7d01a59f5e827c67841632c9314sewardj
92745f4e7c91119c7d01a59f5e827c67841632c9314sewardj/* Return a string which gives the name of an error value.  Note,
92845f4e7c91119c7d01a59f5e827c67841632c9314sewardj   unlike the standard C syserror fn, the returned string is not
92945f4e7c91119c7d01a59f5e827c67841632c9314sewardj   malloc-allocated or writable -- treat it as a constant.
93045f4e7c91119c7d01a59f5e827c67841632c9314sewardj   TODO: implement this properly. */
93145f4e7c91119c7d01a59f5e827c67841632c9314sewardj
93245f4e7c91119c7d01a59f5e827c67841632c9314sewardjconst HChar* VG_(strerror) ( UWord errnum )
93345f4e7c91119c7d01a59f5e827c67841632c9314sewardj{
93445f4e7c91119c7d01a59f5e827c67841632c9314sewardj   switch (errnum) {
93559451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EPERM:       return "Operation not permitted";
93659451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOENT:      return "No such file or directory";
93759451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ESRCH:       return "No such process";
93859451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EINTR:       return "Interrupted system call";
93959451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EIO:         return "Input/output error";
94059451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENXIO:       return "No such device or address";
94159451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_E2BIG:       return "Argument list too long";
94259451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOEXEC:     return "Exec format error";
94359451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EBADF:       return "Bad file descriptor";
94459451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ECHILD:      return "No child processes";
94559451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EAGAIN:      return "Resource temporarily unavailable";
94659451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOMEM:      return "Cannot allocate memory";
94759451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EACCES:      return "Permission denied";
94859451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EFAULT:      return "Bad address";
94959451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOTBLK:     return "Block device required";
95059451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EBUSY:       return "Device or resource busy";
95159451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EEXIST:      return "File exists";
95259451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EXDEV:       return "Invalid cross-device link";
95359451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENODEV:      return "No such device";
95459451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOTDIR:     return "Not a directory";
95559451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EISDIR:      return "Is a directory";
95659451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EINVAL:      return "Invalid argument";
95759451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENFILE:      return "Too many open files in system";
95859451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EMFILE:      return "Too many open files";
95959451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOTTY:      return "Inappropriate ioctl for device";
96059451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ETXTBSY:     return "Text file busy";
96159451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EFBIG:       return "File too large";
96259451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOSPC:      return "No space left on device";
96359451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ESPIPE:      return "Illegal seek";
96459451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EROFS:       return "Read-only file system";
96559451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EMLINK:      return "Too many links";
96659451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EPIPE:       return "Broken pipe";
96759451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EDOM:        return "Numerical argument out of domain";
96859451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ERANGE:      return "Numerical result out of range";
96959451647ad0829e0ffae02db4d20baeeff2e3239florian
97059451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_ENOSYS:      return "Function not implemented";
97159451647ad0829e0ffae02db4d20baeeff2e3239florian   case VKI_EOVERFLOW:   return "Value too large for defined data type";
972cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#     if defined(VKI_ERESTARTSYS)
97345f4e7c91119c7d01a59f5e827c67841632c9314sewardj      case VKI_ERESTARTSYS: return "ERESTARTSYS";
974cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#     endif
97559451647ad0829e0ffae02db4d20baeeff2e3239florian   default:              return "VG_(strerror): unknown error";
97645f4e7c91119c7d01a59f5e827c67841632c9314sewardj   }
97745f4e7c91119c7d01a59f5e827c67841632c9314sewardj}
97845f4e7c91119c7d01a59f5e827c67841632c9314sewardj
97945f4e7c91119c7d01a59f5e827c67841632c9314sewardj
9809abd608244d8123868d027f616fa928156615d5anjn/*--------------------------------------------------------------------*/
98159451647ad0829e0ffae02db4d20baeeff2e3239florian/*--- end                                                          ---*/
9829abd608244d8123868d027f616fa928156615d5anjn/*--------------------------------------------------------------------*/
983