1 // Rom layout and bios assembler to C interface.
3 // Copyright (C) 2009-2013 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU LGPLv3 license.
8 #include "asm-offsets.h" // BREGS_*
9 #include "config.h" // CONFIG_*
10 #include "entryfuncs.S" // ENTRY_*
13 /****************************************************************
15 ****************************************************************/
19 .global _rom_header, _rom_header_size, _rom_header_checksum
31 #if CONFIG_VGA_PCI == 1
40 _rom_header_signature:
44 /****************************************************************
46 ****************************************************************/
48 // This macro implements a call while avoiding instructions
49 // that old versions of x86emu have problems with.
50 .macro VGA_CALLL cfunc
51 #if CONFIG_VGA_FIXUP_ASM
59 // This macro is the same as ENTRY_ARG except VGA_CALLL is used.
60 .macro ENTRY_ARG_VGA cfunc
64 movw %ss, %ax // Move %ss to %ds
66 movl %esp, %ebx // Backup %esp, then zero high bits
68 movl %esp, %eax // First arg is pointer to struct bregs
70 movl %ebx, %esp // Restore %esp (including high bits)
76 ENTRY_ARG_VGA vbe_104f05
79 DECLFUNC _optionrom_entry
81 ENTRY_ARG_VGA vga_post
86 ENTRY_ARG_VGA handle_10
89 // Entry point using extra stack
90 DECLFUNC entry_10_extrastack
94 pushw %ds // Set %ds:%eax to space on ExtraStack
96 movw %cs:ExtraStackSeg, %ds
97 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-16), %eax
98 SAVEBREGS_POP_DSEAX // Save registers on extra stack
99 movl %esp, PUSHBREGS_size+8(%eax)
100 movw %ss, PUSHBREGS_size+12(%eax)
101 popl BREGS_code(%eax)
102 popw BREGS_flags(%eax)
104 movw %ds, %dx // Setup %ss/%esp and call function
109 movl %esp, %eax // Restore registers and return
110 movw PUSHBREGS_size+12(%eax), %ss
111 movl PUSHBREGS_size+8(%eax), %esp
114 pushw BREGS_flags(%eax)
115 pushl BREGS_code(%eax)
119 // Timer irq handling
120 DECLFUNC entry_timer_hook
122 ENTRY handle_timer_hook
123 ljmpw *%cs:Timer_Hook_Resume
125 // Timer irq handling on extra stack
126 DECLFUNC entry_timer_hook_extrastack
127 entry_timer_hook_extrastack:
130 pushw %ds // Set %ds:%eax to space on ExtraStack
132 movw %cs:ExtraStackSeg, %ds
133 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-8), %eax
135 movl %esp, PUSHBREGS_size(%eax)
136 movw %ss, PUSHBREGS_size+4(%eax)
138 movw %ds, %dx // Setup %ss/%esp and call function
141 calll handle_timer_hook
143 movl %esp, %eax // Restore registers and return
144 movw PUSHBREGS_size+4(%eax), %ss
145 movl PUSHBREGS_size(%eax), %esp
147 ljmpw *%cs:Timer_Hook_Resume