Define 16bit OFFSET_x to be 32bit addresses; introduce CONFIG_BIOS_ADDR.
authorKevin O'Connor <kevin@koconnor.net>
Fri, 4 Jul 2008 19:29:23 +0000 (15:29 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 4 Jul 2008 19:29:23 +0000 (15:29 -0400)
The rom16.o object will now have absolute (32bit applicable) addresses.
Replace several 0xf0000 and 0x10000 uses with CONFIG_BIOS_ADDR/SIZE macros.

Makefile
src/config.h
src/memmap.c
src/post.c
src/rombios32.lds.S
src/romlayout.S
src/shadow.c
src/system.c
src/util.h
tools/buildrom.py

index dda74cdeb8ea087e448f40d1d4270968b077ff1b..b939ed28538724d4f900625d4ff328e682e065ee 100644 (file)
--- 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)),$@)
 
index 9adb3c335a778d63ac26fe903a6e5db804189bf2..649aa610b85f128ba589dcca61053d107453d7f8 100644 (file)
@@ -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
 
index 67f10e89db10b8864022c2d034c7e14add023225..3449cb483e26ddb813283a93a7484b70e15bbaca 100644 (file)
@@ -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);
 }
index 2dea6b294d028cc21db6228dcbc7006fb698f598..6ece8a5febc9c35236ff37f37099c6857ad8598e 100644 (file)
 #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"
     );
index 312850a04cb8d5df9e9a44156e805fe920b21695..b04000464c2ed9cab831650ced4e5a8d741843d6 100644 (file)
@@ -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)
index daa8d7ad8517a5795eaf701a2eb61d4db8bf56aa..b8004922d93c3bb5fd7a66ff8fd957b8f25ce750 100644 (file)
@@ -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
index b9457c55b7a5a5c0f385542ab66ccf501efef272..730dc53cc77189066c378d3ad2eedb0e307a3d6f 100644 (file)
@@ -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.
index d9ff5a7609e6c73a9d9244551a25fc47b6c00386..05fb9068bf5f5a2e73c240199435faa5f0f7a18a 100644 (file)
@@ -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
index 358289a9ad9971aee9f093a19816630e3dd43ed8..aa5e45741ca924450db0a0418fbc7e46d743a651 100644 (file)
@@ -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
index d9a490ddd8f27519c8715e639fb3a9c6e63e2811..87b61f3d4d5e24772c4b3c39b783c5e5bc64a083 100755 (executable)
@@ -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)