blob: f9cf6568988566b883c2c3b6e5db6ab5cda48f38 [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 // Force a fault if found to be running on broken x86emu versions.
49 DECLFUNC x86emu_fault
Kevin O'Connor3c37cdb2014-05-12 01:26:26 -040050msg: .ascii "SeaVGABIOS: x86emu leal trap!\n"
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050051x86emu_fault:
Kevin O'Connor3c37cdb2014-05-12 01:26:26 -040052#if CONFIG_DEBUG_IO
53 movw %cs:DebugOutputPort, %dx
54 movw $msg, %si
551: movb %cs:(%si), %al
56 outb %al, (%dx)
57 incw %si
58 cmpw $x86emu_fault, %si
59 jl 1b
60#endif
Kevin O'Connor8032b8a2014-02-05 22:47:29 -0500611: hlt
62 jmp 1b
63
64 // This macro implements a call while avoiding instructions
65 // that old versions of x86emu have problems with.
66 .macro VGA_CALLL cfunc
67 // Make sure leal instruction works.
68 movl $0x8000, %ecx
69 leal (%ecx, %ecx, 1), %ecx
70 cmpl $0x10000, %ecx
71 jne x86emu_fault
72 // Use callw instead of calll
73 push %ax
74 callw \cfunc
75 .endm
76
77 // This macro is the same as ENTRY_ARG except VGA_CALLL is used.
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050078 .macro ENTRY_ARG_VGA cfunc
79 cli
80 cld
81 PUSHBREGS
82 movw %ss, %ax // Move %ss to %ds
83 movw %ax, %ds
84 movl %esp, %ebx // Backup %esp, then zero high bits
85 movzwl %sp, %esp
86 movl %esp, %eax // First arg is pointer to struct bregs
Kevin O'Connor8032b8a2014-02-05 22:47:29 -050087 VGA_CALLL \cfunc
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050088 movl %ebx, %esp // Restore %esp (including high bits)
89 POPBREGS
90 .endm
91
Kevin O'Connor9961f992012-01-21 11:53:44 -050092 DECLFUNC entry_104f05
93entry_104f05:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050094 ENTRY_ARG_VGA vbe_104f05
Kevin O'Connor9961f992012-01-21 11:53:44 -050095 lretw
96
Kevin O'Connor1f2c3072009-05-06 23:35:59 -040097 DECLFUNC _optionrom_entry
98_optionrom_entry:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -050099 ENTRY_ARG_VGA vga_post
Kevin O'Connor1f2c3072009-05-06 23:35:59 -0400100 lretw
101
Kevin O'Connor9f193b92009-05-16 23:31:27 -0400102 DECLFUNC entry_10
103entry_10:
Kevin O'Connor9332f9b2013-11-30 12:52:44 -0500104 ENTRY_ARG_VGA handle_10
Kevin O'Connor9f193b92009-05-16 23:31:27 -0400105 iretw
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500106
107 // Entry point using extra stack
108 DECLFUNC entry_10_extrastack
109entry_10_extrastack:
110 cli
111 cld
112 pushw %ds // Set %ds:%eax to space on ExtraStack
113 pushl %eax
Kevin O'Connorfeb02842013-12-09 20:30:30 -0500114 movw %cs:ExtraStackSeg, %ds
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500115 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-16), %eax
Kevin O'Connor46000f52014-10-21 02:23:02 -0400116 SAVEBREGS_POP_DSEAX // Save registers on extra stack
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500117 movl %esp, PUSHBREGS_size+8(%eax)
118 movw %ss, PUSHBREGS_size+12(%eax)
Kevin O'Connor41c60612013-12-09 17:27:54 -0500119 popl BREGS_code(%eax)
120 popw BREGS_flags(%eax)
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500121
122 movw %ds, %dx // Setup %ss/%esp and call function
123 movw %dx, %ss
124 movl %eax, %esp
Kevin O'Connor8032b8a2014-02-05 22:47:29 -0500125 VGA_CALLL handle_10
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500126
127 movl %esp, %eax // Restore registers and return
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500128 movw PUSHBREGS_size+12(%eax), %ss
129 movl PUSHBREGS_size+8(%eax), %esp
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500130 popl %edx
131 popw %dx
132 pushw BREGS_flags(%eax)
133 pushl BREGS_code(%eax)
Kevin O'Connor46000f52014-10-21 02:23:02 -0400134 RESTOREBREGS_DSEAX
Kevin O'Connor4a8b58c2013-11-30 19:16:15 -0500135 iretw
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400136
137 // Timer irq handling
138 DECLFUNC entry_timer_hook
139entry_timer_hook:
140 ENTRY handle_timer_hook
141 ljmpw *%cs:Timer_Hook_Resume
142
143 // Timer irq handling on extra stack
144 DECLFUNC entry_timer_hook_extrastack
145entry_timer_hook_extrastack:
146 cli
147 cld
148 pushw %ds // Set %ds:%eax to space on ExtraStack
149 pushl %eax
150 movw %cs:ExtraStackSeg, %ds
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500151 movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-8), %eax
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400152 SAVEBREGS_POP_DSEAX
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500153 movl %esp, PUSHBREGS_size(%eax)
154 movw %ss, PUSHBREGS_size+4(%eax)
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400155
156 movw %ds, %dx // Setup %ss/%esp and call function
157 movw %dx, %ss
158 movl %eax, %esp
159 calll handle_timer_hook
160
161 movl %esp, %eax // Restore registers and return
Kevin O'Connoraa66d652014-11-05 09:05:36 -0500162 movw PUSHBREGS_size+4(%eax), %ss
163 movl PUSHBREGS_size(%eax), %esp
Kevin O'Connorb4eb6fc2014-10-17 22:15:42 -0400164 RESTOREBREGS_DSEAX
165 ljmpw *%cs:Timer_Hook_Resume