[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH v2 3/3] kernel2: vm86: Reihenfolge auf dem Stack für int/iret gefixt



! kernel2: eflags, cs und eip wurden vom Emulator genau falschrum auf
  den Stack gepusht (und beim Rücksprung wieder gepopt). Was an sich
  kein Problem wäre, wenn das BIOS täte, was man naiverweise erwartet,
  nämlich mit INT reinzuspringen und mit IRET wieder raus. Es scheint
  aber auch Code da draußen zu geben, der es bevorzugt, stattdessen mit
  RETF 0x2 wieder zurückzuspringen und dann sollte der Stackinhalt
  besser so sein wie auf echter Hardware.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/arch/i386/vm86.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/kernel2/src/arch/i386/vm86.c b/src/kernel2/src/arch/i386/vm86.c
index 53bb04e..9ee62c9 100644
--- a/src/kernel2/src/arch/i386/vm86.c
+++ b/src/kernel2/src/arch/i386/vm86.c
@@ -352,9 +352,9 @@ int vm86_exception(interrupt_stack_frame_t* isf)
             uint16_t intr = ops[1] & 0xff;
             uint16_t* ivt_entry = bios_data.ivt[intr];
 
-            emulator_push(isf, isf->eip + 2);
-            emulator_push(isf, isf->cs);
             emulator_push(isf, isf->eflags);
+            emulator_push(isf, isf->cs);
+            emulator_push(isf, isf->eip + 2);
 
             isf->eip = ivt_entry[0];
             isf->cs  = ivt_entry[1];
@@ -370,9 +370,9 @@ int vm86_exception(interrupt_stack_frame_t* isf)
             }
 
             // Ansonsten muss es ganz normal emuliert werden
-            emulator_pop(isf);
-            isf->cs  = emulator_pop(isf);
             isf->eip = emulator_pop(isf);
+            isf->cs  = emulator_pop(isf);
+            emulator_pop(isf);
             break;
 
         case 0xe4: /* in al, imm8 */
-- 
2.1.4