]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/lguest/i386_head.S
Fix __pfn_to_page(pfn) for CONFIG_DISCONTIGMEM=y
[linux-2.6-omap-h63xx.git] / arch / x86 / lguest / i386_head.S
index ba4282eba5bfda6d09e19983b485ee9cf78b35f9..5c7cef34c9e70d31d96fc47e002fd6b6bcd8d590 100644 (file)
@@ -5,33 +5,34 @@
 #include <asm/thread_info.h>
 #include <asm/processor-flags.h>
 
-/*G:020 This is where we begin: we have a magic signature which the launcher
- * looks for.  The plan is that the Linux boot protocol will be extended with a
- * "platform type" field which will guide us here from the normal entry point,
- * but for the moment this suffices.  The normal boot code uses %esi for the
- * boot header, so we do too.
+/*G:020 Our story starts with the kernel booting into startup_32 in
+ * arch/x86/kernel/head_32.S.  It expects a boot header, which is created by
+ * the bootloader (the Launcher in our case).
+ *
+ * The startup_32 function does very little: it clears the uninitialized global
+ * C variables which we expect to be zero (ie. BSS) and then copies the boot
+ * header and kernel command line somewhere safe.  Finally it checks the
+ * 'hardware_subarch' field.  This was introduced in 2.6.24 for lguest and Xen:
+ * if it's set to '1' (lguest's assigned number), then it calls us here.
  *
  * WARNING: be very careful here!  We're running at addresses equal to physical
  * addesses (around 0), not above PAGE_OFFSET as most code expectes
  * (eg. 0xC0000000).  Jumps are relative, so they're OK, but we can't touch any
- * data.
+ * data without remembering to subtract __PAGE_OFFSET!
  *
  * The .section line puts this code in .init.text so it will be discarded after
  * boot. */
 .section .init.text, "ax", @progbits
-.ascii "GenuineLguest"
-       /* Make initial hypercall now, so we can set up the pagetables. */
+ENTRY(lguest_entry)
+       /* We make the "initialization" hypercall now to tell the Host about
+        * us, and also find out where it put our page tables. */
        movl $LHCALL_LGUEST_INIT, %eax
        movl $lguest_data - __PAGE_OFFSET, %edx
        int $LGUEST_TRAP_ENTRY
 
-       /* Set up boot information pointer to hand to lguest_init(): it wants
-        * a virtual address. */
-       movl %esi, %eax
-       addl $__PAGE_OFFSET, %eax
-
        /* The Host put the toplevel pagetable in lguest_data.pgdir.  The movsl
-        * instruction uses %esi, so we needed to save it above. */
+        * instruction uses %esi implicitly as the source for the copy we're
+        * about to do. */
        movl lguest_data - __PAGE_OFFSET + LGUEST_DATA_pgdir, %esi
 
        /* Copy first 32 entries of page directory to __PAGE_OFFSET entries.
@@ -47,7 +48,6 @@
        /* Set up the initial stack so we can run C code. */
        movl $(init_thread_union+THREAD_SIZE),%esp
 
-
        /* Jumps are relative, and we're running __PAGE_OFFSET too low at the
         * moment. */
        jmp lguest_init+__PAGE_OFFSET