
$PJ,"Project: OSMain","/LT/OSMain/OS.SPZ"$
USE16
JMP U2 LOSETHOS_START2
////**************************PROCEDURE*************************
// ASM Global variables required for 16-bit start-up
ALIGN 4,OC_NOP
SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot
SYS_BOOT_HEADER_BASE:: DU4 ?;
SYS_OS_32START:: DU4 INIT_OS;
ALIGN 16,OC_NOP
SYS_GDTTAB:: DU1 MAXGDT*16 DUP(0);
SYS_BOOT_CODE:: DU4 0xFF;
SYS_MEMBLKS:: DU4 0;
SYS_GR_MODE:: DU2 0;
DU2 0; //pad
SYS_FREE_GDT_LIST:: DU4 0;
ALIGN 8,OC_NOP
SYS_ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0);
SYS_ADAM_HC:: DU1 HC_STRUCT_SIZE DUP(0);
SYS_TEMP_PTR:: DU4 0,0,0;
////**************************PROCEDURE*************************
//EBX is SYS_BOOT_CODE (value passed from boot blk)
LOSETHOS_START2::
MOV AX,(0xA0000-2<<BLK_SIZE_BITS)/16
MOV SS,AX
MOV SP,2<<BLK_SIZE_BITS
PUSH EBX //will be SYS_BOOT_CODE
MOV AX,0xB800
MOV ES,AX
MOV U4 ES:[0],'L'+0x1000+('T'+0x2000)<<16
MOV U4 ES:[4],0
MOV ECX,100000 //Delay
CALL BUSY_WAIT
CALL U2 GET_IP
GET_IP:
POP BX
SUB BX,GET_IP
SHR BX,4
MOV AX,CS
ADD AX,BX
PUSH AX
PUSH U2 LOSETHOS_START3
RETF
LOSETHOS_START3::
//XSUM OSMain
MOV AX,CS
DEC AX
MOV DS,AX
XOR ESI,ESI
MOV ECX,U4 8[ESI] //Get length
SHR ECX,4
MOV EBX,LT_XSUM
@@2: LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
LODSD
XOR EBX,EAX
XOR ESI,ESI
MOV AX,DS
INC AX
MOV DS,AX
LOOP @@2
//$FG,4$If you debug, use text video mem$FG$
MOV U4 ES:[4],'O'+65536*'K'+0xF000F000
OR EBX,EBX
JZ LOSETHOS_CONT_START
//XSUM Error
MOV U4 ES:[4],'X'+65536*'M'+0xF000F000
@@3: JMP @@3
BUSY_WAIT::
MOV DX,0x379 //Par Port
@@1: IN AL,DX
DEC ECX
JNZ @@1
RET
////**************************PROCEDURE*************************
LOSETHOS_CONT_START:
STI
MOV AX,CS
MOV DS,AX
//$FG,2$Enter Graphics Mode$FG$
#exe {
I8 new_gr_mode=0x12; //640x480x4
// new_gr_mode=PmtI8("BIOS Graphic Mode (0x%0X):",0x12);
ExePrintF("MOV BX,%d\r\n",new_gr_mode);
};
MOV U2 [SYS_GR_MODE],BX
MOV AX,0x4F02
INT 0x10 //ENABLE VGA
CMP AX,0x004F
JE @@10
MOV U2 [SYS_GR_MODE],0 //text_mode
//Get mem map
@@10: MOV AX,0xE801
INT 0x15
ADD DX,0x100
MOV U2 [SYS_MEMBLKS],0
MOV U2 [SYS_MEMBLKS+2],DX
CLI
//Enable A20
IN AL,0x92
OR AL,2
OUT 0x92,AL
CLD //Start with known registers
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 U4 [SYS_BOOT_BASE],EAX
POP U4 [SYS_BOOT_CODE]
MOV BX,CS
DEC BX
MOV GS,BX
MOV EBX,U4 GS:[4]
ADD EAX,EBX
SUB EAX,16
MOV U4 [SYS_BOOT_HEADER_BASE],EAX
MOV U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF
MOV U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00
MOV EAX,U4 [SYS_BOOT_BASE]
ADD U4 [SYS_GDTTAB+SYS_BOOT_DS_SEL+2],EAX
ADD U4 [SYS_GDTTAB+SYS_BOOT_CS_SEL+2],EAX
// SETUP PTR TO LIMIT
AND BASE
//OF GDT. USE ENTRY
(0) BECAUSE IT IS
//INVALID.
MOV U2 [SYS_TEMP_PTR],MAXGDT*16-1
MOV EAX,U4 [SYS_BOOT_BASE]
ADD EAX,SYS_GDTTAB+NULL_SEL
MOV U4 [SYS_TEMP_PTR+2],EAX
MOV U2 [SYS_TEMP_PTR+6],0
LGDT U4 [SYS_TEMP_PTR]
MOV EAX,SYS_START_CR0
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0x66,0xEA; //JMP SYS_CS_SEL:INIT_OS
DU4 INIT_OS;
DU2 SYS_BOOT_CS_SEL;
////**************************PROCEDURE*************************
// ASM Global variables not required for 16-bit start-up
ALIGN 8,OC_NOP
SYS_IDTTAB:: DU1 MAX_INITIAL_IDT*16 DUP(0);
SYS_HEAP_BASE:: DU8 0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4);
SYS_HEAP_LIMIT:: DU8 0;
//$FG,2$For debugging: Set flag to 1 and mem will be$FG$
//$FG,2$initialized to a value at boot.$FG$
SYS_MEM_INIT_FLAG:: DU1 0;
SYS_MEM_INIT_VAL:: DU1 0x88;
//$FG,2$For debugging: Set flag to 1 and mem will be$FG$
//$FG,2$initialized every MAlloc.$FG$
SYS_HEAP_INIT_FLAG:: DU1 0;
SYS_HEAP_INIT_VAL:: DU1 0x89;
//$FG,2$For debugging: Set flag to 1 and local variables will be$FG$
//$FG,2$initialized every function call.$FG$
SYS_VAR_INIT_FLAG:: DU1 0;
SYS_VAR_INIT_VAL:: DU1 0x8A;
SYS_INIT_FLOAT_CTRL_WORD: DU2 0x37F;
SYS_FLAGS:: DU8 0;
SYS_CUR_SCAN_CODE:: DU8 0;
SYS_EXTERN_TABLE:: DU8 0;
SYS_BP_SIZE:: DU8 0;
SYS_BP_FLAGS:: DU8 0;
SYS_BP_MEM_FREE_LIST:: DU8 0;
SYS_BP_MEM_FREE_2MEG_LIST:: DU8 0;
SYS_BP_FREE_PAGE_HASH:: DU8 FREE_PAGE_HASH_SIZE DUP(0);
SYS_BP_FREE_PAGE_HASH2:: DU8 64 DUP(0);
SYS_CODE_BP:: DU8 0;
SYS_DATA_BP:: DU8 0;
SYS_PROGRESS_VALS::
SYS_PROGRESS1:: DU8 0;
SYS_PROGRESS2:: DU8 0;
SYS_PROGRESS3:: DU8 0;
SYS_PROGRESS4:: DU8 0;
SYS_PROGRESS_MAXES::
SYS_PROGRESS1_MAX:: DU8 0;
SYS_PROGRESS2_MAX:: DU8 0;
SYS_PROGRESS3_MAX:: DU8 0;
SYS_PROGRESS4_MAX:: DU8 0;
SYS_PROGRESS_DESCS::
SYS_PROGRESS1_DESC:: DU8 0;
SYS_PROGRESS2_DESC:: DU8 0;
SYS_PROGRESS3_DESC:: DU8 0;
SYS_PROGRESS4_DESC:: DU8 0;
SYS_CUR_FOCUS_TASK:: DU8 0;
SYS_TASK_BEING_SCREEN_UPDATED:: DU8 0;
SYS_TIMER:: DU8 1;
SYS_JIFFIES:: DU8 1;
SYS_CPU_CACHED:: DU8 0;
SYS_CPU_UNCACHED:: DU8 0;
SYS_MP_CNT:: DU8 1;
SYS_MP_CNT_LOCK:: DU8 0;
SYS_TEMP_CPU0_STRUCT:: DU1 CPU_CACHED_SIZE DUP (0);
ALIGN CPU_CACHE_LINE_WIDTH,OC_NOP
//Align to cache-line boundary,
// compensating for 16 byte segment header
DU1 CPU_CACHE_LINE_WIDTH-16 DUP(0);
SYS_SEMA_IRQS:: DU1 NUM_IRQ_SEMAS*SEMA_STRUCT_SIZE DUP(0);
SYS_SEMAS:: DU1 NUM_SYS_SEMAS*SEMA_STRUCT_SIZE DUP(0);
////**************************PROCEDURE*************************
ALIGN 16,OC_NOP
USE32
INIT_OS::
PUSH U4 SYS_START_RFLAGS
POPFD
MOV EAX,SYS_START_CR0
// MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
MOV AL,0xFF
OUT 0x21,AL //mask interrupts
OUT 0xA1,AL
MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR
MOV DS,AX
MOV ES,AX
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+ZERO_DS_SEL+4] ,0x00CF9200
MOV U4 [SYS_GDTTAB+SYS_CS_SEL] ,0x0000FFFF
MOV U4 [SYS_GDTTAB+SYS_CS_SEL+4] ,0x00CF9A00
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL] ,0x00000000
MOV U4 [SYS_GDTTAB+SYS_CS64_SEL+4] ,0x00209A00
//INIT FREE GDT ENTRIES
MOV U4 [SYS_FREE_GDT_LIST],0
MOV ECX,MAXGDT-FIRST_FREE_SEL/16
MOV EAX,FIRST_FREE_SEL
@@3: MOV EBX,U4 [SYS_FREE_GDT_LIST]
MOV U4 SYS_GDTTAB[EAX],EBX
MOV U4 [SYS_FREE_GDT_LIST],EAX
ADD EAX,16
LOOP @@3
//Patch absolute addresses
MOV ESI,U4 [SYS_BOOT_HEADER_BASE]
MOV EDI,U4 [SYS_BOOT_BASE]
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV ECX,U4 1[ESI]
LEA ESI,U4 1+4+1[ESI]
@@10: LODSD
ADD EAX,EDI
ADD U4 [EAX],EDI
LOOP @@10
MOV AX,ZERO_DS_SEL
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV ESP,0xA0000 //Temp Stack
DU1 0xEA; //JMP SYS_CS_SEL:CONT_INIT_OS
DU4 CONT_INIT_OS;
DU2 SYS_CS_SEL;
CONT_INIT_OS::
XOR EAX,EAX
MOV U4 [SYS_FLAGS],EAX
MOV U4 [SYS_FLAGS+4],EAX
MOV EDI,U4 SYS_SEMAS
MOV ECX,NUM_SYS_SEMAS*SEMA_STRUCT_SIZE/4
REP_STOSD
MOV U4 [SYS_HEAP_BASE],0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4)
CALL INIT_MEM
PUSH U4 0
CALL INIT_EM64T
USE64
//INIT CPU0 STRUCT
PUSH U4 MAX_INITIAL_IDT
PUSH U4 SYS_IDTTAB
CALL CP_INIT_IDT
ADD RSP,16
PUSH U4 SYS_TEMP_CPU0_STRUCT
PUSH 0
CALL CP_INIT_CPU_CACHED_STRUCT
ADD RSP,16
PUSH EAX
CALL CP_SET_GS_BASE
ADD RSP,8
//INIT ADAM TSS
MOV RDI,U4 SYS_ADAM_TSS
MOV RCX,TSS_STRUCT_SIZE
XOR EAX,EAX
REP_STOSB
//INIT ADAM HC
MOV RDI,U4 SYS_ADAM_HC
MOV RCX,HC_STRUCT_SIZE
XOR EAX,EAX
REP_STOSB
MOV RDI,U4 SYS_ADAM_HC
MOV RAX,U4 SYS_BP_SIZE
MOV HC_BP[RDI],RAX
LEA RAX,U8 HC_NEXT_UM-UM_NEXT[RDI]
MOV U8 HC_NEXT_UM[RDI],RAX
MOV U8 HC_LAST_UM[RDI],RAX
MOV RAX,U4 SYS_ADAM_TSS
MOV U8 HC_MEM_TSS[RDI],RAX
MOV U8 TSS_CODE_HEAP[RAX],RDI
MOV U8 TSS_DATA_HEAP[RAX],RDI
PUSH DEFAULT_STACK
PUSH U4 SYS_ADAM_TSS
CALL CP_INIT_TSS
ADD RSP,16
CALL SET_FS_BASE
MOV RSP,U8 TSS_RSP[RAX]
FLDCW U2 [SYS_INIT_FLOAT_CTRL_WORD]
MOV RAX,U4 FC_INITIAL_FPU
FSAVE U4 [RAX]
JMP I4 CP_OS_MAIN
//Continues $LK,"CP_OS_MAIN","FF:::/LT/OSMain/OSEnd.CPZ,CP_OS_MAIN"$
////**************************PROCEDURE*************************
USE32
INIT_EM64T:
//MOV EAX,CR4
DU1 0x0F,0x20,0xE0;
OR EAX,0xB0
//MOV CR4,EAX
DU1 0x0F,0x22,0xE0;
MOV EAX,0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3)
//MOV CR3,EAX
DU1 0x0F,0x22,0xD8;
MOV ECX,IA32_EFER
XOR EDX,EDX
MOV EAX,IA32F_LME
WRMSR
//MOV EAX,CR0
DU1 0x0F,0x20,0xC0;
OR EAX,0x80000000 //enable paging
//MOV CR0,EAX
DU1 0x0F,0x22,0xC0;
DU1 0xEA; //JMP SYS_CS64_SEL:EM64T_PART3
DU4 EM64T_PART3;
DU2 SYS_CS64_SEL;
USE64
EM64T_PART3:
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
FC_INITIAL_FPU:: DU1 112 DUP(0);
////**************************PROCEDURE*************************
SYS_SHUTDOWN_CPU::
XOR EDI,EDI
MOV EDI,U4 SYS_BOOT_BASE
MOV EDI,U4 [RDI]
XOR ESI,ESI
MOV ESI,U4 SYS_OS_32START
MOV ESI,U4 [RSI]
ADD ESI,EDI
HALT_CPU::
PUSH U4 ZERO_DS_SEL
PUSH U4 0x9C000
PUSH U4 0
PUSH U4 SYS_CS_SEL
CALL @@2
@@2: POP EAX
ADD RAX,@@3-@@2
PUSH EAX
IRET
USE32
@@3:
//disable paging
DU1 0x0F,0x20,0xC0;//MOV EAX,CR0
BTR EAX,31
DU1 0x0F,0x22,0xC0;//MOV CR0,EAX
MOV ECX,IA32_EFER
XOR EDX,EDX
XOR EAX,EAX
WRMSR
MOV EBX,BOOT_CODE_RAM
OR ESI,ESI
JZ @@1
JMP ESI
@@1: HLT
USE64
SYS_SHUTDOWN_CPU_END::
Operating System Start-Up