Patchwork Fix geode lx VSA loading

login
register
about
Submitter Stefan Reinauer
Date 2010-06-04 16:57:09
Message ID <4C093065.8040601@coresystems.de>
Download mbox | patch
Permalink /patch/1467/
State Accepted
Commit r5612
Headers show

Comments

Stefan Reinauer - 2010-06-04 16:57:09
On 6/4/10 6:40 PM, Stefan Reinauer wrote:
> On 6/4/10 6:37 PM, Patrick Georgi wrote:
>   
>> Am Freitag, den 04.06.2010, 16:25 +0100 schrieb Edwin Beasant:
>>   
>>     
>>> 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@virtensys.com
>>>     
>>>       
>> Except for the first two parts (the magic values in ecx/edx and
>> whitespace), and assuming this is tested, the patch is
>>
>> Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>
>>
>>
>>   
>>     
> I did a new version of the patch with those issues fixed (and pushing
> one register instead of all), see attachment
>
> Signed-off-by: Edwin Beasant <edwin_beasant@virtensys.com>
> Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
>   
Updated patch.

Patch

Index: src/devices/oprom/x86_asm.S
===================================================================
--- src/devices/oprom/x86_asm.S	(revision 5608)
+++ src/devices/oprom/x86_asm.S	(working copy)
@@ -141,21 +141,24 @@ 
 	mov	%ax, %ds
 	lidt	__realmode_idt
 
+	/* 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	
+
 	/* 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
 
-	/* 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
-
 	/* ************************************ */
 __lcall_instr = RELOCATED(.)
 	.byte 0x9a
@@ -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