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