145 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/**
 | 
						|
 * PROJECT:         ExectOS
 | 
						|
 * COPYRIGHT:       See COPYING.md in the top level directory
 | 
						|
 * FILE:            boot/bootsect/amd64/cpu.S
 | 
						|
 * DESCRIPTION:     Low-level support for CPU initialization
 | 
						|
 * DEVELOPERS:      Aiken Harris <harraiken91@gmail.com>
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
BuildPageMap:
 | 
						|
    /* Generate page map for first 1GB of memory */
 | 
						|
    pushaw
 | 
						|
    pushw %es
 | 
						|
    cld
 | 
						|
    movw $(0x1000 / 16), %ax
 | 
						|
    movw %ax, %es
 | 
						|
    xorw %di, %di
 | 
						|
    movl $(0x2000 | 0x07), %eax
 | 
						|
    stosl
 | 
						|
    xorl %eax, %eax
 | 
						|
    movw $1021, %cx
 | 
						|
    rep stosl
 | 
						|
    movw $(0x2000 / 16), %ax
 | 
						|
    movw %ax, %es
 | 
						|
    xorw %di, %di
 | 
						|
    movl $(0x3000 | 0x07), %eax
 | 
						|
    stosl
 | 
						|
    xorl %eax, %eax
 | 
						|
    movw $1021, %cx
 | 
						|
    rep stosl
 | 
						|
    movw $(0x3000 / 16), %ax
 | 
						|
    movw %ax, %es
 | 
						|
    xorw %di, %di
 | 
						|
    movw $512, %cx
 | 
						|
    movl $0x00000083, %eax
 | 
						|
.BuildPageMapLoop:
 | 
						|
    /* Identity map 512 pages of 2MB */
 | 
						|
    movl %eax, %es:(%di)
 | 
						|
    addl $2097152, %eax
 | 
						|
    addw $0x08, %di
 | 
						|
    loop .BuildPageMapLoop
 | 
						|
    popw %es
 | 
						|
    popaw
 | 
						|
    ret
 | 
						|
 | 
						|
InitializeCpu:
 | 
						|
    /* Check if CPU supports CPUID, long mode and PAE */
 | 
						|
    pushal
 | 
						|
    pushfl
 | 
						|
    popl %eax
 | 
						|
    movl %eax, %ebx
 | 
						|
    xorl $0x00200000, %eax
 | 
						|
    pushl %eax
 | 
						|
    popfl
 | 
						|
    pushfl
 | 
						|
    popl %eax
 | 
						|
    cmpl %ebx, %eax
 | 
						|
    je CpuUnsupported
 | 
						|
    movl $0x01, %eax
 | 
						|
    cpuid
 | 
						|
    testl $0x40, %edx
 | 
						|
    jz CpuUnsupported
 | 
						|
    movl $0x80000000, %eax
 | 
						|
    cpuid
 | 
						|
    cmpl $0x80000000, %eax
 | 
						|
    jbe CpuUnsupported
 | 
						|
    movl $0x80000001, %eax
 | 
						|
    cpuid
 | 
						|
    testl $0x20000000, %edx
 | 
						|
    jz CpuUnsupported
 | 
						|
    popal
 | 
						|
    call LoadGdt
 | 
						|
    ret
 | 
						|
 | 
						|
LoadGdt:
 | 
						|
    /* Load Global Descriptor Table */
 | 
						|
    lgdt .GdtPointer
 | 
						|
    ret
 | 
						|
 | 
						|
RunStage2:
 | 
						|
    /* Switch to long mode and pass control to Stage 2 */
 | 
						|
    call BuildPageMap
 | 
						|
    call ParseExecutableHeader
 | 
						|
    xorl %edx, %edx
 | 
						|
    pushl %edx
 | 
						|
    pushl %eax
 | 
						|
    cli
 | 
						|
    xorw %ax, %ax
 | 
						|
    movw %ax, %ds
 | 
						|
    movw %ax, %es
 | 
						|
    movw %ax, %fs
 | 
						|
    movw %ax, %gs
 | 
						|
    movw %ax, %ss
 | 
						|
    movl %cr4, %eax
 | 
						|
    orl $0x00A0, %eax
 | 
						|
    movl %eax, %cr4
 | 
						|
    movl $0x00001000, %eax
 | 
						|
    movl %eax, %cr3
 | 
						|
    movl $0xC0000080, %ecx
 | 
						|
    rdmsr
 | 
						|
    orl $0x00000100, %eax
 | 
						|
    wrmsr
 | 
						|
    movl %cr0, %eax
 | 
						|
    orl $0x80000001, %eax
 | 
						|
    movl %eax, %cr0
 | 
						|
    ljmp $0x10, $.Stage2LongMode
 | 
						|
.code64
 | 
						|
.Stage2LongMode:
 | 
						|
    /* Set segments and stack, then jump to Stage 2 */
 | 
						|
    movw $0x18, %ax
 | 
						|
    movw %ax, %ds
 | 
						|
    movw %ax, %es
 | 
						|
    movw %ax, %ss
 | 
						|
    xorw %ax, %ax
 | 
						|
    movw %ax, %fs
 | 
						|
    movw %ax, %gs
 | 
						|
    popq %rax
 | 
						|
    xorq %rbx, %rbx
 | 
						|
    xorq %rcx, %rcx
 | 
						|
    xorq %rdx, %rdx
 | 
						|
    xorq %rsi, %rsi
 | 
						|
    xorq %rdi, %rdi
 | 
						|
    xorq %rbp, %rbp
 | 
						|
    jmp *%rax
 | 
						|
 | 
						|
.code16
 | 
						|
.GdtDescriptor:
 | 
						|
    /* Global Descriptor Table */
 | 
						|
    .quad 0x0000000000000000
 | 
						|
    .quad 0x0000000000000000
 | 
						|
    .quad 0x00AF9A000000FFFF
 | 
						|
    .quad 0x00CF92000000FFFF
 | 
						|
    .quad 0x00009E000000FFFF
 | 
						|
    .quad 0x000092000000FFFF
 | 
						|
    .quad 0x00CF9B000000FFFF
 | 
						|
 | 
						|
.GdtPointer:
 | 
						|
    /* Pointer to Global Descriptor Table */
 | 
						|
    .word .GdtPointer - .GdtDescriptor - 1
 | 
						|
    .long .GdtDescriptor
 | 
						|
 | 
						|
.Stage2FileName:
 | 
						|
    /* Name of Stage 2 executable file */
 | 
						|
    .ascii "BOOTX64 EFI"
 |