Subversion Repositories HelenOS

Rev

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

Rev 2692 Rev 2703
Line 1... Line 1...
1
 
1
 
2
# Copyright (c) 2005 Ondrej Palkovsky
2
# Copyright (c) 2005 Ondrej Palkovsky
3
# Copyright (c) 2006 Martin Decky
3
# Copyright (c) 2006 Martin Decky
-
 
4
# Copyright (c) 2008 Jakub Jermar
4
# All rights reserved.
5
# All rights reserved.
5
#
6
#
6
# Redistribution and use in source and binary forms, with or without
7
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions
8
# modification, are permitted provided that the following conditions
8
# are met:
9
# are met:
Line 52... Line 53...
52
	.long 0
53
	.long 0
53
	.long multiboot_image_start
54
	.long multiboot_image_start
54
 
55
 
55
multiboot_image_start:
56
multiboot_image_start:
56
	movl $START_STACK, %esp			# initialize stack pointer
57
	movl $START_STACK, %esp			# initialize stack pointer
57
	lgdt bootstrap_gdtr				# initialize Global Descriptor Table register
58
	lgdtl bootstrap_gdtr			# initialize Global Descriptor Table register
58
 
59
 
59
	movw $gdtselector(KDATA_DES), %cx
60
	movw $gdtselector(KDATA_DES), %cx
60
	movw %cx, %es
61
	movw %cx, %es
61
	movw %cx, %ds							# kernel data + stack
62
	movw %cx, %ds							# kernel data + stack
62
	movw %cx, %ss
63
	movw %cx, %ss
Line 67... Line 68...
67
	movw %cx, %gs
68
	movw %cx, %gs
68
	
69
	
69
	jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point
70
	jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point
70
	multiboot_meeting_point:
71
	multiboot_meeting_point:
71
	
72
	
72
	movl %eax, grub_eax							# save parameters from GRUB
73
	movl %eax, grub_eax						# save parameters from GRUB
73
	movl %ebx, grub_ebx
74
	movl %ebx, grub_ebx
74
	
75
	
75
	# Protected 32-bit. We want to reuse the code-seg descriptor,
76
	# Protected 32-bit. We want to reuse the code-seg descriptor,
76
	# the Default operand size must not be 1 when entering long mode
77
	# the Default operand size must not be 1 when entering long mode
77
	
78
	
Line 154... Line 155...
154
	leal ptl_0, %eax
155
	leal ptl_0, %eax
155
	movl %eax, %cr3
156
	movl %eax, %cr3
156
	
157
	
157
	# Enable long mode
158
	# Enable long mode
158
	
159
	
159
	movl $EFER_MSR_NUM, %ecx	# EFER MSR number
160
	movl $EFER_MSR_NUM, %ecx			# EFER MSR number
160
	rdmsr						# Read EFER
161
	rdmsr						# Read EFER
161
	btsl $AMD_LME_FLAG, %eax	# Set LME = 1
162
	btsl $AMD_LME_FLAG, %eax			# Set LME = 1
162
	wrmsr						# Write EFER
163
	wrmsr						# Write EFER
163
	
164
	
164
	# Enable paging to activate long mode (set CR0.PG = 1)
165
	# Enable paging to activate long mode (set CR0.PG = 1)
165
	
166
	
166
	movl %cr0, %eax
167
	movl %cr0, %eax
Line 175... Line 176...
175
start64:
176
start64:
176
	movq $(PA2KA(START_STACK)), %rsp
177
	movq $(PA2KA(START_STACK)), %rsp
177
	movl grub_eax, %eax
178
	movl grub_eax, %eax
178
	movl grub_ebx, %ebx
179
	movl grub_ebx, %ebx
179
	
180
	
180
	cmpl $MULTIBOOT_LOADER_MAGIC, %eax				# compare GRUB signature
181
	cmpl $MULTIBOOT_LOADER_MAGIC, %eax			# compare GRUB signature
181
	je valid_boot
182
	je valid_boot
182
		
183
		
183
		xorl %ecx, %ecx							# no memory size or map available
184
		xorl %ecx, %ecx					# no memory size or map available
184
		movl %ecx, e801memorysize
185
		movl %ecx, e801memorysize
185
		movl %ecx, e820counter
186
		movl %ecx, e820counter
186
		
187
		
187
		jmp invalid_boot
188
		jmp invalid_boot
188
		
189
		
189
	valid_boot:
190
	valid_boot:
190
		
191
		
191
		movl (%ebx), %eax						# ebx = physical address of struct multiboot_info
192
		movl (%ebx), %eax				# ebx = physical address of struct multiboot_info
