1
0
Fork 0

use inverted stack mask in normal/full core;

issue exception when calling type zero descriptor;
add INVLPG opcode


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2617
This commit is contained in:
Sebastian Strohhäcker 2006-04-27 13:22:27 +00:00
parent eedd8cc98c
commit 19955c36e8
8 changed files with 23 additions and 6 deletions

View file

@ -447,12 +447,12 @@ l_M_Ed:
goto nextopcode;
}
case D_LEAVEw:
reg_esp&=~cpu.stack.mask;
reg_esp&=cpu.stack.notmask;
reg_esp|=(reg_ebp&cpu.stack.mask);
reg_bp=Pop_16();
goto nextopcode;
case D_LEAVEd:
reg_esp&=~cpu.stack.mask;
reg_esp&=cpu.stack.notmask;
reg_esp|=(reg_ebp&cpu.stack.mask);
reg_ebp=Pop_32();
goto nextopcode;

View file

@ -450,6 +450,11 @@ switch (inst.code.op) {
FillFlags();
if (CPU_LMSW(inst_op1_w)) RunException();
goto nextopcode;
case 7: /* INVLPG */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
FillFlags();
PAGING_ClearTLB();
goto nextopcode;
default:
LOG(LOG_CPU,LOG_ERROR)("Group 7 Illegal subfunction %X",inst.rm_index);
goto illegalopcode;

View file

@ -26,6 +26,7 @@
#include "callback.h"
#include "pic.h"
#include "fpu.h"
#include "paging.h"
#if C_DEBUG
#include "debug.h"

View file

@ -92,6 +92,10 @@
limit=LoadMw(eaa);
if (CPU_LMSW(limit)) RUNEXCEPTION();
break;
case 0x07: /* INVLPG */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
PAGING_ClearTLB();
break;
}
} else {
GetEArw;Bitu limit;

View file

@ -492,7 +492,7 @@
}
break;
CASE_D(0xc9) /* LEAVE */
reg_esp&=~cpu.stack.mask;
reg_esp&=cpu.stack.notmask;
reg_esp|=(reg_ebp&cpu.stack.mask);
reg_ebp=Pop_32();
break;

View file

@ -94,6 +94,10 @@
limit=LoadMw(eaa);
if (CPU_LMSW((Bit16u)limit)) RUNEXCEPTION();
break;
case 0x07: /* INVLPG */
if (cpu.pmode && cpu.cpl) EXCEPTION(EXCEPTION_GP);
PAGING_ClearTLB();
break;
}
} else {
GetEArd;Bitu limit;

View file

@ -712,7 +712,7 @@
}
break;
CASE_W(0xc9) /* LEAVE */
reg_esp&=~cpu.stack.mask;
reg_esp&=cpu.stack.notmask;
reg_esp|=(reg_ebp&cpu.stack.mask);
reg_bp=Pop_16();
break;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: cpu.cpp,v 1.80 2006-04-18 17:44:25 c2woody Exp $ */
/* $Id: cpu.cpp,v 1.81 2006-04-27 13:22:27 c2woody Exp $ */
#include <assert.h>
#include "dosbox.h"
@ -1147,9 +1147,12 @@ call_code:
LOG(LOG_CPU,LOG_NORMAL)("CALL:TSS to %X",selector);
CPU_SwitchTask(selector,TSwitch_CALL_INT,oldeip);
break;
case DESC_INVALID:
// used by some installers
CPU_Exception(EXCEPTION_GP,selector & 0xfffc);
return;
default:
E_Exit("CALL:Descriptor type %x unsupported",call.Type());
}
}
assert(1);