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