aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware/rombios
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-06-04 10:36:01 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-06-04 10:36:01 +0100
commit39c0fe04033bfef6cffec217bf3399a1718f2b8d (patch)
tree5c3733948888d26230fa30d16817c93aa190c1c0 /tools/firmware/rombios
parent83fd7b933efd4264a3e5de03b793e8f412c21e05 (diff)
downloadxen-39c0fe04033bfef6cffec217bf3399a1718f2b8d.tar.gz
xen-39c0fe04033bfef6cffec217bf3399a1718f2b8d.tar.bz2
xen-39c0fe04033bfef6cffec217bf3399a1718f2b8d.zip
rombios: compute checksum for roms bigger than a segment
From: Glauber Costa <glommer@redhat.com> From: "Sebastian Herbszt" <herbszt@gmx.de> Ported by: Akio Takebe <takebe_akio@jp.fujitsu.com>
Diffstat (limited to 'tools/firmware/rombios')
-rw-r--r--tools/firmware/rombios/rombios.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c
index 94f9a9b521..2d97a401d5 100644
--- a/tools/firmware/rombios/rombios.c
+++ b/tools/firmware/rombios/rombios.c
@@ -10439,22 +10439,44 @@ no_serial:
ret
rom_checksum:
- push ax
- push bx
- push cx
+ pusha
+ push ds
+
xor ax, ax
xor bx, bx
xor cx, cx
+ xor dx, dx
+
mov ch, [2]
shl cx, #1
+
+ jnc checksum_loop
+ jz checksum_loop
+ xchg dx, cx
+ dec cx
+
checksum_loop:
add al, [bx]
inc bx
loop checksum_loop
+
+ test dx, dx
+ je checksum_out
+
+ add al, [bx]
+ mov cx, dx
+ mov dx, ds
+ add dh, #0x10
+ mov ds, dx
+ xor dx, dx
+ xor bx, bx
+
+ jmp checksum_loop
+
+checksum_out:
and al, #0xff
- pop cx
- pop bx
- pop ax
+ pop ds
+ popa
ret