aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <David.Woodhouse@intel.com>2013-02-10 00:51:56 +0000
committerKevin O'Connor <kevin@koconnor.net>2013-02-12 21:16:02 -0500
commit4b1d2be6e1c73d1fc9a984ca7fe6c14d433171cc (patch)
treecf4bad9efdd13823460a639d614e2dc342046c04
parentdbdb773f73b1191975ed777c9d06de27cb4477a9 (diff)
downloadseabios-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>
-rw-r--r--src/csm.c20
-rw-r--r--src/romlayout.S23
2 files changed, 22 insertions, 21 deletions
diff --git a/src/csm.c b/src/csm.c
index 40fbf5d..45ca941 100644
--- a/src/csm.c
+++ b/src/csm.c
@@ -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 cbe6b1c..2a2984c 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