OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / memory.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/memory.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/memory.c
new file mode 100644 (file)
index 0000000..ce24a7c
--- /dev/null
@@ -0,0 +1,192 @@
+\r
+#include "core.h"\r
+\r
+IO_MemoryControl sys_mem_ctrl;\r
+uint sys_mem_size;\r
+\r
+uint Memory_Test(uint start, uint end)\r
+{\r
+       uchar flg486 = 0;\r
+       uint eflg, cr0, i;\r
+\r
+       eflg = IO_Load_EFlags();\r
+       eflg |= EFLAGS_AC_BIT;\r
+       IO_Store_EFlags(eflg);\r
+\r
+       eflg = IO_Load_EFlags();\r
+       if((eflg & EFLAGS_AC_BIT) != 0){\r
+               flg486 = 1;\r
+       }\r
+       eflg &= ~EFLAGS_AC_BIT;\r
+       IO_Store_EFlags(eflg);\r
+\r
+       if(flg486 != 0){\r
+               cr0 = Load_CR0();\r
+               cr0 |= CR0_ALL_CACHE_DISABLE;\r
+               Store_CR0(cr0);\r
+       }\r
+       i = Memory_Test_Sub(start, end);\r
+       if(flg486 != 0){\r
+               cr0 = Load_CR0();\r
+               cr0 &= ~CR0_ALL_CACHE_DISABLE;\r
+               Store_CR0(cr0);         \r
+       }\r
+       return i;\r
+}\r
+\r
+void MemoryControl_Initialise(IO_MemoryControl *ctrl, void *start, uint size)\r
+{\r
+       ctrl->start = start;\r
+       ctrl->size = size;\r
+       ctrl->next = start;\r
+       ((IO_MemoryControlTag *)ctrl->next)->size = ctrl->size;\r
+       ((IO_MemoryControlTag *)ctrl->next)->next = 0;\r
+       return;\r
+}\r
+\r
+uint MemoryControl_FreeSize(IO_MemoryControl *ctrl)\r
+{\r
+       void *tag;\r
+       uint size;\r
+\r
+       size = 0;\r
+       tag = ctrl->next;\r
+\r
+       for(;;){\r
+               size += ((IO_MemoryControlTag *)tag)->size;\r
+               if(((IO_MemoryControlTag *)tag)->next == 0){\r
+                       break;\r
+               }\r
+               tag = ((IO_MemoryControlTag *)tag)->next;\r
+       }\r
+       return size;\r
+}\r
+\r
+void *MemoryControl_Allocate(IO_MemoryControl *ctrl, uint size)\r
+{\r
+       void **before;\r
+\r
+       size = (size + 7) & ~7;\r
+\r
+       before = &ctrl->next;\r
+       for(;;){\r
+               if((((IO_MemoryControlTag *)*before)->size - 8) > size){\r
+                       break;\r
+               }\r
+               if(((IO_MemoryControlTag *)*before)->next == 0){\r
+                       return 0;\r
+               }\r
+               before = &((IO_MemoryControlTag *)*before)->next;\r
+       }\r
+       ((IO_MemoryControlTag *)(*before + size))->size = ((IO_MemoryControlTag *)*before)->size - size;\r
+       ((IO_MemoryControlTag *)(*before + size))->next = ((IO_MemoryControlTag *)*before)->next;\r
+       *before = *before + size;\r
+\r
+       return *before - size;\r
+}\r
+\r
+int MemoryControl_Free(IO_MemoryControl *ctrl, void *addr0, uint size)\r
+{\r
+       void **before;\r
+\r
+       size = (size + 7) & ~7;\r
+\r
+       before = &ctrl->next;\r
+       for(; before != 0;){\r
+               if((uint)((IO_MemoryControlTag *)*before) == (uint)(addr0 + size)){             //\89ð\95ú\82µ\82½\82¢\83\81\83\82\83\8a\82Ì\8cã\91±\82É\8bó\82«\82ª\82 \82é\8fê\8d\87\81B\r
+                       ((IO_MemoryControlTag *)addr0)->size = ((IO_MemoryControlTag *)(*before))->size + size;\r
+                       ((IO_MemoryControlTag *)addr0)->next = ((IO_MemoryControlTag *)(*before))->next;\r
+                       *before = addr0;\r
+                       return 0;\r
+               }\r
+               if((uint)((IO_MemoryControlTag *)*before)->next >= (uint)(addr0 + size)){\r
+                       Send_SerialPort("Have to Free!1 or 2\r\n");\r
+                       return -1;\r
+               }\r
+               if(((IO_MemoryControlTag *)*before)->next == 0){\r
+                       Send_SerialPort("Have to Free!0\r\n");\r
+                       return -1;\r
+               }\r
+               before = ((IO_MemoryControlTag *)*before)->next;\r
+       }\r
+       return -1;\r
+}\r
+\r
+void *MemoryControl_Allocate_Page(IO_MemoryControl *ctrl)\r
+{\r
+       void *addr, *mem_head_4k, *offset;\r
+\r
+       addr = MemoryControl_Allocate(ctrl, 0x2000);\r
+       if(addr == 0) return 0;\r
+       mem_head_4k = (void *)(((uint)addr + 0xfff) & 0xfffff000);\r
+       (uint)offset = (uint)mem_head_4k - (uint)addr;\r
+       if (offset > 0) {\r
+               MemoryControl_Free(ctrl, addr, (uint)offset);\r
+       }\r
+       MemoryControl_Free(ctrl, mem_head_4k + 0x1000, 0x1000 - (uint)offset);\r
+\r
+       return mem_head_4k;\r
+}\r
+\r
+void MemoryControl_Output_Info(IO_MemoryControl *ctrl)\r
+{\r
+       void *tag;\r
+\r
+       debug("Memory Free Info.\n");\r
+       tag = ctrl->next;\r
+       for(;;){\r
+               debug("Addr:0x%08X Size:0x%08X\n", (uint)tag, ((IO_MemoryControlTag *)tag)->size);\r
+               if(((IO_MemoryControlTag *)tag)->next == 0){\r
+                       break;\r
+               }\r
+               tag = ((IO_MemoryControlTag *)tag)->next;\r
+       }\r
+       return;\r
+}\r
+\r
+void System_MemoryControl_Initialise(void)\r
+{\r
+       sys_mem_size = Memory_Test(0x00400000, 0xbfffffff) & 0xFFFFF000;\r
+       MemoryControl_Initialise(&sys_mem_ctrl, (void *)0x00400000, sys_mem_size - 0x00400000);\r
+       return;\r
+}\r
+\r
+uint System_MemoryControl_FullSize(void)\r
+{\r
+       return sys_mem_size;\r
+}\r
+\r
+uint System_MemoryControl_FreeSize(void)\r
+{\r
+       return MemoryControl_FreeSize(&sys_mem_ctrl);\r
+}\r
+\r
+void *System_MemoryControl_Allocate(uint size)\r
+{\r
+       void *addr;\r
+       uint *retaddr;\r
+\r
+       retaddr = &size;\r
+\r
+       addr = MemoryControl_Allocate(&sys_mem_ctrl, size);\r
+\r
+       debug("[0x%08X]Memory Allocate Request.[0x%08X](%dByte)\n", *(retaddr - 1), addr, size);\r
+\r
+       return addr;\r
+}\r
+\r
+int System_MemoryControl_Free(void *addr0, uint size)\r
+{\r
+       return MemoryControl_Free(&sys_mem_ctrl, addr0, size);\r
+}\r
+\r
+void *System_MemoryControl_Allocate_Page(void)\r
+{\r
+       return MemoryControl_Allocate_Page(&sys_mem_ctrl);\r
+}\r
+\r
+void System_MemoryControl_Output_Info(void)\r
+{\r
+       MemoryControl_Output_Info(&sys_mem_ctrl);\r
+       return;\r
+}\r