summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2017-05-24 02:49:51 -0700
committerGabe Black <gabeblack@google.com>2017-05-25 21:50:03 +0000
commit91228e9b222513ffc8008558fd4b3f468cccdbbe (patch)
tree65313e11701cf649af9352ffbaef169fd52b869e
parentaf7641a3e9d65ab11247c2182f38923186e0581b (diff)
downloadgem5-91228e9b222513ffc8008558fd4b3f468cccdbbe.tar.xz
x86: sim: Make 32 bit x86 processes work again.
When the LiveProcess class was renamed to be just Process, the CL author also changed the syscall function from a virtual function into a regular one. Unfortunately, the I386Process class overrode the syscall function to adjust the return address so that control would return to the right place. Without that adjustment, 32 bit x86 process would segfault and die immediately after their first system call. This change reinstates the virtual specifier on the base syscall function, and adds an override keyword on the I386Process's version so that it won't be orphaned again in the future. It also fixes some small style issues the style checker script complained about. Change-Id: I0d1178ea0eda6676050c8fc043820a2bb4d99c0d Reviewed-on: https://gem5-review.googlesource.com/3500 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Brandon Potter <Brandon.Potter@amd.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
-rw-r--r--src/arch/x86/process.hh8
-rw-r--r--src/sim/process.hh2
2 files changed, 6 insertions, 4 deletions
diff --git a/src/arch/x86/process.hh b/src/arch/x86/process.hh
index 4240ee625..fe3134844 100644
--- a/src/arch/x86/process.hh
+++ b/src/arch/x86/process.hh
@@ -43,9 +43,9 @@
#include <string>
#include <vector>
+#include "mem/multi_level_page_table.hh"
#include "sim/aux_vector.hh"
#include "sim/process.hh"
-#include "mem/multi_level_page_table.hh"
class SyscallDesc;
@@ -175,7 +175,8 @@ namespace X86ISA
void argsInit(int pageSize);
void initState();
- void syscall(int64_t callnum, ThreadContext *tc, Fault *fault);
+ void syscall(int64_t callnum, ThreadContext *tc,
+ Fault *fault) override;
X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val);
@@ -186,7 +187,8 @@ namespace X86ISA
/**
* Declaration of architectural page table for x86.
*
- * These page tables are stored in system memory and respect x86 specification.
+ * These page tables are stored in system memory and respect x86
+ * specification.
*/
typedef MultiLevelPageTable<PageTableOps> ArchPageTable;
diff --git a/src/sim/process.hh b/src/sim/process.hh
index add3eb357..5da30a4c3 100644
--- a/src/sim/process.hh
+++ b/src/sim/process.hh
@@ -71,7 +71,7 @@ class Process : public SimObject
void initState() override;
DrainState drain() override;
- void syscall(int64_t callnum, ThreadContext *tc, Fault *fault);
+ virtual void syscall(int64_t callnum, ThreadContext *tc, Fault *fault);
virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i) = 0;
virtual TheISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
virtual void setSyscallArg(ThreadContext *tc, int i,