OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / system.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/system.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/system.c
new file mode 100644 (file)
index 0000000..d156e1a
--- /dev/null
@@ -0,0 +1,496 @@
+\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