[ros-diffs] [tkreuzer] 53876: [FREELDR] - copy ebp into REGS structure on Int386 - Write pointer and size of extended bios data area in physical page 0 location 0x740 and pointers to vga rom fonts in location ...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Tue Sep 27 20:25:51 UTC 2011


Author: tkreuzer
Date: Tue Sep 27 20:25:51 2011
New Revision: 53876

URL: http://svn.reactos.org/svn/reactos?rev=53876&view=rev
Log:
[FREELDR]
- copy ebp into REGS structure on Int386
- Write pointer and size of extended bios data area in physical page 0 location 0x740 and pointers to vga rom fonts in location 0x700. This is required by windows 2003's videoprt. Now freeldr is more Windows 2003 ready then ever!

Modified:
    trunk/reactos/boot/freeldr/freeldr/arch/i386/winldr.c
    trunk/reactos/boot/freeldr/freeldr/arch/realmode/int386.inc

Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/winldr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i386/winldr.c?rev=53876&r1=53875&r2=53876&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/winldr.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/winldr.c [iso-8859-1] Tue Sep 27 20:25:51 2011
@@ -279,6 +279,77 @@
     return TRUE;
 }
 
+#define ExtendedBIOSDataArea ((PULONG)0x740)
+#define ExtendedBIOSDataSize ((PULONG)0x744)
+#define RomFontPointers ((PULONG)0x700)
+
+enum
+{
+    INT1FhFont = 0x00,
+    INT43hFont = 0x01,
+    ROM_8x14CharacterFont = 0x02,
+    ROM_8x8DoubleDotFontLo = 0x03,
+    ROM_8x8DoubleDotFontHi = 0x04,
+    ROM_AlphaAlternate = 0x05,
+    ROM_8x16Font = 0x06,
+    ROM_Alternate9x16Font = 0x07,
+    UltraVision_8x20Font = 0x11,
+    UltraVision_8x10Font = 0x12,
+};
+
+void WinLdrSetupSpecialDataPointers()
+{
+    REGS BiosRegs;
+
+    /* Get the address of the bios rom fonts. Win 2003 videoprt reads these
+       values from address 0x700 .. 0x718 and store them in the registry
+       in HKLM\System\CurrentControlSet\Control\Wow\RomFontPointers
+       Int 10h, AX=1130h, BH = pointer specifier
+       returns: es:bp = address */
+    BiosRegs.d.eax = 0x1130;
+    BiosRegs.b.bh = ROM_8x14CharacterFont;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[0] = BiosRegs.w.es << 4 | BiosRegs.w.bp;
+
+    BiosRegs.b.bh = ROM_8x8DoubleDotFontLo;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[1] = BiosRegs.w.es << 16 | BiosRegs.w.bp;
+
+    BiosRegs.b.bh = ROM_8x8DoubleDotFontHi;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[2] = BiosRegs.w.es << 16 | BiosRegs.w.bp;
+
+    BiosRegs.b.bh = ROM_AlphaAlternate;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[3] = BiosRegs.w.es << 16 | BiosRegs.w.bp;
+
+    BiosRegs.b.bh = ROM_8x16Font;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[4] = BiosRegs.w.es << 16 | BiosRegs.w.bp;
+
+    BiosRegs.b.bh = ROM_Alternate9x16Font;
+    Int386(0x10, &BiosRegs, &BiosRegs);
+    RomFontPointers[5] = BiosRegs.w.es << 16 | BiosRegs.w.bp;
+
+    /* Store address of the extended bios data area in 0x740 */
+    BiosRegs.d.eax = 0xC100;
+    Int386(0x15, &BiosRegs, &BiosRegs);
+    if (INT386_SUCCESS(BiosRegs))
+    {
+        *ExtendedBIOSDataArea = BiosRegs.w.es << 4;
+        *ExtendedBIOSDataSize = 1024;
+        ERR(">> *ExtendedBIOSDataArea = 0x%lx\n", *ExtendedBIOSDataArea);
+    }
+    else
+    {
+        ERR("Couldn't get address of extended BIOS data area\n");
+        *ExtendedBIOSDataArea = 0;
+        *ExtendedBIOSDataSize = 0;
+    }
+
+    /* Store size of the extended bios data area in 0x740 */
+}
+
 void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
 	ULONG TssSize;
@@ -331,6 +402,9 @@
 
 	/* Map stuff like PCR, KI_USER_SHARED_DATA and Apic */
     WinLdrMapSpecialPages();
+
+    /* Set some special fields */
+    WinLdrSetupSpecialDataPointers();
 }
 
 

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=53876&r1=53875&r2=53876&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 Sep 27 20:25:51 2011
@@ -29,6 +29,7 @@
 	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]
+	mov ebp, dword ptr cs:[BSS_RegisterSet + REGS_EBP]
 
 	/* Do not set the flags register */
 	/* only return its value in regsout */
@@ -46,6 +47,7 @@
 	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 dword ptr cs:[BSS_RegisterSet + REGS_EBP], ebp
 
 	mov ax, ds
 	mov word ptr cs:[BSS_RegisterSet + REGS_DS], ax




More information about the Ros-diffs mailing list