vgabios: Check that the PCI BDF passed in is valid before using.
authorKevin O'Connor <kevin@koconnor.net>
Tue, 17 Jan 2012 00:05:27 +0000 (19:05 -0500)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 20 Jan 2012 02:34:44 +0000 (21:34 -0500)
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
vgasrc/bochsvga.c
vgasrc/clext.c
vgasrc/geodevga.c
vgasrc/vgabios.c
vgasrc/vgabios.h

index 82629b9f23cb3cfbf99336cc0578044c50268a10..cbd0b41d75002d4d33a796e11352ef16dafc3541 100644 (file)
@@ -123,12 +123,11 @@ bochsvga_init(void)
 
     dispi_write(VBE_DISPI_INDEX_ID, VBE_DISPI_ID5);
 
-    u32 lfb_addr;
-    if (CONFIG_VGA_PCI)
-        lfb_addr = (pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0)
+    u32 lfb_addr = VBE_DISPI_LFB_PHYSICAL_ADDRESS;
+    int bdf = GET_GLOBAL(VgaBDF);
+    if (CONFIG_VGA_PCI && bdf >= 0)
+        lfb_addr = (pci_config_readl(bdf, PCI_BASE_ADDRESS_0)
                     & PCI_BASE_ADDRESS_MEM_MASK);
-    else
-        lfb_addr = VBE_DISPI_LFB_PHYSICAL_ADDRESS;
 
     SET_VGA(VBE_framebuffer, lfb_addr);
     u16 totalmem = dispi_read(VBE_DISPI_INDEX_VIDEO_MEMORY_64K);
index f08294acaddda18792fe12abd3e017aeafc2c90c..5468db35ef77d6e9e4099ed0669772527cb6abc0 100644 (file)
@@ -737,8 +737,9 @@ clext_init(void)
     dprintf(1, "cirrus init 2\n");
 
     u32 lfb_addr = 0;
-    if (CONFIG_VGA_PCI)
-        lfb_addr = (pci_config_readl(GET_GLOBAL(VgaBDF), PCI_BASE_ADDRESS_0)
+    int bdf = GET_GLOBAL(VgaBDF);
+    if (CONFIG_VGA_PCI && bdf >= 0)
+        lfb_addr = (pci_config_readl(bdf, PCI_BASE_ADDRESS_0)
                     & PCI_BASE_ADDRESS_MEM_MASK);
     SET_VGA(VBE_framebuffer, lfb_addr);
     u16 totalmem = cirrus_get_memsize();
index ce754a5b7886b23e18dd73e3135b7700804d37ed..5c6caf045397b307cb62aabe25ea8e5454d8b1c3 100644 (file)
@@ -363,6 +363,9 @@ int geodevga_init(void)
             stdvga_override_crtc(i, crtc);
     }
 
+    if (GET_GLOBAL(VgaBDF) < 0)
+        // Device should be at 00:01.1
+        SET_VGA(VgaBDF, pci_to_bdf(0, 1, 1));
     ret |= vp_setup();
     ret |= dc_setup();
 
index 449f3c4085b23e04d45ddde8d0da0e6901ffcdb4..5ce7c0c99c1be42ddca209e2f1be0c0eedd4de9a 100644 (file)
@@ -20,6 +20,8 @@
 #include "stdvga.h" // stdvga_set_cursor_shape
 #include "clext.h" // clext_1012
 #include "vgahw.h" // vgahw_set_mode
+#include "pci.h" // pci_config_readw
+#include "pci_regs.h" // PCI_VENDOR_ID
 
 // XXX
 #define DEBUG_VGA_POST 1
@@ -1226,14 +1228,19 @@ init_bios_area(void)
     SET_BDA(video_msr, 0x09);
 }
 
-u16 VgaBDF VAR16;
+int VgaBDF VAR16 = -1;
 
 void VISIBLE16
 vga_post(struct bregs *regs)
 {
     debug_enter(regs, DEBUG_VGA_POST);
 
-    SET_VGA(VgaBDF, regs->ax);
+    if (CONFIG_VGA_PCI) {
+        u16 bdf = regs->ax;
+        if (pci_config_readw(bdf, PCI_VENDOR_ID) == CONFIG_VGA_VID
+            && pci_config_readw(bdf, PCI_DEVICE_ID) == CONFIG_VGA_DID)
+            SET_VGA(VgaBDF, bdf);
+    }
 
     int ret = vgahw_init();
     if (ret) {
index 403e7ce905f9910eeaf5bcdccc76d564440798bb..6895a3962bd1288e1ac6b3a0df6a636c486d999a 100644 (file)
@@ -73,7 +73,7 @@ extern u8 vgafont14alt[];
 extern u8 vgafont16alt[];
 
 // vgabios.c
-extern u16 VgaBDF;
+extern int VgaBDF;
 #define SET_VGA(var, val) SET_FARVAR(get_global_seg(), (var), (val))
 struct carattr {
     u8 car, attr, use_attr;