diff options
| author | wannacu <76616478+wannacu@users.noreply.github.com> | 2022-08-11 17:14:13 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-11 11:14:13 +0200 |
| commit | 948205e6f933406f097c93e17361375c41321d1b (patch) | |
| tree | ef1d913f55f3c405db144b6d27cfcf38bdde3851 /src | |
| parent | d90b6b7e51ee84d00543a42411560e5bd40c15a3 (diff) | |
| download | box64-948205e6f933406f097c93e17361375c41321d1b.tar.gz box64-948205e6f933406f097c93e17361375c41321d1b.zip | |
Add SW64 base support (#382)
* Add SW64 base support * Add a few syscalls
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 3 | ||||
| -rwxr-xr-x | src/elfs/elfloader.c | 2 | ||||
| -rwxr-xr-x | src/emu/x64syscall.c | 12 | ||||
| -rwxr-xr-x | src/include/myalign.h | 37 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 2 |
5 files changed, 55 insertions, 1 deletions
diff --git a/src/custommem.c b/src/custommem.c index 25c55063..83e4e1ec 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -51,6 +51,9 @@ static pthread_mutex_t mutex_prot; #elif defined(PAGE16K) #define MEMPROT_SHIFT 14 #define MEMPROT_SHIFT2 (16+14) +#elif defined(PAGE8K) +#define MEMPROT_SHIFT 13 +#define MEMPROT_SHIFT2 (16+13) #else #define MEMPROT_SHIFT 12 #define MEMPROT_SHIFT2 (16+12) diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 938b6318..43eb7157 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -298,7 +298,7 @@ int LoadElfMemory(FILE* f, box64context_t* context, elfheader_t* head) void* p = (void*)-1; if(e->p_memsz==e->p_filesz && !(e->p_align&0xfff)) { printf_log(LOG_DEBUG, "MMap block #%zu @%p offset=%p (0x%zx/0x%zx, flags:0x%x)\n", i, dest, (void*)e->p_offset, e->p_filesz, e->p_memsz, e->p_flags); - mmap(dest, e->p_filesz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fileno(f), e->p_offset); + p = mmap(dest, e->p_filesz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fileno(f), e->p_offset); } if(p!=dest) { printf_log(LOG_DEBUG, "Loading block #%zu %p (0x%zx/0x%zx)\n",i, dest, e->p_filesz, e->p_memsz); diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index 4bc83479..0bfbd216 100755 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -162,6 +162,7 @@ scwrap_t syscallwrap[] = { { 213, __NR_epoll_create, 1}, #endif { 217, __NR_getdents64, 3}, + { 218, __NR_set_tid_address, 1}, { 220, __NR_semtimedop, 4}, { 228, __NR_clock_gettime, 2}, { 229, __NR_clock_getres, 2}, @@ -180,6 +181,7 @@ scwrap_t syscallwrap[] = { { 257, __NR_openat, 4}, { 270, __NR_pselect6, 6}, { 272, __NR_unshare, 1}, + { 273, __NR_set_robust_list, 2}, { 274, __NR_get_robust_list, 3}, { 281, __NR_epoll_pwait, 6}, #ifdef _NR_eventfd @@ -191,6 +193,7 @@ scwrap_t syscallwrap[] = { { 293, __NR_pipe2, 2}, { 294, __NR_inotify_init1, 1}, { 298, __NR_perf_event_open, 5}, + { 302, __NR_prlimit64, 4}, { 309, __NR_getcpu, 3}, // need wrapping? { 315, __NR_sched_getattr, 4}, { 317, __NR_seccomp, 3}, @@ -514,6 +517,13 @@ void EXPORT x64Syscall(x64emu_t *emu) R_EAX = (int)syscall(__NR_inotify_init1, 0); break; #endif + case 262: + R_EAX = (uint64_t)(int64_t)my_fstatat(emu, (int)R_RDI, (char*)R_RSI, (void*)R_RDX, (int)R_R10d); + break; + case 334: // It is helpeful to run static binary + R_RAX = -1; + errno = ENOSYS; + break; #ifndef __NR_fchmodat4 case 434: *(int64_t*)R_RAX = fchmodat((int)R_EDI, (void*)R_RSI, (mode_t)R_RDX, (int)R_R10d); @@ -717,6 +727,8 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) case 253: return (int)syscall(__NR_inotify_init1, 0); #endif + case 262: + return (uint64_t)(int64_t)my_fstatat(emu, (int)R_RSI, (char*)R_RDX, (void*)R_RCX, (int)R_R8d); #ifndef __NR_fchmodat4 case 434: return (int)fchmodat((int)R_ESI, (void*)R_RDX, (mode_t)R_RCX, (int)R_R8d); diff --git a/src/include/myalign.h b/src/include/myalign.h index 264c71eb..4a705afa 100755 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -92,6 +92,43 @@ typedef struct va_list { memcpy(&p[6], emu->xmm, 8*16); \ } +#elif defined(__sw_64__) /* or Alpha */ +/* +typdef struct { + char* __base; + int __offset; +}va_list; +*/ + +// the follow three macro is not fully compatiable with SW64/Alpha +// so don't expect va function works well. +#define CREATE_SYSV_VALIST(A) \ + va_list sysv_varargs; \ + sysv_varargs.__offset=0; \ + sysv_varargs.__base=(A) + +#define CREATE_VALIST_FROM_VALIST(VA, SCRATCH) \ + va_list sysv_varargs; \ + { \ + uintptr_t *p = (uintptr_t*)(SCRATCH); \ + int n = (X64_VA_MAX_REG - (VA)->gp_offset)/8; \ + if(n) memcpy(&p[0], (VA)->reg_save_area, n*8); \ + memcpy(&p[n], (VA)->overflow_arg_area, 100*8); \ + sysv_varargs.__offset = (VA)->gp_offset; \ + sysv_varargs.__base = (char*)p; \ + } + +#define CREATE_VALIST_FROM_VAARG(STACK, SCRATCH, N) \ + va_list sysv_varargs; \ + { \ + uintptr_t *p = (uintptr_t*)(SCRATCH); \ + p[0]=R_RDI; p[1]=R_RSI; p[2]=R_RDX; \ + p[3]=R_RCX; p[4]=R_R8; p[5]=R_R9; \ + memcpy(&p[8+N], STACK, 100*8 - (8+N)*8); \ + sysv_varargs.__offset = N*8; \ + sysv_varargs.__base = (char*)p; \ + } + #elif defined(__loongarch64) || defined(__powerpc64__) || defined(__riscv) #define CREATE_SYSV_VALIST(A) \ va_list sysv_varargs = (va_list)A diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 6bed019f..c003c863 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -776,6 +776,8 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) void * pc = (void*)p->uc_mcontext.gp_regs[PT_NIP]; #elif defined(LA464) void * pc = (void*)p->uc_mcontext.__pc; +#elif defined(SW64) + void * pc = (void*)p->uc_mcontext.sc_pc; #else void * pc = NULL; // unknow arch... #warning Unhandled architecture |