Permissions on IDTs.
[akaros.git] / kern / entry.S
1 /* See COPYRIGHT for copyright information. */
2
3 #include <inc/mmu.h>
4 #include <inc/memlayout.h>
5 #include <inc/trap.h>
6
7 # Shift Right Logical 
8 #define SRL(val, shamt)         (((val) >> (shamt)) & ~(-1 << (32 - (shamt))))
9
10
11 ###################################################################
12 # The kernel (this code) is linked at address (KERNBASE + 0x00100000 (1MB)), 
13 # but we tell the bootloader to load it at physical address 
14 # 0x00100000 (1MB), which is the start of extended memory.
15 # (See kernel.ld)
16 ###################################################################
17
18
19 ###################################################################
20 # RELOC(x) maps a symbol x from its link address to its actual
21 # location in physical memory (its load address).        
22 ###################################################################
23 #define RELOC(x) ((x) - KERNBASE)
24
25
26 .set CODE_SEL,0x8               # index of code seg within mygdt
27 .set DATA_SEL,0x10              # index of data seg within mygdt
28
29 #define MULTIBOOT_PAGE_ALIGN  (1<<0)
30 #define MULTIBOOT_MEMORY_INFO (1<<1)
31 #define MULTIBOOT_HEADER_MAGIC (0x1BADB002)
32 #define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN)
33 #define CHECKSUM (-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS))
34
35 ###################################################################
36 # entry point
37 ###################################################################
38
39 .text
40
41 # The Multiboot header
42 .align 4
43 .long MULTIBOOT_HEADER_MAGIC
44 .long MULTIBOOT_HEADER_FLAGS
45 .long CHECKSUM
46
47 .globl          _start
48 _start:
49         movw    $0x1234,0x472                   # warm boot
50
51         # Establish our own GDT in place of the boot loader's temporary GDT.
52         lgdt    RELOC(mygdtdesc)                # load descriptor table
53
54         # Immediately reload all segment registers (including CS!)
55         # with segment selectors from the new GDT.
56         movl    $DATA_SEL, %eax                 # Data segment selector
57         movw    %ax,%ds                         # -> DS: Data Segment
58         movw    %ax,%es                         # -> ES: Extra Segment
59         movw    %ax,%ss                         # -> SS: Stack Segment
60         ljmp    $CODE_SEL,$relocated            # reload CS by jumping
61 relocated:
62
63         # Clear the frame pointer register (EBP)
64         # so that once we get into debugging C code,
65         # stack backtraces will be terminated properly.
66         movl    $0x0,%ebp                       # nuke frame pointer
67
68     # Set the stack pointer
69     # Leave a few words on the stack for the user trap frame
70         movl    $(bootstacktop-SIZEOF_STRUCT_TRAPFRAME),%esp
71
72         # Save multiboot info
73         push    %ebx
74
75         # now to C code
76         call    kernel_init
77
78         # Should never get here, but in case we do, just spin.
79 spin:   jmp     spin
80
81
82 ###################################################################     
83 # See <inc/memlayout.h> for a complete description of these two symbols.
84 ###################################################################
85 .data
86         .globl  vpt
87         .set    vpt, VPT
88         .globl  vpd
89         .set    vpd, (VPT + SRL(VPT, 10))
90
91
92 ###################################################################
93 # boot stack
94 ###################################################################
95         .p2align        PGSHIFT         # force page alignment
96         .globl          bootstack
97 bootstack:
98         .space          KSTKSIZE
99         .globl          bootstacktop   
100 bootstacktop:
101
102 ###################################################################
103 # setup the GDT 
104 ###################################################################
105         .p2align        2               # force 4 byte alignment
106 mygdt:
107         SEG_NULL                                # null seg
108         SEG(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg
109         SEG(STA_W, -KERNBASE, 0xffffffff)       # data seg
110 mygdtdesc:
111         .word   0x17                    # sizeof(mygdt) - 1
112         .long   RELOC(mygdt)            # address mygdt
113