These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / seabios / vgasrc / vgaentry.S
1 // Rom layout and bios assembler to C interface.
2 //
3 // Copyright (C) 2009-2013  Kevin O'Connor <kevin@koconnor.net>
4 //
5 // This file may be distributed under the terms of the GNU LGPLv3 license.
6
7
8 #include "asm-offsets.h" // BREGS_*
9 #include "config.h" // CONFIG_*
10 #include "entryfuncs.S" // ENTRY_*
11
12
13 /****************************************************************
14  * Rom Header
15  ****************************************************************/
16
17         .section .rom.header
18         .code16
19         .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:
27         .byte 0
28 _rom_header_other:
29         .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
38 _rom_header_other2:
39         .word 0
40 _rom_header_signature:
41         .asciz "IBM"
42
43
44 /****************************************************************
45  * Entry points
46  ****************************************************************/
47
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
52         pushw %ax
53         callw \cfunc
54 #else
55         calll \cfunc
56 #endif
57         .endm
58
59         // This macro is the same as ENTRY_ARG except VGA_CALLL is used.
60         .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
69         VGA_CALLL \cfunc
70         movl %ebx, %esp         // Restore %esp (including high bits)
71         POPBREGS
72         .endm
73
74         DECLFUNC entry_104f05
75 entry_104f05:
76         ENTRY_ARG_VGA vbe_104f05
77         lretw
78
79         DECLFUNC _optionrom_entry
80 _optionrom_entry:
81         ENTRY_ARG_VGA vga_post
82         lretw
83
84         DECLFUNC entry_10
85 entry_10:
86         ENTRY_ARG_VGA handle_10
87         iretw
88
89 #define VGA_CUSTOM_BDA_FLAGS 0xb9
90 #define BF_EXTRA_STACK 0x40
91
92         // Entry point using extra stack
93         DECLFUNC entry_10_extrastack
94 entry_10_extrastack:
95         cli
96         cld
97         pushw %ds
98         pushl %eax
99
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
106         movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-16), %eax
107         SAVEBREGS_POP_DSEAX     // Save registers on extra stack
108         movl %esp, PUSHBREGS_size+8(%eax)
109         movw %ss, PUSHBREGS_size+12(%eax)
110         popl BREGS_code(%eax)
111         popw BREGS_flags(%eax)
112
113         movw %ds, %dx           // Setup %ss/%esp and call function
114         movw %dx, %ss
115         movl %eax, %esp
116         VGA_CALLL handle_10
117
118         movl %esp, %eax         // Restore registers and return
119         movw PUSHBREGS_size+12(%eax), %ss
120         movl PUSHBREGS_size+8(%eax), %esp
121         popl %edx
122         popw %dx
123         pushw BREGS_flags(%eax)
124         pushl BREGS_code(%eax)
125         RESTOREBREGS_DSEAX
126         iretw
127
128 1:      // Use regular entry point if the extra stack is disabled
129         popl %eax
130         popw %ds
131         jmp entry_10
132
133         // Timer irq handling
134         DECLFUNC entry_timer_hook
135 entry_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
141 entry_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
147         movl $(CONFIG_VGA_EXTRA_STACK_SIZE-PUSHBREGS_size-8), %eax
148         SAVEBREGS_POP_DSEAX
149         movl %esp, PUSHBREGS_size(%eax)
150         movw %ss, PUSHBREGS_size+4(%eax)
151
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
158         movw PUSHBREGS_size+4(%eax), %ss
159         movl PUSHBREGS_size(%eax), %esp
160         RESTOREBREGS_DSEAX
161         ljmpw *%cs:Timer_Hook_Resume