Make sure the PMM scanning code uses the GET_FARVAR macro. (The existing code only worked because SeaBIOS happens to call the vgabios in bigreal mode with %ds == %ss = 0.) Also, the scan doesn't require bigreal mode - use accesses relative to the SEG_BIOS segment so that the scan can work in regular real mode.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- vgasrc/vgainit.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/vgasrc/vgainit.c b/vgasrc/vgainit.c index 33b8eb9..6d9a224 100644 --- a/vgasrc/vgainit.c +++ b/vgasrc/vgainit.c @@ -60,14 +60,14 @@ allocate_extra_stack(void) { if (!CONFIG_VGA_ALLOCATE_EXTRA_STACK) return; - void *pmmscan = (void*)BUILD_BIOS_ADDR; - for (; pmmscan < (void*)BUILD_BIOS_ADDR+BUILD_BIOS_SIZE; pmmscan+=16) { - struct pmmheader *pmm = pmmscan; - if (pmm->signature != PMM_SIGNATURE) + u32 pmmscan; + for (pmmscan=0; pmmscan < BUILD_BIOS_SIZE; pmmscan+=16) { + struct pmmheader *pmm = (void*)pmmscan; + if (GET_FARVAR(SEG_BIOS, pmm->signature) != PMM_SIGNATURE) continue; - if (checksum_far(0, pmm, pmm->length)) + if (checksum_far(SEG_BIOS, pmm, GET_FARVAR(SEG_BIOS, pmm->length))) continue; - struct segoff_s entry = pmm->entry; + struct segoff_s entry = GET_FARVAR(SEG_BIOS, pmm->entry); dprintf(1, "Attempting to allocate VGA stack via pmm call to %04x:%04x\n" , entry.seg, entry.offset); u16 res1, res2;