$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
Home

Kernel
StartUp
Scheduler
Memory
MultiCore
Interrupts
BitMaps
Screen
Plot
Compiler Frontend
Compiler Mid
Compiler Backend
Historical capture: 2008-10-15. Home | Power on LoseThos | Sources and changes