diff options
author | Robert Morris <[email protected]> | 2011-08-15 12:44:41 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2011-08-15 12:44:41 -0400 |
commit | 7f1718ca33fb333435b05cd9a0541e6e3b9b7249 (patch) | |
tree | aee753ef68a07829a297edea80a907ff557c8044 /entry.S | |
parent | 5053dd6a6d2b481bfcddbd91bacc885b9f0e0ff5 (diff) | |
parent | c60a3551c2dba29006f5d7917308281e47fa5fef (diff) | |
download | xv6-labs-7f1718ca33fb333435b05cd9a0541e6e3b9b7249.tar.gz xv6-labs-7f1718ca33fb333435b05cd9a0541e6e3b9b7249.tar.bz2 xv6-labs-7f1718ca33fb333435b05cd9a0541e6e3b9b7249.zip |
Merge branch 'master' of git+ssh://amsterdam.csail.mit.edu/home/am0/6.828/xv6
Diffstat (limited to 'entry.S')
-rw-r--r-- | entry.S | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -0,0 +1,60 @@ +# Multiboot header, for multiboot boot loaders like GNU Grub. +# http://www.gnu.org/software/grub/manual/multiboot/multiboot.html +# +# Using GRUB 2, you can boot xv6 from a file stored in a +# Linux file system by copying kernel or kernelmemfs to /boot +# and then adding this menu entry: +# +# menuentry "xv6" { +# insmod ext2 +# set root='(hd0,msdos1)' +# set kernel='/boot/kernel' +# echo "Loading ${kernel}..." +# multiboot ${kernel} ${kernel} +# boot +# } + +#include "asm.h" +#include "memlayout.h" +#include "mmu.h" + +#define STACK 4096 + +# Multiboot header. Data to direct multiboot loader. +.p2align 2 +.text +.globl multiboot_header +multiboot_header: + #define magic 0x1badb002 + #define flags (1<<16 | 1<<0) + .long magic + .long flags + .long (-magic-flags) + .long multiboot_header # beginning of image + .long multiboot_header + .long edata + .long end + .long multiboot_entry + +# Multiboot entry point. Machine is mostly set up. +.globl multiboot_entry +multiboot_entry: + movl $(V2P_WO(bootpgdir)), %eax + movl %eax, %cr3 + # Turn on paging. + movl %cr0, %eax + orl $(CR0_PE|CR0_PG|CR0_WP), %eax + movl %eax, %cr0 + + # now switch to using addresses above KERNBASE + # call addresses are pc-relative so we jump though this hoop: + mov $relocated, %eax + jmp *%eax +relocated: + # Set up the stack pointer and call into C. + movl $(stack + STACK), %esp + call main +spin: + jmp spin + +.comm stack, STACK |