[SeaBIOS] [PATCH] optionrom: disallow int19 redirect for pnp roms.

Laszlo Ersek lersek at redhat.com
Tue Nov 27 16:38:09 CET 2018


On 11/27/18 13:10, Gerd Hoffmann wrote:
> Check whenever pnp roms attempt to redirect int19, and in case it does
> log a message and undo the redirect.
> 
> A pnp rom should not need this, we have BEVs and BCVs for that.
> Nevertheless there are roms in the wild which are redirecting int19.
> At least some BIOS implementations for physical hardware have a config
> option in the setup to allow/disallow int19 redirections, so just not
> allowing this seems to be the way to deal with this situation.
> 
> Buglink: https://bugzilla.redhat.com//show_bug.cgi?id=1642135
> Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
> ---
>  src/optionroms.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/src/optionroms.c b/src/optionroms.c
> index fc992f649f..4ec5504ca9 100644
> --- a/src/optionroms.c
> +++ b/src/optionroms.c
> @@ -8,6 +8,7 @@
>  #include "bregs.h" // struct bregs
>  #include "config.h" // CONFIG_*
>  #include "farptr.h" // FLATPTR_TO_SEG
> +#include "biosvar.h" // GET_IVT
>  #include "hw/pci.h" // pci_config_readl
>  #include "hw/pcidevice.h" // foreachpci
>  #include "hw/pci_ids.h" // PCI_CLASS_DISPLAY_VGA
> @@ -136,9 +137,24 @@ init_optionrom(struct rom_header *rom, u16 bdf, int isvga)
>  
>      tpm_option_rom(newrom, rom->size * 512);
>  
> -    if (isvga || get_pnp_rom(newrom))
> +    struct pnp_data *pnp = get_pnp_rom(newrom);
> +    if (isvga || pnp) {
> +        struct segoff_s old19, new19;
>          // Only init vga and PnP roms here.
> +        old19 = GET_IVT(0x19);
>          callrom(newrom, bdf);
> +        new19 = GET_IVT(0x19);
> +        if (old19.seg != new19.seg ||
> +            old19.offset != new19.offset) {
> +            dprintf(1, "WARNING! rom tried to hijack int19 "
> +                    "(vec %04x:%04x, pnp %s, bev %s, bvc %s)\n",
> +                    new19.seg, new19.offset,
> +                    pnp             ? "yes" : "no",
> +                    pnp && pnp->bev ? "yes" : "no",
> +                    pnp && pnp->bcv ? "yes" : "no");
> +            SET_IVT(0x19, old19);
> +        }
> +    }
>  
>      return rom_confirm(newrom->size * 512);
>  }
> 

Is it OK to call get_pnp_rom() when "isvga" is set?

Thanks
Laszlo



More information about the SeaBIOS mailing list