192
		
193
		
193
		bt $0, %eax								# mbi->flags[0] (mem_lower, mem_upper valid)
194
		bt $0, %eax					# mbi->flags[0] (mem_lower, mem_upper valid)
194
		jc mem_valid
195
		jc mem_valid
195
			
196
			
196
			xorl %ecx, %ecx
197
			xorl %ecx, %ecx
197
			jmp mem_invalid
198
			jmp mem_invalid
198
			
199
			
199
		mem_valid:
200
		mem_valid:
200
		movl 4(%ebx), %ecx						# mbi->mem_lower
201
		movl 4(%ebx), %ecx				# mbi->mem_lower
201
		addl 8(%ebx), %ecx						# mbi->mem_upper
202
		addl 8(%ebx), %ecx				# mbi->mem_upper
202
		
203
		
203
		mem_invalid:
204
		mem_invalid:
204
		movl %ecx, e801memorysize
205
		movl %ecx, e801memorysize
205
		
206
		
206
		bt $3, %eax								# mbi->flags[3] (mods_count, mods_addr valid)
207
		bt $3, %eax					# mbi->flags[3] (mods_count, mods_addr valid)
207
		jc mods_valid
208
		jc mods_valid
208
			
209
			
209
			xorq %rcx, %rcx
210
			xorq %rcx, %rcx
210
			movq %rcx, init
211
			movq %rcx, init
211
			jmp mods_end
212
			jmp mods_end
212
		
213
		
213
		mods_valid:
214
		mods_valid:
214
		
215
		
215
		xorq %rcx, %rcx
216
		xorq %rcx, %rcx
216
		movl 20(%ebx), %ecx						# mbi->mods_count
217
		movl 20(%ebx), %ecx				# mbi->mods_count
217
		movq %rcx, init
218
		movq %rcx, init
218
		
219
		
219
		cmpl $0, %ecx
220
		cmpl $0, %ecx
220
		je mods_end
221
		je mods_end
221
		
222
		
222
		movl 24(%ebx), %esi						# mbi->mods_addr
223
		movl 24(%ebx), %esi				# mbi->mods_addr
223
		movq $init, %rdi
224
		movq $init, %rdi
224
		
225
		
225
		mods_loop:
226
		mods_loop:
226
			
227
			
227
			xorq %rdx, %rdx
228
			xorq %rdx, %rdx
228
			movl 0(%esi), %edx					# mods->mod_start
229
			movl 0(%esi), %edx			# mods->mod_start
229
			movq $0xffff800000000000, %r10
230
			movq $0xffff800000000000, %r10
230
			addq %r10, %rdx
231
			addq %r10, %rdx
231
			movq %rdx, 8(%rdi)
232
			movq %rdx, 8(%rdi)
232
			
233
			
233
			xorq %rdx, %rdx
234
			xorq %rdx, %rdx
234
			movl 4(%esi), %edx
235
			movl 4(%esi), %edx
235
			subl 0(%esi), %edx					# mods->mod_end - mods->mod_start
236
			subl 0(%esi), %edx			# mods->mod_end - mods->mod_start
236
			movq %rdx, 16(%rdi)
237
			movq %rdx, 16(%rdi)
237
			
238
			
238
			addl $16, %esi
239
			addl $16, %esi
239
			addq $16, %rdi
240
			addq $16, %rdi
240
			
241
			
241
			loop mods_loop
242
			loop mods_loop
242
			
243
			
243
		mods_end:
244
		mods_end:
244
		
245
		
245
		bt $6, %eax								# mbi->flags[6] (mmap_length, mmap_addr valid)	
246
		bt $6, %eax					# mbi->flags[6] (mmap_length, mmap_addr valid)	
246
		jc mmap_valid
247
		jc mmap_valid
247
			
248
			
248
			xorl %edx, %edx
249
			xorl %edx, %edx
249
			jmp mmap_invalid
250
			jmp mmap_invalid
250
			
251
			
251
		mmap_valid:
252
		mmap_valid:
252
		movl 44(%ebx), %ecx						# mbi->mmap_length
253
		movl 44(%ebx), %ecx				# mbi->mmap_length
253
		movl 48(%ebx), %esi						# mbi->mmap_addr
254
		movl 48(%ebx), %esi				# mbi->mmap_addr
254
		movq $e820table, %rdi
255
		movq $e820table, %rdi
255
		xorl %edx, %edx
256
		xorl %edx, %edx
256
		
257
		
257
		mmap_loop:
258
		mmap_loop:
258
			cmpl $0, %ecx
259
			cmpl $0, %ecx
