// 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_*
/****************************************************************
// 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
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)
jnz 1f
// Normal entry point
- ENTRY_INTO32 _code32__start
+ ENTRY_INTO32 _start
// Entry point when a post call looks like a resume.
1:
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
lretl
// 32bit elf entry point
- DECLFUNC post32
+ EXPORTFUNC post32
post32:
cli
cld
movw %ax, %gs
movw %ax, %ss
movl $BUILD_STACK_ADDR, %esp
- ljmpl $SEG32_MODE32_CS, $_code32__start
+ ljmpl $SEG32_MODE32_CS, $_start
.code16gcc
.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
// 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
/****************************************************************
// 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