125 lines
2.5 KiB
ArmAsm
125 lines
2.5 KiB
ArmAsm
/**
|
|
* PROJECT: ExectOS
|
|
* COPYRIGHT: See COPYING.md in the top level directory
|
|
* FILE: boot/bootsect/i686/cpu.S
|
|
* DESCRIPTION: Low-level support for CPU initialization
|
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
|
*/
|
|
|
|
|
|
BuildPageMap:
|
|
/* Generate page map for first 16MB of memory */
|
|
pushaw
|
|
pushw %es
|
|
cld
|
|
movw $(0x1000 >> 0x04), %ax
|
|
movw %ax, %es
|
|
xorw %di, %di
|
|
movl $(0x2000 | 0x03), %eax
|
|
stosl
|
|
movl $(0x3000 | 0x03), %eax
|
|
stosl
|
|
movl $(0x4000 | 0x03), %eax
|
|
stosl
|
|
movl $(0x5000 | 0x03), %eax
|
|
stosl
|
|
xorl %eax, %eax
|
|
movw $(1024 - 4), %cx
|
|
rep stosl
|
|
movl $0x00000003, %eax
|
|
movl $4, %edx
|
|
movw $(0x2000 >> 0x04), %bx
|
|
.BuildPageMapLoop:
|
|
/* Identity map 1024 pages of 4KB */
|
|
movw %bx, %es
|
|
xorw %di, %di
|
|
pushl %edx
|
|
movw $1024, %cx
|
|
.FillPageMapTable:
|
|
/* Fill the page table */
|
|
movl %eax, %es:(%di)
|
|
addl $4096, %eax
|
|
addw $0x04, %di
|
|
loop .FillPageMapTable
|
|
popl %edx
|
|
addw $(0x1000 >> 0x04), %bx
|
|
decl %edx
|
|
jnz .BuildPageMapLoop
|
|
popw %es
|
|
popaw
|
|
ret
|
|
|
|
InitializeCpu:
|
|
/* Check if CPU supports CPUID */
|
|
pushal
|
|
pushfl
|
|
popl %eax
|
|
movl %eax, %ebx
|
|
xorl $0x00200000, %eax
|
|
pushl %eax
|
|
popfl
|
|
pushfl
|
|
popl %eax
|
|
cmpl %ebx, %eax
|
|
je CpuUnsupported
|
|
popal
|
|
call LoadGdt
|
|
ret
|
|
|
|
LoadGdt:
|
|
/* Load Global Descriptor Table */
|
|
lgdt .GdtPointer
|
|
ret
|
|
|
|
RunStage2:
|
|
/* Switch to protected mode and pass control to Stage 2 */
|
|
call BuildPageMap
|
|
call ParseExecutableHeader
|
|
pushl %eax
|
|
cli
|
|
movl %cr0, %eax
|
|
orl $0x01, %eax
|
|
movl %eax, %cr0
|
|
ljmp $0x08, $.Stage2ProtectedMode
|
|
.code32
|
|
.Stage2ProtectedMode:
|
|
/* Set segments and stack, then jump to Stage 2 */
|
|
movw $0x10, %ax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
movw %ax, %ss
|
|
xorw %ax, %ax
|
|
movw %ax, %fs
|
|
movw %ax, %gs
|
|
popl %eax
|
|
xorl %ebx, %ebx
|
|
xorl %ecx, %ecx
|
|
xorl %edx, %edx
|
|
xorl %esi, %esi
|
|
xorl %edi, %edi
|
|
xorl %ebp, %ebp
|
|
movl $0x1000, %ebx
|
|
movl %ebx, %cr3
|
|
movl %cr0, %ebx
|
|
orl $0x80000000, %ebx
|
|
movl %ebx, %cr0
|
|
jmp *%eax
|
|
|
|
.code16
|
|
.GdtDescriptor:
|
|
/* Global Descriptor Table */
|
|
.quad 0x0000000000000000
|
|
.quad 0x00CF9A000000FFFF
|
|
.quad 0x00CF92000000FFFF
|
|
.quad 0x00009E000000FFFF
|
|
.quad 0x000092000000FFFF
|
|
|
|
.GdtPointer:
|
|
/* Pointer to Global Descriptor Table */
|
|
.word .GdtPointer - .GdtDescriptor - 1
|
|
.long .GdtDescriptor
|
|
|
|
.Stage2FileName:
|
|
/* Name of Stage 2 executable file */
|
|
.ascii "BOOTIA32EFI"
|