furix
cute os
arch/x86_64/entry.S
2907 bytes raw
1.section .text
2
3.set PAGE_PRESENT, 1 << 0
4.set PAGE_WRITE, 1 << 1
5.set PAGE_SIZE, 1 << 7
6
7.code32
8.global _start
9_start:
10 mov $stack_top, %esp
11
12 mov %ebx, mb_info_ptr
13
14 # clear bss
15
16 mov $__bss_start, %ecx
17 jmp .bss_zero_check
18.bss_zero_loop:
19 movl $0, (%ecx)
20 add $4, %ecx
21.bss_zero_check:
22 cmp $__bss_end, %ecx
23 jb .bss_zero_loop
24
25 # fail if not loaded by multiboot2
26
27 cmp $MB_BOOTLOADER_MAGIC, %eax
28 jne .boot_failure
29
30 # map first gb to page_table_l2
31
32 mov $0, %ecx
33.page_loop:
34 mov %ecx, %eax
35 shl $21, %eax
36
37 or $(PAGE_PRESENT | PAGE_WRITE | PAGE_SIZE), %eax
38 mov %eax, page_table_l2(,%ecx,8)
39
40 inc %ecx
41 cmp $512, %ecx
42 jne .page_loop
43
44 # the rest of the levels
45
46 mov $page_table_l2, %eax
47 or $(PAGE_PRESENT | PAGE_WRITE), %eax
48 mov %eax, page_table_l3
49
50 mov $page_table_l3, %eax
51 or $(PAGE_PRESENT | PAGE_WRITE), %eax
52 mov %eax, page_table_l4
53
54 # page table addr to CR3
55
56 mov $page_table_l4, %eax
57 mov %eax, %cr3
58
59 # enable PAE (CR4.PAE)
60
61 mov %cr4, %eax
62 or $(1 << 5), %eax
63 mov %eax, %cr4
64
65 # enable long mode (EFER.LME)
66
67 mov $0xc0000080, %ecx
68 rdmsr
69 or $(1 << 8), %eax
70 wrmsr
71
72 # enable paging (CR0.PG)
73
74 mov %cr0, %eax
75 or $(1 << 31), %eax
76 mov %eax, %cr0
77
78 # enable GDT and jump to long mode
79
80 lgdt gdt64_ptr
81 ljmp $0x08, $long_main
82
83.boot_failure:
84 # TODO: more failure cases liek idk cpu doesnt support long mode
85
86 movb $'e', 0xb8000
87 movb $' ', 0xb8001 # green
88
89 cli
90.halt32:
91 hlt
92 jmp .halt32
93
94.code64
95long_main:
96 mov $stack_top, %rsp
97
98 mov $0, %ax
99 mov %ax, %ds
100 mov %ax, %es
101 mov %ax, %fs
102 mov %ax, %gs
103 mov %ax, %ss
104
105 call kernel_main
106
107 cli
108.halt64:
109 hlt
110 jmp .halt64
111
112.section .rodata
113
114mb_info_ptr:
115 .space 4
116
117.set GDT_FL_LONG, 1 << 53
118.set GDT_ACC_RDWR, 1 << 41
119.set GDT_ACC_EXEC, 1 << 43
120.set GDT_ACC_NOTSYS, 1 << 44
121.set GDT_ACC_PRESENT, 1 << 47
122
123gdt64:
124 .quad 0
125 .quad GDT_ACC_PRESENT | GDT_ACC_NOTSYS | GDT_ACC_RDWR | GDT_ACC_EXEC | GDT_FL_LONG
126 .quad GDT_ACC_PRESENT | GDT_ACC_NOTSYS | GDT_ACC_RDWR
127gdt64_ptr:
128 .word . - gdt64 - 1
129 .quad gdt64
130
131.section .bss
132
133.align 4096
134page_table_l4:
135 .space 4096
136page_table_l3:
137 .space 4096
138page_table_l2:
139 .space 4096
140
141.align 16
142stack_bottom:
143 .space 1024 * 16
144stack_top:
145
146.section .multiboot, "a"
147
148.set MB_BOOTLOADER_MAGIC, 0x36d76289
149
150.set MB_MAGIC, 0xE85250D6
151.set MB_ARCH, 0
152.set MB_LENGTH, (multiboot_hdr_end - multiboot_hdr)
153.set MB_CHECKSUM, -(MB_LENGTH + MB_ARCH + MB_MAGIC)
154
155.align 8
156multiboot_hdr:
157 .long MB_MAGIC
158 .long MB_ARCH
159 .long MB_LENGTH
160 .long MB_CHECKSUM
161multiboot_hdr_end:
162
163.set MB_TAG_END, 0
164.set MB_TAG_INFO_REQ, 1
165
166.set MB_INFO_MMAP, 6
167
168.align 8
169 .word MB_TAG_INFO_REQ
170 .word 0
171 .long 8 + 4
172 .long MB_INFO_MMAP
173
174.align 8
175 .word MB_TAG_END
176 .word 0
177 .long 8