syscall_emul: [patch 14/22] adds identifier system calls
authorBrandon Potter <brandon.potter@amd.com>
Mon, 27 Feb 2017 19:10:02 +0000 (14:10 -0500)
committerBrandon Potter <brandon.potter@amd.com>
Mon, 27 Feb 2017 19:10:02 +0000 (14:10 -0500)
This changeset add fields to the process object and adds the following
three system calls: setpgid, gettid, getpid.

src/arch/x86/linux/process.cc
src/sim/Process.py
src/sim/process.cc
src/sim/process.hh
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh
src/sim/system.hh
tests/quick/se/01.hello-2T-smt/test.py

index a5078c617f58631cdc5716d036571c4e58d9df44..56688fc89274f64c29fa2c320ad5b8b6591154e4 100644 (file)
@@ -329,7 +329,7 @@ static SyscallDesc syscallDescs64[] = {
     /* 106 */ SyscallDesc("setgid", unimplementedFunc),
     /* 107 */ SyscallDesc("geteuid", geteuidFunc),
     /* 108 */ SyscallDesc("getegid", getegidFunc),
-    /* 109 */ SyscallDesc("setpgid", unimplementedFunc),
+    /* 109 */ SyscallDesc("setpgid", setpgidFunc),
     /* 110 */ SyscallDesc("getppid", getppidFunc),
     /* 111 */ SyscallDesc("getpgrp", unimplementedFunc),
     /* 112 */ SyscallDesc("setsid", unimplementedFunc),
@@ -406,7 +406,7 @@ static SyscallDesc syscallDescs64[] = {
     /* 183 */ SyscallDesc("afs_syscall", unimplementedFunc),
     /* 184 */ SyscallDesc("tuxcall", unimplementedFunc),
     /* 185 */ SyscallDesc("security", unimplementedFunc),
-    /* 186 */ SyscallDesc("gettid", unimplementedFunc),
+    /* 186 */ SyscallDesc("gettid", gettidFunc),
     /* 187 */ SyscallDesc("readahead", unimplementedFunc),
     /* 188 */ SyscallDesc("setxattr", unimplementedFunc),
     /* 189 */ SyscallDesc("lsetxattr", unimplementedFunc),
@@ -563,7 +563,7 @@ static SyscallDesc syscallDescs32[] = {
     /*  17 */ SyscallDesc("break", unimplementedFunc),
     /*  18 */ SyscallDesc("oldstat", unimplementedFunc),
     /*  19 */ SyscallDesc("lseek", unimplementedFunc),
-    /*  20 */ SyscallDesc("getpid", unimplementedFunc),
+    /*  20 */ SyscallDesc("getpid", getpidFunc),
     /*  21 */ SyscallDesc("mount", unimplementedFunc),
     /*  22 */ SyscallDesc("umount", unimplementedFunc),
     /*  23 */ SyscallDesc("setuid", unimplementedFunc),
@@ -600,7 +600,7 @@ static SyscallDesc syscallDescs32[] = {
     /*  54 */ SyscallDesc("ioctl", ioctlFunc<X86Linux32>),
     /*  55 */ SyscallDesc("fcntl", fcntlFunc),
     /*  56 */ SyscallDesc("mpx", unimplementedFunc),
-    /*  57 */ SyscallDesc("setpgid", unimplementedFunc),
+    /*  57 */ SyscallDesc("setpgid", setpgidFunc),
     /*  58 */ SyscallDesc("ulimit", unimplementedFunc),
     /*  59 */ SyscallDesc("oldolduname", unimplementedFunc),
     /*  60 */ SyscallDesc("umask", unimplementedFunc),
@@ -767,7 +767,7 @@ static SyscallDesc syscallDescs32[] = {
     /* 221 */ SyscallDesc("getdents64", unimplementedFunc),
     /* 222 */ SyscallDesc("fcntl64", unimplementedFunc),
     /* 223 */ SyscallDesc("unused", unimplementedFunc),
-    /* 224 */ SyscallDesc("gettid", unimplementedFunc),
+    /* 224 */ SyscallDesc("gettid", gettidFunc),
     /* 225 */ SyscallDesc("readahead", unimplementedFunc),
     /* 226 */ SyscallDesc("setxattr", unimplementedFunc),
     /* 227 */ SyscallDesc("lsetxattr", unimplementedFunc),
index 2d7c7d22c5c6def970a3af36a461807900a3b6f5..9c4ee4760edc553506d9c2f207c6d7b8905b7a5e 100644 (file)
@@ -47,7 +47,8 @@ class Process(SimObject):
     gid = Param.Int(100, 'group id')
     egid = Param.Int(100, 'effective group id')
     pid = Param.Int(100, 'process id')
-    ppid = Param.Int(99, 'parent process id')
+    ppid = Param.Int(0, 'parent process id')
+    pgid = Param.Int(100, 'process group id')
 
     executable = Param.String('', "executable (overrides cmd[0] if set)")
     cmd = VectorParam.String("command line (executable plus arguments)")
index 5acfa88b3ccf91ecec2512f0b82183fae807303d..caf98612380b4724369b6a401498e7b260993c3b 100644 (file)
@@ -112,11 +112,18 @@ Process::Process(ProcessParams * params, ObjectFile * obj_file)
       _uid(params->uid), _euid(params->euid),
       _gid(params->gid), _egid(params->egid),
       _pid(params->pid), _ppid(params->ppid),
-      drivers(params->drivers),
+      _pgid(params->pgid), drivers(params->drivers),
       fds(make_shared<FDArray>(params->input, params->output, params->errout))
 {
     mmap_end = 0;
 
+    if (_pid >= System::maxPID)
+        fatal("_pid is too large: %d", _pid);
+
+    auto ret_pair = system->PIDs.emplace(_pid);
+    if (!ret_pair.second)
+        fatal("_pid %d is already used", _pid);
+
     // load up symbols, if any... these may be used for debugging or
     // profiling.
     if (!debugSymbolTable) {
index 101e4a31c529047de0ee40c68558fa60a5099616..fa2eff6fa703dbfcbb589b396e31531aa69ff9cc 100644 (file)
@@ -95,6 +95,9 @@ class Process : public SimObject
     inline uint64_t egid() { return _egid; }
     inline uint64_t pid() { return _pid; }
     inline uint64_t ppid() { return _ppid; }
+    inline uint64_t pgid() { return _pgid; }
+    inline uint64_t tgid() { return _tgid; }
+    inline void setpgid(uint64_t pgid) { _pgid = pgid; }
 
     const char *progName() const { return executable.c_str(); }
     std::string fullPath(const std::string &filename);
@@ -199,6 +202,8 @@ class Process : public SimObject
     // pid of the process and it's parent
     uint64_t _pid;
     uint64_t _ppid;
+    uint64_t _pgid;
+    uint64_t _tgid;
 
     // Emulated drivers available to this process
     std::vector<EmulatedDriver *> drivers;
index 281e4c0211033afe44a3e390c1fe8e5550b549d2..c6b89b0c7d5e191c2227e8c74411d71a190fdaf1 100644 (file)
@@ -729,6 +729,41 @@ pipePseudoFunc(SyscallDesc *desc, int callnum, Process *process,
     return sim_fds[0];
 }
 
+SyscallReturn
+setpgidFunc(SyscallDesc *desc, int callnum, Process *process,
+            ThreadContext *tc)
+{
+    int index = 0;
+    int pid = process->getSyscallArg(tc, index);
+    int pgid = process->getSyscallArg(tc, index);
+
+    if (pgid < 0)
+        return -EINVAL;
+
+    if (pid == 0) {
+        process->setpgid(process->pid());
+        return 0;
+    }
+
+    Process *matched_ph = NULL;
+    System *sysh = tc->getSystemPtr();
+
+    // Retrieves process pointer from active/suspended thread contexts.
+    for (int i = 0; i < sysh->numContexts(); i++) {
+        if (sysh->threadContexts[i]->status() != ThreadContext::Halted) {
+            Process *temp_h = sysh->threadContexts[i]->getProcessPtr();
+            Process *walk_ph = (Process*)temp_h;
+
+            if (walk_ph && walk_ph->pid() == process->pid())
+                matched_ph = walk_ph;
+        }
+    }
+
+    assert(matched_ph != NULL);
+    matched_ph->setpgid((pgid == 0) ? matched_ph->pid() : pgid);
+
+    return 0;
+}
 
 SyscallReturn
 getpidPseudoFunc(SyscallDesc *desc, int callnum, Process *process,
@@ -780,11 +815,13 @@ SyscallReturn
 getpidFunc(SyscallDesc *desc, int callnum, Process *process,
            ThreadContext *tc)
 {
-    // Make up a PID.  There's no interprocess communication in
-    // fake_syscall mode, so there's no way for a process to know it's
-    // not getting a unique value.
+    return process->tgid();
+}
 
-    tc->setIntReg(SyscallPseudoReturnReg, process->ppid()); //PID
+SyscallReturn
+gettidFunc(SyscallDesc *desc, int callnum, Process *process,
+           ThreadContext *tc)
+{
     return process->pid();
 }
 
index 1ad2f087fb0a0d3dee81b47b9e0faabfaec27a25..e0cbbe786849fbd0d6a0de96db9488f2377546ab 100644 (file)
@@ -216,11 +216,17 @@ SyscallReturn ftruncate64Func(SyscallDesc *desc, int num,
 SyscallReturn umaskFunc(SyscallDesc *desc, int num,
                         Process *p, ThreadContext *tc);
 
+/// Target gettid() handler.
+SyscallReturn gettidFunc(SyscallDesc *desc, int num,
+                         Process *p, ThreadContext *tc);
 
 /// Target chown() handler.
 SyscallReturn chownFunc(SyscallDesc *desc, int num,
                         Process *p, ThreadContext *tc);
 
+/// Target setpgid() handler.
+SyscallReturn setpgidFunc(SyscallDesc *desc, int num,
+                          Process *p, ThreadContext *tc);
 
 /// Target fchown() handler.
 SyscallReturn fchownFunc(SyscallDesc *desc, int num,
index c3667fe099c58023fb427b54bf7074908e2a8066..3954b35c28499cf375a09892a206bbc2f3379a8f 100644 (file)
@@ -551,6 +551,11 @@ class System : public MemObject
     // For futex system call
     std::map<uint64_t, std::list<ThreadContext *> * > futexMap;
 
+    static const int maxPID = 32768;
+
+    /** Process set to track which PIDs have already been allocated */
+    std::set<int> PIDs;
+
   protected:
 
     /**
index b6c3c71a217e3417b59caf60e81c4bfe237cd08e..acfdb9bc2b1fc3469e6aa6bacca40d92bae5f15e 100644 (file)
@@ -26,7 +26,8 @@
 #
 # Authors: Korey Sewell
 
-process1 = Process(cmd = 'hello', executable = binpath('hello'))
-process2 = Process(cmd = 'hello', executable = binpath('hello'))
+process1 = Process(cmd = 'hello', executable = binpath('hello'), pid = 100)
+process2 = Process(cmd = 'hello', executable = binpath('hello'),
+                   pid = 101, ppid = 100)
 
 root.system.cpu[0].workload = [process1, process2]