xref: /xv6-public/entry.S (revision 7e7cb106)
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
282fc6c35bSAustin Clements  #define flags 0
29c60a3551SFrans Kaashoek  .long magic
30c60a3551SFrans Kaashoek  .long flags
31c60a3551SFrans Kaashoek  .long (-magic-flags)
322fc6c35bSAustin Clements
332fc6c35bSAustin Clements# By convention, the _start symbol specifies the ELF entry point.
342fc6c35bSAustin Clements# Since we haven't set up virtual memory yet, our entry point is
352fc6c35bSAustin Clements# the physical address of 'entry'.
362fc6c35bSAustin Clements.globl _start
372fc6c35bSAustin Clements_start = V2P_WO(entry)
38c60a3551SFrans Kaashoek
39*7e7cb106SRobert Morris# Entering xv6 on boot processor, with paging off.
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