+++ /dev/null
-\r
-#include "core.h"\r
-\r
-#define PHYSICAL_MEMORY_ALLOCATION_START_ADDRESS 0x00400000\r
-#define SYSTEM_MEMORY_CONTROL_TAGS 1024\r
-//\r
-typedef union CPUID_FUNCTION_FLAGS {\r
- struct CPUID_FUNCTION_FLAGS_REG {\r
- uint edx;\r
- uint ecx;\r
- } reg;\r
- struct CPUID_FUNCTION_FLAGS_BITS {\r
- /*EAX=1,EDX*/\r
- unsigned FPU : 1;\r
- unsigned VME : 1;\r
- unsigned DE : 1;\r
- unsigned PSE : 1;\r
- unsigned TSC : 1;\r
- unsigned MSR : 1;\r
- unsigned PAE : 1;\r
- unsigned MCE : 1;\r
- unsigned CX8 : 1;\r
- unsigned APIC : 1;\r
- unsigned edx_bit10 : 1;\r
- unsigned SEP : 1;\r
- unsigned MTRR : 1;\r
- unsigned PGE : 1;\r
- unsigned MCA : 1;\r
- unsigned CMOV : 1;\r
- unsigned PAT : 1;\r
- unsigned PSE36 : 1;\r
- unsigned PSN : 1;\r
- unsigned CLFSH : 1;\r
- unsigned edx_bit20 : 1;\r
- unsigned DS : 1;\r
- unsigned ACPI : 1;\r
- unsigned MMX : 1;\r
- unsigned FXSR : 1;\r
- unsigned SSE : 1;\r
- unsigned SSE2 : 1;\r
- unsigned SS : 1;\r
- unsigned HTT : 1;\r
- unsigned TM : 1;\r
- unsigned edx_bit30 : 1;\r
- unsigned PBE : 1;\r
- /*EAX=1,ECX*/\r
- unsigned SSE3 : 1;\r
- unsigned ecx_bit1 : 1;\r
- unsigned ecx_bit2 : 1;\r
- unsigned MONITOR : 1;\r
- unsigned DSCPL : 1;\r
- unsigned ecx_bit5 : 1;\r
- unsigned ecx_bit6 : 1;\r
- unsigned EST : 1;\r
- unsigned TM2 : 1;\r
- unsigned ecx_bit9 : 1;\r
- unsigned CID : 1;\r
- unsigned ecx_bit11 : 1;\r
- unsigned ecx_bit12 : 1;\r
- unsigned CX16 : 1;\r
- unsigned XTPR : 1;\r
- unsigned ecx_bit15 : 1;\r
- unsigned ecx_bit16 : 1;\r
- unsigned ecx_bit17 : 1;\r
- unsigned ecx_bit18 : 1;\r
- unsigned ecx_bit19 : 1;\r
- unsigned ecx_bit20 : 1;\r
- unsigned ecx_bit21 : 1;\r
- unsigned ecx_bit22 : 1;\r
- unsigned ecx_bit23 : 1;\r
- unsigned ecx_bit24 : 1;\r
- unsigned ecx_bit25 : 1;\r
- unsigned ecx_bit26 : 1;\r
- unsigned ecx_bit27 : 1;\r
- unsigned ecx_bit28 : 1;\r
- unsigned ecx_bit29 : 1;\r
- unsigned ecx_bit30 : 1;\r
- unsigned ecx_bit31 : 1;\r
- } bit;\r
-} CPUID_FunctionFlags;\r
-\r
-typedef struct SYSTEM_COMMONDATA {\r
- uint RunningPhase;\r
- DATA_FIFO32 *InputFocus;\r
- struct SYSTEM_COMMONDATA_CONTROLLER {\r
- IO_MemoryControl Memory;\r
- UI_TaskControl *Task;\r
- IO_CallBIOSControl *CallBIOS;\r
- IO_DisplayControl *Display;\r
- } Controller;\r
- struct SYSTEM_COMMONDATA_ENVIRONMENT {\r
- struct SYSTEM_COMMONDATA_ENVIRONMENT_MEMORY {\r
- uint PhysicalSize;\r
- } Memory;\r
- struct SYSTEM_COMMONDATA_ENVIRONMENT_CPUID {\r
- uint max_id;\r
- uint max_eid;\r
- CPUID_FunctionFlags function_flags;\r
- } CPUID;\r
- } Environment;\r
- struct SYSTEM_COMMONDATA_CORETASK {\r
- UI_Task *Main;\r
- UI_Task *KeyboardControl;\r
- UI_Task *MouseControl;\r
- } CoreTask;\r
-} System_CommonData;\r
-//\r
-System_CommonData System;\r
-\r
-uchar *SystemRunningPhaseText[] = {\r
- " 0:Initialising System (Protected 32bit Text Mode)"\r
-};\r
-//\r
-void System_Check_Memory(void);\r
-uint System_CPUID(void *addr, uint id);\r
-\r
-void Initialize_System(void)\r
-{\r
- uint i;\r
- uchar s[128];\r
- uint cpuid_buf[4];\r
- CPU_EFlags eflags;\r
- CPU_ControlRegister4 cr4;\r
-\r
- IO_CLI();\r
-\r
- TextMode_Clear_Screen();\r
- Error_Set_Enable_Display_TextMode(True);\r
-\r
- TextMode_Put_String("Welcome to CHNOSProject!\n", green);\r
-\r
- System_Set_RunningPhase(0);\r
-\r
- TextMode_Put_String("\tInitialising SerialPort...\n", white);\r
- Initialize_SerialPort();\r
- Error_Set_Enable_SerialPort(True);\r
-\r
- #ifdef CHNOSPROJECT_DEBUG\r
- debug("%s:%d\n", __FILE__, __LINE__);\r
- debug("CHNOSProject is Running in Debug Mode.\n");\r
- #endif\r
-\r
-//Config Control Register4\r
- cr4.cr4 = Load_CR4();\r
- cr4.bit.DE = True;\r
- Store_CR4(cr4.cr4);\r
-\r
- TextMode_Put_String("\tInitialising Memory...\n", white);\r
- System_Check_Memory();\r
- i = System_Get_PhisycalMemorySize();\r
- snprintf(s, sizeof(s), "\tMemory:%uByte %uKiB %uMib\n", i, i >> 10, i >> 20);\r
- TextMode_Put_String(s, white);\r
- System.Controller.Memory = Memory_Initialize_Control((void *)PHYSICAL_MEMORY_ALLOCATION_START_ADDRESS, i - PHYSICAL_MEMORY_ALLOCATION_START_ADDRESS, SYSTEM_MEMORY_CONTROL_TAGS);\r
-\r
- i = Memory_Get_FreeSize(System.Controller.Memory);\r
- snprintf(s, sizeof(s), "\tFreeMemory:%uByte %uKiB %uMib\n", i, i >> 10, i >> 20);\r
- TextMode_Put_String(s, white);\r
-\r
- TextMode_Put_String("\tInitialising GDT...\n", white);\r
- Initialize_GlobalDescriptorTable();\r
-\r
- TextMode_Put_String("\tInitialising IDT...\n", white);\r
- Initialize_InterruptDescriptorTable();\r
-\r
- TextMode_Put_String("\tInitialising PIC...\n", white);\r
- Initialize_ProgrammableInterruptController();\r
-\r
- TextMode_Put_String("\tInitialising PIT...\n", white);\r
- Initialize_ProgrammableIntervalTimer();\r
-\r
- TextMode_Put_String("\tInitialising Keyboard...\n", white);\r
- Initialize_Keyboard();\r
-\r
- TextMode_Put_String("\tInitialising MultiTask...\n", white);\r
- System.Controller.Task = Initialize_MultiTask_Control(System.Controller.Memory);\r
- Timer_Set_TaskSwitch(&System_TaskSwitch);\r
- System.CoreTask.Main = System_MultiTask_GetNowTask();\r
- System.InputFocus = System.CoreTask.Main->fifo;\r
-\r
- TextMode_Put_String("\tInitialising CallBIOS...\n", white);\r
- System.Controller.CallBIOS = Initialize_CallBIOS();\r
-\r
- TextMode_Put_String("\tReading CPU Identification...\n", white);\r
- eflags.eflags = IO_Load_EFlags();\r
- eflags.bit.ID = True;\r
- IO_Store_EFlags(eflags.eflags);\r
- eflags.eflags = IO_Load_EFlags();\r
- if(!eflags.bit.ID){\r
- TextMode_Put_String("\t\tCPUID is Disabled.\n", white);\r
- System.Environment.CPUID.max_id = 0xffffffff;\r
- System.Environment.CPUID.max_eid = 0;\r
- } else{\r
- eflags.bit.ID = False;\r
- IO_Store_EFlags(eflags.eflags);\r
- eflags.eflags = IO_Load_EFlags();\r
- if(eflags.bit.ID){\r
- TextMode_Put_String("\t\tCPUID is Disabled.\n", white);\r
- System.Environment.CPUID.max_id = 0xffffffff;\r
- System.Environment.CPUID.max_eid = 0;\r
- }\r
- }\r
- if(System.Environment.CPUID.max_id != 0xffffffff){\r
- System.Environment.CPUID.max_id = 0;\r
- TextMode_Put_String("\t\tCPUID is Enabled.\n", white);\r
- CPUID(cpuid_buf, 0);\r
- System.Environment.CPUID.max_id = cpuid_buf[0];\r
- snprintf(s, sizeof(s), "\t\tMaxID =0x%X\n", System.Environment.CPUID.max_id);\r
- TextMode_Put_String(s, white);\r
- CPUID(cpuid_buf, 0x80000000);\r
- if((cpuid_buf[0] & 0x80000000) == 0){\r
- TextMode_Put_String("\t\tExtended CPUID is Disabled.\n", white);\r
- } else{\r
- TextMode_Put_String("\t\tExtended CPUID is Enabled.\n", white);\r
- System.Environment.CPUID.max_eid = cpuid_buf[0];\r
- snprintf(s, sizeof(s), "\t\tMaxEID=0x%X\n", System.Environment.CPUID.max_eid);\r
- TextMode_Put_String(s, white);\r
- }\r
- CPUID(s, 0);\r
- s[16] = 0x00;\r
- TextMode_Put_String("\t\t", white);\r
- TextMode_Put_String(s + 4, white);\r
- TextMode_Put_String("\n", white);\r
- CPUID(cpuid_buf, 1);\r
- System.Environment.CPUID.function_flags.reg.edx = cpuid_buf[2];\r
- System.Environment.CPUID.function_flags.reg.ecx = cpuid_buf[3];\r
- snprintf(s, sizeof(s), "\t\tVME:%d\n", System.Environment.CPUID.function_flags.bit.VME);\r
- TextMode_Put_String(s, white);\r
- }\r
-\r
- TextMode_Put_String("\tInitialising PCI...\n", white);\r
- Initialize_PCI();\r
-\r
- TextMode_Put_String("\tSystem Initialising Phase End.\n", white);\r
-\r
- IO_STI();\r
-\r
- System.Controller.Display = Initialize_Display();\r
-\r
-//Core Task Run.\r
-\r
- System.CoreTask.KeyboardControl = System_MultiTask_Task_Initialize(0);\r
- System.CoreTask.KeyboardControl->tss->eip = (uint)&KeyboardControlTask;\r
- System.CoreTask.KeyboardControl->tss->cs = SYSTEM_CS << 3;\r
- System.CoreTask.KeyboardControl->tss->ss = SYSTEM_DS << 3;\r
- System.CoreTask.KeyboardControl->tss->ds = SYSTEM_DS << 3;\r
- System.CoreTask.KeyboardControl->tss->esp = (uint)System_Memory_Allocate(1024 * 32) + (1024 * 32);\r
- MultiTask_Push_Arguments(System.CoreTask.KeyboardControl, 1, &System.InputFocus);\r
- System_MultiTask_Task_Run(System.CoreTask.KeyboardControl);\r
-\r
- System.CoreTask.MouseControl = System_MultiTask_Task_Initialize(0);\r
- System.CoreTask.MouseControl->tss->eip = (uint)&MouseControlTask;\r
- System.CoreTask.MouseControl->tss->cs = SYSTEM_CS << 3;\r
- System.CoreTask.MouseControl->tss->ss = SYSTEM_DS << 3;\r
- System.CoreTask.MouseControl->tss->ds = SYSTEM_DS << 3;\r
- System.CoreTask.MouseControl->tss->esp = (uint)System_Memory_Allocate(1024 * 32) + (1024 * 32);\r
- MultiTask_Push_Arguments(System.CoreTask.MouseControl, 2, &System.InputFocus, MouseCursor_Initialize(System.Controller.Display->vramsheet));\r
- System_MultiTask_Task_Run(System.CoreTask.MouseControl);\r
-\r
- return;\r
-}\r
-\r
-void System_Set_RunningPhase(uint phase)\r
-{\r
- System.RunningPhase = phase;\r
- TextMode_Put_String("\nNow SystemRunningPhase is", white);\r
- TextMode_Put_String(SystemRunningPhaseText[System.RunningPhase], skyblue);\r
- TextMode_Put_String("\n", white);\r
-\r
- return;\r
-}\r
-\r
-uint System_Get_RunningPhase(void)\r
-{\r
- return System.RunningPhase;\r
-}\r
-\r
-uint System_Get_PhisycalMemorySize(void)\r
-{\r
- return System.Environment.Memory.PhysicalSize;\r
-}\r
-\r
-void System_SegmentDescriptor_Set_Absolute(uint selector, uint limit, uint base, uint ar)\r
-{\r
- IO_SegmentDescriptor *gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
-\r
- if(selector >= 8192){\r
- return;\r
- }\r
-\r
- SegmentDescriptor_Set(&gdt[selector], limit, base, ar);\r
-\r
- return;\r
-}\r
-\r
-uint System_SegmentDescriptor_Get_Base(uint selector)\r
-{\r
- IO_SegmentDescriptor *gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
-\r
- if(selector >= 8192){\r
- return 0;\r
- }\r
-\r
- return SegmentDescriptor_Get_Base(&gdt[selector]);\r
-}\r
-\r
-uint System_SegmentDescriptor_Get_Limit(uint selector)\r
-{\r
- IO_SegmentDescriptor *gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
-\r
- if(selector >= 8192){\r
- return 0;\r
- }\r
-\r
- return SegmentDescriptor_Get_Limit(&gdt[selector]);\r
-}\r
-\r
-uint System_SegmentDescriptor_Get_AccessRight(uint selector)\r
-{\r
- IO_SegmentDescriptor *gdt = (IO_SegmentDescriptor *)ADR_GDT;\r
-\r
- if(selector >= 8192){\r
- return 0;\r
- }\r
-\r
- return SegmentDescriptor_Get_AccessRight(&gdt[selector]);\r
-}\r
-\r
-uint System_SegmentDescriptor_Set(uint limit, uint base, uint ar)\r
-{\r
- uint *retaddr;\r
- uint i;\r
-\r
- retaddr = &limit - 1;\r
-\r
- for(i = 1; i < 8192; i++){\r
- if(System_SegmentDescriptor_Get_Limit(i) == 0){\r
- System_SegmentDescriptor_Set_Absolute(i, limit, base, ar);\r
- return i;\r
- }\r
- }\r
-\r
- Error_Report(ERROR_NO_MORE_SEGMENT, *retaddr);\r
-\r
- return 0;\r
-}\r
-\r
-void System_GateDescriptor_Set(uint irq, uint offset, uint selector, uint ar)\r
-{\r
- IO_GateDescriptor *idt = (IO_GateDescriptor *)ADR_IDT;\r
-\r
- GateDescriptor_Set(&idt[irq], offset, selector, ar);\r
-\r
- return;\r
-}\r
-\r
-void System_TaskSwitch(void)\r
-{\r
- MultiTask_TaskSwitch(System.Controller.Task);\r
- return;\r
-}\r
-\r
-UI_Task *System_MultiTask_Task_Initialize(uint tss_additional_size)\r
-{\r
- return MultiTask_Task_Initialize(System.Controller.Task, tss_additional_size);\r
-}\r
-\r
-void System_MultiTask_Task_Run(UI_Task *task)\r
-{\r
- #ifdef CHNOSPROJECT_DEBUG_CALLLINK\r
- debug("System_MultiTask_Task_Run:Called from[0x%08X].\n", *((uint *)(&task - 1)));\r
- #endif\r
- MultiTask_Task_Run(System.Controller.Task, task);\r
- return;\r
-}\r
-\r
-void *System_Memory_Allocate(uint size)\r
-{\r
- return Memory_Allocate(System.Controller.Memory, size);\r
-}\r
-\r
-UI_Task *System_MultiTask_GetNowTask(void)\r
-{\r
- return MultiTask_GetNowTask(System.Controller.Task);\r
-}\r
-\r
-IO_CallBIOSControl *System_CallBIOS_Get_Controller(void)\r
-{\r
- return System.Controller.CallBIOS;\r
-}\r
-\r
-void System_CallBIOS_Execute(uchar intn, DATA_FIFO32 *fifo, uint endsignal)\r
-{\r
- CallBIOS_Execute(System.Controller.CallBIOS, intn, fifo, endsignal);\r
- return;\r
-}\r
-\r
-void System_Memory_Free(void *addr, uint size)\r
-{\r
- Memory_Free(System.Controller.Memory, addr, size);\r
- return;\r
-}\r
-\r
-void System_CallBIOS_Send_End_Of_Operation(uint abort)\r
-{\r
- CallBIOS_Send_End_Of_Operation(System.Controller.CallBIOS, abort);\r
- return;\r
-}\r
-\r
-void System_MultiTask_Task_Sleep(UI_Task *task)\r
-{\r
- MultiTask_Task_Sleep(System.Controller.Task, task);\r
- return;\r
-}\r
-\r
-void System_MultiTask_Task_Kill(UI_Task *task)\r
-{\r
- MultiTask_Task_Kill(System.Controller.Task, task);\r
- return;\r
-}\r
-\r
-DATA_FIFO32 *System_FIFO32_Initialize(uint size)\r
-{\r
- return FIFO32_Initialize(System.Controller.Memory, size);\r
-}\r
-\r
-uint System_Display_VESA_Set_VideoMode(uint index)\r
-{\r
- return Display_VESA_Set_VideoMode(System.Controller.Display, index);\r
-}\r
-\r
-IO_DisplayControl *System_Display_Get_Controller(void)\r
-{\r
- return System.Controller.Display;\r
-}\r
-\r
-uint System_Memory_Get_FreeSize(void)\r
-{\r
- return Memory_Get_FreeSize(System.Controller.Memory);\r
-}\r
-\r
-uint System_TaskControlMessage_Send_AllTask(uint message)\r
-{\r
- UI_Task *task;\r
- uint sended_tasks;\r
-\r
- sended_tasks = 0;\r
- for(task = System.Controller.Task->start; task != Null; task = task->next){\r
- if(task->fifo != Null){\r
- sended_tasks++;\r
- FIFO32_Put(task->fifo, message);\r
- }\r
- }\r
-\r
- return sended_tasks;\r
-}\r
-\r
-uint System_Sheet_SetParentToVRAM(UI_Sheet *sheet)\r
-{\r
- return Sheet_SetParent(sheet, System.Controller.Display->vramsheet);\r
-}\r
-\r
-uint System_InputFocus_Change(DATA_FIFO32 *fifo)\r
-{\r
- if(System.InputFocus != fifo){\r
- FIFO32_Put(System.InputFocus, INPUTSIGNAL_OFFSET + INPUTSIGNAL_FOCUS_LOST);\r
- System.InputFocus = fifo;\r
- FIFO32_Put(System.InputFocus, INPUTSIGNAL_OFFSET + INPUTSIGNAL_FOCUS_GOT);\r
- }\r
- return 0;\r
-}\r
-\r
-UI_TaskControl *System_MultiTask_GetController(void)\r
-{\r
- return System.Controller.Task;\r
-}\r
-\r
-//\r
-void System_Check_Memory(void)\r
-{\r
- System.Environment.Memory.PhysicalSize = Memory_Test(0x00400000, 0xbfffffff);\r
- return;\r
-}\r
-\r
-uint System_CPUID(void *addr, uint id) //addr\94Ô\92n\82Ìuint[4]\82É\81ACPU\82Ì\8e¯\95Ê\8fî\95ñid\94Ô\82ðEAX\81EEBX\81EEDX\81EECX\82Ì\8f\87\94Ô\82Å\8ai\94[\82·\82é\81B\r
-{ //CPUID\82ª\97\98\97p\95s\89Â\82Ì\8fê\8d\87\82Í\81A\96ß\82è\92l\82Í0xffffffff\81A\97\98\97p\89Â\94\\82È\82ç\81A\8dÅ\91å\93ü\97Í\92l\81i\8aî\96{\8fî\95ñ\82Ì\8fê\8d\87\81j\82ð\95Ô\82·\81B\r
- if(System.Environment.CPUID.max_id == 0xffffffff){\r
- return 0;\r
- }\r
-\r
- if(id <= System.Environment.CPUID.max_id || (0x80000000 <= id && id <= System.Environment.CPUID.max_eid)){\r
- CPUID(addr, id);\r
- }\r
-\r
- return System.Environment.CPUID.max_id;\r
-}\r
-\r