From 2fc6c35b2fd64a15d7c4cc54c9e8733c3632039d Mon Sep 17 00:00:00 2001
From: Austin Clements <amdragon@mit.edu>
Date: Sun, 4 Sep 2011 15:51:46 -0400
Subject: [PATCH] Make the ELF entry point a physical address

This way, the bootloader doesn't have to translate the entry point.
This also makes xv6 multiboot-compliant and follows the convention
used by Linux.
---
 bootmain.c |  2 +-
 entry.S    | 13 +++++++------
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/bootmain.c b/bootmain.c
index 72f3927..d24bf66 100644
--- a/bootmain.c
+++ b/bootmain.c
@@ -43,7 +43,7 @@ bootmain(void)
 
   // Call the entry point from the ELF header.
   // Does not return!
-  entry = (void(*)(void))(elf->entry - KERNBASE);
+  entry = (void(*)(void))(elf->entry);
   entry();
 }
 
diff --git a/entry.S b/entry.S
index 3fe4eb5..18947b0 100644
--- a/entry.S
+++ b/entry.S
@@ -25,15 +25,16 @@
 .globl multiboot_header
 multiboot_header:
   #define magic 0x1badb002
-  #define flags (1<<16 | 1<<0)
+  #define flags 0
   .long magic
   .long flags
   .long (-magic-flags)
-  .long multiboot_header  # beginning of image
-  .long multiboot_header
-  .long edata
-  .long end
-  .long entry
+
+# By convention, the _start symbol specifies the ELF entry point.
+# Since we haven't set up virtual memory yet, our entry point is
+# the physical address of 'entry'.
+.globl _start
+_start = V2P_WO(entry)
 
 # Entering xv6 on boot processor.  Machine is mostly set up.
 .globl entry