about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorwannacu <76616478+wannacu@users.noreply.github.com>2022-08-11 17:14:13 +0800
committerGitHub <noreply@github.com>2022-08-11 11:14:13 +0200
commit948205e6f933406f097c93e17361375c41321d1b (patch)
treeef1d913f55f3c405db144b6d27cfcf38bdde3851 /src
parentd90b6b7e51ee84d00543a42411560e5bd40c15a3 (diff)
downloadbox64-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.c3
-rwxr-xr-xsrc/elfs/elfloader.c2
-rwxr-xr-xsrc/emu/x64syscall.c12
-rwxr-xr-xsrc/include/myalign.h37
-rwxr-xr-xsrc/libtools/signals.c2
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