Do garbage collection of unused sections.
[seabios.git] / src / romlayout.S
index 80b7a4b29a965b2b7cc6a8b41c0d404a6ad4eacc..cbd9483681749555a102ee617742a81246eda408 100644 (file)
@@ -1,16 +1,10 @@
 // Rom layout and bios assembler to C interface.
 //
-// Copyright (C) 2008  Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2008,2009  Kevin O'Connor <kevin@koconnor.net>
 // Copyright (C) 2002  MandrakeSoft S.A.
 //
 // This file may be distributed under the terms of the GNU LGPLv3 license.
 
-#include "config.h" // CONFIG_*
-#include "ioport.h" // PORT_A20
-#include "bregs.h" // CR0_*
-#include "cmos.h" // CMOS_RESET_CODE
-#include "../out/asm-offsets.h" // BREGS_*
-
 
 /****************************************************************
  * Include of 16bit C code
         .code16gcc
 .include "out/ccode.16.s"
 
-
-/****************************************************************
- * Entry macros
- ****************************************************************/
-
-        // Call a C function - this does the minimal work necessary to
-        // call into C.  It sets up %ds, backs up %es, and backs up
-        // those registers that are call clobbered by the C compiler.
-        .macro ENTRY cfunc
-        cli         // In case something far-calls instead of using "int"
-        cld
-        pushl %eax              // Save registers clobbered by C code
-        pushl %ecx
-        pushl %edx
-        pushw %es
-        pushw %ds
-        movw %ss, %ax           // Move %ss to %ds
-        movw %ax, %ds
-        pushl %esp              // Backup %esp, then clear high bits
-        movzwl %sp, %esp
-        calll \cfunc
-        popl %esp               // Restore %esp (including high bits)
-        popw %ds                // Restore registers saved above
-        popw %es
-        popl %edx
-        popl %ecx
-        popl %eax
-        .endm
-
-        // Call a C function with current register list as an
-        // argument.  This backs up the registers and sets %eax
-        // to point to the backup.  On return, the registers are
-        // restored from the structure.
-        .macro ENTRY_ARG cfunc
-        cli
-        cld
-        pushl %eax              // Save registers (matches struct bregs)
-        pushl %ecx
-        pushl %edx
-        pushl %ebx
-        pushl %esi
-        pushl %edi
-        pushw %es
-        pushw %ds
-        movw %ss, %ax           // Move %ss to %ds
-        movw %ax, %ds
-        movl %esp, %ebx         // Backup %esp, then zero high bits
-        movzwl %sp, %esp
-        movl %esp, %eax         // First arg is pointer to struct bregs
-        calll \cfunc
-        movl %ebx, %esp         // Restore %esp (including high bits)
-        popw %ds                // Restore registers (from struct bregs)
-        popw %es
-        popl %edi
-        popl %esi
-        popl %ebx
-        popl %edx
-        popl %ecx
-        popl %eax
-        .endm
-
-        // As above, but don't mangle %esp
-        .macro ENTRY_ARG_ESP cfunc
-        cli
-        cld
-        pushl %eax              // Save registers (matches struct bregs)
-        pushl %ecx
-        pushl %edx
-        pushl %ebx
-        pushl %esi
-        pushl %edi
-        pushw %es
-        pushw %ds
-        movw %ss, %ax           // Move %ss to %ds
-        movw %ax, %ds
-        movl %esp, %eax         // First arg is pointer to struct bregs
-        calll \cfunc
-        popw %ds                // Restore registers (from struct bregs)
-        popw %es
-        popl %edi
-        popl %esi
-        popl %ebx
-        popl %edx
-        popl %ecx
-        popl %eax
-        .endm
-
-        // Reset stack, transition to 32bit mode, and call a C function.
-        // Clobbers %ax
-        .macro ENTRY_INTO32 cfunc
-        xorw %ax, %ax
-        movw %ax, %ss
-        movl $ BUILD_STACK_ADDR , %esp
-        pushl $ \cfunc
-        jmp transition32
-        .endm
-
-        // Declare a function
-        .macro DECLFUNC func
-        .section .text.asm.\func
-        .global \func
-        .endm
+#include "config.h" // CONFIG_*
+#include "ioport.h" // PORT_A20
+#include "bregs.h" // CR0_*
+#include "cmos.h" // CMOS_RESET_CODE
+#include "../out/asm-offsets.h" // BREGS_*
+#include "entryfuncs.S" // ENTRY_*
 
 
 /****************************************************************
@@ -259,6 +157,7 @@ __call16:
         // Load calling registers.
         movl BREGS_edi(%eax), %edi
         movl BREGS_esi(%eax), %esi
+        movl BREGS_ebp(%eax), %ebp
         movl BREGS_ebx(%eax), %ebx
         movl BREGS_edx(%eax), %edx
         movl BREGS_ecx(%eax), %ecx
@@ -286,6 +185,7 @@ __call16:
         movw %es, BREGS_es(%eax)
         movl %edi, BREGS_edi(%eax)
         movl %esi, BREGS_esi(%eax)
+        movl %ebp, BREGS_ebp(%eax)
         movl %ebx, BREGS_ebx(%eax)
         movl %edx, BREGS_edx(%eax)
 
@@ -334,7 +234,7 @@ entry_post:
         jnz 1f
 
         // Normal entry point
-        ENTRY_INTO32 _code32__start
+        ENTRY_INTO32 _start
 
         // Entry point when a post call looks like a resume.
 1:
@@ -351,8 +251,13 @@ entry_post:
         movw $SEG_BDA, %ax
         movw %ax, %ds
         movw BDA_ebda_seg, %ax
-        // XXX - should verify ebda_seg looks sane.
-        movw %ax, %ds
+
+        cmpw $EBDA_SEGMENT_START, %ax
+        jle 2f
+        // EBDA segment doesn't look valid - use startup value.
+        movw $EBDA_SEGMENT_START, %ax
+
+2:      movw %ax, %ds
         movw %ax, %ss
         movl $EBDA_OFFSET_TOP_STACK, %esp
 
@@ -427,7 +332,7 @@ apm32protected_entry:
         lretl
 
 // 32bit elf entry point
-        DECLFUNC post32
+        EXPORTFUNC post32
 post32:
         cli
         cld
@@ -440,7 +345,7 @@ post32:
         movw %ax, %gs
         movw %ax, %ss
         movl $BUILD_STACK_ADDR, %esp
-        ljmpl $SEG32_MODE32_CS, $_code32__start
+        ljmpl $SEG32_MODE32_CS, $_start
 
         .code16gcc
 
@@ -453,31 +358,41 @@ post32:
         .macro IRQ_ENTRY num
         .global entry_\num
         entry_\num :
-        ENTRY handle_\num
-        iretw
+        pushl $ handle_\num
+        jmp irqentry
         .endm
 
         // Define an entry point for an interrupt (can read/modify args).
         .macro IRQ_ENTRY_ARG num
         .global entry_\num
         entry_\num :
-        ENTRY_ARG handle_\num
-        iretw
+        pushl $ handle_\num
+        jmp irqentryarg
         .endm
 
         // Macros that put each handler into its own section
         .macro DECL_IRQ_ENTRY num
-        .section .text.asm.entry_\num
+        DECLFUNC entry_\num
         IRQ_ENTRY \num
         .endm
         .macro DECL_IRQ_ENTRY_ARG num
-        .section .text.asm.entry_\num
+        DECLFUNC entry_\num
         IRQ_ENTRY_ARG \num
         .endm
 
+        // Main entry point for interrupts without args
+        DECLFUNC irqentry
+irqentry:
+        ENTRY_ST
+        iretw
+
+        // Main entry point for interrupts with args
+        DECLFUNC irqentryarg
+irqentryarg:
+        ENTRY_ARG_ST
+        iretw
+
         DECL_IRQ_ENTRY_ARG 13
-        DECL_IRQ_ENTRY_ARG 12
-        DECL_IRQ_ENTRY_ARG 11
         DECL_IRQ_ENTRY 76
         DECL_IRQ_ENTRY 70
         DECL_IRQ_ENTRY 74
@@ -488,11 +403,11 @@ post32:
         // int 18/19 are special - they reset stack and call into 32bit mode.
         DECLFUNC entry_19
 entry_19:
-        ENTRY_INTO32 _code32_handle_19
+        ENTRY_INTO32 handle_19
 
         DECLFUNC entry_18
 entry_18:
-        ENTRY_INTO32 _code32_handle_18
+        ENTRY_INTO32 handle_18
 
 
 /****************************************************************
@@ -558,14 +473,10 @@ entry_10_0x0f:
         // 0xf0a4 - VideoParams in misc.c
 
         ORG 0xf841
-        .global entry_12_official
-entry_12_official:
-        jmp entry_12
+        IRQ_ENTRY_ARG 12
 
         ORG 0xf84d
-        .global entry_11_official
-entry_11_official:
-        jmp entry_11
+        IRQ_ENTRY_ARG 11
 
         ORG 0xf859
         IRQ_ENTRY_ARG 15