1*c60a3551SFrans Kaashoek# Multiboot header, for multiboot boot loaders like GNU Grub. 2*c60a3551SFrans Kaashoek# http://www.gnu.org/software/grub/manual/multiboot/multiboot.html 3*c60a3551SFrans Kaashoek# 4*c60a3551SFrans Kaashoek# Using GRUB 2, you can boot xv6 from a file stored in a 5*c60a3551SFrans Kaashoek# Linux file system by copying kernel or kernelmemfs to /boot 6*c60a3551SFrans Kaashoek# and then adding this menu entry: 7*c60a3551SFrans Kaashoek# 8*c60a3551SFrans Kaashoek# menuentry "xv6" { 9*c60a3551SFrans Kaashoek# insmod ext2 10*c60a3551SFrans Kaashoek# set root='(hd0,msdos1)' 11*c60a3551SFrans Kaashoek# set kernel='/boot/kernel' 12*c60a3551SFrans Kaashoek# echo "Loading ${kernel}..." 13*c60a3551SFrans Kaashoek# multiboot ${kernel} ${kernel} 14*c60a3551SFrans Kaashoek# boot 15*c60a3551SFrans Kaashoek# } 16*c60a3551SFrans Kaashoek 17*c60a3551SFrans Kaashoek#include "asm.h" 18*c60a3551SFrans Kaashoek#include "memlayout.h" 19*c60a3551SFrans Kaashoek#include "mmu.h" 20*c60a3551SFrans Kaashoek 21*c60a3551SFrans Kaashoek#define STACK 4096 22*c60a3551SFrans Kaashoek 23*c60a3551SFrans Kaashoek# Multiboot header. Data to direct multiboot loader. 24*c60a3551SFrans Kaashoek.p2align 2 25*c60a3551SFrans Kaashoek.text 26*c60a3551SFrans Kaashoek.globl multiboot_header 27*c60a3551SFrans Kaashoekmultiboot_header: 28*c60a3551SFrans Kaashoek #define magic 0x1badb002 29*c60a3551SFrans Kaashoek #define flags (1<<16 | 1<<0) 30*c60a3551SFrans Kaashoek .long magic 31*c60a3551SFrans Kaashoek .long flags 32*c60a3551SFrans Kaashoek .long (-magic-flags) 33*c60a3551SFrans Kaashoek .long multiboot_header # beginning of image 34*c60a3551SFrans Kaashoek .long multiboot_header 35*c60a3551SFrans Kaashoek .long edata 36*c60a3551SFrans Kaashoek .long end 37*c60a3551SFrans Kaashoek .long multiboot_entry 38*c60a3551SFrans Kaashoek 39*c60a3551SFrans Kaashoek# Multiboot entry point. Machine is mostly set up. 40*c60a3551SFrans Kaashoek.globl multiboot_entry 41*c60a3551SFrans Kaashoekmultiboot_entry: 42*c60a3551SFrans Kaashoek movl $(V2P_WO(bootpgdir)), %eax 43*c60a3551SFrans Kaashoek movl %eax, %cr3 44*c60a3551SFrans Kaashoek # Turn on paging. 45*c60a3551SFrans Kaashoek movl %cr0, %eax 46*c60a3551SFrans Kaashoek orl $(CR0_PE|CR0_PG|CR0_WP), %eax 47*c60a3551SFrans Kaashoek movl %eax, %cr0 48*c60a3551SFrans Kaashoek 49*c60a3551SFrans Kaashoek # now switch to using addresses above KERNBASE 50*c60a3551SFrans Kaashoek # call addresses are pc-relative so we jump though this hoop: 51*c60a3551SFrans Kaashoek mov $relocated, %eax 52*c60a3551SFrans Kaashoek jmp *%eax 53*c60a3551SFrans Kaashoekrelocated: 54*c60a3551SFrans Kaashoek # Set up the stack pointer and call into C. 55*c60a3551SFrans Kaashoek movl $(stack + STACK), %esp 56*c60a3551SFrans Kaashoek call main 57*c60a3551SFrans Kaashoekspin: 58*c60a3551SFrans Kaashoek jmp spin 59*c60a3551SFrans Kaashoek 60*c60a3551SFrans Kaashoek.comm stack, STACK 61