summary refs log tree commit diff
path: root/arch/x86/kernel/head_32.S
diff options
context:
space:
mode:
authorAndres Salomon <dilinger@queued.net>2010-06-18 17:46:53 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2010-06-18 14:54:36 -0700
commitfd699c76552bbfa66631f019be415a87dbb08237 (patch)
tree49f136f22fc94230af214f9c9c21a6fc0b7180e1 /arch/x86/kernel/head_32.S
parent7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff)
downloadlinux-fd699c76552bbfa66631f019be415a87dbb08237.tar.gz
x86, olpc: Add support for calling into OpenFirmware
Add support for saving OFW's cif, and later calling into it to run OFW
commands.  OFW remains resident in memory, living within virtual range
0xff800000 - 0xffc00000.  A single page directory entry points to the
pgdir that OFW actually uses, so rather than saving the entire page
table, we grab and install that one entry permanently in the kernel's
page table.

This is currently only used by the OLPC XO.  Note that this particular
calling convention breaks PAE and PAT, and so cannot be used on newer
x86 hardware.

Signed-off-by: Andres Salomon <dilinger@queued.net>
LKML-Reference: <20100618174653.7755a39a@dev.queued.net>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/kernel/head_32.S')
-rw-r--r--arch/x86/kernel/head_32.S6
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index 37c3d4b17d85..ff4c453e13f3 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -131,6 +131,12 @@ ENTRY(startup_32)
 	movsl
 1:
 
+#ifdef CONFIG_OLPC_OPENFIRMWARE
+	/* save OFW's pgdir table for later use when calling into OFW */
+	movl %cr3, %eax
+	movl %eax, pa(olpc_ofw_pgd)
+#endif
+
 #ifdef CONFIG_PARAVIRT
 	/* This is can only trip for a broken bootloader... */
 	cmpw $0x207, pa(boot_params + BP_version)