62e99969eef676b4fed1fa8580a99ac39ca37e13
[akaros.git] / kern / arch / i686 / entry.S
1 /* See COPYRIGHT for copyright information. */
2
3 #include <arch/mmu.h>
4 #include <arch/trap.h>
5 #include <ros/memlayout.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 # The Multiboot header
40 .section .multiboot
41 .align 4
42 .long MULTIBOOT_HEADER_MAGIC
43 .long MULTIBOOT_HEADER_FLAGS
44 .long CHECKSUM
45
46 .section .text
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         movl    $0x0, os_coreid_lookup
63         movl    $0x0, hw_coreid_lookup
64
65         # Clear the frame pointer register (EBP)
66         # so that once we get into debugging C code,
67         # stack backtraces will be terminated properly.
68         movl    $0x0,%ebp                       # nuke frame pointer
69
70     # Set the stack pointer
71         movl    $(bootstacktop),%esp
72
73         # Save multiboot info
74         push    %ebx
75
76         # now to C code
77         movl    $0x1,num_cpus           # init global var, for now
78         call    kernel_init
79
80         # Should never get here, but in case we do, just spin.
81 spin:   jmp     spin
82
83 ###################################################################     
84 # See <inc/memlayout.h> for a complete description of these two symbols.
85 ###################################################################
86 .data
87         .globl  vpt
88         .set    vpt, VPT
89         .globl  vpd
90         .set    vpd, (VPT + SRL(VPT, 10))
91
92
93 ###################################################################
94 # boot stack
95 ###################################################################
96         .p2align        PGSHIFT         # force page alignment
97         .globl          bootstack
98 bootstack:
99         .space          KSTKSIZE
100         .globl          bootstacktop   
101 bootstacktop:
102
103 ###################################################################
104 # setup the GDT 
105 ###################################################################
106         .p2align        2               # force 4 byte alignment
107 mygdt:
108         SEG_NULL                                # null seg
109         SEG(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg
110         SEG(STA_W, -KERNBASE, 0xffffffff)       # data seg
111 mygdtdesc:
112         .word   0x17                    # sizeof(mygdt) - 1
113         .long   RELOC(mygdt)            # address mygdt
114