xref: /xv6-public/entry.S (revision a4b213cf)
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
37*a4b213cfSFrans Kaashoek  .long entry
38c60a3551SFrans Kaashoek
39*a4b213cfSFrans Kaashoek# Entering xv6 on boot processor.  Machine is mostly set up.
40*a4b213cfSFrans Kaashoek.globl entry
41*a4b213cfSFrans 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
47*a4b213cfSFrans Kaashoek  movl    $(V2P_WO(enterpgdir)), %eax
48c60a3551SFrans Kaashoek  movl    %eax, %cr3
49c60a3551SFrans Kaashoek  # Turn on paging.
50c60a3551SFrans Kaashoek  movl    %cr0, %eax
51c60a3551SFrans Kaashoek  orl     $(CR0_PE|CR0_PG|CR0_WP), %eax
52c60a3551SFrans Kaashoek  movl    %eax, %cr0
53c60a3551SFrans Kaashoek
54c60a3551SFrans Kaashoek  # now switch to using addresses above KERNBASE
55c60a3551SFrans Kaashoek  # call addresses are pc-relative so we jump though this hoop:
56c60a3551SFrans Kaashoek  mov     $relocated, %eax
57c60a3551SFrans Kaashoek  jmp     *%eax
58c60a3551SFrans Kaashoekrelocated:
59c60a3551SFrans Kaashoek  # Set up the stack pointer and call into C.
60c60a3551SFrans Kaashoek  movl $(stack + STACK), %esp
61c60a3551SFrans Kaashoek  call main
62c60a3551SFrans Kaashoekspin:
63c60a3551SFrans Kaashoek  jmp spin
64c60a3551SFrans Kaashoek
65c60a3551SFrans Kaashoek.comm stack, STACK
66