BXE: min->MIN, plus an spatch
[akaros.git] / kern / arch / x86 / entry32.S
1 /* Copyright (c) 2009-13 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #include <arch/mmu.h>
6 #include <arch/trap.h>
7 #include <kstack.h>
8
9 .set CODE_SEL,0x8               # index of code seg within mygdt
10 .set DATA_SEL,0x10              # index of data seg within mygdt
11
12 #define MULTIBOOT_PAGE_ALIGN  (1<<0)
13 #define MULTIBOOT_MEMORY_INFO (1<<1)
14 #define MULTIBOOT_HEADER_MAGIC (0x1BADB002)
15 #define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN)
16 #define CHECKSUM (-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS))
17
18 # The kernel bootstrap (this code) is linked and loaded at physical address
19 # 0x00100000 (1MB), which is the start of extended memory.  (See kernel.ld)
20
21 # Flagging boottext to be text.  Check out:
22 # http://sourceware.org/binutils/docs/as/Section.html
23 .section .boottext, "awx"
24
25 .code32
26 .align 4
27 multiboot_header:
28 .long MULTIBOOT_HEADER_MAGIC
29 .long MULTIBOOT_HEADER_FLAGS
30 .long CHECKSUM
31
32 .globl          _start
33 _start:
34         movw    $0x1234,0x472                   # warm boot
35         # Reload all segment registers (including CS!) with flag segment selectors
36         # from our boot GDT.
37         lgdt    mygdtdesc
38         movl    $DATA_SEL, %eax
39         movw    %ax,%ds
40         movw    %ax,%es
41         movw    %ax,%ss
42         ljmp    $CODE_SEL,$newcs                # reload CS by jumping
43 newcs:
44         # build page table.  need a mapping for current code at 0x00100000 and a
45         # basic kernbase mapping.  we're using the 32 bit second PT (aka, pg_dir),
46         # which covers 4MB per entry
47         movl    $boot_pdt, %edx
48         # identity map the first jumbo PTE from 0x0 -> 0x0
49         movl    $(PTE_P | PTE_W | PTE_PS), (%edx)
50         # map KERNBASE -> 0 for 1GB (1/4 of the 1024 entries)
51         movl    $256, %ecx
52         # init loop, eax at paddr 0, and edx is advanced by KERNBASE mapping slots
53         # (with 4 bytes per PTE).
54         addl    $((KERNBASE >> PTSHIFT) << 2), %edx
55         movl    $(PTE_P | PTE_W | PTE_PS), %eax
56 loop:
57         movl    %eax, (%edx)
58         addl    $PTSIZE, %eax
59         addl    $4, %edx
60         decl    %ecx
61         jnz             loop
62         # load cr3 and turn on paging.  note we assume PSE support.  if we didn't
63         # have it, then our jumbo page mappings are going to fail.
64         movl    $boot_pdt, %eax
65         movl    %eax, %cr3
66         movl    %cr4, %eax
67         orl             $(CR4_PSE | CR4_PGE), %eax
68         movl    %eax, %cr4
69         movl    %cr0, %eax
70         orl             $(CR0_PE | CR0_PG | CR0_AM | CR0_WP | CR0_NE | CR0_MP), %eax  
71         andl    $(~(CR0_TS | CR0_EM | CR0_CD | CR0_NW)), %eax  
72         movl    %eax, %cr0
73         # paging is on, and our code is still running at 0x00100000 do some
74         # miscellaneous OS setup.  the coreid stuff is so we can call core_id()
75         # before smp_boot.  this is the only arch-dependent code called before then.
76         movl    $0x0, os_coreid_lookup
77         movl    $0x0, hw_coreid_lookup
78         # Clear the frame pointer register (EBP)
79         # so that once we get into debugging C code,
80         # stack backtraces will be terminated properly.
81         movl    $0x0,%ebp
82         movl    $(bootstacktop),%esp
83         # Save multiboot info
84         push    %ebx
85         movl    $0x1,num_cpus           # init global var, for now
86         call    kernel_init
87         # Should never get here, but in case we do, just spin.
88 spin:   jmp     spin
89
90 .section .bootdata, "aw"
91         .p2align        2               # force 4 byte alignment
92 mygdt:
93         SEG_NULL                        # null seg
94         SEG(STA_X|STA_R, 0, 0xffffffff) # code seg
95         SEG(STA_W, 0, 0xffffffff)       # data seg
96 mygdtdesc:
97         .word   0x17            # sizeof(mygdt) - 1
98         .long   mygdt           # address mygdt
99 # boot page directory.  going to use jumbo page entries
100         .align PGSIZE
101 boot_pdt:
102         .space  PGSIZE
103
104
105 # From here down is linked for KERNBASE
106
107 .data
108         .p2align        PGSHIFT         # force page alignment
109         .globl          bootstack
110 bootstack:
111         .space          KSTKSIZE
112         .globl          bootstacktop   
113 bootstacktop:
114