Subversion Repositories HelenOS

Rev

Rev 1806 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1806 Rev 1809
Line 37... Line 37...
37
	.ascii  "HYPERCALL_PAGE=0x2,"
37
	.ascii  "HYPERCALL_PAGE=0x2,"
38
	.ascii  "LOADER=generic,"
38
	.ascii  "LOADER=generic,"
39
	.ascii  "PT_MODE_WRITABLE"
39
	.ascii  "PT_MODE_WRITABLE"
40
	.byte   0
40
	.byte   0
41
 
41
 
42
#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE)
-
 
43
 
-
 
44
.section K_TEXT_START, "ax"
42
.section K_TEXT_START, "ax"
45
 
43
 
46
KTEXT=8
44
KTEXT=8
47
KDATA=16
45
KDATA=16
48
 
46
 
49
.code32
47
.code32
50
.align 4
48
.align 4
51
.global multiboot_image_start
49
.global kernel_image_start
52
multiboot_header:
-
 
53
	.long MULTIBOOT_HEADER_MAGIC
-
 
54
	.long MULTIBOOT_HEADER_FLAGS
-
 
55
	.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)	# checksum
-
 
56
	.long multiboot_header
-
 
57
	.long unmapped_ktext_start
-
 
58
	.long 0
-
 
59
	.long 0
-
 
60
	.long multiboot_image_start
-
 
61
	
50
	
62
multiboot_image_start:
51
kernel_image_start:
63
	movl $START_STACK, %esp			# initialize stack pointer
-
 
64
	lgdt KA2PA(bootstrap_gdtr)		# initialize Global Descriptor Table register
52
	lgdt KA2PA(bootstrap_gdtr)		# initialize Global Descriptor Table register
65
 
53
 
66
	movw $KDATA, %cx
54
	movw $KDATA, %cx
67
	movw %cx, %es
55
	movw %cx, %es
68
	movw %cx, %fs
56
	movw %cx, %fs
Line 99... Line 87...
99
	
87
	
100
	call map_kernel							# map kernel and turn paging on
88
	call map_kernel							# map kernel and turn paging on
101
	
89
	
102
	popl %eax
90
	popl %eax
103
	popl %ebx
91
	popl %ebx
104
	cmpl $MULTIBOOT_LOADER_MAGIC, %eax				# compare GRUB signature
-
 
105
	je valid_boot
-
 
106
		
-
 
107
		xorl %ecx, %ecx							# no memory size or map available
-
 
108
		movl %ecx, e801memorysize
-
 
109
		movl %ecx, e820counter
-
 
110
		
-
 
111
		jmp invalid_boot
-
 
112
		
-
 
113
	valid_boot:
-
 
114
		
-
 
115
		movl (%ebx), %eax						# ebx = physical address of struct multiboot_info
-
 
116
		
-
 
117
		bt $0, %eax								# mbi->flags[0] (mem_lower, mem_upper valid)
-
 
118
		jc mem_valid
-
 
119
			
-
 
120
			xorl %ecx, %ecx
-
 
121
			jmp mem_invalid
-
 
122
			
-
 
123
		mem_valid:
-
 
124
		movl 4(%ebx), %ecx						# mbi->mem_lower
-
 
125
		addl 8(%ebx), %ecx						# mbi->mem_upper
-
 
126
		
-
 
127
		mem_invalid:
-
 
128
		movl %ecx, e801memorysize
-
 
129
		
-
 
130
		bt $3, %eax								# mbi->flags[3] (mods_count, mods_addr valid)
-
 
131
		jc mods_valid
-
 
132
			
-
 
133
			xorl %ecx, %ecx
-
 
134
			movl %ecx, init
-
 
135
			jmp mods_end
-
 
136
		
-
 
137
		mods_valid:
-
 
138
		
-
 
139
		movl 20(%ebx), %ecx						# mbi->mods_count
-
 
140
		movl %ecx, init
-
 
141
		
-
 
142
		cmpl $0, %ecx
-
 
143
		je mods_end
-
 
144
		
-
 
145
		movl 24(%ebx), %esi						# mbi->mods_addr
-
 
146
		movl $init, %edi
-
 
147
		
-
 
148
		mods_loop:
-
 
149
		
-
 
150
			movl 0(%esi), %edx					# mods->mod_start
-
 
151
			addl $0x80000000, %edx
-
 
152
			movl %edx, 4(%edi)
-
 
153
			
-
 
154
			movl 4(%esi), %edx
-
 
155
			subl 0(%esi), %edx					# mods->mod_end - mods->mod_start
-
 
156
			movl %edx, 8(%edi)
-
 
157
			
-
 
158
			addl $16, %esi
-
 
159
			addl $8	, %edi
-
 
160
			
-
 
161
			loop mods_loop
-
 
162
			
-
 
163
		mods_end:
-
 
164
		
-
 
165
	invalid_boot:
-
 
166
	
-
 
167
#ifdef CONFIG_SMP
-
 
168
	
-
 
169
	# copy AP bootstrap routines below 1 MB
-
 
170
	
-
 
171
	movl $BOOT_OFFSET, %esi
-
 
172
	movl $AP_BOOT_OFFSET, %edi
-
 
173
	movl $_hardcoded_unmapped_size, %ecx
-
 
174
	cld
-
 
175
	rep movsb
-
 
176
	
-
 
177
#endif
-
 
178
	
92
	
179
	call main_bsp								# never returns
93
	call main_bsp								# never returns
180
 
94
 
181
	cli
95
	cli
182
	hlt
96
	hlt