summaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/serialize.cc4
-rw-r--r--sim/serialize.hh6
-rw-r--r--sim/syscall_emul.cc28
-rw-r--r--sim/syscall_emul.hh10
4 files changed, 42 insertions, 6 deletions
diff --git a/sim/serialize.cc b/sim/serialize.cc
index d836e7c20..f8d6b46bf 100644
--- a/sim/serialize.cc
+++ b/sim/serialize.cc
@@ -187,7 +187,7 @@ class Globals : public Serializable
{
public:
const string name() const;
- void serialize(ostream& os);
+ void serialize(ostream &os);
void unserialize(Checkpoint *cp);
};
@@ -201,7 +201,7 @@ Globals::name() const
}
void
-Globals::serialize(ostream& os)
+Globals::serialize(ostream &os)
{
nameOut(os);
SERIALIZE_SCALAR(curTick);
diff --git a/sim/serialize.hh b/sim/serialize.hh
index 43dbd2c85..36622b7fe 100644
--- a/sim/serialize.hh
+++ b/sim/serialize.hh
@@ -103,8 +103,8 @@ objParamIn(Checkpoint *cp, const std::string &section,
class Serializable
{
protected:
- void nameOut(std::ostream& os);
- void nameOut(std::ostream& os, const std::string &_name);
+ void nameOut(std::ostream &os);
+ void nameOut(std::ostream &os, const std::string &_name);
public:
Serializable() {}
@@ -113,7 +113,7 @@ class Serializable
// manditory virtual function, so objects must provide names
virtual const std::string name() const = 0;
- virtual void serialize(std::ostream& os) {}
+ virtual void serialize(std::ostream &os) {}
virtual void unserialize(Checkpoint *cp, const std::string &section) {}
static Serializable *create(Checkpoint *cp,
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());
}
}