annotate withGRUB2Kernel/bootstrap.S @ 19:f8ef856d6691

two new test directory
author Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
date Tue, 09 Oct 2012 17:35:53 +0900
parents acdc2c21996a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 * This program is boot to kernel.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 * Change mode to 64bit mode and go to CbC kernel. */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 .file "bootstrap.S"
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include "multiboot2.h"
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include "boot_header.h"
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 .code32
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 .text
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 /* Align 64 bit boundly. */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 .align 8
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 multiboot_header:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 .long MULTIBOOT2_HEADER_MAGIC
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 .long MULTIBOOT_ARCHITECTURE_I386
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 .long multiboot_header_end - multiboot_header
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 .short MULTIBOOT_HEADER_TAG_END
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 .short 0
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 .long 8
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 multiboot_header_end:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 * Prepare for entering 64bit-mode.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 .globl _start
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 _start:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 jmp move_longmode
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 move_longmode:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 /* load new GDT */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 leal gdt(%ebp), %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 movl %eax, gdt+2(%ebp)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 lgdt gdt(%ebp)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 * PAE mode ON.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 * Physical Address Extension
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 * You can use capacity of memory more than 4GiB on 32 bit CPU.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 movl $0x00000020, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 movl %eax, %cr4
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 * create 64bit page table
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 * Initialize page tables to 0
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 * 6144 = 512*8*6/4
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 movl $0x01fe9000, %ebx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 leal pgtable(%ebx), %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 xorl %eax, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 movl $6144, %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 rep stosl
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 /* Build Level 4 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 leal pgtable + 0(%ebx), %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 leal 0x1007(%edi), %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 movl %eax, 0(%edi)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 /* Build Level 3 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 leal pgtable + 0x1000(%ebx), %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 leal 0x1007(%edi), %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 movl $4, %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 1: movl %eax, 0x00(%edi)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 addl $0x00001000, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 addl $8, %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 decl %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 jnz 1b
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 /* Build level 2 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 leal pgtable + 0x2000(%ebx), %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 movl $0x00000183, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 movl $2048, %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 1: movl %eax, 0(%edi)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 addl $0x00200000, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 addl $8, %edi
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 decl %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 jnz 1b
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 /* Enable the boot page talbes */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 leal pgtable(%ebx), %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 movl %eax, %cr3
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 /* Enable Long mode */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 movl $MSR_EFER, %ecx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 rdmsr
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 btsl $EFER_LME, %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 wrmsr
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 pushl $(12*8)
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 leal start_kernel(%ebp), %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 pushl %eax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 /* activating Long Mode */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 movl %eax, %cr0
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 jmp start_kernel
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 * jump to kernel.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 * push ebx and eax send argument to kernel.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 .code64
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 .text
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 start_kernel:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 pushq %rbx
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 pushq %rax
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 call kmain
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 .data
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 gdt:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 .word gdt_end - gdt
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 .long gdt
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 .word 0
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 .quad 0x0000000000000000 /* NULL descriptor */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 .quad 0x00af9a000000ffff /* __KERNEL_CS */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 .quad 0x00cf92000000ffff /* __KERNEL_DS */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 .quad 0x0080890000000000 /* TS descriptor */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 .quad 0x0000000000000000 /* TS continued */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 gdt_end:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 /*
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 * Space for page tables.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 * a : section is allocatable.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 * @nobits : section does not contain data.
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 */
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 .section ".pgtable", "a", @nobits
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 .balign 4096
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 pgtable:
acdc2c21996a chage directory structure
Taiki TAIRA <e095767@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 .fill 6*4096, 1, 0