458 lines
8.8 KiB
Plaintext
458 lines
8.8 KiB
Plaintext
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_FREE_GDT_LIST:: DU4 0;
|
|
ALIGN 8,OC_NOP
|
|
SYS_ADAM_TSS:: DU1 TSS_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 memory$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,0x4F00
|
|
INT 0x10 //GET MODES
|
|
PUSH DS
|
|
PUSH ES
|
|
MOV CX,0x100
|
|
MOV SI,DI
|
|
XOR DI,DI
|
|
MOV AX,ES
|
|
MOV DS,AX
|
|
MOV AX,0x8000
|
|
MOV ES,AX
|
|
REP_MOVSB
|
|
POP ES
|
|
POP DS
|
|
***********/
|
|
|
|
//Enter Graphics Mode
|
|
MOV BX,0x12
|
|
MOV AX,0x4F02
|
|
INT 0x10 //ENABLE VGA
|
|
|
|
//Get memory map
|
|
MOV AX,0xE801
|
|
INT 0x15
|
|
MOV AX,CS
|
|
MOV DS,AX
|
|
ADD DX,0x101
|
|
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 POINTER 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 MAXIDT*16 DUP(0);
|
|
SYS_HEAP_BASE:: DU8 0x100000+0x1000*(NUM_PML1+NUM_PML2+NUM_PML3+NUM_PML4);
|
|
SYS_HEAP_LIMIT:: DU8 0;
|
|
|
|
SYS_FLAGS:: DU8 0;
|
|
SYS_TEXTBASE:: DU8 0;
|
|
|
|
SYS_CUR_SCAN_CODE:: DU8 0;
|
|
SYS_EXTERN_TABLE:: DU8 0;
|
|
|
|
SYS_MEM_FREE_LIST:: DU8 0;
|
|
SYS_MEM_FREE_2MEG_LIST:: DU8 0;
|
|
SYS_FREE_PAGE_HASH:: DU8 FREE_PAGE_HASH_SIZE DUP(0);
|
|
SYS_FREE_PAGE_HASH2:: DU8 64 DUP(0);
|
|
SYS_PROGRESS1:: DU8 0;
|
|
SYS_PROGRESS2:: DU8 0;
|
|
SYS_PROGRESS3:: DU8 0;
|
|
SYS_PROGRESS4:: DU8 0;
|
|
SYS_CUR_FOCUS_TASK:: DU8 0;
|
|
SYS_TIMER:: DU8 1;
|
|
SYS_JIFFIES:: DU8 1;
|
|
SYS_MP_CPU_STRUCTS:: DU8 0;
|
|
SYS_MP_CNT:: DU8 1;
|
|
SYS_UNCACHED_MP_CNT:: DU8 0;
|
|
SYS_TEMP_CPU0_STRUCT:: DU1 CPU_STRUCT_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_SEMA_IRQ_BUSY:: 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,0x800000 //Temp
|
|
|
|
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 INTERRUPT TABLE
|
|
MOV RCX,MAXIDT
|
|
MOV RDI,U4 SYS_IDTTAB
|
|
MOV RSI,U4 IRQ_VECTORS
|
|
@@1: MOVSW
|
|
MOV AX,SYS_CS64_SEL
|
|
STOSW
|
|
MOV AX,0x8E00 //E=32-bit irq gate
|
|
STOSW
|
|
MOVSW
|
|
XOR EAX,EAX
|
|
STOSQ
|
|
LOOP @@1
|
|
|
|
MOV RAX,U4 SYS_TEMP_PTR
|
|
MOV U2 [RAX],MAXIDT*16-1
|
|
MOV U4 2[RAX],SYS_IDTTAB
|
|
MOV U2 6[RAX],0
|
|
MOV U4 8[RAX],0
|
|
REX
|
|
LIDT U4 [RAX]
|
|
|
|
|
|
//INIT CPU0 STRUCT
|
|
PUSH U4 SYS_TEMP_CPU0_STRUCT
|
|
PUSH 0
|
|
CALL CP_INIT_CPU_STRUCT
|
|
ADD RSP,16
|
|
PUSH RAX
|
|
CALL CP_PUT_GS_BASE
|
|
ADD RSP,8
|
|
|
|
//INIT ADAM TSS
|
|
MOV RDI,U4 SYS_ADAM_TSS
|
|
MOV RCX,TSS_STRUCT_SIZE
|
|
XOR EAX,EAX
|
|
REP_STOSB
|
|
|
|
PUSH DEFAULT_STACK
|
|
PUSH U4 SYS_ADAM_TSS
|
|
CALL CP_INIT_TSS
|
|
ADD RSP,16
|
|
CALL PUT_FS_BASE
|
|
MOV RSP,U8 TSS_RSP[RAX]
|
|
|
|
CALL INIT_FLOATING_CONSTS
|
|
|
|
JMP U4 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*************************
|
|
INIT_FLOATING_CONSTS::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,8
|
|
FLD1
|
|
MOV RAX,U4 FC_1
|
|
FSTP U8[RAX]
|
|
FLDPI
|
|
MOV RAX,U4 FC_PI
|
|
FSTP U8[RAX]
|
|
FLDPI
|
|
FLDPI
|
|
FADDP
|
|
MOV RAX,U4 FC_PI2
|
|
FSTP U8[RAX]
|
|
FLDL2T
|
|
MOV RAX,U4 FC_LOG2_10
|
|
FSTP U8[RAX]
|
|
FLDL2E
|
|
MOV RAX,U4 FC_LOG2_E
|
|
FSTP U8[RAX]
|
|
FLDLG2
|
|
MOV RAX,U4 FC_LOG10_2
|
|
FSTP U8[RAX]
|
|
FLDLN2
|
|
MOV RAX,U4 FC_LOGE_2
|
|
FSTP U8[RAX]
|
|
|
|
FLD1
|
|
FSTP U8 -8[RBP]
|
|
CALL CP_EXP
|
|
MOV RBX,U4 FC_E
|
|
MOV U8 [RBX],RAX
|
|
|
|
ADD RSP,8
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
FC_1:: DU8 0;
|
|
FC_PI:: DU8 0;
|
|
FC_PI2:: DU8 0;
|
|
FC_E:: DU8 0;
|
|
FC_LOG2_10:: DU8 0;
|
|
FC_LOG2_E:: DU8 0;
|
|
FC_LOG10_2:: DU8 0;
|
|
FC_LOGE_2:: DU8 0;
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
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 RAX
|
|
ADD RAX,10 //@@3-@@2
|
|
PUSH RAX
|
|
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::
|