aboutsummaryrefslogtreecommitdiff
path: root/pci.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2019-07-23 19:45:15 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2019-07-24 11:00:15 +0200
commite7fc653f44247f1008509a68bf9b666e33fea0e5 (patch)
tree8c5518432f79a8f45d575d9f76e9be1e90431bdb /pci.c
parentc476b5c67199b44523084b7639a4ff52f437156b (diff)
downloadqboot-e7fc653f44247f1008509a68bf9b666e33fea0e5.zip
qboot-e7fc653f44247f1008509a68bf9b666e33fea0e5.tar.gz
qboot-e7fc653f44247f1008509a68bf9b666e33fea0e5.tar.bz2
implement PCIBIOS specification
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'pci.c')
-rw-r--r--pci.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/pci.c b/pci.c
index 1457d17..f03ff6d 100644
--- a/pci.c
+++ b/pci.c
@@ -1,11 +1,13 @@
#include "bios.h"
#include "ioport.h"
#include "pci.h"
+#include <string.h>
static uint16_t addend;
-static uint8_t bus, max_bus, bridge_head;
+static uint8_t bus, bridge_head;
static bool use_i440fx_routing;
static int bridge_count;
+uint8_t max_bus;
static void do_setup_pci_bus(void);
@@ -143,6 +145,21 @@ static void do_setup_pci_bus(void)
}
}
+void setup_bios32(void)
+{
+ char *bios32 = malloc_fseg_align(16, 16);
+ void *bios32_entry_ = &bios32_entry;
+ int i;
+
+ memcpy(bios32, "_32_", 4);
+ memcpy(bios32 + 4, &bios32_entry_, 4);
+ bios32[8] = 0;
+ bios32[9] = 1;
+ memset(bios32 + 10, 0, 6);
+ for (i = 0; i <= 9; i++)
+ bios32[10] -= bios32[i];
+}
+
void setup_pci(void)
{
const int bdf = 0;
@@ -156,4 +173,5 @@ void setup_pci(void)
panic();
do_setup_pci_bus();
+ setup_bios32();
}