summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oehmke <doehmke@umich.edu>2004-02-05 12:16:17 -0500
committerDavid Oehmke <doehmke@umich.edu>2004-02-05 12:16:17 -0500
commit95c248c2139ff8d3568e1c92319727777f19920f (patch)
tree97497d04270a5288a02ea8576aa220ed90fced52
parent98948b2e572d10faf1ac91f977837cf2e8a903c3 (diff)
downloadgem5-95c248c2139ff8d3568e1c92319727777f19920f.tar.xz
Modify the emulated system calls to support running the SPEC Int
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
-rw-r--r--arch/alpha/alpha_linux_process.cc12
-rw-r--r--arch/alpha/alpha_tru64_process.cc9
-rw-r--r--sim/syscall_emul.cc28
-rw-r--r--sim/syscall_emul.hh10
4 files changed, 50 insertions, 9 deletions
diff --git a/arch/alpha/alpha_linux_process.cc b/arch/alpha/alpha_linux_process.cc
index d8a05849d..ae197d1ac 100644
--- a/arch/alpha/alpha_linux_process.cc
+++ b/arch/alpha/alpha_linux_process.cc
@@ -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),
diff --git a/arch/alpha/alpha_tru64_process.cc b/arch/alpha/alpha_tru64_process.cc
index ccf4d4d6c..2366baed8 100644
--- a/arch/alpha/alpha_tru64_process.cc
+++ b/arch/alpha/alpha_tru64_process.cc
@@ -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),
diff --git a/sim/syscall_emul.cc b/sim/syscall_emul.cc
index 9955d4421..e953a7308 100644
--- a/sim/syscall_emul.cc
+++ b/sim/syscall_emul.cc
@@ -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;
+}
diff --git a/sim/syscall_emul.hh b/sim/syscall_emul.hh
index df4038f71..b425ef83c 100644
--- a/sim/syscall_emul.hh
+++ b/sim/syscall_emul.hh
@@ -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());
}
}