Support multiple BCVs in a single option rom.
diff --git a/src/optionroms.c b/src/optionroms.c
index 0f99c2e..389d528 100644
--- a/src/optionroms.c
+++ b/src/optionroms.c
@@ -131,6 +131,18 @@
return pnp;
}
+// Check for multiple pnp option rom headers.
+static struct pnp_data *
+get_pnp_next(struct rom_header *rom, struct pnp_data *pnp)
+{
+ if (! pnp->nextoffset)
+ return NULL;
+ pnp = (struct pnp_data *)((u8*)rom + pnp->nextoffset);
+ if (pnp->signature != *(u32*)pnp_string)
+ return NULL;
+ return pnp;
+}
+
// Check if a valid option rom has a pci struct; return it if so.
static struct pci_data *
get_pci_rom(struct rom_header *rom)
@@ -345,9 +357,13 @@
if (pnp->bev)
// Can boot system - add to IPL list.
add_ipl(rom, pnp);
- else if (pnp->bcv)
- // Has BCV - run it now.
- callrom(rom, pnp->bcv, 0);
+ else
+ // Check for BCV (there may be multiple).
+ while (pnp && pnp->bcv) {
+ // Has BCV - run it now.
+ callrom(rom, pnp->bcv, 0);
+ pnp = get_pnp_next(rom, pnp);
+ }
}
}