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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#include <mach/machine/asm.h>
#include <i386/i386asm.h>
/*
* This section will be put first into .text. See also i386/ldscript.
*/
.section .text.start,"ax"
/* We should never be entered this way. */
.globl start,_start
start:
_start:
jmp boot_entry
/* MultiBoot header - see multiboot.h. */
#define MULTIBOOT_MAGIC 0x1BADB002
#ifdef __ELF__
#define MULTIBOOT_FLAGS 0x00000002
#else /* __ELF__ */
#define MULTIBOOT_FLAGS 0x00010002
#endif /* __ELF__ */
P2ALIGN(2)
boot_hdr:
.long MULTIBOOT_MAGIC
.long MULTIBOOT_FLAGS
/*
* The next item here is the checksum.
* XX this works OK until we need at least the 30th bit.
*/
.long - (MULTIBOOT_MAGIC+MULTIBOOT_FLAGS)
#ifndef __ELF__ /* a.out kludge */
.long boot_hdr /* header_addr */
.long _start /* load_addr */
.long _edata /* load_end_addr */
.long _end /* bss_end_addr */
.long boot_entry /* entry */
#endif /* __ELF__ */
boot_entry:
/* use segmentation to offset ourself. */
lgdt boot_gdt_descr - KERNELBASE
ljmp $8,$0f
0:
movw $0,%ax
movw %ax,%ds
movw %ax,%es
movw %ax,%fs
movw %ax,%gs
movw $16,%ax
movw %ax,%ds
movw %ax,%es
movw %ax,%ss
/* Switch to our own interrupt stack. */
movl $_intstack+INTSTACK_SIZE,%esp
/* Reset EFLAGS to a known state. */
pushl $0
popf
/* Clear uninitialized data. */
lea _edata,%edi
lea _end,%ecx
subl %edi,%ecx
xorl %eax,%eax
rep
stosb
/* Push the boot_info pointer to be the second argument. */
pushl %ebx
/* Fix ifunc entries */
movl $__rel_iplt_start,%esi
movl $__rel_iplt_end,%edi
iplt_cont:
cmpl %edi,%esi
jae iplt_done
movl (%esi),%ebx /* r_offset */
movb 4(%esi),%al /* info */
cmpb $42,%al /* IRELATIVE */
jnz iplt_next
call *(%ebx) /* call ifunc */
movl %eax,(%ebx) /* fixed address */
iplt_next:
addl $8,%esi
jmp iplt_cont
iplt_done:
/* Jump into C code. */
call EXT(c_boot_entry)
.comm _intstack,INTSTACK_SIZE
.align 16
.word 0
boot_gdt_descr:
.word 3*8+7
.long boot_gdt - KERNELBASE
.align 16
boot_gdt:
/* 0 */
.quad 0
/* boot CS = 8 */
.word 0xffff
.word (-KERNELBASE) & 0xffff
.byte ((-KERNELBASE) >> 16) & 0xff
.byte 0x9a
.byte 0xcf
.byte ((-KERNELBASE) >> 24) & 0xff
/* boot DS = 8 */
.word 0xffff
.word (-KERNELBASE) & 0xffff
.byte ((-KERNELBASE) >> 16) & 0xff
.byte 0x92
.byte 0xcf
.byte ((-KERNELBASE) >> 24) & 0xff
|