Generate a fault when a privileged PAL call is

executed in non-privileged (non-PAL) mode.

--HG--
extra : convert_revision : c8823a1eec27d801a1ed6110ade07354c4dd2a32
This commit is contained in:
Steve Reinhardt 2003-12-09 14:19:35 -08:00
parent 37a718e45e
commit f13509e968

View file

@ -1399,6 +1399,7 @@ declare {{
protected: protected:
int palFunc; ///< Function code part of instruction int palFunc; ///< Function code part of instruction
int palOffset; ///< Target PC, offset from IPR_PAL_BASE int palOffset; ///< Target PC, offset from IPR_PAL_BASE
bool palPriv; ///< is this call privileged?
/// Constructor. /// Constructor.
CallPalBase(const char *mnem, MachInst _machInst, CallPalBase(const char *mnem, MachInst _machInst,
@ -1406,7 +1407,7 @@ declare {{
: AlphaStaticInst(mnem, _machInst, __opClass), : AlphaStaticInst(mnem, _machInst, __opClass),
palFunc(PALFUNC) palFunc(PALFUNC)
{ {
int palPriv = ((machInst & 0x80) != 0); palPriv = ((machInst & 0x80) != 0);
int shortPalFunc = (machInst & 0x3f); int shortPalFunc = (machInst & 0x3f);
palOffset = 0x2001 + (palPriv << 12) + (shortPalFunc << 6); palOffset = 0x2001 + (palPriv << 12) + (shortPalFunc << 6);
} }
@ -2352,20 +2353,26 @@ decode OPCODE default Unknown::unknown() {
#ifdef FULL_SYSTEM #ifdef FULL_SYSTEM
0x00: CallPal::call_pal({{ 0x00: CallPal::call_pal({{
// check to see if simulator wants to do something special if (palPriv && !PC_PAL(xc->regs.pc)) {
// on this PAL call (including maybe suppress it) // attempt to do privileged PAL call in non-PAL mode
bool dopal = xc->simPalCheck(palFunc); fault = Unimplemented_Opcode_Fault;
if (!xc->misspeculating()) {
Annotate::Callpal(xc, palFunc);
} }
else {
// check to see if simulator wants to do something special
// on this PAL call (including maybe suppress it)
bool dopal = xc->simPalCheck(palFunc);
if (dopal) {
if (!xc->misspeculating()) { if (!xc->misspeculating()) {
AlphaISA::swap_palshadow(&xc->regs, true); Annotate::Callpal(xc, palFunc);
}
if (dopal) {
if (!xc->misspeculating()) {
AlphaISA::swap_palshadow(&xc->regs, true);
}
xc->setIpr(AlphaISA::IPR_EXC_ADDR, NPC);
NPC = xc->readIpr(AlphaISA::IPR_PAL_BASE, fault) + palOffset;
} }
xc->setIpr(AlphaISA::IPR_EXC_ADDR, NPC);
NPC = xc->readIpr(AlphaISA::IPR_PAL_BASE, fault) + palOffset;
} }
}}); }});
#else #else