mirror of
https://github.com/ipxe/ipxe
synced 2025-12-14 16:01:38 +03:00
[romprefix] Sanity-check the runtime segment address for PCI 3
Some PCI 3 BIOSes seem to provide a garbage value in %bx, which should contain the runtime segment address. Perform a basic sanity check: we reject the segment if it is below the start of option ROM space. If the sanity check fails, we assume that the BIOS was not expecting us to be a PCI 3 ROM, and we just leave our image in situ.
This commit is contained in:
@@ -205,7 +205,16 @@ init:
|
|||||||
movb %bl, %al
|
movb %bl, %al
|
||||||
call print_hex_byte
|
call print_hex_byte
|
||||||
cmpb $3, %bh
|
cmpb $3, %bh
|
||||||
|
jb 1f
|
||||||
|
/* PCI >=3.0: leave %gs as-is if sane */
|
||||||
|
movw %gs, %ax
|
||||||
|
cmpw $0xc000, %ax
|
||||||
jae 2f
|
jae 2f
|
||||||
|
/* PCI 3.0 with insane %gs value: print error and ignore %gs */
|
||||||
|
movb $'!', %al
|
||||||
|
call print_character
|
||||||
|
movw %gs, %ax
|
||||||
|
call print_hex_word
|
||||||
1: /* PCI <3.0: set %gs (runtime segment) = %cs (init-time segment) */
|
1: /* PCI <3.0: set %gs (runtime segment) = %cs (init-time segment) */
|
||||||
pushw %cs
|
pushw %cs
|
||||||
popw %gs
|
popw %gs
|
||||||
|
|||||||
Reference in New Issue
Block a user