X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fromlayout.S;h=5983a4a7b1c615e64acba65d30674078a8fedb0e;hb=refs%2Fheads%2Fcoreboot;hp=d83f337101e818459b8f7d76a42c52b8623a4d78;hpb=4057f9847e94147aaa9799b92ba4561506333a57;p=seabios.git diff --git a/src/romlayout.S b/src/romlayout.S index d83f337..5983a4a 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -11,13 +11,13 @@ ****************************************************************/ .code16gcc -.include "out/ccode.16.s" +#include "ccode.16.s" #include "config.h" // CONFIG_* #include "ioport.h" // PORT_A20 #include "bregs.h" // CR0_* #include "cmos.h" // CMOS_RESET_CODE -#include "../out/asm-offsets.h" // BREGS_* +#include "asm-offsets.h" // BREGS_* #include "entryfuncs.S" // ENTRY_* @@ -230,64 +230,25 @@ __call16big_from32: /**************************************************************** - * POST entry point + * Misc. entry points. ****************************************************************/ - DECLFUNC entry_post -entry_post: - // Enable cache - movl %cr0, %eax - andl $~(CR0_CD|CR0_NW), %eax - movl %eax, %cr0 - +// Resume (and reboot) entry point - called from entry_post + DECLFUNC entry_resume +entry_resume: // Disable interrupts cli cld - - // Check for restart indicator. - movl $CMOS_RESET_CODE|NMI_DISABLE_BIT, %eax - outb %al, $PORT_CMOS_INDEX - inb $PORT_CMOS_DATA, %al - cmpb $0x0, %al - jnz 1f - - // Normal entry point - ENTRY_INTO32 _start - - // Entry point when a post call looks like a resume. -1: - // Save old shutdown status. - movl %eax, %ebx - - // Clear shutdown status register. - movl $CMOS_RESET_CODE|NMI_DISABLE_BIT, %eax - outb %al, $PORT_CMOS_INDEX - xorl %eax, %eax - outb %al, $PORT_CMOS_DATA - // Use a stack in EBDA movw $SEG_BDA, %ax movw %ax, %ds movw BDA_ebda_seg, %ax - - cmpw $EBDA_SEGMENT_START, %ax - jle 2f - // EBDA segment doesn't look valid - use startup value. - movw $EBDA_SEGMENT_START, %ax - -2: movw %ax, %ds + movw %ax, %ds movw %ax, %ss movl $EBDA_OFFSET_TOP_STACK, %esp - // Call handler. - movl %ebx, %eax jmp handle_resume - -/**************************************************************** - * Misc. entry points. - ****************************************************************/ - // PMM entry point DECLFUNC entry_pmm entry_pmm: @@ -303,8 +264,10 @@ entry_pmm: pushw %ds movw %ss, %cx // Move %ss to %ds movw %cx, %ds - leal 28(%esp), %eax // %eax points to start of args - calll handle_pmm + movl $_cfunc32flat_handle_pmm, %eax // Setup: call32(handle_pmm, args, -1) + leal 28(%esp), %edx // %edx points to start of args + movl $-1, %ecx + calll call32 movw %ax, 12(%esp) // Modify %ax:%dx to return %eax shrl $16, %eax movw %ax, 4(%esp) @@ -350,8 +313,8 @@ entry_pnp_real: lretw // APM entry points - DECLFUNC apm16protected_entry -apm16protected_entry: + DECLFUNC entry_apm16 +entry_apm16: pushfw // save flags pushl %eax // dummy ENTRY_ARG handle_apm16 @@ -360,33 +323,33 @@ apm16protected_entry: lretw .code32 - DECLFUNC apm32protected_entry -apm32protected_entry: + DECLFUNC entry_apm32 +entry_apm32: pushfl pushl %gs pushl %cs // Move second descriptor after %cs to %gs addl $16, (%esp) popl %gs - ENTRY_ARG_ESP handle_apm32 + ENTRY_ARG_ESP _cfunc32seg_handle_apm32 popl %gs popfl lretl // PCI-BIOS 32bit entry point - DECLFUNC pcibios32_entry -pcibios32_entry: + DECLFUNC entry_pcibios32 +entry_pcibios32: pushfl pushl %gs // Backup %gs and set %gs=%ds pushl %ds popl %gs - ENTRY_ARG_ESP handle_pcibios32 + ENTRY_ARG_ESP _cfunc32seg_handle_pcibios32 popl %gs popfl lretl // BIOS32 support - EXPORTFUNC bios32_entry -bios32_entry: + EXPORTFUNC entry_bios32 +entry_bios32: pushfl #if CONFIG_PCIBIOS // Check for PCI-BIOS request @@ -394,7 +357,7 @@ bios32_entry: jne 1f movl $BUILD_BIOS_ADDR, %ebx movl $BUILD_BIOS_SIZE, %ecx - movl $pcibios32_entry, %edx + movl $entry_pcibios32, %edx xorb %al, %al jmp 2f #endif @@ -405,8 +368,8 @@ bios32_entry: lretl // 32bit elf entry point - EXPORTFUNC post32 -post32: + EXPORTFUNC entry_elf +entry_elf: cli cld lidtl (BUILD_BIOS_ADDR + pmode_IDT_info) @@ -418,7 +381,7 @@ post32: movw %ax, %gs movw %ax, %ss movl $BUILD_STACK_ADDR, %esp - ljmpl $SEG32_MODE32_CS, $_start + ljmpl $SEG32_MODE32_CS, $_cfunc32flat_handle_post .code16gcc @@ -427,6 +390,18 @@ post32: * Interrupt entry points ****************************************************************/ + // Main entry point for interrupts without args + DECLFUNC irqentry +irqentry: + ENTRY_ST + iretw + + // Main entry point for interrupts with args + DECLFUNC irqentryarg +irqentryarg: + ENTRY_ARG_ST + iretw + // Define an entry point for an interrupt (no args passed). .macro IRQ_ENTRY num .global entry_\num @@ -435,6 +410,11 @@ post32: jmp irqentry .endm + .macro DECL_IRQ_ENTRY num + DECLFUNC entry_\num + IRQ_ENTRY \num + .endm + // Define an entry point for an interrupt (can read/modify args). .macro IRQ_ENTRY_ARG num .global entry_\num @@ -443,28 +423,12 @@ post32: jmp irqentryarg .endm - // Macros that put each handler into its own section - .macro DECL_IRQ_ENTRY num - DECLFUNC entry_\num - IRQ_ENTRY \num - .endm .macro DECL_IRQ_ENTRY_ARG num DECLFUNC entry_\num IRQ_ENTRY_ARG \num .endm - // Main entry point for interrupts without args - DECLFUNC irqentry -irqentry: - ENTRY_ST - iretw - - // Main entry point for interrupts with args - DECLFUNC irqentryarg -irqentryarg: - ENTRY_ARG_ST - iretw - + // Various entry points (that don't require a fixed location). DECL_IRQ_ENTRY_ARG 13 DECL_IRQ_ENTRY 76 DECL_IRQ_ENTRY 70 @@ -476,11 +440,11 @@ irqentryarg: // int 18/19 are special - they reset stack and call into 32bit mode. DECLFUNC entry_19 entry_19: - ENTRY_INTO32 handle_19 + ENTRY_INTO32 _cfunc32flat_handle_19 DECLFUNC entry_18 entry_18: - ENTRY_INTO32 handle_18 + ENTRY_INTO32 _cfunc32flat_handle_18 /**************************************************************** @@ -493,8 +457,10 @@ entry_18: .endm ORG 0xe05b -entry_post_official: - jmp entry_post +entry_post: + cmpl $0, %cs:HaveRunPost // Check for resume/reboot + jnz entry_resume + ENTRY_INTO32 _cfunc32flat_handle_post // Normal entry point ORG 0xe2c3 IRQ_ENTRY 02 @@ -577,7 +543,7 @@ entry_iret_official: ORG 0xfff0 // Power-up Entry Point .global reset_vector reset_vector: - ljmpw $SEG_BIOS, $entry_post_official + ljmpw $SEG_BIOS, $entry_post // 0xfff5 - BiosDate in misc.c