From e3677b12f8895c062bcd7e2a4b82963f7a62ca00 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Fri, 4 Jul 2008 15:29:23 -0400 Subject: [PATCH] Define 16bit OFFSET_x to be 32bit addresses; introduce CONFIG_BIOS_ADDR. The rom16.o object will now have absolute (32bit applicable) addresses. Replace several 0xf0000 and 0x10000 uses with CONFIG_BIOS_ADDR/SIZE macros. --- Makefile | 3 +- src/config.h | 2 ++ src/memmap.c | 4 +-- src/post.c | 87 ++++++++++++++++++++++++--------------------- src/rombios32.lds.S | 4 +-- src/romlayout.S | 9 +++-- src/shadow.c | 12 ++++--- src/system.c | 2 +- src/util.h | 2 +- tools/buildrom.py | 5 +-- 10 files changed, 73 insertions(+), 57 deletions(-) diff --git a/Makefile b/Makefile index dda74cd..b939ed2 100644 --- a/Makefile +++ b/Makefile @@ -98,7 +98,8 @@ $(OUT)romlayout16.o: romlayout.S $(OUT)blob.16.s $(TABLEASM) $(OUT)rom16.o: $(OUT)romlayout16.o $(OUT)rombios16.lds @echo " Linking $@" - $(Q)ld -T $(OUT)rombios16.lds $< -o $@ + $(Q)ld -T $(OUT)rombios16.lds $< -o $@.16 + $(Q)objcopy --change-addresses 0xf0000 $@.16 $@ $(OUT)romlayout32.o: $(OUT)rom16.offset.auto.h ; $(call whole-compile, $(CFLAGS), $(addprefix src/, $(SRC32)),$@) diff --git a/src/config.h b/src/config.h index 9adb3c3..649aa61 100644 --- a/src/config.h +++ b/src/config.h @@ -54,6 +54,8 @@ #define BUILD_CPU_COUNT_ADDR 0xf000 #define BUILD_AP_BOOT_ADDR 0x10000 #define BUILD_BSS_ADDR 0x40000 +#define BUILD_BIOS_ADDR 0xf0000 +#define BUILD_BIOS_SIZE 0x10000 /* 64 KB used to copy the BIOS to shadow RAM */ #define BUILD_BIOS_TMP_ADDR 0x30000 diff --git a/src/memmap.c b/src/memmap.c index 67f10e8..3449cb4 100644 --- a/src/memmap.c +++ b/src/memmap.c @@ -132,8 +132,8 @@ u32 bios_table_cur_addr, bios_table_end_addr; void memmap_setup() { - bios_table_cur_addr = 0xf0000 | OFFSET_freespace2_start; - bios_table_end_addr = 0xf0000 | OFFSET_freespace2_end; + bios_table_cur_addr = OFFSET_freespace2_start; + bios_table_end_addr = OFFSET_freespace2_end; dprintf(1, "bios_table_addr: 0x%08x end=0x%08x\n", bios_table_cur_addr, bios_table_end_addr); } diff --git a/src/post.c b/src/post.c index 2dea6b2..6ece8a5 100644 --- a/src/post.c +++ b/src/post.c @@ -22,6 +22,13 @@ #define bda ((struct bios_data_area_s *)MAKE_FARPTR(SEG_BDA, 0)) #define ebda ((struct extended_bios_data_area_s *)MAKE_FARPTR(SEG_EBDA, 0)) +static void +set_irq(int vector, u32 loc) +{ + SET_BDA(ivecs[vector].seg, SEG_BIOS); + SET_BDA(ivecs[vector].offset, loc - BUILD_BIOS_ADDR); +} + static void init_bda() { @@ -31,47 +38,45 @@ init_bda() SET_BDA(mem_size_kb, BASE_MEM_IN_K); int i; - for (i=0; i<256; i++) { - SET_BDA(ivecs[i].seg, SEG_BIOS); - SET_BDA(ivecs[i].offset, OFFSET_dummy_iret_handler); - } - - SET_BDA(ivecs[0x08].offset, OFFSET_entry_08); - SET_BDA(ivecs[0x09].offset, OFFSET_entry_09); - //SET_BDA(ivecs[0x0a].offset, OFFSET_entry_hwirq); - //SET_BDA(ivecs[0x0b].offset, OFFSET_entry_hwirq); - //SET_BDA(ivecs[0x0c].offset, OFFSET_entry_hwirq); - //SET_BDA(ivecs[0x0d].offset, OFFSET_entry_hwirq); - SET_BDA(ivecs[0x0e].offset, OFFSET_entry_0e); - //SET_BDA(ivecs[0x0f].offset, OFFSET_entry_hwirq); - SET_BDA(ivecs[0x10].offset, OFFSET_entry_10); - SET_BDA(ivecs[0x11].offset, OFFSET_entry_11); - SET_BDA(ivecs[0x12].offset, OFFSET_entry_12); - SET_BDA(ivecs[0x13].offset, OFFSET_entry_13); - SET_BDA(ivecs[0x14].offset, OFFSET_entry_14); - SET_BDA(ivecs[0x15].offset, OFFSET_entry_15); - SET_BDA(ivecs[0x16].offset, OFFSET_entry_16); - SET_BDA(ivecs[0x17].offset, OFFSET_entry_17); - SET_BDA(ivecs[0x18].offset, OFFSET_entry_18); - SET_BDA(ivecs[0x19].offset, OFFSET_entry_19); - SET_BDA(ivecs[0x1a].offset, OFFSET_entry_1a); - SET_BDA(ivecs[0x1c].offset, OFFSET_entry_1c); - SET_BDA(ivecs[0x40].offset, OFFSET_entry_40); - SET_BDA(ivecs[0x70].offset, OFFSET_entry_70); - //SET_BDA(ivecs[0x71].offset, OFFSET_entry_hwirq); - //SET_BDA(ivecs[0x72].offset, OFFSET_entry_hwirq); - //SET_BDA(ivecs[0x73].offset, OFFSET_entry_hwirq); - SET_BDA(ivecs[0x74].offset, OFFSET_entry_74); - SET_BDA(ivecs[0x75].offset, OFFSET_entry_75); - SET_BDA(ivecs[0x76].offset, OFFSET_entry_76); - //SET_BDA(ivecs[0x77].offset, OFFSET_entry_hwirq); + for (i=0; i<256; i++) + set_irq(i, OFFSET_dummy_iret_handler); + + set_irq(0x08, OFFSET_entry_08); + set_irq(0x09, OFFSET_entry_09); + //set_irq(0x0a, OFFSET_entry_hwirq); + //set_irq(0x0b, OFFSET_entry_hwirq); + //set_irq(0x0c, OFFSET_entry_hwirq); + //set_irq(0x0d, OFFSET_entry_hwirq); + set_irq(0x0e, OFFSET_entry_0e); + //set_irq(0x0f, OFFSET_entry_hwirq); + set_irq(0x10, OFFSET_entry_10); + set_irq(0x11, OFFSET_entry_11); + set_irq(0x12, OFFSET_entry_12); + set_irq(0x13, OFFSET_entry_13); + set_irq(0x14, OFFSET_entry_14); + set_irq(0x15, OFFSET_entry_15); + set_irq(0x16, OFFSET_entry_16); + set_irq(0x17, OFFSET_entry_17); + set_irq(0x18, OFFSET_entry_18); + set_irq(0x19, OFFSET_entry_19); + set_irq(0x1a, OFFSET_entry_1a); + set_irq(0x1c, OFFSET_entry_1c); + set_irq(0x40, OFFSET_entry_40); + set_irq(0x70, OFFSET_entry_70); + //set_irq(0x71, OFFSET_entry_hwirq); + //set_irq(0x72, OFFSET_entry_hwirq); + //set_irq(0x73, OFFSET_entry_hwirq); + set_irq(0x74, OFFSET_entry_74); + set_irq(0x75, OFFSET_entry_75); + set_irq(0x76, OFFSET_entry_76); + //set_irq(0x77, OFFSET_entry_hwirq); // set vector 0x79 to zero // this is used by 'gardian angel' protection system SET_BDA(ivecs[0x79].seg, 0); SET_BDA(ivecs[0x79].offset, 0); - SET_BDA(ivecs[0x1E].offset, OFFSET_diskette_param_table2); + set_irq(0x1E, OFFSET_diskette_param_table2); } static void @@ -116,7 +121,7 @@ ram_probe(void) // Mark known areas as reserved. add_e820((u32)MAKE_FARPTR(SEG_EBDA, 0), EBDA_SIZE * 1024, E820_RESERVED); - add_e820((u32)MAKE_FARPTR(SEG_BIOS, 0), 0x10000, E820_RESERVED); + add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED); dprintf(1, "ram_size=0x%08x\n", GET_EBDA(ram_size)); } @@ -181,7 +186,8 @@ callrom(u16 seg, u16 offset) struct bregs br; memset(&br, 0, sizeof(br)); br.es = SEG_BIOS; - br.di = OFFSET_pnp_string + 1; // starts 1 past for alignment + // starts 1 past for alignment + br.di = OFFSET_pnp_string - BUILD_BIOS_ADDR + 1; br.cs = seg; br.ip = offset; call16(&br); @@ -352,7 +358,8 @@ _start() interactive_bootmenu(); // Setup bios checksum. - *(u8*)0xfffff = -checksum((u8*)0xf0000, 0xffff); + *(u8*)OFFSET_bios_checksum = -checksum((u8*)BUILD_BIOS_ADDR + , BUILD_BIOS_SIZE - 1); // Prep for boot process. make_bios_readonly(); @@ -371,8 +378,8 @@ asm( "post32:\n" "cli\n" "cld\n" - "lidtl " __stringify(0xf0000 | OFFSET_pmode_IDT_info) "\n" - "lgdtl " __stringify(0xf0000 | OFFSET_rombios32_gdt_48) "\n" + "lidtl " __stringify(OFFSET_pmode_IDT_info) "\n" + "lgdtl " __stringify(OFFSET_rombios32_gdt_48) "\n" "movl $" __stringify(BUILD_STACK_ADDR) ", %esp\n" "ljmp $0x10, $_start\n" ); diff --git a/src/rombios32.lds.S b/src/rombios32.lds.S index 312850a..b040004 100644 --- a/src/rombios32.lds.S +++ b/src/rombios32.lds.S @@ -13,7 +13,7 @@ OUTPUT_ARCH("i386") ENTRY(post32); SECTIONS { - . = (OFFSET_bios16c_end | 0xf0000); + . = OFFSET_bios16c_end; . = ALIGN(16); _text32_start = . ; .text : { *(.text) } @@ -23,7 +23,7 @@ SECTIONS __bss_start = . ; .bss : { *(.bss) *(COMMON) } __bss_end = . ; - __call16_from32 = (0xf0000 | OFFSET___call16_from32) ; + __call16_from32 = OFFSET___call16_from32; /DISCARD/ : { *(.stab) *(.stabstr) *(.comment) diff --git a/src/romlayout.S b/src/romlayout.S index daa8d7a..b800492 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -207,7 +207,7 @@ __call16_from32: movl %eax, %cr0 // far jump to flush CPU queue after transition to real mode - ljmpw $0xf000, $2f + ljmpw $SEG_BIOS, $2f 2: // restore IDT to normal real-mode defaults @@ -238,7 +238,7 @@ __call16: pushl %eax // Setup for iretw call - pushw $0xf000 + pushw $SEG_BIOS pushw $1f // return point pushw 0x20(%eax) // flags pushl 0x1c(%eax) // CS:IP @@ -515,7 +515,7 @@ dummy_iret_handler: IRQ_ENTRY_ARG 05 ORG 0xfff0 // Power-up Entry Point - ljmpw $0xf000, $post16 + ljmpw $SEG_BIOS, $post16 ORG 0xfff5 // BIOS build date @@ -523,6 +523,9 @@ dummy_iret_handler: ORG 0xfffe .byte CONFIG_MODEL_ID + + .globl bios_checksum +bios_checksum: .byte 0x00 .end diff --git a/src/shadow.c b/src/shadow.c index b9457c5..730dc53 100644 --- a/src/shadow.c +++ b/src/shadow.c @@ -24,7 +24,8 @@ copy_bios(PCIDevice d) int v = pci_config_readb(d, 0x59); v |= 0x30; pci_config_writeb(d, 0x59, v); - memcpy((void *)0x000f0000, (void *)BUILD_BIOS_TMP_ADDR, 0x10000); + memcpy((void *)BUILD_BIOS_ADDR, (void *)BUILD_BIOS_TMP_ADDR + , BUILD_BIOS_SIZE); } // Make the BIOS code segment area (0xf0000) writable. @@ -45,14 +46,15 @@ make_bios_writable() } // Copy the bios to a temporary area. - memcpy((void *)BUILD_BIOS_TMP_ADDR, (void *)0x000f0000, 0x10000); + memcpy((void *)BUILD_BIOS_TMP_ADDR, (void *)BUILD_BIOS_ADDR + , BUILD_BIOS_SIZE); // Enable shadowing and copy bios. - if (IN_RANGE((u32)copy_bios, 0xf0000, 0x10000)) { + if (IN_RANGE((u32)copy_bios, BUILD_BIOS_ADDR, BUILD_BIOS_SIZE)) { // Jump to shadow enable function - use the copy in the // temporary storage area so that memory does not change under // the executing code. - u32 pos = (u32)copy_bios - 0xf0000 + BUILD_BIOS_TMP_ADDR; + u32 pos = (u32)copy_bios - BUILD_BIOS_ADDR + BUILD_BIOS_TMP_ADDR; void (*func)(PCIDevice) = (void*)pos; func(d); } else { @@ -60,7 +62,7 @@ make_bios_writable() } // Clear the temporary area. - memset((void *)BUILD_BIOS_TMP_ADDR, 0, 0x10000); + memset((void *)BUILD_BIOS_TMP_ADDR, 0, BUILD_BIOS_SIZE); } // Make the BIOS code segment area (0xf0000) read-only. diff --git a/src/system.c b/src/system.c index d9ff5a7..05fb906 100644 --- a/src/system.c +++ b/src/system.c @@ -170,7 +170,7 @@ handle_1587(struct bregs *regs) "movl %%eax, %%cr0\n" // far jump to flush CPU queue after transition to real mode - "ljmpw $0xf000, $2f\n" + "ljmpw $" __stringify(SEG_BIOS) ", $2f\n" "2:\n" // restore IDT to normal real-mode defaults diff --git a/src/util.h b/src/util.h index 358289a..aa5e457 100644 --- a/src/util.h +++ b/src/util.h @@ -73,7 +73,7 @@ inline void __call16_int(struct bregs *callregs, u16 offset); #else #include "../out/rom16.offset.auto.h" #define call16_int(nr, callregs) \ - __call16_int((callregs), OFFSET_irq_trampoline_ ##nr ) + __call16_int((callregs), OFFSET_irq_trampoline_ ##nr - BUILD_BIOS_ADDR) #endif // output.c diff --git a/tools/buildrom.py b/tools/buildrom.py index d9a490d..87b61f3 100755 --- a/tools/buildrom.py +++ b/tools/buildrom.py @@ -58,14 +58,15 @@ def main(): if size32 > freespace: print "32bit code too large (%d vs %d)" % (size32, freespace) sys.exit(1) + spos -= 0xf0000 if data16[spos:spos+size32] != '\0'*size32: - print "Non zero data in 16bit freespace (%d to %d)" % ( + print "Non zero data in 16bit freespace (0x%x to 0x%x)" % ( spos, spos+size32) sys.exit(1) outrom = data16[:spos] + data32 + data16[spos+size32:] # Fixup initial jump to 32 bit code - jmppos = int(o16['OFFSET_set_entry32'], 16) + jmppos = int(o16['OFFSET_set_entry32'], 16) - 0xf0000 start32 = int(o32['OFFSET__start'], 16) outrom = alteraddr(outrom, jmppos+2, start32) -- 2.25.1