summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMyles Watson <mylesgw@gmail.com>2008-12-22 17:27:00 +0000
committerMyles Watson <mylesgw@gmail.com>2008-12-22 17:27:00 +0000
commita94ea6f062afd14a398f007a19c790c6b5742084 (patch)
tree9fa71ff75c2b15f59bc8087c5010ebc0228edc8b
parent3169211c8bb791037d543c37796b7211844ed880 (diff)
downloadcoreboot-a94ea6f062afd14a398f007a19c790c6b5742084.tar.gz
coreboot-a94ea6f062afd14a398f007a19c790c6b5742084.tar.bz2
coreboot-a94ea6f062afd14a398f007a19c790c6b5742084.zip
Date: Sun, 21 Dec 2008 00:09:12 +0100
Subject: [PATCH] use the rom_addr passed by coreboot, needed for ROM images from LAR Signed-off-by: Pattrick Hueper <phueper@hueper.net> Acked-by: Myles Watson <mylesgw@gmail.com> git-svn-id: svn://coreboot.org/repository/coreboot-v3@1081 f3766cd6-281f-0410-b1cd-43a5c92072e9
-rw-r--r--util/x86emu/yabel/biosemu.c21
-rw-r--r--util/x86emu/yabel/compat/functions.c5
-rw-r--r--util/x86emu/yabel/device.c31
-rw-r--r--util/x86emu/yabel/device.h4
4 files changed, 39 insertions, 22 deletions
diff --git a/util/x86emu/yabel/biosemu.c b/util/x86emu/yabel/biosemu.c
index 7e92fdeda8d5..c741e4fecdbe 100644
--- a/util/x86emu/yabel/biosemu.c
+++ b/util/x86emu/yabel/biosemu.c
@@ -43,8 +43,15 @@ static X86EMU_pioFuncs my_pio_funcs = {
void dump(u8 * addr, u32 len);
+/* main entry into YABEL biosemu, arguments are:
+ * *biosmem = pointer to virtual memory
+ * biosmem_size = size of the virtual memory
+ * *dev = pointer to the device to be initialised
+ * rom_addr = address of the OptionROM to be executed, if this is = 0, YABEL
+ * will look for an ExpansionROM BAR and use the code from there.
+ */
u32
-biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev)
+biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev, unsigned long rom_addr)
{
u8 *rom_image;
int i = 0;
@@ -60,7 +67,7 @@ biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev)
printf("Error initializing device!\n");
return -1;
}
- if (biosemu_dev_check_exprom() != 0) {
+ if (biosemu_dev_check_exprom(rom_addr) != 0) {
printf("Error: Device Expansion ROM invalid!\n");
return -1;
}
@@ -301,15 +308,17 @@ biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev)
}
}
#endif
- // check wether the stack is "clean" i.e. containing the HLT instruction
- // we pushed before executing, and pointing to the original stack address...
- // indicating that the initialization probably was successful
+ /* Check whether the stack is "clean" i.e. containing the HLT
+ * instruction we pushed before executing and pointing to the original
+ * stack address... indicating that the initialization probably was
+ * successful
+ */
if ((pop_word() == 0xf4f4) && (M.x86.R_SS == STACK_SEGMENT)
&& (M.x86.R_SP == STACK_START_OFFSET)) {
DEBUG_PRINTF("Stack is clean, initialization successfull!\n");
} else {
DEBUG_PRINTF
- ("Stack unclean, initialization probably NOT COMPLETE!!!\n");
+ ("Stack unclean, initialization probably NOT COMPLETE!!\n");
DEBUG_PRINTF("SS:SP = %04x:%04x, expected: %04x:%04x\n",
M.x86.R_SS, M.x86.R_SP, STACK_SEGMENT,
STACK_START_OFFSET);
diff --git a/util/x86emu/yabel/compat/functions.c b/util/x86emu/yabel/compat/functions.c
index c1a6d9a0dd8b..c788594f6788 100644
--- a/util/x86emu/yabel/compat/functions.c
+++ b/util/x86emu/yabel/compat/functions.c
@@ -15,11 +15,12 @@ u8* vmem = (u8 *) CONFIG_YABEL_VIRTMEM_LOCATION;
u8* vmem = (u8 *) (16*1024*1024); /* default to 16MB */
#endif
-u32 biosemu(u8 *biosmem, u32 biosmem_size, struct device * dev);
+u32 biosemu(u8 *biosmem, u32 biosmem_size, struct device *dev,
+ unsigned long rom_addr);
void run_bios(struct device * dev, unsigned long addr)
{
- biosemu(vmem, VMEM_SIZE, dev);
+ biosemu(vmem, VMEM_SIZE, dev, addr);
}
u64 get_time(void)
diff --git a/util/x86emu/yabel/device.c b/util/x86emu/yabel/device.c
index ab4e7a272356..21ac7d638c51 100644
--- a/util/x86emu/yabel/device.c
+++ b/util/x86emu/yabel/device.c
@@ -281,26 +281,33 @@ biosemu_dev_get_device_vendor_id(void)
bios_device.pci_device_id, bios_device.pci_vendor_id);
}
-/* check, wether the device has a valid Expansion ROM, also search the PCI Data Structure and
- * any Expansion ROM Header (using dev_scan_exp_header()) for needed information */
+/* Check whether the device has a valid Expansion ROM and search the PCI Data
+ * Structure and any Expansion ROM Header (using dev_scan_exp_header()) for
+ * needed information. If the rom_addr parameter is != 0, it is the address of
+ * the Expansion ROM image and will be used, if it is == 0, the Expansion ROM
+ * BAR address will be used.
+ */
u8
-biosemu_dev_check_exprom()
+biosemu_dev_check_exprom(unsigned long rom_base_addr)
{
int i = 0;
translate_address_t ta;
- unsigned long rom_base_addr = 0;
u16 pci_ds_offset;
pci_data_struct_t pci_ds;
- // check for ExpROM Address (Offset 30) in taa
- for (i = 0; i <= taa_last_entry; i++) {
- ta = translate_address_array[i];
- if (ta.cfg_space_offset == 0x30) {
- rom_base_addr = ta.address + ta.address_offset; //translated address
- break;
+ if (rom_base_addr == 0) {
+ // check for ExpROM Address (Offset 30) in taa
+ for (i = 0; i <= taa_last_entry; i++) {
+ ta = translate_address_array[i];
+ if (ta.cfg_space_offset == 0x30) {
+ //translated address
+ rom_base_addr = ta.address + ta.address_offset;
+ break;
+ }
}
}
- // in the ROM there could be multiple Expansion ROM Images... start searching
- // them for a x86 image
+ /* In the ROM there could be multiple Expansion ROM Images... start
+ * searching them for an x86 image.
+ */
do {
if (rom_base_addr == 0) {
printf("Error: no Expansion ROM address found!\n");
diff --git a/util/x86emu/yabel/device.h b/util/x86emu/yabel/device.h
index 09c77102c2fa..5fc5c17eb6e7 100644
--- a/util/x86emu/yabel/device.h
+++ b/util/x86emu/yabel/device.h
@@ -115,7 +115,7 @@ extern biosemu_device_t bios_device;
u8 biosemu_dev_init(struct device * device);
// NOTE: for dev_check_exprom to work, biosemu_dev_init MUST be called first!
-u8 biosemu_dev_check_exprom(void);
+u8 biosemu_dev_check_exprom(unsigned long rom_base_addr);
u8 biosemu_dev_translate_address(unsigned long * addr);
@@ -166,7 +166,7 @@ in16le(void *addr)
return val;
}
-/* debug function, dumps HID1 and HID4 to detect wether caches are on/off */
+/* debug function, dumps HID1 and HID4 to detect whether caches are on/off */
static inline void
dumpHID(void)
{