TempleOSCD_150216.ISO
This commit is contained in:
1 parent
64f679eeb9
commit
401601816c
531 files changed
+23341
-22071
No files matched your search
+74
-115
@@ -6,7 +6,7 @@ It continues here: $LK,"Kernel",A="FF:::/Kernel/KEnd.CPP,U0 Kernel"$.
|
||||
|
||||
The boot loader jumps here, in real-mode (16-bit).
|
||||
It actually jumps to the $LK,"CBinFile",A="MN:CBinFile"$ which is placed
|
||||
just before this $LK,"generated by the compiler",A="FF:::/Compiler/CmpMain.CPP,16 ALIGN"$.
|
||||
just before this $LK,"generated by the compiler",A="FF:::/Compiler/CMain.CPP,16 ALIGN"$.
|
||||
The header begins with a short jmp to
|
||||
the start of this file's code which begins
|
||||
with the following small jump past some data.
|
||||
@@ -15,28 +15,28 @@ This file is first in the Kernel image
|
||||
because it is #included first. $LK,"Kernel.PRJ",A="FF:::/Kernel/Kernel.PRJ,KStart:1"$
|
||||
*/
|
||||
USE16
|
||||
SYS_KERNEL_START1:: //This must match $LK,"CKernel",A="MN:CKernel"$.
|
||||
JMP U16 SYS_KERNEL_START2
|
||||
SYS_KERNEL:: //This must match $LK,"CKernel",A="MN:CKernel"$.
|
||||
JMP U16 BSP_16BIT_INIT
|
||||
|
||||
//************************************
|
||||
// ASM Global vars required for 16-bit start-up
|
||||
ALIGN 4,OC_NOP
|
||||
SYS_BOOT_BASE:: DU32 0; //Fixed offset from start used by reboot
|
||||
SYS_BOOT_SRC:: DU32 BOOT_SRC_NULL;
|
||||
SYS_BOOT_PATCH_TABLE_BASE:: DU32 0;
|
||||
SYS_RUN_LEVEL:: DU32 0;
|
||||
#exe {StreamPrint("SYS_COMPILE_TIME:: DU64 0x%X;",Now);}
|
||||
//See $LK,"BootCdProbe",A="MN:BootCdProbe"$
|
||||
#assert SYS_COMPILE_TIME+8+sizeof(CBinFile)<CD_BLK_SIZE
|
||||
#assert SYS_COMPILE_TIME+sizeof(CDate)+sizeof(CBinFile)<CD_BLK_SIZE
|
||||
|
||||
SYS_OS_32START:: DU32 SYS_INIT_OS;
|
||||
SYS_BOOT_CODE:: DU32 0xFF;
|
||||
SYS_BOOT_BASE:: DU32 0; //Offset from start used by reboot
|
||||
SYS_MEM_E801:: DU16 0,0;
|
||||
SYS_MEM_E820:: DU8 MEM_NUM_E820_ENTRIES*MEM_E820_ENTRY_SIZE DUP (0);
|
||||
|
||||
ALIGN 16,OC_NOP
|
||||
SYS_GDT:: //See $LK,"CGDT",A="MN:CGDT"$
|
||||
GDT_NULL: DU64 0,0;
|
||||
GDT_BOOT_DS: DU64 0,0; //Gets filled-in
|
||||
GDT_BOOT_CS: DU64 0,0; //Gets filled-in
|
||||
GDT_BOOT_DS: DU64 0x00CF92000000FFFF,0; //Gets patched.
|
||||
GDT_BOOT_CS: DU64 0x00CF9A000000FFFF,0; //Gets patched.
|
||||
GDT_CS32: DU64 0x00CF9A000000FFFF,0;
|
||||
GDT_CS64: DU64 0x00209A0000000000,0; //The $LK,"Charter",A="FI:::/Doc/Charter.TXT"$ says just ring0.
|
||||
GDT_CS64_RING3: DU64 0x0020FA0000000000,0; //$LK,"Ring3",A="FI:::/Demo/Lectures/Ring3.CPP"$, in case you want to play around.
|
||||
@@ -46,21 +46,19 @@ GDT_TR: DU8 MP_MAX_PROCESSORS*16 DUP(0);
|
||||
GDT_TR_RING3: DU8 MP_MAX_PROCESSORS*16 DUP(0);
|
||||
#assert $$-SYS_GDT==sizeof(CGDT)
|
||||
|
||||
SYS_BIOS_GR_MODE:: DU16 0;
|
||||
SYS_PCI_BUSSES:: DU16 0;
|
||||
#assert $$-SYS_KERNEL_START1==sizeof(CKernel)-sizeof(CBinFile)
|
||||
|
||||
SYS_RUN_LEVEL:: DU32 0;
|
||||
SYS_TEMP_PTR:: DU16 0;
|
||||
SYS_GDT_PTR:: DU16 sizeof(CGDT)-1;
|
||||
DU64 0;
|
||||
SYS_PCI_BUSSES:: DU16 0;
|
||||
#assert $$-SYS_KERNEL==sizeof(CKernel)-sizeof(CBinFile)
|
||||
|
||||
//************************************
|
||||
SYS_KERNEL_START2::
|
||||
//EBX is SYS_BOOT_CODE (val passed from boot blk)
|
||||
BSP_16BIT_INIT::
|
||||
//EBX is $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. (Val passed from boot blk, $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$, & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.)
|
||||
MOV AX,(BOOT_RAM_LIMIT-BOOT_STK_SIZE)/16
|
||||
MOV SS,AX
|
||||
MOV SP,BOOT_STK_SIZE
|
||||
PUSH EBX //will be SYS_BOOT_CODE
|
||||
MOV AX,VGA_TEXT_MEM_BASE/16
|
||||
PUSH EBX //Will be $LK,"SYS_BOOT_SRC",A="FF:::/Kernel/KStart.CPP,[SYS_BOOT_SRC]"$. See $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$ & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.
|
||||
MOV AX,VGAM_TEXT/16
|
||||
MOV ES,AX
|
||||
MOV U32 ES:[0],'O'+BLUE<<12+('S'+GREEN<<12)<<16
|
||||
|
||||
@@ -71,26 +69,24 @@ GET_IP: POP BX
|
||||
MOV AX,CS
|
||||
ADD AX,BX
|
||||
PUSH AX
|
||||
PUSH U16 TEMPLEOS_CONT_START
|
||||
PUSH U16 @@05
|
||||
RETF
|
||||
|
||||
TEMPLEOS_CONT_START:
|
||||
STI
|
||||
@@05: STI
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
|
||||
MOV U32 [SYS_RUN_LEVEL],RLF_16BIT
|
||||
|
||||
MOV BX,0x12 //640x480 16 color
|
||||
MOV U16 [SYS_BIOS_GR_MODE],BX
|
||||
MOV AX,0x4F02
|
||||
MOV BX,0x12 //640x480 16 color
|
||||
#exe {
|
||||
if (!kernel_cfg->opts[CFG_TEXT_MODE])
|
||||
StreamPrint("INT 0x10"); //Enable VGA
|
||||
};
|
||||
CMP AX,0x004F
|
||||
JE @@10
|
||||
MOV U16 [SYS_BIOS_GR_MODE],0 //failed
|
||||
JNE @@10 //Jmp if fail
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_VGA
|
||||
@@10:
|
||||
|
||||
//Get mem maps
|
||||
@@ -138,52 +134,33 @@ TEMPLEOS_CONT_START:
|
||||
OR AL,2
|
||||
OUT 0x92,AL
|
||||
|
||||
CLD //Start with known regs
|
||||
POP U32 [SYS_BOOT_SRC] //See $LK,"BootHD",A="FF:::/Adam/Boot/BootHD.CPP,BOOT_SRC_HARDDRV"$, $LK,"BootCD",A="FF:::/Adam/Boot/BootCD.CPP,BOOT_SRC_CDROM"$, & $LK,"BootRAM",A="FF:::/Adam/Boot/Boot.CPP,BOOT_SRC_RAM"$.
|
||||
|
||||
CLD
|
||||
XOR EAX,EAX
|
||||
MOV AX,CS
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
XOR EAX,EAX
|
||||
XOR EBX,EBX
|
||||
XOR ECX,ECX
|
||||
XOR EDX,EDX
|
||||
XOR ESI,ESI
|
||||
XOR EDI,EDI
|
||||
XOR EBP,EBP
|
||||
|
||||
XOR EAX,EAX
|
||||
MOV AX,CS
|
||||
SHL EAX,4
|
||||
|
||||
MOV U32 [SYS_BOOT_BASE],EAX
|
||||
|
||||
POP U32 [SYS_BOOT_CODE]
|
||||
|
||||
MOV BX,CS
|
||||
SUB BX,sizeof(CBinFile)/16
|
||||
MOV DX,CS
|
||||
SUB DX,sizeof(CBinFile)/16
|
||||
#assert !(sizeof(CBinFile)&15)
|
||||
MOV GS,BX
|
||||
MOV EBX,U32 GS:[CBinFile.patch_table_offset]
|
||||
ADD EAX,EBX
|
||||
SUB EAX,sizeof(CBinFile)
|
||||
MOV U32 [SYS_BOOT_PATCH_TABLE_BASE],EAX
|
||||
MOV GS,DX
|
||||
|
||||
MOV EDX,EAX
|
||||
ADD EDX,U32 GS:[CBinFile.patch_table_offset]
|
||||
SUB EDX,sizeof(CBinFile)
|
||||
MOV U32 [SYS_BOOT_PATCH_TABLE_BASE],EDX
|
||||
|
||||
MOV U32 [GDT_BOOT_DS],0x0000FFFF
|
||||
MOV U32 [GDT_BOOT_DS+4],0x0CF9200
|
||||
MOV U32 [GDT_BOOT_CS],0x0000FFFF
|
||||
MOV U32 [GDT_BOOT_CS+4],0x0CF9A00
|
||||
MOV EAX,U32 [SYS_BOOT_BASE]
|
||||
ADD U32 [GDT_BOOT_DS+2],EAX
|
||||
ADD U32 [GDT_BOOT_CS+2],EAX
|
||||
ADD EAX,I32 SYS_GDT
|
||||
MOV U32 [SYS_GDT_PTR+CSysLimitBase.base],EAX
|
||||
LGDT U32 [SYS_GDT_PTR]
|
||||
|
||||
//Set-up ptr to limit and base of GDT.
|
||||
MOV U16 [SYS_TEMP_PTR],sizeof(CGDT)-1
|
||||
MOV EAX,U32 [SYS_BOOT_BASE]
|
||||
ADD EAX,SYS_GDT
|
||||
MOV U32 [SYS_TEMP_PTR+2],EAX
|
||||
MOV U16 [SYS_TEMP_PTR+6],0
|
||||
|
||||
LGDT U32 [SYS_TEMP_PTR]
|
||||
MOV EAX,SYS_START_CR0
|
||||
MOV_CR0_EAX
|
||||
|
||||
@@ -195,8 +172,8 @@ The assembler doesn't support far jumps so we hand code it.
|
||||
To complete the switch to 32-bit mode, we have to load
|
||||
the code segment with a far jump.
|
||||
*/
|
||||
DU8 0x66,0xEA; //JMP CGDT.boot_cs:SYS_INIT_OS
|
||||
DU32 SYS_INIT_OS;
|
||||
DU8 0x66,0xEA; //JMP CGDT.boot_cs:BSP_32BIT_INIT
|
||||
DU32 BSP_32BIT_INIT;
|
||||
DU16 CGDT.boot_cs;
|
||||
|
||||
#assert $$+16<=0xFFFF
|
||||
@@ -254,7 +231,7 @@ SYS_CACHE_LINE_WIDTH:: DU64 DFT_CACHE_LINE_WIDTH;
|
||||
SYS_SEMAS:: DU8 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
|
||||
//************************************
|
||||
ALIGN 16,OC_NOP
|
||||
SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
BSP_32BIT_INIT:: //Entry point for $LK,"RAMReboot",A="MN:RAMReboot"$.
|
||||
PUSH U32 SYS_START_RFLAGS
|
||||
POPFD
|
||||
MOV EAX,SYS_START_CR0
|
||||
@@ -262,26 +239,9 @@ SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
|
||||
MOV AX,CGDT.boot_ds //LOAD DS SELECTOR
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
|
||||
MOV EAX,U32 [SYS_RUN_LEVEL]
|
||||
AND EAX,RLF_16BIT
|
||||
OR EAX,RLF_32BIT
|
||||
MOV U32 [SYS_RUN_LEVEL],EAX
|
||||
|
||||
//Patch abs addresses
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_32BIT
|
||||
MOV ESI,U32 [SYS_BOOT_PATCH_TABLE_BASE]
|
||||
MOV EDI,U32 [SYS_BOOT_BASE]
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
|
||||
MOV ECX,U32 CPatchTableAbsAddr.abs_addres_cnt[ESI]
|
||||
LEA ESI,U32 CPatchTableAbsAddr.abs_addres[ESI]
|
||||
@@05: LODSD
|
||||
ADD EAX,EDI
|
||||
ADD U32 [EAX],EDI
|
||||
LOOP @@05
|
||||
|
||||
MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
@@ -291,13 +251,19 @@ SYS_INIT_OS:: //Entry point for RAM reboots.
|
||||
MOV SS,AX
|
||||
MOV ESP,BOOT_RAM_LIMIT //Temp Stk
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs32:SYS_CONT_INIT_OS
|
||||
DU32 SYS_CONT_INIT_OS;
|
||||
//Patch abs addresses
|
||||
MOV ECX,U32 CPatchTableAbsAddr.abs_addres_cnt[ESI]
|
||||
LEA ESI,U32 CPatchTableAbsAddr.abs_addres[ESI]
|
||||
@@05: LODSD
|
||||
ADD EAX,EDI
|
||||
ADD U32 [EAX],EDI
|
||||
LOOP @@05
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs32:@@10
|
||||
DU32 @@10;
|
||||
DU16 CGDT.cs32;
|
||||
|
||||
SYS_CONT_INIT_OS::
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_PATCHED
|
||||
@@10: BTS U32 [SYS_RUN_LEVEL],RLf_PATCHED
|
||||
|
||||
CALL SYS_FIND_BIOS32_SERVICE_DIR
|
||||
CALL SYS_FIND_PCI_SERVICES
|
||||
@@ -305,11 +271,9 @@ SYS_CONT_INIT_OS::
|
||||
MOV U32 [SYS_HEAP_BASE],SYS_FIXED_AREA+sizeof(CSysFixedArea)
|
||||
CALL SYS_INIT_MEM
|
||||
|
||||
PUSH U32 0
|
||||
CALL INIT_EM64T
|
||||
USE64
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_64BIT
|
||||
PUSH U32 0 //Return from next call will be 64-bit
|
||||
CALL SYS_EM64T
|
||||
USE64 BTS U32 [SYS_RUN_LEVEL],RLf_64BIT
|
||||
|
||||
FNINIT
|
||||
MOV RAX,SYS_FIXED_AREA+CSysFixedArea.init_fpu_mmx
|
||||
@@ -322,14 +286,13 @@ USE64
|
||||
CALL &CPUStructInit
|
||||
CALL SET_GS_BASE
|
||||
|
||||
//Init Adam heap ctrl
|
||||
//Init Adam HeapCtrl
|
||||
MOV EDI,U32 SYS_FIXED_AREA+CSysFixedArea.adam_hc
|
||||
MOV EAX,U32 SYS_FIXED_AREA+CSysFixedArea.adam_bp
|
||||
MOV U64 CHeapCtrl.bp[RDI],RAX
|
||||
MOV U32 CHeapCtrl.hc_signature[RDI],HEAP_CTRL_SIGNATURE_VAL
|
||||
|
||||
|
||||
LEA RAX,U64 CHeapCtrl.next_um-CMemUsedAllocated.next[RDI]
|
||||
LEA RAX,U64 CHeapCtrl.next_um-CMemUsed.next[RDI]
|
||||
MOV U64 CHeapCtrl.next_um[RDI],RAX
|
||||
MOV U64 CHeapCtrl.last_um[RDI],RAX
|
||||
|
||||
@@ -340,7 +303,6 @@ USE64
|
||||
MOV U32 CTask.task_signature[RAX],TASK_SIGNATURE_VAL
|
||||
MOV U32 CTask.task_in_que_signature[RAX],TASK_IN_QUE_SIGNATURE_VAL
|
||||
|
||||
LOCK
|
||||
BTS U32 [SYS_RUN_LEVEL],RLf_BOOT_HEAP
|
||||
|
||||
PUSH ADAM_STK
|
||||
@@ -353,7 +315,7 @@ USE64
|
||||
|
||||
//************************************
|
||||
USE32
|
||||
INIT_EM64T:
|
||||
SYS_EM64T:: //Switch to long 64-bit mode
|
||||
MOV_EAX_CR4
|
||||
OR EAX,0xB0
|
||||
MOV_CR4_EAX
|
||||
@@ -370,24 +332,20 @@ INIT_EM64T:
|
||||
BTS EAX,31 //enable paging (required for 64-bit mode)
|
||||
MOV_CR0_EAX
|
||||
|
||||
DU8 0xEA; //JMP CGDT.cs64:EM64T_PART3
|
||||
DU32 EM64T_PART3;
|
||||
DU8 0xEA; //JMP CGDT.cs64:@@05
|
||||
DU32 @@05;
|
||||
DU16 CGDT.cs64;
|
||||
|
||||
USE64
|
||||
EM64T_PART3:
|
||||
@@05: MOV AX,CGDT.ds
|
||||
MOV DS,AX
|
||||
MOV ES,AX
|
||||
MOV SS,AX
|
||||
MOV FS,AX
|
||||
MOV GS,AX
|
||||
RET
|
||||
|
||||
//************************************
|
||||
SYS_RESTART_KERNEL::
|
||||
XOR RDI,RDI
|
||||
MOV EDI,U32 SYS_BOOT_BASE
|
||||
MOV EDI,U32 [RDI]
|
||||
XOR RSI,RSI
|
||||
MOV ESI,U32 SYS_OS_32START
|
||||
MOV ESI,U32 [RSI]
|
||||
ADD ESI,EDI
|
||||
|
||||
SYS_RAM_REBOOT:: //This gets copied high. $LK,"SYS_RAM_REBOOT",A="FF:::/Adam/Boot/Boot.CPP,SYS_RAM_REBOOT:2"$
|
||||
PUSH U32 CGDT.ds //stk seg
|
||||
PUSH U32 BOOT_RAM_LIMIT //stk
|
||||
PUSH U32 0 //flags
|
||||
@@ -396,8 +354,8 @@ SYS_RESTART_KERNEL::
|
||||
PUSH RAX
|
||||
IRET
|
||||
USE32
|
||||
@@10:
|
||||
WBINVD
|
||||
@@10: WBINVD
|
||||
|
||||
//disable paging
|
||||
MOV_EAX_CR0
|
||||
BTR EAX,31
|
||||
@@ -408,8 +366,9 @@ USE32
|
||||
XOR EAX,EAX
|
||||
WRMSR
|
||||
|
||||
MOV EBX,BOOT_CODE_RAM
|
||||
JMP ESI
|
||||
MOV EBX,BOOT_SRC_RAM
|
||||
MOV EAX,I32 BSP_32BIT_INIT
|
||||
JMP EAX
|
||||
USE64
|
||||
SYS_RESTART_KERNEL_END::
|
||||
SYS_RAM_REBOOT_END::
|
||||
}
|
||||
Reference in new issue
Block a user