--- /dev/null
+\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