diff options
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/isa/decoder/one_byte_opcodes.isa | 2 | ||||
-rw-r--r-- | src/arch/x86/isa/decoder/two_byte_opcodes.isa | 4 | ||||
-rw-r--r-- | src/arch/x86/linux/process.cc | 29 | ||||
-rw-r--r-- | src/arch/x86/linux/process.hh | 2 | ||||
-rw-r--r-- | src/arch/x86/process.cc | 13 | ||||
-rw-r--r-- | src/arch/x86/process.hh | 2 | ||||
-rw-r--r-- | src/arch/x86/pseudo_inst.cc | 2 |
7 files changed, 31 insertions, 23 deletions
diff --git a/src/arch/x86/isa/decoder/one_byte_opcodes.isa b/src/arch/x86/isa/decoder/one_byte_opcodes.isa index 95bc7a5c1..1fbf32748 100644 --- a/src/arch/x86/isa/decoder/one_byte_opcodes.isa +++ b/src/arch/x86/isa/decoder/one_byte_opcodes.isa @@ -400,7 +400,7 @@ // will sign extend it, and there's no easy way to // specify only checking the first byte. 0xffffffffffffff80: - SyscallInst::int80('xc->syscall(Rax, &fault)', + SyscallInst::int80('xc->syscall(&fault)', IsSyscall, IsNonSpeculative, IsSerializeAfter); } diff --git a/src/arch/x86/isa/decoder/two_byte_opcodes.isa b/src/arch/x86/isa/decoder/two_byte_opcodes.isa index 51154d5b8..43a62d76c 100644 --- a/src/arch/x86/isa/decoder/two_byte_opcodes.isa +++ b/src/arch/x86/isa/decoder/two_byte_opcodes.isa @@ -235,7 +235,7 @@ } } 0x05: decode FullSystemInt { - 0: SyscallInst::syscall('xc->syscall(Rax, &fault)', + 0: SyscallInst::syscall('xc->syscall(&fault)', IsSyscall, IsNonSpeculative, IsSerializeAfter); default: decode MODE_MODE { @@ -429,7 +429,7 @@ 0x2: Inst::RDMSR(); 0x3: rdpmc(); 0x4: decode FullSystemInt { - 0: SyscallInst::sysenter('xc->syscall(Rax, &fault)', + 0: SyscallInst::sysenter('xc->syscall(&fault)', IsSyscall, IsNonSpeculative, IsSerializeAfter); default: sysenter(); diff --git a/src/arch/x86/linux/process.cc b/src/arch/x86/linux/process.cc index 6befafde4..d58d965af 100644 --- a/src/arch/x86/linux/process.cc +++ b/src/arch/x86/linux/process.cc @@ -584,8 +584,15 @@ X86_64LinuxProcess::X86_64LinuxProcess(ProcessParams * params, sizeof(syscallDescs64) / sizeof(SyscallDesc)) {} -void X86_64LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc, - Process *process, RegVal flags) +void +X86_64LinuxProcess::syscall(ThreadContext *tc, Fault *fault) +{ + doSyscall(tc->readIntReg(INTREG_RAX), tc, fault); +} + +void +X86_64LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc, + Process *process, RegVal flags) { X86_64Process::clone(old_tc, new_tc, (X86_64Process*)process, flags); } @@ -926,8 +933,22 @@ I386LinuxProcess::I386LinuxProcess(ProcessParams * params, ObjectFile *objFile) sizeof(syscallDescs32) / sizeof(SyscallDesc)) {} -void I386LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc, - Process *process, RegVal flags) +void +I386LinuxProcess::syscall(ThreadContext *tc, Fault *fault) +{ + PCState pc = tc->pcState(); + Addr eip = pc.pc(); + if (eip >= vsyscallPage.base && + eip < vsyscallPage.base + vsyscallPage.size) { + pc.npc(vsyscallPage.base + vsyscallPage.vsysexitOffset); + tc->pcState(pc); + } + doSyscall(tc->readIntReg(INTREG_RAX), tc, fault); +} + +void +I386LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc, + Process *process, RegVal flags) { I386Process::clone(old_tc, new_tc, (I386Process*)process, flags); } diff --git a/src/arch/x86/linux/process.hh b/src/arch/x86/linux/process.hh index d4c9b0cf6..5f3135dd9 100644 --- a/src/arch/x86/linux/process.hh +++ b/src/arch/x86/linux/process.hh @@ -54,6 +54,7 @@ class X86_64LinuxProcess : public X86_64Process public: /// Constructor. X86_64LinuxProcess(ProcessParams * params, ObjectFile *objFile); + void syscall(ThreadContext *tc, Fault *fault) override; void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *process, RegVal flags); }; @@ -63,6 +64,7 @@ class I386LinuxProcess : public I386Process public: /// Constructor. I386LinuxProcess(ProcessParams * params, ObjectFile *objFile); + void syscall(ThreadContext *tc, Fault *fault) override; void clone(ThreadContext *old_tc, ThreadContext *new_tc, Process *process, RegVal flags); }; diff --git a/src/arch/x86/process.cc b/src/arch/x86/process.cc index f0e8ead98..df22f238a 100644 --- a/src/arch/x86/process.cc +++ b/src/arch/x86/process.cc @@ -146,19 +146,6 @@ X86_64Process::X86_64Process(ProcessParams *params, ObjectFile *objFile, next_thread_stack_base, mmap_end); } -void -I386Process::syscall(int64_t callnum, ThreadContext *tc, Fault *fault) -{ - PCState pc = tc->pcState(); - Addr eip = pc.pc(); - if (eip >= vsyscallPage.base && - eip < vsyscallPage.base + vsyscallPage.size) { - pc.npc(vsyscallPage.base + vsyscallPage.vsysexitOffset); - tc->pcState(pc); - } - X86Process::syscall(callnum, tc, fault); -} - I386Process::I386Process(ProcessParams *params, ObjectFile *objFile, SyscallDesc *_syscallDescs, int _numSyscallDescs) diff --git a/src/arch/x86/process.hh b/src/arch/x86/process.hh index 37545e9d9..4c424cd7d 100644 --- a/src/arch/x86/process.hh +++ b/src/arch/x86/process.hh @@ -176,8 +176,6 @@ namespace X86ISA void argsInit(int pageSize); void initState() override; - void syscall(int64_t callnum, ThreadContext *tc, - Fault *fault) override; RegVal getSyscallArg(ThreadContext *tc, int &i) override; RegVal getSyscallArg(ThreadContext *tc, int &i, int width) override; void clone(ThreadContext *old_tc, ThreadContext *new_tc, diff --git a/src/arch/x86/pseudo_inst.cc b/src/arch/x86/pseudo_inst.cc index 62d8b25c5..68bc74acc 100644 --- a/src/arch/x86/pseudo_inst.cc +++ b/src/arch/x86/pseudo_inst.cc @@ -50,7 +50,7 @@ m5Syscall(ThreadContext *tc) DPRINTF(PseudoInst, "PseudoInst::m5Syscall()\n"); Fault fault; - tc->syscall(tc->readIntReg(INTREG_RAX), &fault); + tc->syscall(&fault); } /* |