1
2
3
4
5
6
7
8
9
10
11 .text
12 .balign 16
13 .code64
14 .globl entry64, entry64_regs
15
16
17 entry64:
18
19 lgdt gdt(%rip)
20
21
22 movl $0x18, %eax
23 movl %eax, %ds
24 movl %eax, %es
25 movl %eax, %ss
26 movl %eax, %fs
27 movl %eax, %gs
28
29
30 leaq stack_init(%rip), %rsp
31 pushq $0x10
32 leaq new_cs_exit(%rip), %rax
33 pushq %rax
34 lretq
35 new_cs_exit:
36
37
38 movq rax(%rip), %rax
39 movq rbx(%rip), %rbx
40 movq rcx(%rip), %rcx
41 movq rdx(%rip), %rdx
42 movq rsi(%rip), %rsi
43 movq rdi(%rip), %rdi
44 movq rsp(%rip), %rsp
45 movq rbp(%rip), %rbp
46 movq r8(%rip), %r8
47 movq r9(%rip), %r9
48 movq r10(%rip), %r10
49 movq r11(%rip), %r11
50 movq r12(%rip), %r12
51 movq r13(%rip), %r13
52 movq r14(%rip), %r14
53 movq r15(%rip), %r15
54
55
56 jmpq *rip(%rip)
57
58 .section ".rodata"
59 .balign 4
60 entry64_regs:
61 rax: .quad 0x0
62 rcx: .quad 0x0
63 rdx: .quad 0x0
64 rbx: .quad 0x0
65 rsp: .quad 0x0
66 rbp: .quad 0x0
67 rsi: .quad 0x0
68 rdi: .quad 0x0
69 r8: .quad 0x0
70 r9: .quad 0x0
71 r10: .quad 0x0
72 r11: .quad 0x0
73 r12: .quad 0x0
74 r13: .quad 0x0
75 r14: .quad 0x0
76 r15: .quad 0x0
77 rip: .quad 0x0
78 .size entry64_regs, . - entry64_regs
79
80
81 .section ".rodata"
82 .balign 16
83 gdt:
84
85
86
87
88 .word gdt_end - gdt - 1
89 .quad gdt
90 .word 0, 0, 0
91
92
93 .word 0xFFFF, 0x0000, 0x9A00, 0x00AF
94
95
96 .word 0xFFFF, 0x0000, 0x9200, 0x00CF
97 gdt_end:
98 stack: .quad 0, 0
99 stack_init: