-
Notifications
You must be signed in to change notification settings - Fork 0
/
kernel_entry.asm
92 lines (77 loc) · 1.01 KB
/
kernel_entry.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
extern kernel
global read_port
global write_port
bits 32
_start:
call kernel
jmp $
bits 32
switch_to_long_mode:
cli
mov eax, cr0
and eax, 01111111111111111111111111111111b
mov cr0, eax
mov edi, 0x1000
mov cr3, edi
xor eax, eax
mov ecx, 4096
rep stosd
mov edi, cr3
mov ebx, 0x00000003
mov ecx, 512
.setEntry:
mov dword [edi], ebx
add ebx, 0x1000
add edi, 8
loop .setEntry
mov eax, cr4
or eax, 1 << 5
mov cr4, eax
mov ecx, 0xC0000080
rdmsr
or eax, 1 << 8
wrmsr
lgdt [GDT64.Pointer]
mov eax, cr0
or eax, 1 << 31
mov cr0, eax
jmp GDT64.Code:Realm64
bits 64
Realm64:
cli
mov ax, GDT64.Data
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov edi, 0xB8000
mov rax, 0x1F201F201F201F20
mov ecx, 500
call kernel
jmp $
GDT64:
.Null: equ $ - GDT64
dw 0xFFFF
dw 0
db 0
db 0
db 1
db 0
.Code: equ $ - GDT64
dw 0
dw 0
db 0
db 10011010b
db 10101111b
db 0
.Data: equ $ - GDT64
dw 0
dw 0
db 0
db 10010010b
db 00000000b
db 0
.Pointer:
dw $ - GDT64 - 1
dq GDT64