259
			jle mmap_end
260
			jle mmap_end
260
			
261
			
261
			movl 4(%esi), %eax					# mmap->base_addr_low
262
			movl 4(%esi), %eax			# mmap->base_addr_low
262
			movl %eax, (%rdi)
263
			movl %eax, (%rdi)
263
			
264
			
264
			movl 8(%esi), %eax					# mmap->base_addr_high
265
			movl 8(%esi), %eax			# mmap->base_addr_high
265
			movl %eax, 4(%rdi)
266
			movl %eax, 4(%rdi)
266
			
267
			
267
			movl 12(%esi), %eax					# mmap->length_low
268
			movl 12(%esi), %eax			# mmap->length_low
268
			movl %eax, 8(%rdi)
269
			movl %eax, 8(%rdi)
269
			
270
			
270
			movl 16(%esi), %eax					# mmap->length_high
271
			movl 16(%esi), %eax			# mmap->length_high
271
			movl %eax, 12(%rdi)
272
			movl %eax, 12(%rdi)
272
			
273
			
273
			movl 20(%esi), %eax					# mmap->type
274
			movl 20(%esi), %eax			# mmap->type
274
			movl %eax, 16(%rdi)
275
			movl %eax, 16(%rdi)
275
			
276
			
276
			movl (%esi), %eax					# mmap->size
277
			movl (%esi), %eax			# mmap->size
277
			addl $0x4, %eax
278
			addl $0x4, %eax
278
			addl %eax, %esi
279
			addl %eax, %esi
279
			subl %eax, %ecx
280
			subl %eax, %ecx
280
			addq $MEMMAP_E820_RECORD_SIZE, %rdi
281
			addq $MEMMAP_E820_RECORD_SIZE, %rdi
281
			incl %edx
282
			incl %edx
Line 429... Line 430...
429
	mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
430
	mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax
430
	push %di
431
	push %di
431
	mov $vga323 - vesa_init, %di
432
	mov $vga323 - vesa_init, %di
432
	mov $0x100, %ecx
433
	mov $0x100, %ecx
433
	
434
	
434
	bt $5, %ax							# Test if VGA compatible registers are present
435
	bt $5, %ax						# Test if VGA compatible registers are present
435
	jnc vga_compat
436
	jnc vga_compat
436
		
437
		
437
		# Try VESA routine to set palette
438
		# Try VESA routine to set palette
438
		
439
		
439
		mov $VESA_SET_PALETTE, %ax
440
		mov $VESA_SET_PALETTE, %ax
Line 445... Line 446...
445
	
446
	
446
	vga_compat:
447
	vga_compat:
447
		
448
		
448
		# Try VGA registers to set palette
449
		# Try VGA registers to set palette
449
		
450
		
450
		movw $0x3c6, %dx						# Set palette mask
451
		movw $0x3c6, %dx				# Set palette mask
451
		movb $0xff, %al
452
		movb $0xff, %al
452
		outb %al, %dx
453
		outb %al, %dx
453
		
454
		
454
		movw $0x3c8, %dx						# First index to set
455
		movw $0x3c8, %dx				# First index to set
455
		xor %al, %al
456
		xor %al, %al
456
		outb %al, %dx
457
		outb %al, %dx
457
		
458
		
458
		movw $0x3c9, %dx						# Data port
459
		movw $0x3c9, %dx				# Data port
459
		vga_loop:
460
		vga_loop:
460
			movb %es:2(%di), %al
461
			movb %es:2(%di), %al
461
			outb %al, %dx
462
			outb %al, %dx
462
			
463
			
463
			movb %es:1(%di), %al
464
			movb %es:1(%di), %al
Line 510... Line 511...
510
	jz 2b						# Force relative jump
511
	jz 2b						# Force relative jump
511
 
512
 
512
1:
513
1:
513
	mov $0x0003, %ax
514
	mov $0x0003, %ax
514
	int $0x10
515
	int $0x10
515
	mov $0xffffffff, %edi		# EGA text mode used, because of problems with VESA
516
	mov $0xffffffff, %edi				# EGA text mode used, because of problems with VESA
516
	xor %ax, %ax
517
	xor %ax, %ax
517
	jz 8b						# Force relative jump
518
	jz 8b						# Force relative jump
518
 
519
 
519
vga323:
520
vga323:
520
#include "vga323.pal"	
521
#include "vga323.pal"	
521
	
522
	
522
.code32
523
.code32
523
vesa_init_protect:
524
vesa_init_protect:
524
	movw $gdtselector(KDATA_DES), %cx
525
	movw $gdtselector(KDATA_DES), %cx
