xref: /xv6-public/entry.S (revision c60a3551)
1*c60a3551SFrans Kaashoek# Multiboot header, for multiboot boot loaders like GNU Grub.
2*c60a3551SFrans Kaashoek# http://www.gnu.org/software/grub/manual/multiboot/multiboot.html
3*c60a3551SFrans Kaashoek#
4*c60a3551SFrans Kaashoek# Using GRUB 2, you can boot xv6 from a file stored in a
5*c60a3551SFrans Kaashoek# Linux file system by copying kernel or kernelmemfs to /boot
6*c60a3551SFrans Kaashoek# and then adding this menu entry:
7*c60a3551SFrans Kaashoek#
8*c60a3551SFrans Kaashoek# menuentry "xv6" {
9*c60a3551SFrans Kaashoek# 	insmod ext2
10*c60a3551SFrans Kaashoek# 	set root='(hd0,msdos1)'
11*c60a3551SFrans Kaashoek# 	set kernel='/boot/kernel'
12*c60a3551SFrans Kaashoek# 	echo "Loading ${kernel}..."
13*c60a3551SFrans Kaashoek# 	multiboot ${kernel} ${kernel}
14*c60a3551SFrans Kaashoek# 	boot
15*c60a3551SFrans Kaashoek# }
16*c60a3551SFrans Kaashoek
17*c60a3551SFrans Kaashoek#include "asm.h"
18*c60a3551SFrans Kaashoek#include "memlayout.h"
19*c60a3551SFrans Kaashoek#include "mmu.h"
20*c60a3551SFrans Kaashoek
21*c60a3551SFrans Kaashoek#define STACK 4096
22*c60a3551SFrans Kaashoek
23*c60a3551SFrans Kaashoek# Multiboot header.  Data to direct multiboot loader.
24*c60a3551SFrans Kaashoek.p2align 2
25*c60a3551SFrans Kaashoek.text
26*c60a3551SFrans Kaashoek.globl multiboot_header
27*c60a3551SFrans Kaashoekmultiboot_header:
28*c60a3551SFrans Kaashoek  #define magic 0x1badb002
29*c60a3551SFrans Kaashoek  #define flags (1<<16 | 1<<0)
30*c60a3551SFrans Kaashoek  .long magic
31*c60a3551SFrans Kaashoek  .long flags
32*c60a3551SFrans Kaashoek  .long (-magic-flags)
33*c60a3551SFrans Kaashoek  .long multiboot_header  # beginning of image
34*c60a3551SFrans Kaashoek  .long multiboot_header
35*c60a3551SFrans Kaashoek  .long edata
36*c60a3551SFrans Kaashoek  .long end
37*c60a3551SFrans Kaashoek  .long multiboot_entry
38*c60a3551SFrans Kaashoek
39*c60a3551SFrans Kaashoek# Multiboot entry point.  Machine is mostly set up.
40*c60a3551SFrans Kaashoek.globl multiboot_entry
41*c60a3551SFrans Kaashoekmultiboot_entry:
42*c60a3551SFrans Kaashoek  movl    $(V2P_WO(bootpgdir)), %eax
43*c60a3551SFrans Kaashoek  movl    %eax, %cr3
44*c60a3551SFrans Kaashoek  # Turn on paging.
45*c60a3551SFrans Kaashoek  movl    %cr0, %eax
46*c60a3551SFrans Kaashoek  orl     $(CR0_PE|CR0_PG|CR0_WP), %eax
47*c60a3551SFrans Kaashoek  movl    %eax, %cr0
48*c60a3551SFrans Kaashoek
49*c60a3551SFrans Kaashoek  # now switch to using addresses above KERNBASE
50*c60a3551SFrans Kaashoek  # call addresses are pc-relative so we jump though this hoop:
51*c60a3551SFrans Kaashoek  mov     $relocated, %eax
52*c60a3551SFrans Kaashoek  jmp     *%eax
53*c60a3551SFrans Kaashoekrelocated:
54*c60a3551SFrans Kaashoek  # Set up the stack pointer and call into C.
55*c60a3551SFrans Kaashoek  movl $(stack + STACK), %esp
56*c60a3551SFrans Kaashoek  call main
57*c60a3551SFrans Kaashoekspin:
58*c60a3551SFrans Kaashoek  jmp spin
59*c60a3551SFrans Kaashoek
60*c60a3551SFrans Kaashoek.comm stack, STACK
61