Author: aandrejevic
Date: Sat Sep 19 22:12:56 2015
New Revision: 69297
URL: http://svn.reactos.org/svn/reactos?rev=69297&view=rev
Log:
[NTVDM]
Save and restore the general purpose and segment registers around Int32Call
calls in the BIOS. Also, make sure CF doesn't get set by the called interrupt
procedure.
Modified:
trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/kbdbios32.c
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/bios32.c [iso-8859-1] Sat Sep 19 22:12:56 2015
@@ -721,7 +721,30 @@
* because some programs may hook only BIOS_SYS_TIMER_INTERRUPT
* for their purpose...
*/
+
+ WORD AX = getAX();
+ WORD CX = getCX();
+ WORD DX = getDX();
+ WORD BX = getBX();
+ WORD BP = getBP();
+ WORD SI = getSI();
+ WORD DI = getDI();
+ WORD DS = getDS();
+ WORD ES = getES();
+
Int32Call(&BiosContext, BIOS_SYS_TIMER_INTERRUPT);
+
+ setAX(AX);
+ setCX(CX);
+ setDX(DX);
+ setBX(BX);
+ setBP(BP);
+ setSI(SI);
+ setDI(DI);
+ setDS(DS);
+ setES(ES);
+ setCF(0);
+
// BiosSystemTimerInterrupt(Stack);
PicIRQComplete(LOBYTE(Stack[STACK_INT_NUM]));
}
Modified: trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/kbdbios32.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/bios…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/kbdbios32.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/bios/bios32/kbdbios32.c [iso-8859-1] Sat Sep 19 22:12:56 2015
@@ -209,8 +209,15 @@
* In return, if CF is set we continue processing the scan code
* stored in AL, and if not, we skip it.
*/
- BYTE CF = getCF();
WORD AX = getAX();
+ WORD CX = getCX();
+ WORD DX = getDX();
+ WORD BX = getBX();
+ WORD BP = getBP();
+ WORD SI = getSI();
+ WORD DI = getDI();
+ WORD DS = getDS();
+ WORD ES = getES();
setCF(1);
setAL(IOReadB(PS2_DATA_PORT));
@@ -222,7 +229,15 @@
ScanCode = getAL();
setAX(AX);
- setCF(CF);
+ setCX(CX);
+ setDX(DX);
+ setBX(BX);
+ setBP(BP);
+ setSI(SI);
+ setDI(DI);
+ setDS(DS);
+ setES(ES);
+ setCF(0);
if (ScanCode == 0xE0)
{