|  | /* Copyright (c) 2009-13 The Regents of the University of California | 
|  | * Barret Rhoden <brho@cs.berkeley.edu> | 
|  | * See LICENSE for details. */ | 
|  |  | 
|  | #include <arch/mmu.h> | 
|  | #include <arch/trap.h> | 
|  | #include <ros/memlayout.h> | 
|  |  | 
|  | .set CODE_SEL,0x8		# index of code seg within mygdt | 
|  | .set DATA_SEL,0x10		# index of data seg within mygdt | 
|  |  | 
|  | #define MULTIBOOT_PAGE_ALIGN  (1<<0) | 
|  | #define MULTIBOOT_MEMORY_INFO (1<<1) | 
|  | #define MULTIBOOT_HEADER_MAGIC (0x1BADB002) | 
|  | #define MULTIBOOT_HEADER_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN) | 
|  | #define CHECKSUM (-(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)) | 
|  |  | 
|  | # The kernel bootstrap (this code) is linked and loaded at physical address | 
|  | # 0x00100000 (1MB), which is the start of extended memory.  (See kernel.ld) | 
|  |  | 
|  | # Flagging boottext to be text.  Check out: | 
|  | # http://sourceware.org/binutils/docs/as/Section.html | 
|  | .section .boottext, "awx" | 
|  |  | 
|  | .code32 | 
|  | .align 4 | 
|  | multiboot_header: | 
|  | .long MULTIBOOT_HEADER_MAGIC | 
|  | .long MULTIBOOT_HEADER_FLAGS | 
|  | .long CHECKSUM | 
|  |  | 
|  | .globl		_start | 
|  | _start: | 
|  | movw	$0x1234,0x472			# warm boot | 
|  | # Reload all segment registers (including CS!) with flag segment selectors | 
|  | # from our boot GDT. | 
|  | lgdt	mygdtdesc | 
|  | movl	$DATA_SEL, %eax | 
|  | movw	%ax,%ds | 
|  | movw	%ax,%es | 
|  | movw	%ax,%ss | 
|  | ljmp	$CODE_SEL,$newcs		# reload CS by jumping | 
|  | newcs: | 
|  | # build page table.  need a mapping for current code at 0x00100000 and a | 
|  | # basic kernbase mapping.  we're using the 32 bit second PT (aka, pg_dir), | 
|  | # which covers 4MB per entry | 
|  | movl	$boot_pdt, %edx | 
|  | # identity map the first jumbo PTE from 0x0 -> 0x0 | 
|  | movl	$(PTE_P | PTE_W | PTE_PS), (%edx) | 
|  | # map KERNBASE -> 0 for 1GB (1/4 of the 1024 entries) | 
|  | movl	$256, %ecx | 
|  | # init loop, eax at paddr 0, and edx is advanced by KERNBASE mapping slots | 
|  | # (with 4 bytes per PTE). | 
|  | addl	$((KERNBASE >> PTSHIFT) << 2), %edx | 
|  | movl	$(PTE_P | PTE_W | PTE_PS), %eax | 
|  | loop: | 
|  | movl	%eax, (%edx) | 
|  | addl	$PTSIZE, %eax | 
|  | addl	$4, %edx | 
|  | decl	%ecx | 
|  | jnz		loop | 
|  | # load cr3 and turn on paging.  note we assume PSE support.  if we didn't | 
|  | # have it, then our jumbo page mappings are going to fail. | 
|  | movl	$boot_pdt, %eax | 
|  | movl	%eax, %cr3 | 
|  | movl	%cr4, %eax | 
|  | orl		$(CR4_PSE | CR4_PGE), %eax | 
|  | movl	%eax, %cr4 | 
|  | movl	%cr0, %eax | 
|  | orl		$(CR0_PE | CR0_PG | CR0_AM | CR0_WP | CR0_NE | CR0_MP), %eax | 
|  | andl	$(~(CR0_TS | CR0_EM | CR0_CD | CR0_NW)), %eax | 
|  | movl	%eax, %cr0 | 
|  | # paging is on, and our code is still running at 0x00100000 do some | 
|  | # miscellaneous OS setup.  the coreid stuff is so we can call core_id() | 
|  | # before smp_boot.  this is the only arch-dependent code called before then. | 
|  | movl	$0x0, os_coreid_lookup | 
|  | movl	$0x0, hw_coreid_lookup | 
|  | # Clear the frame pointer register (EBP) | 
|  | # so that once we get into debugging C code, | 
|  | # stack backtraces will be terminated properly. | 
|  | movl	$0x0,%ebp | 
|  | movl	$(bootstacktop),%esp | 
|  | # Save multiboot info | 
|  | push 	%ebx | 
|  | movl	$0x1,num_cpus 		# init global var, for now | 
|  | call	kernel_init | 
|  | # Should never get here, but in case we do, just spin. | 
|  | spin:	jmp	spin | 
|  |  | 
|  | .section .bootdata, "aw" | 
|  | .p2align	2		# force 4 byte alignment | 
|  | mygdt: | 
|  | SEG_NULL			# null seg | 
|  | SEG(STA_X|STA_R, 0, 0xffffffff)	# code seg | 
|  | SEG(STA_W, 0, 0xffffffff)	# data seg | 
|  | mygdtdesc: | 
|  | .word	0x17		# sizeof(mygdt) - 1 | 
|  | .long	mygdt		# address mygdt | 
|  | # boot page directory.  going to use jumbo page entries | 
|  | .align PGSIZE | 
|  | boot_pdt: | 
|  | .space  PGSIZE | 
|  |  | 
|  |  | 
|  | # From here down is linked for KERNBASE | 
|  |  | 
|  | .data | 
|  | .p2align	PGSHIFT		# force page alignment | 
|  | .globl		bootstack | 
|  | bootstack: | 
|  | .space		KSTKSIZE | 
|  | .globl		bootstacktop | 
|  | bootstacktop: | 
|  |  |