1*0a69dc9bSRobert Morris# The xv6 kernel starts executing in this file. This file is linked with 2*0a69dc9bSRobert Morris# the kernel C code, so it can refer to kernel symbols such as main(). 3*0a69dc9bSRobert Morris# The boot block (bootasm.S and bootmain.c) jumps to entry below. 4*0a69dc9bSRobert Morris 5c60a3551SFrans Kaashoek# Multiboot header, for multiboot boot loaders like GNU Grub. 6c60a3551SFrans Kaashoek# http://www.gnu.org/software/grub/manual/multiboot/multiboot.html 7c60a3551SFrans Kaashoek# 8c60a3551SFrans Kaashoek# Using GRUB 2, you can boot xv6 from a file stored in a 9c60a3551SFrans Kaashoek# Linux file system by copying kernel or kernelmemfs to /boot 10c60a3551SFrans Kaashoek# and then adding this menu entry: 11c60a3551SFrans Kaashoek# 12c60a3551SFrans Kaashoek# menuentry "xv6" { 13c60a3551SFrans Kaashoek# insmod ext2 14c60a3551SFrans Kaashoek# set root='(hd0,msdos1)' 15c60a3551SFrans Kaashoek# set kernel='/boot/kernel' 16c60a3551SFrans Kaashoek# echo "Loading ${kernel}..." 17c60a3551SFrans Kaashoek# multiboot ${kernel} ${kernel} 18c60a3551SFrans Kaashoek# boot 19c60a3551SFrans Kaashoek# } 20c60a3551SFrans Kaashoek 21c60a3551SFrans Kaashoek#include "asm.h" 22c60a3551SFrans Kaashoek#include "memlayout.h" 23c60a3551SFrans Kaashoek#include "mmu.h" 24e04329aaSFrans Kaashoek#include "param.h" 25c60a3551SFrans Kaashoek 26c60a3551SFrans Kaashoek# Multiboot header. Data to direct multiboot loader. 27c60a3551SFrans Kaashoek.p2align 2 28c60a3551SFrans Kaashoek.text 29c60a3551SFrans Kaashoek.globl multiboot_header 30c60a3551SFrans Kaashoekmultiboot_header: 31c60a3551SFrans Kaashoek #define magic 0x1badb002 322fc6c35bSAustin Clements #define flags 0 33c60a3551SFrans Kaashoek .long magic 34c60a3551SFrans Kaashoek .long flags 35c60a3551SFrans Kaashoek .long (-magic-flags) 362fc6c35bSAustin Clements 372fc6c35bSAustin Clements# By convention, the _start symbol specifies the ELF entry point. 382fc6c35bSAustin Clements# Since we haven't set up virtual memory yet, our entry point is 392fc6c35bSAustin Clements# the physical address of 'entry'. 402fc6c35bSAustin Clements.globl _start 412fc6c35bSAustin Clements_start = V2P_WO(entry) 42c60a3551SFrans Kaashoek 437e7cb106SRobert Morris# Entering xv6 on boot processor, with paging off. 44a4b213cfSFrans Kaashoek.globl entry 45a4b213cfSFrans Kaashoekentry: 4694496468SFrans Kaashoek # Turn on page size extension for 4Mbyte pages 4794496468SFrans Kaashoek movl %cr4, %eax 4894496468SFrans Kaashoek orl $(CR4_PSE), %eax 4994496468SFrans Kaashoek movl %eax, %cr4 5094496468SFrans Kaashoek # Set page directory 515e083578SRobert Morris movl $(V2P_WO(entrypgdir)), %eax 52c60a3551SFrans Kaashoek movl %eax, %cr3 53c60a3551SFrans Kaashoek # Turn on paging. 54c60a3551SFrans Kaashoek movl %cr0, %eax 555e083578SRobert Morris orl $(CR0_PG|CR0_WP), %eax 56c60a3551SFrans Kaashoek movl %eax, %cr0 57c60a3551SFrans Kaashoek 585c292b3dSRobert Morris # Set up the stack pointer. 59e04329aaSFrans Kaashoek movl $(stack + KSTACKSIZE), %esp 605c292b3dSRobert Morris 615a236924SRobert Morris # Jump to main(), and switch to executing at 625c292b3dSRobert Morris # high addresses. The indirect call is needed because 635c292b3dSRobert Morris # the assembler produces a PC-relative instruction 645a236924SRobert Morris # for a direct jump. 655c292b3dSRobert Morris mov $main, %eax 665c292b3dSRobert Morris jmp *%eax 67c60a3551SFrans Kaashoek 68e04329aaSFrans Kaashoek.comm stack, KSTACKSIZE 69