Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 1 | // Rom layout and bios assembler to C interface. |
| 2 | // |
| 3 | // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net> |
| 4 | // Copyright (C) 2002 MandrakeSoft S.A. |
| 5 | // |
Kevin O'Connor | b1b7c2a | 2009-01-15 20:52:58 -0500 | [diff] [blame] | 6 | // This file may be distributed under the terms of the GNU LGPLv3 license. |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 7 | |
Kevin O'Connor | d9a8b2d | 2008-11-16 09:17:02 -0500 | [diff] [blame] | 8 | #include "config.h" // CONFIG_* |
| 9 | #include "ioport.h" // PORT_A20 |
Kevin O'Connor | 3eac009 | 2008-11-16 09:59:32 -0500 | [diff] [blame] | 10 | #include "bregs.h" // CR0_* |
Kevin O'Connor | 18e38b2 | 2008-12-10 20:40:13 -0500 | [diff] [blame] | 11 | #include "cmos.h" // CMOS_RESET_CODE |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 12 | #include "../out/asm-offsets.h" // BREGS_* |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 13 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 14 | |
| 15 | /**************************************************************** |
| 16 | * Include of 16bit C code |
| 17 | ****************************************************************/ |
| 18 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 19 | .code16gcc |
Kevin O'Connor | 9e82122 | 2008-12-06 18:56:19 -0500 | [diff] [blame] | 20 | .include "out/ccode.16.s" |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 21 | |
| 22 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 23 | /**************************************************************** |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 24 | * Entry macros |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 25 | ****************************************************************/ |
| 26 | |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 27 | // Call a C function - this does the minimal work necessary to |
| 28 | // call into C. It sets up %ds, backs up %es, and backs up |
| 29 | // those registers that are call clobbered by the C compiler. |
| 30 | .macro ENTRY cfunc |
| 31 | cld |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 32 | pushl %eax // Save registers clobbered by C code |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 33 | pushl %ecx |
| 34 | pushl %edx |
| 35 | pushw %es |
| 36 | pushw %ds |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 37 | movw %ss, %ax // Move %ss to %ds |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 38 | movw %ax, %ds |
Kevin O'Connor | b3c28be | 2008-06-08 13:34:43 -0400 | [diff] [blame] | 39 | pushl %esp // Backup %esp, then clear high bits |
| 40 | movzwl %sp, %esp |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 41 | calll \cfunc |
Kevin O'Connor | b3c28be | 2008-06-08 13:34:43 -0400 | [diff] [blame] | 42 | popl %esp // Restore %esp (including high bits) |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 43 | popw %ds // Restore registers saved above |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 44 | popw %es |
| 45 | popl %edx |
| 46 | popl %ecx |
| 47 | popl %eax |
| 48 | .endm |
| 49 | |
| 50 | // Call a C function with current register list as an |
| 51 | // argument. This backs up the registers and sets %eax |
| 52 | // to point to the backup. On return, the registers are |
| 53 | // restored from the structure. |
| 54 | .macro ENTRY_ARG cfunc |
| 55 | cld |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 56 | pushl %eax // Save registers (matches struct bregs) |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 57 | pushl %ecx |
| 58 | pushl %edx |
| 59 | pushl %ebx |
| 60 | pushl %esi |
| 61 | pushl %edi |
| 62 | pushw %es |
| 63 | pushw %ds |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 64 | movw %ss, %ax // Move %ss to %ds |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 65 | movw %ax, %ds |
Kevin O'Connor | b3c28be | 2008-06-08 13:34:43 -0400 | [diff] [blame] | 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 | calll \cfunc |
| 70 | movl %ebx, %esp // Restore %esp (including high bits) |
| 71 | popw %ds // Restore registers (from struct bregs) |
| 72 | popw %es |
| 73 | popl %edi |
| 74 | popl %esi |
| 75 | popl %ebx |
| 76 | popl %edx |
| 77 | popl %ecx |
| 78 | popl %eax |
| 79 | .endm |
| 80 | |
| 81 | // As above, but don't mangle %esp |
| 82 | .macro ENTRY_ARG_ESP cfunc |
| 83 | cld |
| 84 | pushl %eax // Save registers (matches struct bregs) |
| 85 | pushl %ecx |
| 86 | pushl %edx |
| 87 | pushl %ebx |
| 88 | pushl %esi |
| 89 | pushl %edi |
| 90 | pushw %es |
| 91 | pushw %ds |
| 92 | movw %ss, %ax // Move %ss to %ds |
| 93 | movw %ax, %ds |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 94 | movl %esp, %eax // First arg is pointer to struct bregs |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 95 | calll \cfunc |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 96 | popw %ds // Restore registers (from struct bregs) |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 97 | popw %es |
| 98 | popl %edi |
| 99 | popl %esi |
| 100 | popl %ebx |
| 101 | popl %edx |
| 102 | popl %ecx |
| 103 | popl %eax |
| 104 | .endm |
| 105 | |
Kevin O'Connor | bdce35f | 2008-02-26 21:33:14 -0500 | [diff] [blame] | 106 | // Macro to reset the 16bit stack |
| 107 | // Clobbers %ax |
| 108 | .macro RESET_STACK |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 109 | xorw %ax, %ax |
| 110 | movw %ax, %ss |
Kevin O'Connor | 276d4a9 | 2008-06-11 22:47:01 -0400 | [diff] [blame] | 111 | movl $ BUILD_STACK_ADDR , %esp |
Kevin O'Connor | 44eeaf1 | 2008-07-06 10:14:49 -0400 | [diff] [blame] | 112 | cld |
Kevin O'Connor | bdce35f | 2008-02-26 21:33:14 -0500 | [diff] [blame] | 113 | .endm |
| 114 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 115 | // Specify a location in the fixed part of bios area. |
| 116 | .macro ORG addr |
Kevin O'Connor | 202024a | 2009-01-17 10:41:28 -0500 | [diff] [blame] | 117 | .section .fixedaddr.\addr |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 118 | .endm |
| 119 | |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 120 | |
| 121 | /**************************************************************** |
| 122 | * POST handler |
| 123 | ****************************************************************/ |
| 124 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 125 | ORG 0xe05b |
Kevin O'Connor | bdce35f | 2008-02-26 21:33:14 -0500 | [diff] [blame] | 126 | post16: |
Kevin O'Connor | 50cf4f1 | 2008-10-25 23:06:23 -0400 | [diff] [blame] | 127 | // enable cache |
| 128 | movl %cr0, %eax |
Kevin O'Connor | 3eac009 | 2008-11-16 09:59:32 -0500 | [diff] [blame] | 129 | andl $~(CR0_CD|CR0_NW), %eax |
Kevin O'Connor | 50cf4f1 | 2008-10-25 23:06:23 -0400 | [diff] [blame] | 130 | movl %eax, %cr0 |
| 131 | |
Kevin O'Connor | 18e38b2 | 2008-12-10 20:40:13 -0500 | [diff] [blame] | 132 | // Check for restart indicator. |
| 133 | movl $CMOS_RESET_CODE, %eax |
| 134 | outb %al, $PORT_CMOS_INDEX |
| 135 | inb $PORT_CMOS_DATA, %al |
| 136 | cmpb $0x0, %al |
| 137 | jnz entry_resume |
| 138 | |
| 139 | // Normal entry point |
Kevin O'Connor | bdce35f | 2008-02-26 21:33:14 -0500 | [diff] [blame] | 140 | RESET_STACK |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 141 | |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 142 | pushl $_code32__start |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 143 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 144 | // Fall through to transition32 function below |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 145 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 146 | |
| 147 | /**************************************************************** |
| 148 | * Call trampolines |
| 149 | ****************************************************************/ |
| 150 | |
| 151 | // Place CPU into 32bit mode from 16bit mode. |
| 152 | // Clobbers: %eax, flags, stack registers, cr0, idt/gdt |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 153 | transition32: |
| 154 | // Disable irqs |
| 155 | cli |
| 156 | |
| 157 | // enable a20 |
Kevin O'Connor | d9a8b2d | 2008-11-16 09:17:02 -0500 | [diff] [blame] | 158 | inb $PORT_A20, %al |
| 159 | orb $A20_ENABLE_BIT, %al |
| 160 | outb %al, $PORT_A20 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 161 | |
| 162 | // Set segment descriptors |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 163 | lidtw %cs:pmode_IDT_info |
| 164 | lgdtw %cs:rombios32_gdt_48 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 165 | |
Kevin O'Connor | 3eac009 | 2008-11-16 09:59:32 -0500 | [diff] [blame] | 166 | // Enable protected mode |
| 167 | movl %cr0, %eax |
| 168 | orl $CR0_PE, %eax |
| 169 | movl %eax, %cr0 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 170 | |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 171 | // start 32bit protected mode code |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 172 | ljmpl $SEG32_MODE32_CS, $(BUILD_BIOS_ADDR + 1f) |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 173 | |
| 174 | .code32 |
| 175 | 1: |
| 176 | // init data segments |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 177 | movl $SEG32_MODE32_DS, %eax |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 178 | movw %ax, %ds |
| 179 | movw %ax, %es |
| 180 | movw %ax, %ss |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 181 | movw %ax, %fs |
| 182 | movw %ax, %gs |
| 183 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 184 | retl |
| 185 | |
| 186 | // Call a 16bit function from 32bit mode. |
Kevin O'Connor | cb6735f | 2008-03-01 13:39:52 -0500 | [diff] [blame] | 187 | // %eax = address of struct bregs |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 188 | // Clobbers: all gp registers, flags, stack registers, cr0, idt/gdt |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 189 | .global __call16_from32, __call16big_from32 |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 190 | __call16_from32: |
| 191 | pushl %eax |
| 192 | |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 193 | // restore data segment limits to 0xffff |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 194 | movl $SEG32_MODE16_DS, %eax |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 195 | movw %ax, %ds |
| 196 | movw %ax, %es |
| 197 | movw %ax, %ss |
| 198 | movw %ax, %fs |
| 199 | movw %ax, %gs |
| 200 | |
Kevin O'Connor | 1a72e2e | 2008-11-11 22:03:55 -0500 | [diff] [blame] | 201 | // disable a20 |
Kevin O'Connor | d9a8b2d | 2008-11-16 09:17:02 -0500 | [diff] [blame] | 202 | inb $PORT_A20, %al |
| 203 | andb $~A20_ENABLE_BIT, %al |
| 204 | outb %al, $PORT_A20 |
Kevin O'Connor | 1a72e2e | 2008-11-11 22:03:55 -0500 | [diff] [blame] | 205 | |
| 206 | // Jump to 16bit mode |
| 207 | ljmpw $SEG32_MODE16_CS, $1f |
| 208 | |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 209 | __call16big_from32: |
| 210 | pushl %eax |
| 211 | |
| 212 | movl $SEG32_MODE16BIG_DS, %eax |
| 213 | movw %ax, %ds |
| 214 | movw %ax, %es |
| 215 | movw %ax, %ss |
| 216 | movw %ax, %fs |
| 217 | movw %ax, %gs |
| 218 | |
| 219 | ljmpl $SEG32_MODE16BIG_CS, $(BUILD_BIOS_ADDR + 1f) |
| 220 | |
Kevin O'Connor | 1a72e2e | 2008-11-11 22:03:55 -0500 | [diff] [blame] | 221 | .code16gcc |
| 222 | 1: |
Kevin O'Connor | 3eac009 | 2008-11-16 09:59:32 -0500 | [diff] [blame] | 223 | // Disable protected mode |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 224 | movl %cr0, %eax |
Kevin O'Connor | 3eac009 | 2008-11-16 09:59:32 -0500 | [diff] [blame] | 225 | andl $~CR0_PE, %eax |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 226 | movl %eax, %cr0 |
| 227 | |
| 228 | // far jump to flush CPU queue after transition to real mode |
Kevin O'Connor | e3677b1 | 2008-07-04 15:29:23 -0400 | [diff] [blame] | 229 | ljmpw $SEG_BIOS, $2f |
Kevin O'Connor | 21e930b | 2008-03-01 09:49:37 -0500 | [diff] [blame] | 230 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 231 | 2: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 232 | // restore IDT to normal real-mode defaults |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 233 | lidtw %cs:rmode_IDT_info |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 234 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 235 | // Clear segment registers |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 236 | xorw %ax, %ax |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 237 | movw %ax, %fs |
| 238 | movw %ax, %gs |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 239 | movw %ax, %es |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 240 | movw %ax, %ds |
| 241 | movw %ax, %ss // Assume stack is in segment 0 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 242 | |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 243 | popl %eax |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 244 | |
| 245 | // Set __call16 return address to be transition32 |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 246 | pushl $transition32 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 247 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 248 | // Fall through to __call16 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 249 | |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 250 | |
Kevin O'Connor | 21e930b | 2008-03-01 09:49:37 -0500 | [diff] [blame] | 251 | // Call a 16bit function from 16bit mode with a specified cpu register state |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 252 | // %eax = address of struct bregs |
| 253 | // Clobbers: all gp registers, es |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 254 | .global __call16 |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 255 | __call16: |
| 256 | // Save eax |
| 257 | pushl %eax |
| 258 | |
| 259 | // Setup for iretw call |
Kevin O'Connor | e3677b1 | 2008-07-04 15:29:23 -0400 | [diff] [blame] | 260 | pushw $SEG_BIOS |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 261 | pushw $1f // return point |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 262 | pushw BREGS_flags(%eax) // flags |
| 263 | pushl BREGS_ip(%eax) // CS:IP |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 264 | |
| 265 | // Load calling registers. |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 266 | movl BREGS_edi(%eax), %edi |
| 267 | movl BREGS_esi(%eax), %esi |
| 268 | movl BREGS_ebx(%eax), %ebx |
| 269 | movl BREGS_edx(%eax), %edx |
| 270 | movl BREGS_ecx(%eax), %ecx |
| 271 | movw BREGS_es(%eax), %es |
| 272 | movw BREGS_ds(%eax), %ds |
| 273 | movl %ss:BREGS_eax(%eax), %eax |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 274 | |
| 275 | // Invoke call |
| 276 | iretw // XXX - just do a lcalll |
| 277 | 1: |
| 278 | // Store flags, eax, ecx |
| 279 | pushfw |
| 280 | pushl %eax |
| 281 | movl 0x06(%esp), %eax |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 282 | movl %ecx, %ss:BREGS_ecx(%eax) |
| 283 | movw %ds, %ss:BREGS_ds(%eax) |
Kevin O'Connor | cbbb667 | 2008-03-08 13:04:10 -0500 | [diff] [blame] | 284 | movw %ss, %cx |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 285 | movw %cx, %ds // Restore %ds == %ss |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 286 | popl %ecx |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 287 | movl %ecx, BREGS_eax(%eax) |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 288 | popw %cx |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 289 | movw %cx, BREGS_flags(%eax) |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 290 | |
| 291 | // Store remaining registers |
Kevin O'Connor | 952974e | 2008-11-16 18:14:33 -0500 | [diff] [blame] | 292 | movw %es, BREGS_es(%eax) |
| 293 | movl %edi, BREGS_edi(%eax) |
| 294 | movl %esi, BREGS_esi(%eax) |
| 295 | movl %ebx, BREGS_ebx(%eax) |
| 296 | movl %edx, BREGS_edx(%eax) |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 297 | |
| 298 | // Remove %eax |
| 299 | popl %eax |
| 300 | |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 301 | cld |
| 302 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 303 | retl |
| 304 | |
Kevin O'Connor | 18e38b2 | 2008-12-10 20:40:13 -0500 | [diff] [blame] | 305 | // Entry point when a post call looks like a resume. |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 306 | // %eax = shutdown status from cmos |
Kevin O'Connor | 18e38b2 | 2008-12-10 20:40:13 -0500 | [diff] [blame] | 307 | entry_resume: |
| 308 | // Save old shutdown status. |
| 309 | movl %eax, %ebx |
| 310 | |
| 311 | // Clear shutdown status register. |
| 312 | movl $CMOS_RESET_CODE, %eax |
| 313 | outb %al, $PORT_CMOS_INDEX |
| 314 | xorl %eax, %eax |
| 315 | outb %al, $PORT_CMOS_DATA |
| 316 | |
| 317 | // Use a stack in EBDA |
| 318 | movw $SEG_BDA, %ax |
| 319 | movw %ax, %ds |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 320 | movw BDA_ebda_seg, %ax |
| 321 | movw %ax, %ss |
| 322 | movw %ax, %ds |
Kevin O'Connor | 7f34309 | 2009-01-01 18:31:11 -0500 | [diff] [blame] | 323 | movl $EBDA_OFFSET_TOP_STACK, %esp |
Kevin O'Connor | 18e38b2 | 2008-12-10 20:40:13 -0500 | [diff] [blame] | 324 | |
| 325 | // Call handler. |
| 326 | movl %ebx, %eax |
| 327 | cld |
| 328 | cli |
| 329 | jmp handle_resume |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 330 | |
Kevin O'Connor | 0c3068d | 2008-12-21 17:51:36 -0500 | [diff] [blame] | 331 | // PnP trampolines |
| 332 | .global entry_pnp_real, entry_pnp_prot |
| 333 | entry_pnp_prot: |
| 334 | pushl %esp |
| 335 | jmp 1f |
| 336 | entry_pnp_real: |
| 337 | pushl %esp // Backup %esp, then clear high bits |
| 338 | movzwl %sp, %esp |
| 339 | 1: |
| 340 | pushfl // Save registers clobbered by C code |
| 341 | pushl %eax |
| 342 | pushl %ecx |
| 343 | pushl %edx |
| 344 | pushw %es |
| 345 | pushw %ds |
| 346 | movw %ss, %cx // Move %ss to %ds |
| 347 | movw %cx, %ds |
| 348 | lea 28(%esp), %eax // %eax points to start of u16 args |
| 349 | calll handle_pnp |
| 350 | movw %ax, 12(%esp) // Modify %eax to return %ax |
| 351 | popw %ds |
| 352 | popw %es |
| 353 | popl %edx |
| 354 | popl %ecx |
| 355 | popl %eax |
| 356 | popfl |
| 357 | popl %esp |
| 358 | lretw |
| 359 | |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 360 | // APM trampolines |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 361 | .global apm16protected_entry |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 362 | apm16protected_entry: |
| 363 | pushfw // save flags |
| 364 | pushl %eax // dummy |
| 365 | ENTRY_ARG handle_1553 |
Kevin O'Connor | b3c28be | 2008-06-08 13:34:43 -0400 | [diff] [blame] | 366 | addw $4, %sp // pop dummy |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 367 | popfw // restore flags |
| 368 | lretw |
| 369 | |
| 370 | .code32 |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 371 | .global apm32protected_entry |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 372 | apm32protected_entry: |
Kevin O'Connor | 68296e8 | 2008-03-13 21:33:26 -0400 | [diff] [blame] | 373 | pushfw |
| 374 | pushw %cs // Setup for long jump to 16bit mode |
| 375 | pushw $1f |
Kevin O'Connor | 0fae9e1 | 2008-06-07 14:51:14 -0400 | [diff] [blame] | 376 | addw $8, 2(%esp) |
Kevin O'Connor | 68296e8 | 2008-03-13 21:33:26 -0400 | [diff] [blame] | 377 | ljmpw *(%esp) |
| 378 | .code16gcc |
| 379 | 1: |
Kevin O'Connor | b3c28be | 2008-06-08 13:34:43 -0400 | [diff] [blame] | 380 | ENTRY_ARG_ESP handle_1553 |
Kevin O'Connor | 68296e8 | 2008-03-13 21:33:26 -0400 | [diff] [blame] | 381 | |
| 382 | movw $2f,(%esp) // Setup for long jump back to 32bit mode |
Kevin O'Connor | 0fae9e1 | 2008-06-07 14:51:14 -0400 | [diff] [blame] | 383 | subw $8, 2(%esp) |
Kevin O'Connor | 68296e8 | 2008-03-13 21:33:26 -0400 | [diff] [blame] | 384 | ljmpw *(%esp) |
| 385 | .code32 |
| 386 | 2: |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 387 | addl $4, %esp // pop call address |
| 388 | popfw |
| 389 | lretl |
Kevin O'Connor | ee4f9ff | 2008-07-05 21:19:10 -0400 | [diff] [blame] | 390 | |
| 391 | // 32bit elf entry point |
| 392 | .global post32 |
| 393 | post32: |
| 394 | cli |
| 395 | cld |
| 396 | lidtl (BUILD_BIOS_ADDR + pmode_IDT_info) |
| 397 | lgdtl (BUILD_BIOS_ADDR + rombios32_gdt_48) |
| 398 | movl $BUILD_STACK_ADDR, %esp |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 399 | ljmpl $SEG32_MODE32_CS, $_code32__start |
Kevin O'Connor | ee4f9ff | 2008-07-05 21:19:10 -0400 | [diff] [blame] | 400 | |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 401 | .code16gcc |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 402 | |
Kevin O'Connor | 484270d | 2008-08-17 10:50:57 -0400 | [diff] [blame] | 403 | // Shutdown a CPU. We want this in the 0xf000 section to ensure that |
| 404 | // the code wont be overwritten with something else. (Should |
| 405 | // something spurious wake up the CPU, we want to be sure that the hlt |
| 406 | // insn will still be present and will shutdown the CPU.) |
| 407 | .global permanent_halt |
| 408 | permanent_halt: |
| 409 | cli |
| 410 | 1: hlt |
| 411 | jmp 1b |
| 412 | |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 413 | // IRQ trampolines |
| 414 | .macro IRQ_TRAMPOLINE num |
| 415 | .global irq_trampoline_0x\num |
| 416 | irq_trampoline_0x\num : |
| 417 | int $0x\num |
| 418 | lretw |
| 419 | .endm |
| 420 | |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 421 | IRQ_TRAMPOLINE 10 |
| 422 | IRQ_TRAMPOLINE 13 |
| 423 | IRQ_TRAMPOLINE 15 |
| 424 | IRQ_TRAMPOLINE 16 |
| 425 | IRQ_TRAMPOLINE 18 |
| 426 | IRQ_TRAMPOLINE 19 |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 427 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 428 | |
| 429 | /**************************************************************** |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 430 | * Interrupt entry points |
| 431 | ****************************************************************/ |
| 432 | |
| 433 | // Define an entry point for an interrupt (no args passed). |
| 434 | .macro IRQ_ENTRY num |
| 435 | .global entry_\num |
| 436 | entry_\num : |
| 437 | cli // In case something far-calls instead of using "int" |
| 438 | ENTRY handle_\num |
| 439 | iretw |
| 440 | .endm |
| 441 | |
| 442 | // Define an entry point for an interrupt (can read/modify args). |
| 443 | .macro IRQ_ENTRY_ARG num |
| 444 | .global entry_\num |
| 445 | entry_\num : |
| 446 | cli // In case something far-calls instead of using "int" |
| 447 | ENTRY_ARG handle_\num |
| 448 | iretw |
| 449 | .endm |
| 450 | |
| 451 | ORG 0xe2c3 |
| 452 | IRQ_ENTRY nmi |
| 453 | |
| 454 | /**************************************************************** |
| 455 | * GDT and IDT tables (between 0xe2c3 - 0xe3fe) |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 456 | ****************************************************************/ |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 457 | |
| 458 | // Protected mode IDT descriptor |
| 459 | // |
| 460 | // I just make the limit 0, so the machine will shutdown |
| 461 | // if an exception occurs during protected mode memory |
| 462 | // transfers. |
| 463 | // |
| 464 | // Set base to f0000 to correspond to beginning of BIOS, |
| 465 | // in case I actually define an IDT later |
| 466 | // Set limit to 0 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 467 | .type pmode_IDT_info, @object |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 468 | pmode_IDT_info: |
| 469 | .word 0x0000 // limit 15:00 |
Kevin O'Connor | ddd4bfd | 2008-02-28 20:00:20 -0500 | [diff] [blame] | 470 | .long 0xf0000 // base 16:47 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 471 | |
| 472 | // Real mode IDT descriptor |
| 473 | // |
| 474 | // Set to typical real-mode values. |
| 475 | // base = 000000 |
| 476 | // limit = 03ff |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 477 | .type rmode_IDT_info, @object |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 478 | rmode_IDT_info: |
| 479 | .word 0x03ff // limit 15:00 |
Kevin O'Connor | ddd4bfd | 2008-02-28 20:00:20 -0500 | [diff] [blame] | 480 | .long 0 // base 16:47 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 481 | |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 482 | .type rombios32_gdt_48, @object |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 483 | rombios32_gdt_48: |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 484 | .word (rombios32_gdt_end - rombios32_gdt) |
| 485 | .long (BUILD_BIOS_ADDR + rombios32_gdt) |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 486 | |
Kevin O'Connor | 711ddc6 | 2009-01-17 15:17:34 -0500 | [diff] [blame] | 487 | //.balign 8 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 488 | .type rombios32_gdt, @object |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 489 | rombios32_gdt: |
| 490 | .word 0, 0, 0, 0 |
| 491 | .word 0, 0, 0, 0 |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 492 | // 32 bit flat code segment (SEG32_MODE32_CS) |
Kevin O'Connor | cb6735f | 2008-03-01 13:39:52 -0500 | [diff] [blame] | 493 | .word 0xffff, 0, 0x9b00, 0x00cf |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 494 | // 32 bit flat data segment (SEG32_MODE32_DS) |
Kevin O'Connor | cb6735f | 2008-03-01 13:39:52 -0500 | [diff] [blame] | 495 | .word 0xffff, 0, 0x9300, 0x00cf |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 496 | // 16 bit code segment base=0xf0000 limit=0xffff (SEG32_MODE16_CS) |
Kevin O'Connor | cb6735f | 2008-03-01 13:39:52 -0500 | [diff] [blame] | 497 | .word 0xffff, 0, 0x9b0f, 0x0000 |
Kevin O'Connor | 1492708 | 2008-11-08 19:07:49 -0500 | [diff] [blame] | 498 | // 16 bit data segment base=0x0 limit=0xffff (SEG32_MODE16_DS) |
Kevin O'Connor | cb6735f | 2008-03-01 13:39:52 -0500 | [diff] [blame] | 499 | .word 0xffff, 0, 0x9300, 0x0000 |
Kevin O'Connor | 6e5b4a4 | 2008-12-06 13:03:52 -0500 | [diff] [blame] | 500 | // 16 bit code segment base=0 limit=0xffffffff (SEG32_MODE16BIG_CS) |
| 501 | .word 0xffff, 0, 0x9b00, 0x008f |
| 502 | // 16 bit data segment base=0 limit=0xffffffff (SEG32_MODE16BIG_DS) |
| 503 | .word 0xffff, 0, 0x9300, 0x008f |
| 504 | rombios32_gdt_end: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 505 | |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 506 | |
| 507 | /**************************************************************** |
Kevin O'Connor | c5b5036 | 2008-12-18 21:56:41 -0500 | [diff] [blame] | 508 | * Interrupt entry points (continued) |
Kevin O'Connor | 38fcbfe | 2008-02-25 22:30:47 -0500 | [diff] [blame] | 509 | ****************************************************************/ |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 510 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 511 | ORG 0xe3fe |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 512 | .global entry_13_official |
| 513 | entry_13_official: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 514 | jmp entry_13 |
| 515 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 516 | ORG 0xe401 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 517 | .type __fdpt, @object |
| 518 | __fdpt: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 519 | // XXX - Fixed Disk Parameter Table |
Kevin O'Connor | 711ddc6 | 2009-01-17 15:17:34 -0500 | [diff] [blame] | 520 | .space 16 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 521 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 522 | ORG 0xe6f2 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 523 | .global entry_19_official |
| 524 | entry_19_official: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 525 | jmp entry_19 |
| 526 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 527 | ORG 0xe6f5 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 528 | .include "out/cbt.proc.16.s" |
| 529 | .text |
| 530 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 531 | ORG 0xe729 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 532 | .type __brgt, @object |
| 533 | __brgt: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 534 | // XXX - Baud Rate Generator Table |
Kevin O'Connor | 711ddc6 | 2009-01-17 15:17:34 -0500 | [diff] [blame] | 535 | .space 16 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 536 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 537 | ORG 0xe739 |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 538 | IRQ_ENTRY_ARG 14 |
| 539 | |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 540 | ORG 0xe82e |
| 541 | IRQ_ENTRY_ARG 16 |
| 542 | |
| 543 | ORG 0xe987 |
| 544 | IRQ_ENTRY 09 |
| 545 | |
| 546 | ORG 0xec59 |
| 547 | IRQ_ENTRY_ARG 40 |
| 548 | |
| 549 | ORG 0xef57 |
| 550 | IRQ_ENTRY 0e |
| 551 | |
| 552 | ORG 0xefc7 |
| 553 | .include "out/floppy_dbt.proc.16.s" |
| 554 | .text |
| 555 | |
| 556 | ORG 0xefd2 |
| 557 | IRQ_ENTRY_ARG 17 |
| 558 | |
| 559 | ORG 0xf045 |
| 560 | __int10_0x0f: |
| 561 | // XXX - INT 10 Functions 0-Fh Entry Point |
| 562 | iretw |
| 563 | |
| 564 | ORG 0xf065 |
| 565 | IRQ_ENTRY_ARG 10 |
| 566 | |
| 567 | ORG 0xf0a4 |
| 568 | .type __int1d, @object |
| 569 | __int1d: |
| 570 | // XXX - INT 1D - SYSTEM DATA - VIDEO PARAMETER TABLES |
| 571 | .space 0x58 |
| 572 | |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 573 | ORG 0xf841 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 574 | .global entry_12_official |
| 575 | entry_12_official: |
| 576 | jmp entry_12 |
| 577 | |
| 578 | ORG 0xf84d |
| 579 | .global entry_11_official |
| 580 | entry_11_official: |
| 581 | jmp entry_11 |
| 582 | |
| 583 | ORG 0xf859 |
| 584 | IRQ_ENTRY_ARG 15 |
| 585 | |
| 586 | // Fit other misc defs if the freespace between 0xf859-0xfa6e |
| 587 | |
| 588 | IRQ_ENTRY_ARG 13 |
| 589 | IRQ_ENTRY_ARG 12 |
| 590 | IRQ_ENTRY_ARG 11 |
| 591 | IRQ_ENTRY 76 |
| 592 | IRQ_ENTRY 1c |
| 593 | IRQ_ENTRY 70 |
Kevin O'Connor | 18f368e | 2008-03-31 21:56:04 -0400 | [diff] [blame] | 594 | IRQ_ENTRY 74 |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 595 | IRQ_ENTRY 75 |
Kevin O'Connor | ffdc9ee | 2008-12-20 13:10:00 -0500 | [diff] [blame] | 596 | IRQ_ENTRY hwpic1 |
| 597 | IRQ_ENTRY hwpic2 |
Kevin O'Connor | 1d01951 | 2008-03-11 21:21:47 -0400 | [diff] [blame] | 598 | |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 599 | // int 18/19 are special - they reset the stack and do not return. |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 600 | entry_19: |
| 601 | RESET_STACK |
Kevin O'Connor | 44eeaf1 | 2008-07-06 10:14:49 -0400 | [diff] [blame] | 602 | pushl $_code32_handle_19 |
| 603 | jmp transition32 |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 604 | |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 605 | .global entry_18 |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 606 | entry_18: |
| 607 | RESET_STACK |
Kevin O'Connor | 44eeaf1 | 2008-07-06 10:14:49 -0400 | [diff] [blame] | 608 | pushl $_code32_handle_18 |
| 609 | jmp transition32 |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 610 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 611 | ORG 0xfa6e |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 612 | .include "out/font.proc.16.s" |
| 613 | .text |
| 614 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 615 | ORG 0xfe6e |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 616 | IRQ_ENTRY_ARG 1a |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 617 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 618 | ORG 0xfea5 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 619 | IRQ_ENTRY 08 |
| 620 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 621 | ORG 0xfef3 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 622 | __initvector: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 623 | // XXX - Initial Interrupt Vector Offsets Loaded by POST |
Kevin O'Connor | 711ddc6 | 2009-01-17 15:17:34 -0500 | [diff] [blame] | 624 | .space 13 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 625 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 626 | ORG 0xff00 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 627 | .type __copyright, @object |
| 628 | __copyright: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 629 | // XXX - BIOS_COPYRIGHT_STRING |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 630 | .asciz "(c) 2002 MandrakeSoft S.A. Written by Kevin Lawton & the Bochs team." |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 631 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 632 | ORG 0xff53 |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 633 | .global dummy_iret_handler |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 634 | dummy_iret_handler: |
| 635 | iretw |
| 636 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 637 | ORG 0xff54 |
Kevin O'Connor | ed12849 | 2008-03-11 11:14:59 -0400 | [diff] [blame] | 638 | IRQ_ENTRY_ARG 05 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 639 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 640 | ORG 0xfff0 // Power-up Entry Point |
Kevin O'Connor | 3f168b6 | 2008-11-29 13:22:29 -0500 | [diff] [blame] | 641 | .global reset_vector |
| 642 | reset_vector: |
Kevin O'Connor | e3677b1 | 2008-07-04 15:29:23 -0400 | [diff] [blame] | 643 | ljmpw $SEG_BIOS, $post16 |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 644 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 645 | ORG 0xfff5 |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 646 | .type __biosdate, @object |
| 647 | __biosdate: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 648 | // BIOS build date |
| 649 | .ascii "06/23/99" |
| 650 | |
Kevin O'Connor | 7453453 | 2008-05-12 18:28:58 -0400 | [diff] [blame] | 651 | ORG 0xfffe |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 652 | .type __model_id, @object |
| 653 | __model_id: |
Kevin O'Connor | 44c631d | 2008-03-02 11:24:36 -0500 | [diff] [blame] | 654 | .byte CONFIG_MODEL_ID |
Kevin O'Connor | e3677b1 | 2008-07-04 15:29:23 -0400 | [diff] [blame] | 655 | |
Kevin O'Connor | 2fda7cb | 2008-07-05 20:41:53 -0400 | [diff] [blame] | 656 | .global bios_checksum |
Kevin O'Connor | b4f0e89 | 2008-12-13 18:33:05 -0500 | [diff] [blame] | 657 | .type bios_checksum, @object |
Kevin O'Connor | e3677b1 | 2008-07-04 15:29:23 -0400 | [diff] [blame] | 658 | bios_checksum: |
Kevin O'Connor | f076a3e | 2008-02-25 22:25:15 -0500 | [diff] [blame] | 659 | .byte 0x00 |
| 660 | |
| 661 | .end |