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