On Thu, Dec 31, 2020 at 07:08:24PM -0800, Bin Gao wrote: > In csm mode, the bev pointer of the pci option rom was not > added to the bootentry list, resulting in failure to boot > from pci option rom. This patch fixed it. > Also we enabled hw timer interrupt and clock update before > we call the option rom's init() funtion, so the clock tick > update at BDA address 40:6C will work during the rom's init() > execution. Withou this change, iPXE would hang on reading BDA > 40:6C due to the value at this address is not changed. > > Signed-off-by: Bin Gao <gao...@amazon.com> > --- > src/fw/csm.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/src/fw/csm.c b/src/fw/csm.c > index 8359bcb..f64bc73 100644 > --- a/src/fw/csm.c > +++ b/src/fw/csm.c > @@ -19,6 +19,7 @@ > #include "std/acpi.h" // RSDP_SIGNATURE > #include "std/bda.h" // struct bios_data_area_s > #include "std/optionrom.h" // struct rom_header > +#include "std/pnpbios.h" // PNP_SIGNATURE > #include "util.h" // copy_smbios > > #define UINT8 u8 > @@ -219,6 +220,7 @@ handle_csm_0005(struct bregs *regs) > { > EFI_DISPATCH_OPROM_TABLE *table = MAKE_FLATPTR(regs->es, regs->bx); > struct rom_header *rom; > + struct pnp_data *pnp; > u16 bdf; > > if (!CONFIG_OPTIONROMS) { > @@ -240,11 +242,36 @@ handle_csm_0005(struct bregs *regs) > > rom_reserve(rom->size * 512); > > + // callrom() typically calls the rom's init() functions. > + // If the rom's init() function does a delay by detecting the value > + // at address 40:6C, it will fail because the value at 40:6C is > + // updated only in clock_update() which is called in hw timer ISR. > + // Thus we have to enable hw timer interrupt and set up clock before > + // calling callrom(). > + pic_setup(); > + timer_setup(); > + clock_setup();
This doesn't look correct to me. The CSM code was originally designed not to directly setup the PIC hardware - IIRC we don't know if the OS is a "legacy OS" or not at this point. Maybe David has a more clear recollection. In any case, it would not make sense to call clock_setup() and timer_setup() on every option rom and then again in PrepareToBoot(). -Kevin _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-le...@seabios.org