xref: /xv6-public/entry.S (revision 5c292b3d)
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
37a4b213cfSFrans Kaashoek  .long entry
38c60a3551SFrans Kaashoek
39a4b213cfSFrans Kaashoek# Entering xv6 on boot processor.  Machine is mostly set up.
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
54*5c292b3dSRobert Morris  # Set up the stack pointer.
55c60a3551SFrans Kaashoek  movl $(stack + STACK), %esp
56*5c292b3dSRobert Morris
57*5c292b3dSRobert Morris  # Call main(), which switches to executing at
58*5c292b3dSRobert Morris  # high addresses. The indirect call is needed because
59*5c292b3dSRobert Morris  # the assembler produces a PC-relative instruction
60*5c292b3dSRobert Morris  # for a direct call.
61*5c292b3dSRobert Morris  mov $main, %eax
62*5c292b3dSRobert Morris  jmp *%eax
63c60a3551SFrans Kaashoek
64c60a3551SFrans Kaashoek.comm stack, STACK
65