diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-11-22 23:10:43 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-11-22 23:10:43 +0100 |
| commit | 99e02f978d3d6b9594d4991b8c95f1b8b0e6b833 (patch) | |
| tree | 698d54b55a8dc2d8a0a849a08afc9330acb2756b /src | |
| parent | 89112197d4d4bc35c24b573d92481cd4514149cc (diff) | |
| download | box64-99e02f978d3d6b9594d4991b8c95f1b8b0e6b833.tar.gz box64-99e02f978d3d6b9594d4991b8c95f1b8b0e6b833.zip | |
Added syscall 63 (for #174)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64syscall.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index 6310da9d..476aff59 100755 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -113,6 +113,7 @@ scwrap_t syscallwrap[] = { { 57, __NR_fork, 0 }, // should wrap this one, because of the struct pt_regs (the only arg)? #endif { 61, __NR_wait4, 4}, + //{ 63, __NR_uname, 1}, // Needs wrapping, use old_utsname { 66, __NR_semctl, 4}, { 73, __NR_flock, 2}, #ifdef __NR_getdents @@ -201,6 +202,14 @@ typedef struct nat_linux_dirent64_s { char d_name[]; } nat_linux_dirent64_t; +typedef struct old_utsname_s { + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; +} old_utsname_t; + ssize_t DirentFromDirent64(void* dest, void* source, ssize_t count) { nat_linux_dirent64_t *src = (nat_linux_dirent64_t*)source; @@ -348,6 +357,15 @@ void EXPORT x64Syscall(x64emu_t *emu) R_RAX = fork(); break; #endif + case 63: //uname + { + old_utsname_t *old = (old_utsname_t*)R_RDI; + struct utsname uts; + R_RAX = uname(&uts); + memcpy(old, &uts, sizeof(*old)); // old_uts is just missing a field from new_uts + strcpy(old->machine, "x86_64"); + } + break; #ifndef __NR_getdents case 78: { @@ -483,6 +501,15 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) case 57: return fork(); #endif + case 63: //uname + { + old_utsname_t *old = (old_utsname_t*)R_RSI; + struct utsname uts; + int64_t ret = uname(&uts); + memcpy(old, &uts, sizeof(*old)); + strcpy(old->machine, "x86_64"); + return ret; + } #ifndef __NR_getdents case 78: { |