LTCD_070816.ISO
This commit is contained in:
1 parent
d14bbc24f9
commit
0e9364ff4c
506 files changed
+157705
-41812
No files matched your search
@@ -0,0 +1,457 @@
|
||||
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::
|
||||
Reference in new issue
Block a user