[ros-diffs] [tkreuzer] 52227: [FREELDR] Reimplement Int386 based on realmode callback mechanism.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Tue Jun 14 14:53:03 UTC 2011


Author: tkreuzer
Date: Tue Jun 14 14:53:02 2011
New Revision: 52227

URL: http://svn.reactos.org/svn/reactos?rev=52227&view=rev
Log:
[FREELDR]
Reimplement Int386 based on realmode callback mechanism.

Modified:
    trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
    trunk/reactos/boot/freeldr/freeldr/arch/i386/entry.S
    trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S
    trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc

Modified: trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt?rev=52227&r1=52226&r2=52227&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/CMakeLists.txt [iso-8859-1] Tue Jun 14 14:53:02 2011
@@ -19,7 +19,6 @@
             arch/i386/i386pnp.S
             arch/i386/i386pxe.S
             arch/i386/i386trap.S
-            arch/i386/int386.S
             arch/i386/linux.S
             arch/i386/mb.S
             arch/i386/i386bug.c)

Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/entry.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i386/entry.S?rev=52227&r1=52226&r2=52227&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/entry.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/entry.S [iso-8859-1] Tue Jun 14 14:53:02 2011
@@ -63,8 +63,6 @@
     mov eax, dword ptr ds:[BSS_RealModeEntry]
     mov dword ptr ds:[SwitchToReal16Address], eax
 
-call _Int386_ // test
-
 	/* GO! */
 	xor eax, eax
 	push eax
@@ -222,8 +220,25 @@
 _EnableA20:
     ret
 
-PUBLIC _Int386_
-_Int386_:
+Int386_regsin:
+	.long 0
+Int386_regsout:
+	.long 0
+
+/*
+ * int Int386(int ivec, REGS* in, REGS* out);
+ */
+PUBLIC _Int386
+_Int386:
+
+	/* Get the function parameters */
+	mov eax, dword ptr [esp + 4]
+    mov dword ptr ds:[BSS_IntVector], eax
+	mov eax, dword ptr [esp + 8]
+	mov dword ptr [Int386_regsin], eax
+	mov eax, dword ptr [esp + 12]
+	mov dword ptr [Int386_regsout], eax
+
 	/* Save all registers + segment registers */
 	push ds
 	push es
@@ -231,14 +246,26 @@
 	push gs
 	pusha
 
+    /* Copy input registers */
+    mov esi, dword ptr [Int386_regsin]
+    mov edi, BSS_RegisterSet
+    mov ecx, 9
+    rep movsd
+
     /* Set the callback index */
-    mov cx, 1234
+    mov bx, 0
 
     /* Set continue address and switch to real mode */
     mov dword ptr [ContinueAddress], offset Int386_return
     jmp SwitchToReal
 
 Int386_return:
+
+    /* Copy output registers */
+    mov esi, BSS_RegisterSet
+    mov edi, dword ptr [Int386_regsout]
+    mov ecx, 9
+    rep movsd
 
     popa
     pop gs

Modified: trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S?rev=52227&r1=52226&r2=52227&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/i386.S [iso-8859-1] Tue Jun 14 14:53:02 2011
@@ -91,10 +91,10 @@
 
 	sti		/* These are ok now */
 
-    /* Do the callback, specified by cx */
-    // call word ptr CallbackTable[cx * 4]
-    mov ax, cx
-    call writehex4
+    /* Do the callback, specified by bx */
+    shl bx, 1
+    call word ptr ds:[callback_table + bx]
+
 
 /*
  * Switches the processor to protected mode
@@ -123,6 +123,8 @@
     nop
 
 
+callback_table:
+    .word Int386
 
 
     /* 16-bit stack pointer */

Modified: trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc?rev=52227&r1=52226&r2=52227&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc [iso-8859-1] Tue Jun 14 14:53:02 2011
@@ -1,26 +1,33 @@
 
 
 Int386:
