Merge with head.
--HG-- extra : convert_revision : aa1969b60044f8ed88e689bdd25eeded2b1105ec
This commit is contained in:
commit
bd5a88ba43
4 changed files with 108 additions and 4 deletions
|
@ -73,8 +73,39 @@ void SparcLiveProcess::handleTrap(int trapNum, ThreadContext *tc)
|
||||||
{
|
{
|
||||||
switch(trapNum)
|
switch(trapNum)
|
||||||
{
|
{
|
||||||
|
case 0x01: //Software breakpoint
|
||||||
|
warn("Software breakpoint encountered at pc %#x.\n", tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x02: //Division by zero
|
||||||
|
warn("Software signaled a division by zero at pc %#x.\n",
|
||||||
|
tc->readPC());
|
||||||
|
break;
|
||||||
case 0x03: //Flush window trap
|
case 0x03: //Flush window trap
|
||||||
warn("Ignoring request to flush register windows.\n");
|
flushWindows(tc);
|
||||||
|
break;
|
||||||
|
case 0x04: //Clean windows
|
||||||
|
warn("Ignoring process request for clean register "
|
||||||
|
"windows at pc %#x.\n", tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x05: //Range check
|
||||||
|
warn("Software signaled a range check at pc %#x.\n",
|
||||||
|
tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x06: //Fix alignment
|
||||||
|
warn("Ignoring process request for os assisted unaligned accesses "
|
||||||
|
"at pc %#x.\n", tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x07: //Integer overflow
|
||||||
|
warn("Software signaled an integer overflow at pc %#x.\n",
|
||||||
|
tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x32: //Get integer condition codes
|
||||||
|
warn("Ignoring process request to get the integer condition codes "
|
||||||
|
"at pc %#x.\n", tc->readPC());
|
||||||
|
break;
|
||||||
|
case 0x33: //Set integer condition codes
|
||||||
|
warn("Ignoring process request to set the integer condition codes "
|
||||||
|
"at pc %#x.\n", tc->readPC());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
panic("Unimplemented trap to operating system: trap number %#x.\n", trapNum);
|
panic("Unimplemented trap to operating system: trap number %#x.\n", trapNum);
|
||||||
|
@ -636,3 +667,73 @@ Sparc32LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
|
|
||||||
// num_processes++;
|
// num_processes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Sparc32LiveProcess::flushWindows(ThreadContext *tc)
|
||||||
|
{
|
||||||
|
IntReg Cansave = tc->readIntReg(NumIntArchRegs + 3);
|
||||||
|
IntReg Canrestore = tc->readIntReg(NumIntArchRegs + 4);
|
||||||
|
IntReg Otherwin = tc->readIntReg(NumIntArchRegs + 6);
|
||||||
|
MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
|
||||||
|
MiscReg origCWP = CWP;
|
||||||
|
CWP = (CWP + Cansave + 2) % NWindows;
|
||||||
|
while(NWindows - 2 - Cansave != 0)
|
||||||
|
{
|
||||||
|
if (Otherwin) {
|
||||||
|
panic("Otherwin non-zero.\n");
|
||||||
|
} else {
|
||||||
|
tc->setMiscReg(MISCREG_CWP, CWP);
|
||||||
|
//Do the stores
|
||||||
|
IntReg sp = tc->readIntReg(StackPointerReg);
|
||||||
|
for (int index = 16; index < 32; index++) {
|
||||||
|
IntReg regVal = tc->readIntReg(index);
|
||||||
|
regVal = htog(regVal);
|
||||||
|
if (!tc->getMemPort()->tryWriteBlob(
|
||||||
|
sp + (index - 16) * 4, (uint8_t *)®Val, 4)) {
|
||||||
|
warn("Failed to save register to the stack when "
|
||||||
|
"flushing windows.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Canrestore--;
|
||||||
|
Cansave++;
|
||||||
|
CWP = (CWP + 1) % NWindows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tc->setIntReg(NumIntArchRegs + 3, Cansave);
|
||||||
|
tc->setIntReg(NumIntArchRegs + 4, Canrestore);
|
||||||
|
tc->setMiscReg(MISCREG_CWP, origCWP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sparc64LiveProcess::flushWindows(ThreadContext *tc)
|
||||||
|
{
|
||||||
|
IntReg Cansave = tc->readIntReg(NumIntArchRegs + 3);
|
||||||
|
IntReg Canrestore = tc->readIntReg(NumIntArchRegs + 4);
|
||||||
|
IntReg Otherwin = tc->readIntReg(NumIntArchRegs + 6);
|
||||||
|
MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
|
||||||
|
MiscReg origCWP = CWP;
|
||||||
|
CWP = (CWP + Cansave + 2) % NWindows;
|
||||||
|
while(NWindows - 2 - Cansave != 0)
|
||||||
|
{
|
||||||
|
if (Otherwin) {
|
||||||
|
panic("Otherwin non-zero.\n");
|
||||||
|
} else {
|
||||||
|
tc->setMiscReg(MISCREG_CWP, CWP);
|
||||||
|
//Do the stores
|
||||||
|
IntReg sp = tc->readIntReg(StackPointerReg);
|
||||||
|
for (int index = 16; index < 32; index++) {
|
||||||
|
IntReg regVal = tc->readIntReg(index);
|
||||||
|
regVal = htog(regVal);
|
||||||
|
if (!tc->getMemPort()->tryWriteBlob(
|
||||||
|
sp + 2047 + (index - 16) * 8, (uint8_t *)®Val, 8)) {
|
||||||
|
warn("Failed to save register to the stack when "
|
||||||
|
"flushing windows.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Canrestore--;
|
||||||
|
Cansave++;
|
||||||
|
CWP = (CWP + 1) % NWindows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tc->setIntReg(NumIntArchRegs + 3, Cansave);
|
||||||
|
tc->setIntReg(NumIntArchRegs + 4, Canrestore);
|
||||||
|
tc->setMiscReg(MISCREG_CWP, origCWP);
|
||||||
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ class SparcLiveProcess : public LiveProcess
|
||||||
Addr readSpillStart()
|
Addr readSpillStart()
|
||||||
{ return spillStart; }
|
{ return spillStart; }
|
||||||
|
|
||||||
|
virtual void flushWindows(ThreadContext *tc) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct M5_32_auxv_t
|
struct M5_32_auxv_t
|
||||||
|
@ -116,6 +117,7 @@ class Sparc32LiveProcess : public SparcLiveProcess
|
||||||
|
|
||||||
void argsInit(int intSize, int pageSize);
|
void argsInit(int intSize, int pageSize);
|
||||||
|
|
||||||
|
void flushWindows(ThreadContext *tc);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct M5_64_auxv_t
|
struct M5_64_auxv_t
|
||||||
|
@ -169,6 +171,7 @@ class Sparc64LiveProcess : public SparcLiveProcess
|
||||||
|
|
||||||
void argsInit(int intSize, int pageSize);
|
void argsInit(int intSize, int pageSize);
|
||||||
|
|
||||||
|
void flushWindows(ThreadContext *tc);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __SPARC_PROCESS_HH__
|
#endif // __SPARC_PROCESS_HH__
|
||||||
|
|
|
@ -336,7 +336,7 @@ SparcSolarisProcess::SparcSolarisProcess(const std::string &name,
|
||||||
uint64_t _egid,
|
uint64_t _egid,
|
||||||
uint64_t _pid,
|
uint64_t _pid,
|
||||||
uint64_t _ppid)
|
uint64_t _ppid)
|
||||||
: SparcLiveProcess(name, objFile, system,
|
: Sparc64LiveProcess(name, objFile, system,
|
||||||
stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd,
|
stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd,
|
||||||
_uid, _euid, _gid, _egid, _pid, _ppid),
|
_uid, _euid, _gid, _egid, _pid, _ppid),
|
||||||
Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc))
|
Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc))
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
namespace SparcISA {
|
namespace SparcISA {
|
||||||
|
|
||||||
/// A process with emulated SPARC/Solaris syscalls.
|
/// A process with emulated SPARC/Solaris syscalls.
|
||||||
class SparcSolarisProcess : public SparcLiveProcess
|
class SparcSolarisProcess : public Sparc64LiveProcess
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Constructor.
|
/// Constructor.
|
||||||
|
@ -66,4 +66,4 @@ class SparcSolarisProcess : public SparcLiveProcess
|
||||||
|
|
||||||
|
|
||||||
} // namespace SparcISA
|
} // namespace SparcISA
|
||||||
#endif // __ALPHA_SOLARIS_PROCESS_HH__
|
#endif // __SPARC_SOLARIS_PROCESS_HH__
|
||||||
|
|
Loading…
Reference in a new issue