Modify the emulated system calls to support running the SPEC Int
authorDavid Oehmke <doehmke@umich.edu>
Thu, 5 Feb 2004 17:16:17 +0000 (12:16 -0500)
committerDavid Oehmke <doehmke@umich.edu>
Thu, 5 Feb 2004 17:16:17 +0000 (12:16 -0500)
benchmarks for alpha-linux.

arch/alpha/alpha_linux_process.cc:
    Added some more ioctl commands to ignore.
    Set unlink and rename to the new functions.
    Ignore setrlimit, times and rt_sigaction.
    Should eventually provide a function for times.
arch/alpha/alpha_tru64_process.cc:
    Added some more ioctl commands to ignore.
    Set unlink and rename to the new functions.
    Ignore setrlimit.
sim/syscall_emul.cc:
    Added implementations for unlink and rename.
sim/syscall_emul.hh:
    Added unlink and rename functions.
    Added a couple more ioctl requests to ignore.
    Print out the PC of any ioctl commands that fail.

--HG--
extra : convert_revision : 8af21c7fa7d0645d3f9324c9ce70ad33590c3c8e

arch/alpha/alpha_linux_process.cc
arch/alpha/alpha_tru64_process.cc
sim/syscall_emul.cc
sim/syscall_emul.hh

index d8a05849dd2f706ae4caf01cd85270b7b6d26405..ae197d1ac31f1f2edf6350fd68ad4a26ecb16aa1 100644 (file)
@@ -139,6 +139,8 @@ class Linux {
     static const unsigned TIOCGETC   = 0x40067412;
     static const unsigned FIONREAD   = 0x4004667f;
     static const unsigned TIOCISATTY = 0x2000745e;
+    static const unsigned TIOCGETS   = 0x402c7413;
+    static const unsigned TIOCGETA   = 0x40127417;
     //@}
 
     /// Resource enumeration for getrlimit().
@@ -421,7 +423,7 @@ SyscallDesc Linux::syscallDescs[] = {
     /*  7 */ SyscallDesc("osf_wait4", unimplementedFunc),
     /*  8 */ SyscallDesc("osf_old_creat", unimplementedFunc),
     /*  9 */ SyscallDesc("link", unimplementedFunc),
-    /* 10 */ SyscallDesc("unlink", unimplementedFunc),
+    /* 10 */ SyscallDesc("unlink", unlinkFunc),
     /* 11 */ SyscallDesc("osf_execve", unimplementedFunc),
     /* 12 */ SyscallDesc("chdir", unimplementedFunc),
     /* 13 */ SyscallDesc("fchdir", unimplementedFunc),
@@ -539,7 +541,7 @@ SyscallDesc Linux::syscallDescs[] = {
     /* 125 */ SyscallDesc("recvfrom", unimplementedFunc),
     /* 126 */ SyscallDesc("setreuid", unimplementedFunc),
     /* 127 */ SyscallDesc("setregid", unimplementedFunc),
-    /* 128 */ SyscallDesc("rename", unimplementedFunc),
+    /* 128 */ SyscallDesc("rename", renameFunc),
     /* 129 */ SyscallDesc("truncate", unimplementedFunc),
     /* 130 */ SyscallDesc("ftruncate", unimplementedFunc),
     /* 131 */ SyscallDesc("flock", unimplementedFunc),
@@ -556,7 +558,7 @@ SyscallDesc Linux::syscallDescs[] = {
     /* 142 */ SyscallDesc("osf_gethostid", unimplementedFunc),
     /* 143 */ SyscallDesc("osf_sethostid", unimplementedFunc),
     /* 144 */ SyscallDesc("getrlimit", getrlimitFunc<Linux>),
-    /* 145 */ SyscallDesc("setrlimit", unimplementedFunc),
+    /* 145 */ SyscallDesc("setrlimit", ignoreFunc),
     /* 146 */ SyscallDesc("osf_old_killpg", unimplementedFunc),
     /* 147 */ SyscallDesc("setsid", unimplementedFunc),
     /* 148 */ SyscallDesc("quotactl", unimplementedFunc),
@@ -737,7 +739,7 @@ SyscallDesc Linux::syscallDescs[] = {
     /* 320 */ SyscallDesc("was sys_idle", unimplementedFunc),
     /* 321 */ SyscallDesc("oldumount", unimplementedFunc),
     /* 322 */ SyscallDesc("swapon", unimplementedFunc),
-    /* 323 */ SyscallDesc("times", unimplementedFunc),
+    /* 323 */ SyscallDesc("times", ignoreFunc),
     /* 324 */ SyscallDesc("personality", unimplementedFunc),
     /* 325 */ SyscallDesc("setfsuid", unimplementedFunc),
     /* 326 */ SyscallDesc("setfsgid", unimplementedFunc),
@@ -766,7 +768,7 @@ SyscallDesc Linux::syscallDescs[] = {
     /* 349 */ SyscallDesc("pread", unimplementedFunc),
     /* 350 */ SyscallDesc("pwrite", unimplementedFunc),
     /* 351 */ SyscallDesc("rt_sigreturn", unimplementedFunc),
-    /* 352 */ SyscallDesc("rt_sigaction", unimplementedFunc),
+    /* 352 */ SyscallDesc("rt_sigaction", ignoreFunc),
     /* 353 */ SyscallDesc("rt_sigprocmask", unimplementedFunc),
     /* 354 */ SyscallDesc("rt_sigpending", unimplementedFunc),
     /* 355 */ SyscallDesc("rt_sigtimedwait", unimplementedFunc),
index ccf4d4d6cc898800ddafcfbfac0bd518c1fb6ccb..2366baed896da1042139b77a6137f62caffa726e 100644 (file)
@@ -171,6 +171,9 @@ class Tru64 {
     static const unsigned TIOCGETC   = 0x40067412;
     static const unsigned FIONREAD   = 0x4004667f;
     static const unsigned TIOCISATTY = 0x2000745e;
+    // TIOCGETS not defined in tru64, so I made up a number
+    static const unsigned TIOCGETS   = 0x40000000;
+    static const unsigned TIOCGETA   = 0x402c7413;
     //@}
 
     /// Resource enumeration for getrlimit().
@@ -1356,7 +1359,7 @@ SyscallDesc Tru64::syscallDescs[] = {
     /* 7 */ SyscallDesc("wait4", unimplementedFunc),
     /* 8 */ SyscallDesc("old_creat", unimplementedFunc),
     /* 9 */ SyscallDesc("link", unimplementedFunc),
-    /* 10 */ SyscallDesc("unlink", unimplementedFunc),
+    /* 10 */ SyscallDesc("unlink", unlinkFunc),
     /* 11 */ SyscallDesc("execv", unimplementedFunc),
     /* 12 */ SyscallDesc("chdir", unimplementedFunc),
     /* 13 */ SyscallDesc("fchdir", unimplementedFunc),
@@ -1475,7 +1478,7 @@ SyscallDesc Tru64::syscallDescs[] = {
     /* 125 */ SyscallDesc("old_recvfrom", unimplementedFunc),
     /* 126 */ SyscallDesc("setreuid", unimplementedFunc),
     /* 127 */ SyscallDesc("setregid", unimplementedFunc),
-    /* 128 */ SyscallDesc("rename", unimplementedFunc),
+    /* 128 */ SyscallDesc("rename", renameFunc),
     /* 129 */ SyscallDesc("truncate", unimplementedFunc),
     /* 130 */ SyscallDesc("ftruncate", unimplementedFunc),
     /* 131 */ SyscallDesc("flock", unimplementedFunc),
@@ -1492,7 +1495,7 @@ SyscallDesc Tru64::syscallDescs[] = {
     /* 142 */ SyscallDesc("gethostid", unimplementedFunc),
     /* 143 */ SyscallDesc("sethostid", unimplementedFunc),
     /* 144 */ SyscallDesc("getrlimit", getrlimitFunc<Tru64>),
-    /* 145 */ SyscallDesc("setrlimit", unimplementedFunc),
+    /* 145 */ SyscallDesc("setrlimit", ignoreFunc),
     /* 146 */ SyscallDesc("old_killpg", unimplementedFunc),
     /* 147 */ SyscallDesc("setsid", unimplementedFunc),
     /* 148 */ SyscallDesc("quotactl", unimplementedFunc),
index 9955d442196f7587d2133cf4365d07f75242fac8..e953a730805da9bcd683dd2506aed6229eec8676 100644 (file)
@@ -185,4 +185,32 @@ gethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
     return 0;
 }
 
+int
+unlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
+{
+    std::string path;
+
+    if (xc->mem->readString(path, xc->getSyscallArg(0)) != No_Fault)
+        return -EFAULT;
+
+    int result = unlink(path.c_str());
+    return (result == -1) ? -errno : result;
+}
+
+int
+renameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
+{
+    std::string old_name;
+
+    if (xc->mem->readString(old_name, xc->getSyscallArg(0)) != No_Fault)
+        return -EFAULT;
+
+    std::string new_name;
+
+    if (xc->mem->readString(new_name, xc->getSyscallArg(1)) != No_Fault)
+        return -EFAULT;
+
+    int result = rename(old_name.c_str(),new_name.c_str());
+    return (result == -1) ? -errno : result;
+}
 
index df4038f71cdf7e002b506fe5e58f2ebf1a693377..b425ef83c6d2c73b13d6300712757853eebaed75 100644 (file)
@@ -191,6 +191,12 @@ int munmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc);
 /// Target gethostname() handler.
 int gethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc);
 
+/// Target unlink() handler.
+int unlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc);
+
+/// Target rename() handler.
+int renameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc);
+
 //////////////////////////////////////////////////////////////////////
 //
 // The following emulation functions are generic, but need to be
@@ -223,10 +229,12 @@ ioctlFunc(SyscallDesc *desc, int callnum, Process *process,
       case OS::TIOCSETN:
       case OS::TIOCSETC:
       case OS::TIOCGETC:
+      case OS::TIOCGETS:
+      case OS::TIOCGETA:
         return -ENOTTY;
 
       default:
-        fatal("Unsupported ioctl call: ioctl(%d, 0x%x, ...)\n", fd, req);
+        fatal("Unsupported ioctl call: ioctl(%d, 0x%x, ...) @ 0x%llx\n", fd, req, xc->readPC());
     }
 }