blob: 53be2b38ca520c691a4fde927bd8e0c5415a8919 [file] [log] [blame]
Kevin O'Connor1f2c3072009-05-06 23:35:59 -04001// Rom layout and bios assembler to C interface.
2//
Kevin O'Connordab0a742013-12-03 11:50:49 -05003// Copyright (C) 2009-2013 Kevin O'Connor <kevin@koconnor.net>
Kevin O'Connor1f2c3072009-05-06 23:35:59 -04004//
5// This file may be distributed under the terms of the GNU LGPLv3 license.
6
7
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -05008#include "asm-offsets.h" // BREGS_*
Julian Pidancet7c6509c2011-12-19 05:07:55 +00009#include "config.h" // CONFIG_*
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040010#include "entryfuncs.S" // ENTRY_*
11
12
13/****************************************************************
14 * Rom Header
15 ****************************************************************/
16
17 .section .rom.header
David Woodhouse67fd42c2014-06-03 17:28:58 +010018 .code16
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040019 .global _rom_header, _rom_header_size, _rom_header_checksum
20_rom_header:
21 .word 0xaa55
22_rom_header_size:
23 .byte 0
24_rom_header_entry:
25 jmp _optionrom_entry
26_rom_header_checksum:
Kevin O'Connorc9d3c2d2010-01-01 12:53:32 -050027 .byte 0
28_rom_header_other:
Julian Pidancet7c6509c2011-12-19 05:07:55 +000029 .space 17
30_rom_header_pcidata:
31#if CONFIG_VGA_PCI == 1
32 .word rom_pci_data
33#else
34 .word 0
35#endif
36_rom_header_pnpdata:
37 .word 0
Kevin O'Connor72b5e452011-12-23 23:01:48 -050038_rom_header_other2:
39 .word 0
40_rom_header_signature:
41 .asciz "IBM"
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040042
43
44/****************************************************************
45 * Entry points
46 ****************************************************************/
47
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050048 // This macro implements a call while avoiding instructions
49 // that old versions of x86emu have problems with.
50 .macro VGA_CALLL cfunc
Kevin O'Connor799b20b2015-04-09 17:15:23 -040051#if CONFIG_VGA_FIXUP_ASM
Kevin O'Connor0b2165d2015-04-09 17:20:16 -040052 pushw %ax
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050053 callw \cfunc
Kevin O'Connor799b20b2015-04-09 17:15:23 -040054#else
55 calll \cfunc
56#endif
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050057 .endm
58
59 // This macro is the same as ENTRY_ARG except VGA_CALLL is used.
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050060 .macro ENTRY_ARG_VGA cfunc
61 cli
62 cld
63 PUSHBREGS
64 movw %ss, %ax // Move %ss to %ds
65 movw %ax, %ds
66 movl %esp, %ebx // Backup %esp, then zero high bits
67 movzwl %sp, %esp
68 movl %esp, %eax // First arg is pointer to struct bregs
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050069 VGA_CALLL \cfunc
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050070 movl %ebx, %esp // Restore %esp (including high bits)
71 POPBREGS
72 .endm
73
Kevin O'Connor9961f992012-01-21 11:53:44 -050074 DECLFUNC entry_104f05
75entry_104f05:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050076 ENTRY_ARG_VGA vbe_104f05
Kevin O'Connor9961f992012-01-21 11:53:44 -050077 lretw
78
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040079 DECLFUNC _optionrom_entry
80_optionrom_entry:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050081 ENTRY_ARG_VGA vga_post
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040082 lretw
83
Kevin O'Connor9f193b92009-05-16 23:31:27 -040084 DECLFUNC entry_10
85entry_10:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050086 ENTRY_ARG_VGA handle_10
Kevin O'Connor9f193b92009-05-16 23:31:27 -040087 iretw
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -050088
Kevin O'Connor251e2632015-03-17 11:37:25 -040089#define VGA_CUSTOM_BDA_FLAGS 0xb9
90#define BF_EXTRA_STACK 0x40
91
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -050092 // Entry point using extra stack
93 DECLFUNC entry_10_extrastack
94entry_10_extrastack:
95 cli
96 cld
Kevin O'Connor251e2632015-03-17 11:37:25 -040097 pushw %ds
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -050098 pushl %eax
Kevin O'Connor251e2632015-03-17 11:37:25 -040099
100 movw $SEG_BDA, %ax // Check if extra stack is enabled
101 movw %ax, %ds
102 testb $BF_EXTRA_STACK, VGA_CUSTOM_BDA_FLAGS
103 jz 1f
104
105 movw %cs:ExtraStackSeg, %ds // Set %ds:%eax to space on ExtraStack
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500106 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-16), %eax
Kevin O'Connor46000f52014-10-21 02:23:02 -0400107 SAVEBREGS_POP_DSEAX // Save registers on extra stack
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500108 movl %esp, PUSHBREGS_size+8(%eax)
109 movw %ss, PUSHBREGS_size+12(%eax)
Kevin O'Connor41c60612013-12-09 17:27:54 -0500110 popl BREGS_code(%eax)
111 popw BREGS_flags(%eax)
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500112
113 movw %ds, %dx // Setup %ss/%esp and call function
114 movw %dx, %ss
115 movl %eax, %esp
Kevin O'Connor8032b8a2014-02-05 22:47:29 -0500116 VGA_CALLL handle_10
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500117
118 movl %esp, %eax // Restore registers and return
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500119 movw PUSHBREGS_size+12(%eax), %ss
120 movl PUSHBREGS_size+8(%eax), %esp
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500121 popl %edx
122 popw %dx
123 pushw BREGS_flags(%eax)
124 pushl BREGS_code(%eax)
Kevin O'Connor46000f52014-10-21 02:23:02 -0400125 RESTOREBREGS_DSEAX
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500126 iretw
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400127
Kevin O'Connor251e2632015-03-17 11:37:25 -04001281: // Use regular entry point if the extra stack is disabled
129 popl %eax
130 popw %ds
131 jmp entry_10
132
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400133 // Timer irq handling
134 DECLFUNC entry_timer_hook
135entry_timer_hook:
136 ENTRY handle_timer_hook
137 ljmpw *%cs:Timer_Hook_Resume
138
139 // Timer irq handling on extra stack
140 DECLFUNC entry_timer_hook_extrastack
141entry_timer_hook_extrastack:
142 cli
143 cld
144 pushw %ds // Set %ds:%eax to space on ExtraStack
145 pushl %eax
146 movw %cs:ExtraStackSeg, %ds
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500147 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-8), %eax
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400148 SAVEBREGS_POP_DSEAX
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500149 movl %esp, PUSHBREGS_size(%eax)
150 movw %ss, PUSHBREGS_size+4(%eax)
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400151
152 movw %ds, %dx // Setup %ss/%esp and call function
153 movw %dx, %ss
154 movl %eax, %esp
155 calll handle_timer_hook
156
157 movl %esp, %eax // Restore registers and return
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500158 movw PUSHBREGS_size+4(%eax), %ss
159 movl PUSHBREGS_size(%eax), %esp
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400160 RESTOREBREGS_DSEAX
161 ljmpw *%cs:Timer_Hook_Resume