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 37a4b213cfSFrans Kaashoek .long 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 54*5c292b3dSRobert Morris # Set up the stack pointer. 55c60a3551SFrans Kaashoek movl $(stack + STACK), %esp 56*5c292b3dSRobert Morris 57*5c292b3dSRobert Morris # Call main(), which switches to executing at 58*5c292b3dSRobert Morris # high addresses. The indirect call is needed because 59*5c292b3dSRobert Morris # the assembler produces a PC-relative instruction 60*5c292b3dSRobert Morris # for a direct call. 61*5c292b3dSRobert Morris mov $main, %eax 62*5c292b3dSRobert Morris jmp *%eax 63c60a3551SFrans Kaashoek 64c60a3551SFrans Kaashoek.comm stack, STACK 65