diff options
Diffstat (limited to 'src/arch/sparc')
-rw-r--r-- | src/arch/sparc/linux/process.cc | 24 | ||||
-rw-r--r-- | src/arch/sparc/linux/process.hh | 4 | ||||
-rw-r--r-- | src/arch/sparc/solaris/process.cc | 6 | ||||
-rw-r--r-- | src/arch/sparc/solaris/process.hh | 2 |
4 files changed, 30 insertions, 6 deletions
diff --git a/src/arch/sparc/linux/process.cc b/src/arch/sparc/linux/process.cc index 5fb3b0348..530cf8512 100644 --- a/src/arch/sparc/linux/process.cc +++ b/src/arch/sparc/linux/process.cc @@ -100,12 +100,18 @@ Sparc32LinuxProcess::Sparc32LinuxProcess(ProcessParams * params, : Sparc32Process(params, objFile) {} -void Sparc32LinuxProcess::handleTrap(int trapNum, ThreadContext *tc, - Fault *fault) +void +Sparc32LinuxProcess::syscall(ThreadContext *tc, Fault *fault) +{ + doSyscall(tc->readIntReg(1), tc, fault); +} + +void +Sparc32LinuxProcess::handleTrap(int trapNum, ThreadContext *tc, Fault *fault) { switch (trapNum) { case 0x10: //Linux 32 bit syscall trap - tc->syscall(tc->readIntReg(1), fault); + tc->syscall(fault); break; default: SparcProcess::handleTrap(trapNum, tc, fault); @@ -117,13 +123,19 @@ Sparc64LinuxProcess::Sparc64LinuxProcess(ProcessParams * params, : Sparc64Process(params, objFile) {} -void Sparc64LinuxProcess::handleTrap(int trapNum, ThreadContext *tc, - Fault *fault) +void +Sparc64LinuxProcess::syscall(ThreadContext *tc, Fault *fault) +{ + doSyscall(tc->readIntReg(1), tc, fault); +} + +void +Sparc64LinuxProcess::handleTrap(int trapNum, ThreadContext *tc, Fault *fault) { switch (trapNum) { // case 0x10: // Linux 32 bit syscall trap case 0x6d: // Linux 64 bit syscall trap - tc->syscall(tc->readIntReg(1), fault); + tc->syscall(fault); break; default: SparcProcess::handleTrap(trapNum, tc, fault); diff --git a/src/arch/sparc/linux/process.hh b/src/arch/sparc/linux/process.hh index f5260cdf1..5c673db26 100644 --- a/src/arch/sparc/linux/process.hh +++ b/src/arch/sparc/linux/process.hh @@ -70,6 +70,8 @@ class Sparc32LinuxProcess : public SparcLinuxProcess, public Sparc32Process return SparcLinuxProcess::getDesc32(callnum); } + void syscall(ThreadContext *tc, Fault *fault) override; + void handleTrap(int trapNum, ThreadContext *tc, Fault *fault); }; @@ -86,6 +88,8 @@ class Sparc64LinuxProcess : public SparcLinuxProcess, public Sparc64Process return SparcLinuxProcess::getDesc(callnum); } + void syscall(ThreadContext *tc, Fault *fault) override; + void handleTrap(int trapNum, ThreadContext *tc, Fault *fault); }; diff --git a/src/arch/sparc/solaris/process.cc b/src/arch/sparc/solaris/process.cc index 18f2316a2..d51b9519c 100644 --- a/src/arch/sparc/solaris/process.cc +++ b/src/arch/sparc/solaris/process.cc @@ -368,3 +368,9 @@ SparcSolarisProcess::getDesc(int callnum) return NULL; return &syscallDescs[callnum]; } + +void +SparcSolarisProcess::syscall(ThreadContext *tc, Fault *fault) +{ + doSyscall(tc->readIntReg(1), tc, fault); +} diff --git a/src/arch/sparc/solaris/process.hh b/src/arch/sparc/solaris/process.hh index 660802cef..39e3aef17 100644 --- a/src/arch/sparc/solaris/process.hh +++ b/src/arch/sparc/solaris/process.hh @@ -49,6 +49,8 @@ class SparcSolarisProcess : public Sparc64Process /// The target system's hostname. static const char *hostname; + void syscall(ThreadContext *tc, Fault *fault) override; + /// Array of syscall descriptors, indexed by call number. static SyscallDesc syscallDescs[]; |