From a98544e517b5b3f8340422cef2018e0bad58ed12 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 19 Oct 2013 18:36:04 +0000 Subject: [PATCH] [FAST486] Implement PUSH/POP FS/GS. svn path=/branches/ntvdm/; revision=60711 --- lib/fast486/extraops.c | 48 ++++++++++++++++++++++++++++++++++++++---- lib/fast486/extraops.h | 4 ++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/fast486/extraops.c b/lib/fast486/extraops.c index 18dc09aaaec..de06eff2ed3 100644 --- a/lib/fast486/extraops.c +++ b/lib/fast486/extraops.c @@ -198,16 +198,16 @@ Fast486ExtendedHandlers[FAST486_NUM_OPCODE_HANDLERS] = Fast486ExtOpcodeConditionalSet, Fast486ExtOpcodeConditionalSet, Fast486ExtOpcodeConditionalSet, - NULL, // TODO: OPCODE 0xA0 NOT IMPLEMENTED - NULL, // TODO: OPCODE 0xA1 NOT IMPLEMENTED + Fast486ExtOpcodePushFs, + Fast486ExtOpcodePopFs, NULL, // Invalid NULL, // TODO: OPCODE 0xA3 NOT IMPLEMENTED NULL, // TODO: OPCODE 0xA4 NOT IMPLEMENTED NULL, // TODO: OPCODE 0xA5 NOT IMPLEMENTED NULL, // Invalid NULL, // Invalid - NULL, // TODO: OPCODE 0xA8 NOT IMPLEMENTED - NULL, // TODO: OPCODE 0xA9 NOT IMPLEMENTED + Fast486ExtOpcodePushGs, + Fast486ExtOpcodePopGs, NULL, // TODO: OPCODE 0xAA NOT IMPLEMENTED NULL, // TODO: OPCODE 0xAB NOT IMPLEMENTED NULL, // TODO: OPCODE 0xAC NOT IMPLEMENTED @@ -298,6 +298,46 @@ Fast486ExtendedHandlers[FAST486_NUM_OPCODE_HANDLERS] = /* PUBLIC FUNCTIONS ***********************************************************/ +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePushFs) +{ + /* Call the internal API */ + return Fast486StackPush(State, State->SegmentRegs[FAST486_REG_FS].Selector); +} + +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePopFs) +{ + ULONG NewSelector; + + if (!Fast486StackPop(State, &NewSelector)) + { + /* Exception occurred */ + return FALSE; + } + + /* Call the internal API */ + return Fast486LoadSegment(State, FAST486_REG_FS, LOWORD(NewSelector)); +} + +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePushGs) +{ + /* Call the internal API */ + return Fast486StackPush(State, State->SegmentRegs[FAST486_REG_GS].Selector); +} + +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePopGs) +{ + ULONG NewSelector; + + if (!Fast486StackPop(State, &NewSelector)) + { + /* Exception occurred */ + return FALSE; + } + + /* Call the internal API */ + return Fast486LoadSegment(State, FAST486_REG_GS, LOWORD(NewSelector)); +} + FAST486_OPCODE_HANDLER(Fast486ExtOpcodeConditionalJmp) { BOOLEAN Jump = FALSE; diff --git a/lib/fast486/extraops.h b/lib/fast486/extraops.h index 8b3eeefdd76..7010ffc163c 100644 --- a/lib/fast486/extraops.h +++ b/lib/fast486/extraops.h @@ -23,6 +23,10 @@ #define _EXTRAOPS_H_ /* DEFINES ********************************************************************/ +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePushFs); +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePopFs); +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePushGs); +FAST486_OPCODE_HANDLER(Fast486ExtOpcodePopGs); FAST486_OPCODE_HANDLER(Fast486ExtOpcodeConditionalJmp); FAST486_OPCODE_HANDLER(Fast486ExtOpcodeConditionalSet); FAST486_OPCODE_HANDLER(Fast486OpcodeExtended); -- 2.17.1