525
	movw %cx, %es
526
	movw %cx, %es
526
	movw %cx, %ds							# kernel data + stack
527
	movw %cx, %ds					# kernel data + stack
527
	movw %cx, %ss
528
	movw %cx, %ss
528
	# Simics seems to remove hidden part of GS on entering user mode
529
	# Simics seems to remove hidden part of GS on entering user mode
529
	#  when _visible_ part of GS does not point to user-mode segment
530
	#  when _visible_ part of GS does not point to user-mode segment
530
	movw $gdtselector(UDATA_DES), %cx
531
	movw $gdtselector(UDATA_DES), %cx
531
	movw %cx, %fs
532
	movw %cx, %fs
532
	movw %cx, %gs
533
	movw %cx, %gs
533
	
534
	
534
	movl $START_STACK, %esp			# initialize stack pointer
535
	movl $START_STACK, %esp				# initialize stack pointer
535
	
536
	
536
	jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
537
	jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
537
	
538
	
538
.align 4
539
.align 4
539
e_vesa_init:
540
e_vesa_init:
540
#endif
541
#endif
541
 
542
 
542
# Print string from %esi to EGA display (in red) and halt
543
# Print string from %esi to EGA display (in red) and halt
543
error_halt:
544
error_halt:
544
	movl $0xb8000, %edi						# base of EGA text mode memory
545
	movl $0xb8000, %edi				# base of EGA text mode memory
545
	xorl %eax, %eax
546
	xorl %eax, %eax
546
	
547
	
547
	movw $0x3d4, %dx						# read bits 8 - 15 of the cursor address
548
	movw $0x3d4, %dx				# read bits 8 - 15 of the cursor address
548
	movb $0xe, %al
549
	movb $0xe, %al
549
	outb %al, %dx
550
	outb %al, %dx
550
	
551
	
551
	movw $0x3d5, %dx
552
	movw $0x3d5, %dx
552
	inb %dx, %al
553
	inb %dx, %al
553
	shl $8, %ax
554
	shl $8, %ax
554
	
555
	
555
	movw $0x3d4, %dx						# read bits 0 - 7 of the cursor address
556
	movw $0x3d4, %dx				# read bits 0 - 7 of the cursor address
556
	movb $0xf, %al
557
	movb $0xf, %al
557
	outb %al, %dx
558
	outb %al, %dx
558
	
559
	
559
	movw $0x3d5, %dx
560
	movw $0x3d5, %dx
560
	inb %dx, %al
561
	inb %dx, %al
561
	
562
	
562
	cmp $1920, %ax
563
	cmp $1920, %ax
563
	jbe cursor_ok
564
	jbe cursor_ok
564
		movw $1920, %ax						# sanity check for the cursor on the last line
565
		movw $1920, %ax				# sanity check for the cursor on the last line
565
	cursor_ok:
566
	cursor_ok:
566
	
567
	
567
	movw %ax, %bx
568
	movw %ax, %bx
568
	shl $1, %eax
569
	shl $1, %eax
569
	addl %eax, %edi
570
	addl %eax, %edi
570
	
571
	
571
	movw $0x0c00, %ax						# black background, light red foreground
572
	movw $0x0c00, %ax				# black background, light red foreground
572
	cld
573
	cld
573
	
574
	
574
	ploop:
575
	ploop:
575
		lodsb
576
		lodsb
576
		cmp $0, %al
577
		cmp $0, %al
Line 578... Line 579...
578
		stosw
579
		stosw
579
		inc %bx	
580
		inc %bx	
580
		jmp ploop
581
		jmp ploop
581
	ploop_end:
582
	ploop_end:
582
	
583
	
583
	movw $0x3d4, %dx						# write bits 8 - 15 of the cursor address
584
	movw $0x3d4, %dx				# write bits 8 - 15 of the cursor address
584
	movb $0xe, %al
585
	movb $0xe, %al
585
	outb %al, %dx
586
	outb %al, %dx
586
	
587
	
587
	movw $0x3d5, %dx
588
	movw $0x3d5, %dx
588
	movb %bh, %al
589
	movb %bh, %al
589
	outb %al, %dx
590
	outb %al, %dx
590
	
591
	
591
	movw $0x3d4, %dx						# write bits 0 - 7 of the cursor address
592
	movw $0x3d4, %dx				# write bits 0 - 7 of the cursor address
592
	movb $0xf, %al
593
	movb $0xf, %al
593
	outb %al, %dx
594
	outb %al, %dx
594
	
595
	
595
	movw $0x3d5, %dx
596
	movw $0x3d5, %dx
