linux-user: sb1 support
authorRiku Voipio <riku.voipio@nokia.com>
Mon, 31 Aug 2009 14:44:59 +0000 (17:44 +0300)
committerRiku Voipio <riku.voipio@nokia.com>
Wed, 9 Sep 2009 13:32:16 +0000 (16:32 +0300)
hacks needed for sb1

linux-user/main.c
linux-user/syscall.c

index a628c01..0df5886 100644 (file)
@@ -2458,7 +2458,7 @@ void init_task_state(TaskState *ts)
  
 int main(int argc, char **argv, char **envp)
 {
-    const char *filename;
+    char *filename = NULL;
     const char *cpu_model;
     struct target_pt_regs regs1, *regs = &regs1;
     struct image_info info1, *info = &info1;
@@ -2471,8 +2471,10 @@ int main(int argc, char **argv, char **envp)
     char **target_environ, **wrk;
     char **target_argv;
     int target_argc;
+    int drop_ld_preload = 0;
     envlist_t *envlist = NULL;
     const char *argv0 = NULL;
+    int argskip = 0;
     int i;
     int ret;
 
@@ -2534,6 +2536,8 @@ int main(int argc, char **argv, char **envp)
         } else if (!strcmp(r, "0")) {
             r = argv[optind++];
             argv0 = r;
+        } else if (!strcmp(r,"-sbox-call")) {
+            argskip++;
         } else if (!strcmp(r, "s")) {
             if (optind >= argc)
                 break;
@@ -2577,7 +2581,9 @@ int main(int argc, char **argv, char **envp)
            have_guest_base = 1;
 #endif
         } else if (!strcmp(r, "drop-ld-preload")) {
-            (void) envlist_unsetenv(envlist, "LD_PRELOAD");
+            drop_ld_preload = 1;
+        } else if (!strcmp(r, "keep-ld-preload")) {
+            drop_ld_preload = 0;
         } else if (!strcmp(r, "singlestep")) {
             singlestep = 1;
         } else if (!strcmp(r, "strace")) {
@@ -2589,8 +2595,15 @@ int main(int argc, char **argv, char **envp)
     }
     if (optind >= argc)
         usage();
-    filename = argv[optind];
-    exec_path = argv[optind];
+    if (filename == NULL) {
+        filename = argv[optind];
+        exec_path = argv[optind];
+    } else {
+        argv0 = argv[optind];
+    }
+    if (drop_ld_preload) {
+        (void) envlist_unsetenv(envlist, "LD_PRELOAD");
+    }
 
     /* Zero out regs */
     memset(regs, 0, sizeof(struct target_pt_regs));
@@ -2713,7 +2726,7 @@ int main(int argc, char **argv, char **envp)
     env->opaque = ts;
     task_settid(ts);
 
-    ret = loader_exec(filename, target_argv, target_environ, regs,
+    ret = loader_exec(filename, target_argv+argskip, target_environ, regs,
         info, &bprm);
     if (ret != 0) {
         printf("Error %d while loading %s\n", ret, filename);
index 25b95ea..7266ca7 100644 (file)
@@ -445,6 +445,11 @@ _syscall3(int,sys_mkdirat,int,dirfd,const char *,pathname,mode_t,mode)
 _syscall4(int,sys_mknodat,int,dirfd,const char *,pathname,
           mode_t,mode,dev_t,dev)
 #endif
+#if (defined(TARGET_NR_newfstatat) || defined(TARGET_NR_fstatat64) ) && \
+        defined(__NR_newfstatat)
+_syscall4(int,sys_newfstatat,int,dirfd,const char *,pathname,
+          struct stat *,buf,int,flags)
+#endif
 #if defined(TARGET_NR_openat) && defined(__NR_openat)
 _syscall4(int,sys_openat,int,dirfd,const char *,pathname,int,flags,mode_t,mode)
 #endif
@@ -3473,6 +3478,7 @@ typedef struct {
     pthread_cond_t cond;
     pthread_t thread;
     uint32_t tid;
+    unsigned int flags;
     abi_ulong child_tidptr;
     abi_ulong parent_tidptr;
     sigset_t sigmask;