diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-02-12 10:52:05 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-02-12 10:52:05 +0000 |
commit | 54ddfee829b2d98f5dcd335a14133cabd4971886 (patch) | |
tree | 468be79fe1cd976e3e28cdd9c039a8927591c9ca /tools/firmware/rombios | |
parent | 413de29298163207c7c06f32cd6d334bb4e59c0b (diff) | |
download | xen-54ddfee829b2d98f5dcd335a14133cabd4971886.tar.gz xen-54ddfee829b2d98f5dcd335a14133cabd4971886.tar.bz2 xen-54ddfee829b2d98f5dcd335a14133cabd4971886.zip |
rombios: fix int15/86h (wait for microseconds)
The bcc compiler generates wrong stack pointer offset of a local
variable within ASM code if another local variable is declared
later.
Signed-off-by: Kouya Shimura <kouya@jp.fujitsu.com>
Signed-off-by: Akio Takebe <takebe_akio@jp.fujitsu.com>
Diffstat (limited to 'tools/firmware/rombios')
-rw-r--r-- | tools/firmware/rombios/rombios.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c index 66cf30a782..dd7291f857 100644 --- a/tools/firmware/rombios/rombios.c +++ b/tools/firmware/rombios/rombios.c @@ -4609,6 +4609,10 @@ int15_function32(regs, ES, DS, FLAGS) { Bit32u extended_memory_size=0; // 64bits long Bit16u CX,DX; +#ifdef HVMASSIST + Bit16u off, e820_table_size; + Bit32u base, type, size; +#endif BX_DEBUG_INT15("int15 AX=%04x\n",regs.u.r16.ax); @@ -4625,8 +4629,10 @@ ASM_START ;; Get the count in eax mov bx, sp +SEG SS mov ax, _int15_function32.CX [bx] shl eax, #16 +SEG SS mov ax, _int15_function32.DX [bx] ;; convert to numbers of 15usec ticks @@ -4660,8 +4666,7 @@ ASM_END { #ifdef HVMASSIST case 0x20: { - Bit16u e820_table_size = - read_word(E820_SEG, E820_NR_OFFSET) * 0x14; + e820_table_size = read_word(E820_SEG, E820_NR_OFFSET) * 0x14; if (regs.u.r32.edx != 0x534D4150) /* SMAP */ goto int15_unimplemented; @@ -4674,8 +4679,6 @@ ASM_END if ((regs.u.r32.ebx + 0x14 - 1) > e820_table_size) regs.u.r32.ebx = 0; } else if (regs.u.r16.bx == 1) { - Bit32u base, type; - Bit16u off; for (off = 0; off < e820_table_size; off += 0x14) { base = read_dword(E820_SEG, E820_OFFSET + off); type = read_dword(E820_SEG, E820_OFFSET + 0x10 + off); @@ -4699,9 +4702,7 @@ ASM_END } case 0x01: { - Bit16u off, e820_table_size = - read_word(E820_SEG, E820_NR_OFFSET) * 0x14; - Bit32u base, type, size; + e820_table_size = read_word(E820_SEG, E820_NR_OFFSET) * 0x14; // do we have any reason to fail here ? CLEAR_CF(); |