xref: /xv6-public/entry.S (revision 0a69dc9b)
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