596
	movb %bl, %al
597
	movb %bl, %al
597
	outb %al, %dx
598
	outb %al, %dx
598
		
599
		
599
	cli
600
	cli
600
	hlt
601
	hlt
601
				
602
				
-
 
603
 
602
.section K_DATA_START, "aw", @progbits
604
.section K_INI_PTLS, "aw", @progbits
-
 
605
 
-
 
606
#
-
 
607
# Macro for generating initial page table contents.
-
 
608
# @param cnt	Number of entries to generat. Must be multiple of 8.
-
 
609
# @param g	Number of GB that will be added to the mapping.
-
 
610
#
-
 
611
.macro ptl2gen cnt g 
-
 
612
.if \cnt
-
 
613
	ptl2gen "\cnt - 8" \g 
-
 
614
	.quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
615
	.quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
616
	.quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
617
	.quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
618
	.quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
619
	.quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
620
	.quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
621
	.quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
622
.endif
-
 
623
.endm
-
 
624
 
-
 
625
# Page table for pages in the first gigabyte.
603
.align 4096
626
.align 4096
-
 
627
.global ptl_2_0g
-
 
628
ptl_2_0g:	
-
 
629
	ptl2gen 512 0
-
 
630
 
-
 
631
# Page table for pages in the second gigabyte.
-
 
632
.align 4096
-
 
633
.global ptl_2_1g
-
 
634
ptl_2_1g:
-
 
635
	ptl2gen 512 1
-
 
636
 
-
 
637
# Page table for pages in the third gigabyte.
-
 
638
.align 4096
-
 
639
.global ptl_2_2g
-
 
640
ptl_2_2g:
-
 
641
	ptl2gen 512 2
-
 
642
 
-
 
643
# Page table for pages in the fourth gigabyte.
-
 
644
.align 4096
-
 
645
.global ptl_2_3g
-
 
646
ptl_2_3g:
-
 
647
	ptl2gen 512 3
604
 
648
 
605
# Identical mapping of first 64MB and the same of -2GB -> 0	
-
 
606
.global ptl_2
-
 
607
ptl_2:	
-
 
608
	.quad 0x0 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
609
	.quad 0x200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
610
	.quad 0x400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
611
	.quad 0x600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
612
	.quad 0x800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
613
	.quad 0xa00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
614
	.quad 0xc00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
615
	.quad 0xe00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
616
	.quad 0x1000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
617
	.quad 0x1200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
618
	.quad 0x1400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
619
	.quad 0x1600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
620
	.quad 0x1800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
621
	.quad 0x1a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
622
	.quad 0x1c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
623
	.quad 0x1e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
624
	.quad 0x2000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
625
	.quad 0x2200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
626
	.quad 0x2400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
627
	.quad 0x2600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
628
	.quad 0x2800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
629
	.quad 0x2a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
630
	.quad 0x2c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
631
	.quad 0x2e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
632
	.quad 0x3000000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
633
	.quad 0x3200000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
634
	.quad 0x3400000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
635
	.quad 0x3600000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
636
	.quad 0x3800000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
637
	.quad 0x3a00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
638
	.quad 0x3c00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
639
	.quad 0x3e00000 | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE)
-
 
640
	
-
 
641
.align 4096
649
.align 4096
642
.global ptl_1
650
.global ptl_1
643
ptl_1:
651
ptl_1:
-
 
652
	# Identity mapping for [0; 4G)
644
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
653
	.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
-
 
654
	.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) 
-
 
655
	.quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT)
-
 
656
	.quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT)
645
	.fill 509,8,0
657
	.fill 506, 8, 0
-
 
658
	# Mapping of [0; 1G) at -2G
646
	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
659
	.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
647
	.fill 1,8,0
660
	.fill 1, 8, 0
648
	
661
	
649
.align 4096
662
.align 4096
650
.global ptl_0
663
.global ptl_0
651
ptl_0:
664
ptl_0:
652
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
665
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
653
	.fill 255,8,0
666
	.fill 255,8,0
654
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
667
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
655
	.fill 254,8,0
668
	.fill 254,8,0
656
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
669
	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
657
 
670
 
-
 
671
.section K_DATA_START, "aw", @progbits
-
 
672
 
658
.global bootstrap_gdtr
673
.global bootstrap_gdtr
659
bootstrap_gdtr:
674
bootstrap_gdtr:
660
	.word gdtselector(GDT_ITEMS)
675
	.word gdtselector(GDT_ITEMS)
661
	.long KA2PA(gdt)
676
	.long KA2PA(gdt)
662
 
677