Hi, On Sat, Dec 20, 2008 at 2:44 PM, Myles Watson <[email protected]> wrote: > That would be great. Once that's done I think I'll try YABEL on a "factory" > BIOS from inside Coreboot. Qemu would be an easy place to try that. >
here is the patch that should use the address that coreboot passes, unless that address is 0, then the ExpROM BAR address is used. Subject: [PATCH] use the rom_addr passed by coreboot, needed for ROM images from LAR Signed-off-by: Pattrick Hueper <[email protected]> --- util/x86emu/yabel/biosemu.c | 11 +++++++++-- util/x86emu/yabel/compat/functions.c | 4 ++-- util/x86emu/yabel/device.c | 22 +++++++++++++--------- util/x86emu/yabel/device.h | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/util/x86emu/yabel/biosemu.c b/util/x86emu/yabel/biosemu.c index 7e92fde..cc11c0f 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; } diff --git a/util/x86emu/yabel/compat/functions.c b/util/x86emu/yabel/compat/functions.c index c1a6d9a..33c9115 100644 --- a/util/x86emu/yabel/compat/functions.c +++ b/util/x86emu/yabel/compat/functions.c @@ -15,11 +15,11 @@ 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 ab4e7a2..0a0e00f 100644 --- a/util/x86emu/yabel/device.c +++ b/util/x86emu/yabel/device.c @@ -282,21 +282,25 @@ biosemu_dev_get_device_vendor_id(void) } /* 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 */ + * 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) { + rom_base_addr = ta.address + ta.address_offset; //translated address + break; + } } } // in the ROM there could be multiple Expansion ROM Images... start searching diff --git a/util/x86emu/yabel/device.h b/util/x86emu/yabel/device.h index 09c7710..0f1680c 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); -- 1.6.0.4 Cheers, Patty
From 75dbfc19cbf03a632a6e37859b340dbecfcd5f40 Mon Sep 17 00:00:00 2001 From: Pattrick Hueper <[email protected]> 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 <[email protected]> --- util/x86emu/yabel/biosemu.c | 11 +++++++++-- util/x86emu/yabel/compat/functions.c | 4 ++-- util/x86emu/yabel/device.c | 22 +++++++++++++--------- util/x86emu/yabel/device.h | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/util/x86emu/yabel/biosemu.c b/util/x86emu/yabel/biosemu.c index 7e92fde..cc11c0f 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; } diff --git a/util/x86emu/yabel/compat/functions.c b/util/x86emu/yabel/compat/functions.c index c1a6d9a..33c9115 100644 --- a/util/x86emu/yabel/compat/functions.c +++ b/util/x86emu/yabel/compat/functions.c @@ -15,11 +15,11 @@ 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 ab4e7a2..0a0e00f 100644 --- a/util/x86emu/yabel/device.c +++ b/util/x86emu/yabel/device.c @@ -282,21 +282,25 @@ biosemu_dev_get_device_vendor_id(void) } /* 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 */ + * 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) { + rom_base_addr = ta.address + ta.address_offset; //translated address + break; + } } } // in the ROM there could be multiple Expansion ROM Images... start searching diff --git a/util/x86emu/yabel/device.h b/util/x86emu/yabel/device.h index 09c7710..0f1680c 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); -- 1.6.0.4
-- coreboot mailing list: [email protected] http://www.coreboot.org/mailman/listinfo/coreboot

