[coreboot] [commit] r5612 - trunk/src/devices/oprom
repository service
svn at coreboot.org
Fri Jun 4 22:32:12 CEST 2010
Author: stepan
Date: Fri Jun 4 22:32:12 2010
New Revision: 5612
URL: https://tracker.coreboot.org/trac/coreboot/changeset/5612
Log:
This patch fixes the option rom code that was buggy when it switched
segment registers before restoring register values. This was breaking
the Geode VSA, and probably would have hurt other option roms as well.
Signed-off-by: Edwin Beasant <edwin_beasant at virtensys.com>
Acked-by: Patrick Georgi <patrick.georgi at coresystems.de>
Signed-off-by: Stefan Reinauer <stepan at coresystems.de>
Acked-by: Nils Jacobs <njacobs8 at hetnet.nl>
Modified:
trunk/src/devices/oprom/x86_asm.S
Modified: trunk/src/devices/oprom/x86_asm.S
==============================================================================
--- trunk/src/devices/oprom/x86_asm.S Fri Jun 4 22:24:11 2010 (r5611)
+++ trunk/src/devices/oprom/x86_asm.S Fri Jun 4 22:32:12 2010 (r5612)
@@ -141,20 +141,23 @@
mov %ax, %ds
lidt __realmode_idt
- /* Set all segments to 0x0000, ds to 0x0040 */
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %gs
- mov $0x40, %ax
- mov %ax, %ds
-
/* initialize registers for option rom lcall */
movl __registers + 0, %eax
movl __registers + 4, %ebx
movl __registers + 8, %ecx
movl __registers + 12, %edx
movl __registers + 16, %esi
- movl __registers + 20, %edi
+ movl __registers + 20, %edi
+
+ /* Set all segments to 0x0000, ds to 0x0040 */
+ push %ax
+ xor %ax, %ax
+ mov %ax, %es
+ mov %ax, %fs
+ mov %ax, %gs
+ mov $0x40, %ax
+ mov %ax, %ds
+ pop %ax
/* ************************************ */
__lcall_instr = RELOCATED(.)
@@ -262,12 +265,6 @@
mov %ax, %ds
lidt __realmode_idt
- /* Set all segments to 0x0000 */
- mov %ax, %ds
- mov %ax, %es
- mov %ax, %fs
- mov %ax, %gs
-
/* initialize registers for intXX call */
movl __registers + 0, %eax
movl __registers + 4, %ebx
@@ -276,6 +273,15 @@
movl __registers + 16, %esi
movl __registers + 20, %edi
+ /* Set all segments to 0x0000 */
+ push %ax
+ xor %ax, %ax
+ mov %ax, %ds
+ mov %ax, %es
+ mov %ax, %fs
+ mov %ax, %gs
+ pop %ax
+
__intXX_instr = RELOCATED(.)
.byte 0xcd, 0x00 /* This becomes intXX */
@@ -376,7 +382,7 @@
mov %ax, %ds
lidt __realmode_idt
- /* Set up segment registers to segment 0x0000 */
+ /* Set up segment registers to segment 0x0000 and ds to 0x040 */
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
More information about the coreboot
mailing list