diff mbox

[1/2] qemu-kvm: extboot: Keep variables in RAM

Message ID 4B7D6725.1090202@siemens.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Kiszka Feb. 18, 2010, 4:13 p.m. UTC
None
diff mbox

Patch

diff --git a/pc-bios/optionrom/extboot.S b/pc-bios/optionrom/extboot.S
index 1e60f68..1eeb172 100644
--- a/pc-bios/optionrom/extboot.S
+++ b/pc-bios/optionrom/extboot.S
@@ -19,6 +19,9 @@ 
  *   Authors: Anthony Liguori <aliguori@us.ibm.com>
  */
 
+#define OLD_INT19	(0x80 * 4)	/* re-use INT 0x80 BASIC vector */
+#define OLD_INT13	(0x81 * 4)	/* re-use INT 0x81 BASIC vector */
+
 .code16
 .text
 	.global _start
@@ -37,7 +40,7 @@  _start:
 
 	/* save old int 19 */
 	mov (0x19*4), %eax
-	mov %eax, %cs:old_int19
+	mov %eax, (OLD_INT19)
 
 	/* install out int 19 handler */
 	movw $int19_handler, (0x19*4)
@@ -48,6 +51,7 @@  _start:
 	lret
 
 int19_handler:
+	push %eax /* reserve space for lret */
 	push %eax
 	push %bx
 	push %cx
@@ -69,7 +73,7 @@  int19_handler:
 1: /* hook int13: intb(0x404) == 1 */
 	/* save old int 13 to int 2c */
 	mov (0x13*4), %eax
-	mov %eax, %cs:old_int13
+	mov %eax, (OLD_INT13)
 
 	/* install our int 13 handler */
 	movw $int13_handler, (0x13*4)
@@ -90,15 +94,21 @@  int19_handler:
 
 3: /* fall through: inb(0x404) == 0 */
 	/* restore previous int $0x19 handler */
-	mov %cs:old_int19,%eax
+	mov (OLD_INT19),%eax
 	mov %eax,(0x19*4)
-	
+
+	/* write old handler as return address onto stack */
+	push %bp
+	mov %sp, %bp
+	mov %eax, 14(%bp)
+	pop %bp
+
 	pop %ds
 	pop %dx
 	pop %cx
 	pop %bx
 	pop %eax
-	ljmpw *%cs:old_int19
+	lret
 
 #define FLAGS_CF	0x01
 
@@ -626,7 +636,21 @@  terminate_disk_emulation:
 int13_handler:
 	cmp $0x80, %dl
 	je 1f
-	ljmpw *%cs:old_int13
+
+	/* write old handler as return address onto stack */
+	push %eax
+	push %eax
+	push %ds
+	push %bp
+	mov %sp, %bp
+	xor %ax, %ax
+	mov %ax, %ds
+	mov (OLD_INT13), %eax
+	mov %eax, 8(%bp)
+	pop %bp
+	pop %ds
+	pop %eax
+	lret
 1:
 	cmp $0x0, %ah
 	jne 1f
@@ -686,10 +710,5 @@  int13_handler:
 	int $0x18  /* boot failed */
 	iret
 
-/* Variables */
-.align 4, 0
-old_int13:	.long 0
-old_int19:	.long 0
-	
 .align 512, 0
 _end: