diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2013-02-10 00:51:56 +0000 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2013-02-12 21:16:02 -0500 |
commit | 4b1d2be6e1c73d1fc9a984ca7fe6c14d433171cc (patch) | |
tree | cf4bad9efdd13823460a639d614e2dc342046c04 /src | |
parent | dbdb773f73b1191975ed777c9d06de27cb4477a9 (diff) | |
download | seabios-4b1d2be6e1c73d1fc9a984ca7fe6c14d433171cc.tar.gz |
Unify return path for CSM to go via csm_return()
This allows us to keep the entry_csm code simple, and ensures that we
consistently do things like saving the PIC mask (and later setting
UmbStart) on the way back to UEFI.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/csm.c | 20 | ||||
-rw-r--r-- | src/romlayout.S | 23 |
2 files changed, 22 insertions, 21 deletions
@@ -34,7 +34,16 @@ EFI_COMPATIBILITY16_TABLE csm_compat_table VAR32FLATVISIBLE __aligned(16) = { EFI_TO_COMPATIBILITY16_INIT_TABLE *csm_init_table; EFI_TO_COMPATIBILITY16_BOOT_TABLE *csm_boot_table; -extern void csm_return(struct bregs *regs) __noreturn; +extern void __csm_return(struct bregs *regs) __noreturn; + +static void +csm_return(struct bregs *regs) +{ + dprintf(3, "handle_csm returning AX=%04x\n", regs->ax); + + pic_save_mask(); + __csm_return(regs); +} static void csm_maininit(struct bregs *regs) @@ -47,9 +56,6 @@ csm_maininit(struct bregs *regs) regs->ax = 0; - // Return directly to UEFI instead of unwinding stack. - pic_save_mask(); - dprintf(3, "csm_maininit fast returning AX=%04x\n", regs->ax); csm_return(regs); } @@ -243,7 +249,7 @@ handle_csm(struct bregs *regs) if (!CONFIG_CSM) return; - dprintf(3, "handle_csm16 regs %p AX=%04x\n", regs, regs->ax); + dprintf(3, "handle_csm regs %p AX=%04x\n", regs, regs->ax); pic_restore_mask(); @@ -260,9 +266,7 @@ handle_csm(struct bregs *regs) default: regs->al = 1; } - pic_save_mask(); - - dprintf(3, "handle_csm16 returning AX=%04x\n", regs->ax); + csm_return(regs); } int csm_bootprio_ata(struct pci_device *pci, int chanid, int slave) diff --git a/src/romlayout.S b/src/romlayout.S index cbe6b1c6..2a2984cc 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -394,27 +394,24 @@ entry_csm: PUSHBREGS // Backup stack location and convert to a "flat pointer" - movl %ss, %ebx - movw %bx, BREGS_code+2(%esp) // Store %ss in bregs->code.seg - shll $4, %ebx - addl %esp, %ebx + movl %ss, %eax + movw %ax, BREGS_code+2(%esp) // Store %ss in bregs->code.seg + shll $4, %eax + addl %esp, %eax // Change to BUILD_STACK_ADDR stack - xorl %eax, %eax - movw %ax, %ss + xorl %ebx, %ebx + movw %bx, %ss movl $BUILD_STACK_ADDR, %esp // Jump to 32bit mode and call handle_csm(bregs) - movl $(1f + BUILD_BIOS_ADDR), %edx + movl $_cfunc32flat_handle_csm, %edx jmp transition32 + .code32 -1: movl %ebx, %eax - calll _cfunc32flat_handle_csm - BUILD_BIOS_ADDR - movl $2f, %edx - jmp transition16big - .global csm_return -csm_return: + EXPORTFUNC __csm_return +__csm_return: movl %eax, %ebx movl $2f, %edx jmp transition16big |