======
@@ -26,32 +26,43 @@ static void
__make_bios_writable_intel(u16 bdf, u32 pam0)
{
// Make ram from 0xc0000-0xf0000 writable
- int clear = 0;
int i;
+ unsigned *mem, *mem_limit;
for (i=0; i<6; i++) {
u32 pam = pam0 + 1 + i;
int reg = pci_config_readb(bdf, pam);
- if (CONFIG_OPTIONROMS_DEPLOYED && (reg & 0x11) != 0x11) {
- // Need to copy optionroms to work around qemu implementation
- void *mem = (void*)(BUILD_ROM_START + i * 32*1024);
- memcpy((void*)BUILD_BIOS_TMP_ADDR, mem, 32*1024);
+ if ((reg & 0x11) != 0x11) {
+ mem = (unsigned *)(BUILD_ROM_START + i * 32 * 1024);
+ pci_config_writeb(bdf, pam, 0x22);
+ mem_limit = mem + 32 * 1024 / sizeof(unsigned);
+
+ while (mem < mem_limit) {
+ volatile unsigned tmp = *mem;
+ *mem = tmp;
+ mem++;
+ }
pci_config_writeb(bdf, pam, 0x33);
- memcpy(mem, (void*)BUILD_BIOS_TMP_ADDR, 32*1024);
- clear = 1;
} else {
pci_config_writeb(bdf, pam, 0x33);
}
}
- if (clear)
- memset((void*)BUILD_BIOS_TMP_ADDR, 0, 32*1024);
// Make ram from 0xf0000-0x100000 writable
int reg = pci_config_readb(bdf, pam0);
- pci_config_writeb(bdf, pam0, 0x30);
if (reg & 0x10)
// Ram already present.
return;
+ pci_config_writeb(bdf, pam0, 0x22);
+ mem = (unsigned *)BUILD_BIOS_ADDR;
+ mem_limit = mem + 32 * 1024 / sizeof(unsigned);
+ while (mem < mem_limit) {
+ volatile unsigned tmp = *mem;
+ *mem = tmp;
+ mem++;
+ }
+ pci_config_writeb(bdf, pam0, 0x33);
+
// Copy bios.
extern u8 code32flat_start[], code32flat_end[];
memcpy(code32flat_start, code32flat_start + BIOS_SRC_OFFSET
@@ -61,17 +72,6 @@ __make_bios_writable_intel(u16 bdf, u32 pam0)
static void
make_bios_writable_intel(u16 bdf, u32 pam0)
{
- int reg = pci_config_readb(bdf, pam0);
- if (!(reg & 0x10)) {
- // QEMU doesn't fully implement the piix shadow capabilities -
- // if ram isn't backing the bios segment when shadowing is
- // disabled, the code itself wont be in memory. So, run the
- // code from the high-memory flash location.
- u32 pos = (u32)__make_bios_writable_intel + BIOS_SRC_OFFSET;
- void (*func)(u16 bdf, u32 pam0) = (void*)pos;
- func(bdf, pam0);
- return;
- }
// Ram already present - just enable writes
__make_bios_writable_intel(bdf, pam0);
}