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