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" 20e04329aaSFrans Kaashoek#include "param.h" 21c60a3551SFrans Kaashoek 22c60a3551SFrans Kaashoek# Multiboot header. Data to direct multiboot loader. 23c60a3551SFrans Kaashoek.p2align 2 24c60a3551SFrans Kaashoek.text 25c60a3551SFrans Kaashoek.globl multiboot_header 26c60a3551SFrans Kaashoekmultiboot_header: 27c60a3551SFrans Kaashoek #define magic 0x1badb002 28*2fc6c35bSAustin Clements #define flags 0 29c60a3551SFrans Kaashoek .long magic 30c60a3551SFrans Kaashoek .long flags 31c60a3551SFrans Kaashoek .long (-magic-flags) 32*2fc6c35bSAustin Clements 33*2fc6c35bSAustin Clements# By convention, the _start symbol specifies the ELF entry point. 34*2fc6c35bSAustin Clements# Since we haven't set up virtual memory yet, our entry point is 35*2fc6c35bSAustin Clements# the physical address of 'entry'. 36*2fc6c35bSAustin Clements.globl _start 37*2fc6c35bSAustin Clements_start = V2P_WO(entry) 38c60a3551SFrans Kaashoek 39a4b213cfSFrans Kaashoek# Entering xv6 on boot processor. Machine is mostly set up. 40a4b213cfSFrans Kaashoek.globl entry 41a4b213cfSFrans Kaashoekentry: 4294496468SFrans Kaashoek # Turn on page size extension for 4Mbyte pages 4394496468SFrans Kaashoek movl %cr4, %eax 4494496468SFrans Kaashoek orl $(CR4_PSE), %eax 4594496468SFrans Kaashoek movl %eax, %cr4 4694496468SFrans Kaashoek # Set page directory 475e083578SRobert Morris movl $(V2P_WO(entrypgdir)), %eax 48c60a3551SFrans Kaashoek movl %eax, %cr3 49c60a3551SFrans Kaashoek # Turn on paging. 50c60a3551SFrans Kaashoek movl %cr0, %eax 515e083578SRobert Morris orl $(CR0_PG|CR0_WP), %eax 52c60a3551SFrans Kaashoek movl %eax, %cr0 53c60a3551SFrans Kaashoek 545c292b3dSRobert Morris # Set up the stack pointer. 55e04329aaSFrans Kaashoek movl $(stack + KSTACKSIZE), %esp 565c292b3dSRobert Morris 575a236924SRobert Morris # Jump to main(), and switch to executing at 585c292b3dSRobert Morris # high addresses. The indirect call is needed because 595c292b3dSRobert Morris # the assembler produces a PC-relative instruction 605a236924SRobert Morris # for a direct jump. 615c292b3dSRobert Morris mov $main, %eax 625c292b3dSRobert Morris jmp *%eax 63c60a3551SFrans Kaashoek 64e04329aaSFrans Kaashoek.comm stack, KSTACKSIZE 65