aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware/rombios
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-11-24 13:57:48 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-11-24 13:57:48 +0000
commitba10bcb00ff0a66d19a7444e1a2dcd517d4738c3 (patch)
treee62bce09d067484349108268d85d4821c6ab4fc9 /tools/firmware/rombios
parent6641cb8ee3810c3d15de6250c45b2dccb6591c35 (diff)
downloadxen-ba10bcb00ff0a66d19a7444e1a2dcd517d4738c3.tar.gz
xen-ba10bcb00ff0a66d19a7444e1a2dcd517d4738c3.tar.bz2
xen-ba10bcb00ff0a66d19a7444e1a2dcd517d4738c3.zip
hvmloader: Pass BDF to PCI option ROMs.
Signed-off-by: Shan Haitao <Haitao.shan@intel.com> Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'tools/firmware/rombios')
-rw-r--r--tools/firmware/rombios/rombios.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/tools/firmware/rombios/rombios.c b/tools/firmware/rombios/rombios.c
index 0edd371765..05ee9875c6 100644
--- a/tools/firmware/rombios/rombios.c
+++ b/tools/firmware/rombios/rombios.c
@@ -9677,20 +9677,35 @@ block_count_rounded:
pop ds
pop ax
#endif
- xor bx, bx ;; Restore DS back to 0000:
- mov ds, bx
push ax ;; Save AX
push di ;; Save DI
;; Push addr of ROM entry point
push cx ;; Push seg
push #0x0003 ;; Push offset
+ ;; Get the BDF into ax before invoking the option ROM
+ mov bl, [2]
+ mov al, bl
+ shr al, #7
+ cmp al, #1
+ jne fetch_bdf
+ mov ax, ds ;; Increment the DS since rom size larger than an segment
+ add ax, #0x1000
+ mov ds, ax
+fetch_bdf:
+ shl bx, #9
+ xor ax, ax
+ mov al, [bx]
+
;; Point ES:DI at "$PnP", which tells the ROM that we are a PnP BIOS.
;; That should stop it grabbing INT 19h; we will use its BEV instead.
- mov ax, #0xf000
- mov es, ax
+ mov bx, #0xf000
+ mov es, bx
lea di, pnp_string
+ xor bx, bx ;; Restore DS back to 0000:
+ mov ds, bx
+
mov bp, sp ;; Call ROM init routine using seg:off on stack
db 0xff ;; call_far ss:[bp+0]
db 0x5e