From: David Woodhouse Date: Fri, 28 Jun 2019 13:57:47 +0000 (+0100) Subject: csm: Fix boot priority translation X-Git-Tag: rel-1.13.0~28 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=30f1e41f04fb4c715d27f987f003cfc31c9ff4f3;p=seabios.git csm: Fix boot priority translation Explicitly handle the BBS_DO_NOT_BOOT_FROM and BBS_IGNORE_ENTRY values. Also add one to the other priority values, as find_prio() does for entries from bootorder. SeaBIOS uses zero for an item explicitly selected in interactive_bootmenu(). Signed-off-by: David Woodhouse --- diff --git a/src/fw/csm.c b/src/fw/csm.c index 3fcc252..8359bcb 100644 --- a/src/fw/csm.c +++ b/src/fw/csm.c @@ -319,6 +319,23 @@ handle_csm(struct bregs *regs) csm_return(regs); } +static int csm_prio_to_seabios(u16 csm_prio) +{ + switch (csm_prio) { + case BBS_DO_NOT_BOOT_FROM: + case BBS_IGNORE_ENTRY: + return -1; + + case BBS_LOWEST_PRIORITY: + case BBS_UNPRIORITIZED_ENTRY: + default: + // SeaBIOS default priorities start at 1, with 0 being used for + // an item explicitly selected from interactive_bootmenu(). + // As in find_prio(), add 1 to the value being returned. + return csm_prio + 1; + } +} + int csm_bootprio_ata(struct pci_device *pci, int chanid, int slave) { if (!csm_boot_table) @@ -327,7 +344,7 @@ int csm_bootprio_ata(struct pci_device *pci, int chanid, int slave) int index = 1 + (chanid * 2) + slave; dprintf(3, "CSM bootprio for ATA%d,%d (index %d) is %d\n", chanid, slave, index, bbs[index].BootPriority); - return bbs[index].BootPriority; + return csm_prio_to_seabios(bbs[index].BootPriority); } int csm_bootprio_fdc(struct pci_device *pci, int port, int fdid) @@ -336,7 +353,7 @@ int csm_bootprio_fdc(struct pci_device *pci, int port, int fdid) return -1; BBS_TABLE *bbs = (void *)csm_boot_table->BbsTable; dprintf(3, "CSM bootprio for FDC is %d\n", bbs[0].BootPriority); - return bbs[0].BootPriority; + return csm_prio_to_seabios(bbs[0].BootPriority); } int csm_bootprio_pci(struct pci_device *pci) @@ -350,7 +367,7 @@ int csm_bootprio_pci(struct pci_device *pci) if (pci->bdf == pci_to_bdf(bbs[i].Bus, bbs[i].Device, bbs[i].Function)) { dprintf(3, "CSM bootprio for PCI(%d,%d,%d) is %d\n", bbs[i].Bus, bbs[i].Device, bbs[i].Function, bbs[i].BootPriority); - return bbs[i].BootPriority; + return csm_prio_to_seabios(bbs[i].BootPriority); } } return -1;