Fixed up sysenter/sysexit semantics to allow another environment to be run on exit
[akaros.git] / kern / src / entry.S
1 /* See COPYRIGHT for copyright information. */
2
3 #include <arch/mmu.h>
4 #include <ros/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 .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         movl    $(bootstacktop),%esp
70
71         # Save multiboot info
72         push    %ebx
73
74         # now to C code
75         movl    $0x1,num_cpus           # init global var, for now
76         call    kernel_init
77
78         # Should never get here, but in case we do, just spin.
79 spin:   jmp     spin
80
81 ###################################################################     
82 # See <inc/memlayout.h> for a complete description of these two symbols.
83 ###################################################################
84 .data
85         .globl  vpt
86         .set    vpt, VPT
87         .globl  vpd
88         .set    vpd, (VPT + SRL(VPT, 10))
89
90
91 ###################################################################
92 # boot stack
93 ###################################################################
94         .p2align        PGSHIFT         # force page alignment
95         .globl          bootstack
96 bootstack:
97         .space          KSTKSIZE
98         .globl          bootstacktop   
99 bootstacktop:
100
101 ###################################################################
102 # setup the GDT 
103 ###################################################################
104         .p2align        2               # force 4 byte alignment
105 mygdt:
106         SEG_NULL                                # null seg
107         SEG(STA_X|STA_R, -KERNBASE, 0xffffffff) # code seg
108         SEG(STA_W, -KERNBASE, 0xffffffff)       # data seg
109 mygdtdesc:
110         .word   0x17                    # sizeof(mygdt) - 1
111         .long   RELOC(mygdt)            # address mygdt
112