X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fromlayout.S;h=c5f48eb68b7fe282f1db81f94d80377b9c2d6ed5;hb=18f368edc5141b55efd11d9ca82e7e6ff5914a14;hp=4a067e13ed21a4afc1fd97ee9e5c9d373ab9caa0;hpb=63dbcfbff1b8b5ce5f0e89d428d9ff43c9d9ac0a;p=seabios.git diff --git a/src/romlayout.S b/src/romlayout.S index 4a067e1..c5f48eb 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -27,9 +27,63 @@ bios16c_end: /**************************************************************** - * POST handler + * Entry macros ****************************************************************/ + // Call a C function - this does the minimal work necessary to + // call into C. It sets up %ds, backs up %es, and backs up + // those registers that are call clobbered by the C compiler. + .macro ENTRY cfunc + cld + pushl %eax // Save registers clobbered by C code + pushl %ecx + pushl %edx + pushw %es + pushw %ds + movw %ss, %ax // Move %ss to %ds + movw %ax, %ds + pushl %esp // Backup %esp, then clear high bits + movzwl %sp, %esp + calll \cfunc + popl %esp // Restore %esp (including high bits) + popw %ds // Restore registers saved above + popw %es + popl %edx + popl %ecx + popl %eax + .endm + + // Call a C function with current register list as an + // argument. This backs up the registers and sets %eax + // to point to the backup. On return, the registers are + // restored from the structure. + .macro ENTRY_ARG cfunc + cld + pushl %eax // Save registers (matches struct bregs) + pushl %ecx + pushl %edx + pushl %ebx + pushl %esi + pushl %edi + pushw %es + pushw %ds + movw %ss, %ax // Move %ss to %ds + movw %ax, %ds + movl %esp, %ebx // Backup %esp, then zero high bits + movzwl %sp, %esp + movl %esp, %eax // First arg is pointer to struct bregs + calll \cfunc + movl %ebx, %esp // Restore %esp (including high bits) + popw %ds // Restore registers (from struct bregs) + popw %es + popl %edi + popl %esi + popl %ebx + popl %edx + popl %ecx + popl %eax + .endm + // Macro to reset the 16bit stack // Clobbers %ax .macro RESET_STACK @@ -38,6 +92,11 @@ bios16c_end: movl $ CONFIG_STACK_OFFSET , %esp .endm + +/**************************************************************** + * POST handler + ****************************************************************/ + .org 0xe05b .globl post16 post16: @@ -50,6 +109,8 @@ post16: set_entry32: pushl $0xf0000000 + cld + // Fall through to transition32 function below @@ -92,8 +153,6 @@ transition32: movw %ax, %fs movw %ax, %gs - cld - retl // Call a 16bit function from 32bit mode. @@ -104,12 +163,12 @@ __call16_from32: pushl %eax // Jump to 16bit mode - ljmp $0x20, $1f + ljmpw $REAL_MODE_CS, $1f .code16gcc 1: // restore data segment limits to 0xffff - movw $0x28, %ax + movw $REAL_MODE_DS, %ax movw %ax, %ds movw %ax, %es movw %ax, %ss @@ -137,6 +196,8 @@ __call16_from32: movw %ax, %ss // Assume stack is in segment 0 popl %eax + + // Set __call16 return address to be transition32 pushl $transition32 // Fall through to __call16 @@ -153,18 +214,17 @@ __call16: // Setup for iretw call pushw $0xf000 pushw $1f // return point - pushw 0x28(%eax) // flags - pushl 0x24(%eax) // CS:IP + pushw 0x20(%eax) // flags + pushl 0x1c(%eax) // CS:IP // Load calling registers. movl 0x04(%eax), %edi movl 0x08(%eax), %esi - movl 0x0c(%eax), %ebp - movl 0x14(%eax), %ebx - movl 0x18(%eax), %edx - movl 0x1c(%eax), %ecx + movl 0x0c(%eax), %ebx + movl 0x10(%eax), %edx + movl 0x14(%eax), %ecx movw 0x02(%eax), %es // XXX - should load %ds too - movl 0x20(%eax), %eax + movl 0x18(%eax), %eax // Invoke call iretw // XXX - just do a lcalll @@ -173,26 +233,62 @@ __call16: pushfw pushl %eax movl 0x06(%esp), %eax - movl %ecx, 0x1c(%eax) // Save %ecx + movl %ecx, %ss:0x14(%eax) // Save %ecx + movw %ss, %cx + movw %cx, %ds // Restore %ds == %ss popl %ecx - movl %ecx, 0x20(%eax) // Save %eax + movl %ecx, 0x18(%eax) // Save %eax popw %cx - movw %cx, 0x28(%eax) // Save flags + movw %cx, 0x20(%eax) // Save flags // Store remaining registers movw %es, 0x02(%eax) movl %edi, 0x04(%eax) movl %esi, 0x08(%eax) - movl %ebp, 0x0c(%eax) - movl %ebx, 0x14(%eax) - movl %edx, 0x18(%eax) + movl %ebx, 0x0c(%eax) + movl %edx, 0x10(%eax) // Remove %eax popl %eax + cld + retl +// APM trampolines + .globl apm16protected_entry +apm16protected_entry: + pushfw // save flags + pushl %eax // dummy + ENTRY_ARG handle_1553 + addw $4, %sp // pop dummy + popfw // restore flags + lretw + + .code32 + .globl apm32protected_entry +apm32protected_entry: + pushfw + pushw %cs // Setup for long jump to 16bit mode + pushw $1f + incw 2(%esp) + ljmpw *(%esp) + .code16gcc +1: + ENTRY_ARG handle_1553 + + movw $2f,(%esp) // Setup for long jump back to 32bit mode + decw 2(%esp) + ljmpw *(%esp) + .code32 +2: + addl $4, %esp // pop call address + popfw + lretl + .code16gcc + + /**************************************************************** * GDT and IDT tables ****************************************************************/ @@ -224,6 +320,7 @@ rombios32_gdt_48: .word rombios32_gdt .word 0x000f + .balign 8 rombios32_gdt: .word 0, 0, 0, 0 .word 0, 0, 0, 0 @@ -236,70 +333,79 @@ rombios32_gdt: // 16 bit data segment base=0x0 limit=0xffff (REAL_MODE_DS) .word 0xffff, 0, 0x9300, 0x0000 -// We need a copy of this string, but we are not actually a PnP BIOS, -// so make sure it is *not* aligned, so OSes will not see it if they -// scan. - .align 2 - .byte 0 - .globl pnp_string -pnp_string: - .ascii "$PnP" - /**************************************************************** * Interrupt entry points ****************************************************************/ - .macro ENTRY cfunc - cli // In case something far-calls instead of using "int" - pushal - pushw %es - pushw %ds - movw %ss, %ax - movw %ax, %ds - movzwl %sp, %esp - movl %esp, %eax - calll \cfunc - popw %ds - popw %es - popal - .endm - + // Define an entry point for an interrupt (no args passed). .macro IRQ_ENTRY num .globl entry_\num entry_\num : + cli // In case something far-calls instead of using "int" ENTRY handle_\num iretw .endm - .macro IRQ_TRAMPOLINE num - .globl irq_trampoline_0x\num - irq_trampoline_0x\num : - int $0x\num - lretw + // Define an entry point for an interrupt (can read/modify args). + .macro IRQ_ENTRY_ARG num + .globl entry_\num + entry_\num : + cli // In case something far-calls instead of using "int" + ENTRY_ARG handle_\num + iretw .endm .org 0xe2c3 IRQ_ENTRY nmi - IRQ_ENTRY 13 - IRQ_ENTRY 12 - IRQ_ENTRY 11 + IRQ_ENTRY_ARG 13 + IRQ_ENTRY_ARG 12 + IRQ_ENTRY_ARG 11 IRQ_ENTRY 76 IRQ_ENTRY 1c IRQ_ENTRY 70 + + .org 0xe3fe + jmp entry_13 + + .org 0xe401 + // XXX - Fixed Disk Parameter Table + + .org 0xe6f2 + jmp entry_19 + + .org 0xe6f5 +.include "out/cbt.proc.16.s" + .text + + .org 0xe729 + // XXX - Baud Rate Generator Table + + .org 0xe739 + IRQ_ENTRY_ARG 14 + IRQ_ENTRY 74 IRQ_ENTRY 75 + // int 18/19 are special - they reset the stack and do not return. .globl entry_19 entry_19: RESET_STACK - calll handle_19 + ENTRY handle_19 .globl entry_18 entry_18: RESET_STACK - calll handle_18 + ENTRY handle_18 + + // IRQ trampolines + .macro IRQ_TRAMPOLINE num + .globl irq_trampoline_0x\num + irq_trampoline_0x\num : + int $0x\num + lretw + .endm IRQ_TRAMPOLINE 02 IRQ_TRAMPOLINE 10 @@ -310,49 +416,31 @@ entry_18: IRQ_TRAMPOLINE 1c IRQ_TRAMPOLINE 4a - .org 0xe3fe - jmp entry_13 - - .org 0xe401 - // XXX - Fixed Disk Parameter Table - - .org 0xe6f2 - jmp entry_19 - - .org 0xe6f5 -.include "out/cbt.proc.16.s" - .text - - .org 0xe729 - // XXX - Baud Rate Generator Table - - .org 0xe739 - IRQ_ENTRY 14 - .org 0xe82e - IRQ_ENTRY 16 + IRQ_ENTRY_ARG 16 .org 0xe987 IRQ_ENTRY 09 .org 0xec59 - IRQ_ENTRY 40 + IRQ_ENTRY_ARG 40 .org 0xef57 IRQ_ENTRY 0e .org 0xefc7 - // XXX - Diskette Controller Parameter Table +.include "out/floppy_dbt.proc.16.s" + .text .org 0xefd2 - IRQ_ENTRY 17 + IRQ_ENTRY_ARG 17 .org 0xf045 // XXX int 10 iretw .org 0xf065 - IRQ_ENTRY 10 + IRQ_ENTRY_ARG 10 .org 0xf0a4 // XXX int 1D @@ -369,14 +457,14 @@ freespace2_end: jmp entry_11 .org 0xf859 - IRQ_ENTRY 15 + IRQ_ENTRY_ARG 15 .org 0xfa6e .include "out/font.proc.16.s" .text .org 0xfe6e - IRQ_ENTRY 1a + IRQ_ENTRY_ARG 1a .org 0xfea5 IRQ_ENTRY 08 @@ -394,7 +482,7 @@ dummy_iret_handler: iretw .org 0xff54 - IRQ_ENTRY 05 + IRQ_ENTRY_ARG 05 .org 0xfff0 // Power-up Entry Point ljmpw $0xf000, $post16 @@ -404,8 +492,7 @@ dummy_iret_handler: .ascii "06/23/99" .org 0xfffe - // XXX - model byte 0xFC = AT - .byte 0xfc + .byte CONFIG_MODEL_ID .byte 0x00 .end