+	/* Save all registers + segment registers */
+	push ds
+	push es
+	push fs
+	push gs
+	pushad
+
     /* Get the interupt vector and patch the opcode */
     mov al, byte ptr ds:[BSS_IntVector]
     mov byte ptr ds:[Int386_vector_opcode], al
 
 	/* Setup the registers */
 	mov ax, word ptr cs:[BSS_RegisterSet + REGS_DS]
-	mov ds, ax					/* DS register */
+	mov ds, ax
 	mov ax, word ptr cs:[BSS_RegisterSet + REGS_ES]
-	mov es, ax					/* ES register */
+	mov es, ax
 	mov ax, word ptr cs:[BSS_RegisterSet + REGS_FS]
-	mov fs, ax					/* FS register */
+	mov fs, ax
 	mov ax, word ptr cs:[BSS_RegisterSet + REGS_GS]
-	mov gs, ax					/* GS register */
+	mov gs, ax
 
-	mov eax, dword ptr cs:[BSS_RegisterSet + REGS_EAX]	/* EAX register */
-	mov ebx, dword ptr cs:[BSS_RegisterSet + REGS_EBX]	/* EBX register */
-	mov ecx, dword ptr cs:[BSS_RegisterSet + REGS_ECX]	/* ECX register */
-	mov edx, dword ptr cs:[BSS_RegisterSet + REGS_EDX]	/* EDX register */
-	mov esi, dword ptr cs:[BSS_RegisterSet + REGS_ESI]	/* ESI register */
-	mov edi, dword ptr cs:[BSS_RegisterSet + REGS_EDI]	/* EDI register */
+	mov eax, dword ptr cs:[BSS_RegisterSet + REGS_EAX]
+	mov ebx, dword ptr cs:[BSS_RegisterSet + REGS_EBX]
+	mov ecx, dword ptr cs:[BSS_RegisterSet + REGS_ECX]
+	mov edx, dword ptr cs:[BSS_RegisterSet + REGS_EDX]
+	mov esi, dword ptr cs:[BSS_RegisterSet + REGS_ESI]
+	mov edi, dword ptr cs:[BSS_RegisterSet + REGS_EDI]
 
 	/* Do not set the flags register */
 	/* only return its value in regsout */
@@ -32,24 +39,30 @@
 	.byte	0x00
 
 	/* Save the registers */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_EAX], eax	/* EAX register */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_EBX], ebx	/* EBX register */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_ECX], ecx	/* ECX register */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_EDX], edx	/* EDX register */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_ESI], esi	/* ESI register */
-	mov dword ptr cs:[BSS_RegisterSet + REGS_EDI], edi	/* EDI register */
+	mov dword ptr cs:[BSS_RegisterSet + REGS_EAX], eax
+	mov dword ptr cs:[BSS_RegisterSet + REGS_EBX], ebx
+	mov dword ptr cs:[BSS_RegisterSet + REGS_ECX], ecx
+	mov dword ptr cs:[BSS_RegisterSet + REGS_EDX], edx
+	mov dword ptr cs:[BSS_RegisterSet + REGS_ESI], esi
+	mov dword ptr cs:[BSS_RegisterSet + REGS_EDI], edi
 
-	mov ax, ds					/* DS register */
+	mov ax, ds
 	mov word ptr cs:[BSS_RegisterSet + REGS_DS], ax
-	mov ax, es					/* ES register */
+	mov ax, es
 	mov word ptr cs:[BSS_RegisterSet + REGS_ES], ax
-	mov ax, fs					/* FS register */
+	mov ax, fs
 	mov word ptr cs:[BSS_RegisterSet + REGS_FS], ax
-	mov ax, gs					/* GS register */
+	mov ax, gs
 	mov word ptr cs:[BSS_RegisterSet + REGS_GS], ax
 
-	pushf
-	pop dword ptr cs:[BSS_RegisterSet + REGS_EFLAGS]	/* EFLAGS register */
+	pushfd
+	pop dword ptr cs:[BSS_RegisterSet + REGS_EFLAGS]
+
+    popad
+    pop gs
+    pop fs
+    pop es
+    pop ds
 
     ret
 




More information about the Ros-diffs mailing list