ZealOS/src/Kernel/KStart32.ZC

131 lines
3.3 KiB
HolyC
Executable File

asm {
USE32
//************************************
// ASM Global variables not required for 16-bit start-up
ALIGN 8, OC_NOP
MEM_HEAP_BASE:: DU64 0;
MEM_HEAP_LIMIT:: DU64 0;
MEM_PAGE_SIZE:: DU64 0;
MEM_MAPPED_SPACE:: DU64 0;
MEM_2MEG_NUM:: DU64 0;
MEM_1GIG_NUM:: DU64 0;
MEM_512GIG_NUM:: DU64 0;
MEM_PML2:: DU64 0;
MEM_PML3:: DU64 0;
MEM_PML4:: DU64 0;
#exe {
StreamPrint("SYS_MEM_INIT_FLAG:: DU8 %d;"
"SYS_MEM_INIT_VAL:: DU8 %d;"
"SYS_HEAP_INIT_FLAG:: DU8 %d;"
"SYS_HEAP_INIT_VAL:: DU8 %d;"
"SYS_VAR_INIT_FLAG:: DU8 %d;"
"SYS_VAR_INIT_VAL:: DU8 %d;",
kernel_config->opts[CONFIG_MEM_INIT],
kernel_config->mem_init_val,
kernel_config->opts[CONFIG_HEAP_INIT],
kernel_config->heap_init_val,
kernel_config->opts[CONFIG_VAR_INIT],
kernel_config->var_init_val);
};
SYS_HEAP_DEBUG_FLAG:: DU8 _CONFIG_HEAP_DEBUG;
ALIGN 8, 0
SYS_CTRL_ALT_FLAGS:: DU64 0;
SYS_EXTERN_TABLE:: DU64 0;
SYS_CODE_BP:: DU64 0;
SYS_DATA_BP:: DU64 0;
SYS_PROGRESSES::
SYS_PROGRESS1:: DU64 0;
SYS_PROGRESS1_MAX:: DU64 0;
SYS_PROGRESS1_T0:: DU64 0;
SYS_PROGRESS1_TF:: DU64 0;
SYS_PROGRESS1_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS2:: DU64 0;
SYS_PROGRESS2_MAX:: DU64 0;
SYS_PROGRESS2_T0:: DU64 0;
SYS_PROGRESS2_TF:: DU64 0;
SYS_PROGRESS2_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS3:: DU64 0;
SYS_PROGRESS3_MAX:: DU64 0;
SYS_PROGRESS3_T0:: DU64 0;
SYS_PROGRESS3_TF:: DU64 0;
SYS_PROGRESS3_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
SYS_PROGRESS4:: DU64 0;
SYS_PROGRESS4_MAX:: DU64 0;
SYS_PROGRESS4_T0:: DU64 0;
SYS_PROGRESS4_TF:: DU64 0;
SYS_PROGRESS4_DESC:: DU8 PROGRESS_DESC_LEN DUP(0);
#assert $$ - SYS_PROGRESSES == sizeof(CProgress) * 4
SYS_FOCUS_TASK:: DU64 0;
SYS_CPU_STRUCTS:: DU64 0;
SYS_MP_COUNT:: DU64 1;
SYS_MP_COUNT_INITIAL:: DU64 1;
SYS_MP_COUNT_LOCK:: DU64 1;
ALIGN DEFAULT_CACHE_LINE_WIDTH, OC_NOP
SYS_CACHE_LINE_WIDTH:: DU64 DEFAULT_CACHE_LINE_WIDTH;
DU8 DEFAULT_CACHE_LINE_WIDTH - sizeof(CZXE) - 8 DUP(0);
SYS_SEMAS:: DU8 SEMA_SEMAS_NUM * DEFAULT_CACHE_LINE_WIDTH DUP(0);
//************************************
ALIGN 16, OC_NOP
CORE0_32BIT_INIT:: //Entry point for $LK,"BootRAM",A="MN:BootRAM"$.
PUSH U32 RFLAGG_START
POPFD
MOV EAX, SYS_START_CR0
MOV_CR0_EAX
MOV AX, CGDT.boot_ds //LOAD DS SELECTOR
MOV DS, AX
BTS U32 [SYS_RUN_LEVEL], RLf_32BIT
MOV ESI, U32 [SYS_BOOT_PATCH_TABLE_BASE]
MOV EDI, U32 [MEM_BOOT_BASE]
MOV AX, CGDT.ds
MOV DS, AX
MOV ES, AX
MOV FS, AX
MOV GS, AX
MOV SS, AX
MOV ESP, BOOT_RAM_LIMIT //Tmp Stack
JMP @@02
ALIGN 16, OC_NOP
// Signature to find CORE0_32BIT_INIT
DU64 0xaa23c08ed10bd4d7;
DU64 0xf6ceba7d4b74179a;
@@02:
//Patch abs addresses
MOV ECX, U32 CPatchTableAbsAddr.abs_address_count[ESI]
LEA ESI, U32 CPatchTableAbsAddr.abs_address[ESI]
@@05: LODSD
ADD EAX, EDI
ADD U32 [EAX], EDI
LOOP @@05
DU8 0xEA; //JMP CGDT.cs32:@@10
DU32 @@10;
DU16 CGDT.cs32;
@@10: BTS U32 [SYS_RUN_LEVEL], RLf_PATCHED
CALL SYS_FIND_PCIBIOS_SERVICE_DIR
CALL SYS_FIND_PCI_SERVICES
CALL SYS_INIT_PAGE_TABLES
CALL SYS_INIT_16MEG_SYS_CODE_BP
PUSH U32 0 //Return from next call will be 64-bit
CALL SYS_ENTER_LONG_MODE
//We fall-through to $LK,"KStart64",A="FL:::/Kernel/KStart64.ZC,1"$, next.
}