--- /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