OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / memory.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/memory.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/memory.c
new file mode 100644 (file)
index 0000000..242e084
--- /dev/null
@@ -0,0 +1,156 @@
+\r
+#include "core.h"\r
+\r
+uint memtest(uint start, uint end)\r
+{\r
+\r
+       char flg486 = 0;\r
+       uint eflg,cr0,i;\r
+\r
+       eflg = io_load_eflags();\r
+       eflg |= EFLAGS_AC_BIT;\r
+       io_store_eflags(eflg);\r
+       eflg = io_load_eflags();\r
+       if((eflg & EFLAGS_AC_BIT) != 0) flg486 = 1;\r
+       eflg &= ~EFLAGS_AC_BIT;\r
+       io_store_eflags(eflg);\r
+       if(flg486 != 0) {\r
+               cr0 = load_cr0();\r
+               cr0 |= CR0_ALL_CACHE_DISABLE;\r
+               store_cr0(cr0);\r
+               }\r
+       i = memtest_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
+\r
+void memman_init(IO_MemoryControl *man)\r
+{\r
+       man->frees = 0;\r
+       man->maxfrees = 0;\r
+       man->lostsize = 0;\r
+       man->losts = 0;\r
+       return;\r
+}\r
+\r
+uint memman_free_total(IO_MemoryControl *man)\r
+{\r
+       uint i,t = 0;\r
+       for (i = 0; i < man->frees; i++) {\r
+               t += man->free[i].size;\r
+               }\r
+       return t;\r
+}\r
+\r
+void *memman_alloc(IO_MemoryControl *man, uint size)\r
+{\r
+       uint i,a;\r
+       for(i = 0; i < man->frees; i++) {\r
+               if (man->free[i].size >= size) {\r
+               a = man->free[i].addr;\r
+               man->free[i].addr += size;\r
+               man->free[i].size -= size;\r
+               if(man->free[i].size == 0) {\r
+                       man->frees--;\r
+                       for (; i < man->frees; i++) {\r
+                               man->free[i] = man->free[i+1];\r
+                               }\r
+                       }\r
+                       return (void *)a;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+int memman_free(IO_MemoryControl *man, void *addr0, uint size)\r
+{\r
+       int i, j;\r
+       uint addr;\r
+       addr = (uint)addr0;\r
+       for(i = 0; i < man->frees; i++){\r
+               if(man->free[i].addr > addr) break;\r
+       }\r
+       if(i > 0) {\r
+               if(man->free[i-1].addr + man->free[i-1].size == addr){\r
+                       man->free[i-1].size += size;\r
+                       if(i < man->frees){\r
+                               if(addr + size == man->free[i].addr){\r
+                                       man->free[i-1].size += man->free[i].size;\r
+                                       man->frees--;\r
+                                       for (;i < man->frees; i++){\r
+                                               man->free[i] = man->free[i+1];\r
+                                       }\r
+                               }\r
+                       }\r
+                       return 0;\r
+               }\r
+       }\r
+       if(i < man->frees){\r
+               if(addr + size == man->free[i].addr){\r
+                       man->free[i].addr = addr;\r
+                       man->free[i].size += size;\r
+                       return 0;\r
+               }\r
+       }\r
+       if(man->frees < MEMMAN_FREES){\r
+               for(j = man->frees;j>i;j--) {\r
+                       man->free[j] = man->free[j-1];\r
+\r
+               }\r
+               man->frees++;\r
+               if(man->maxfrees < man->frees) man->maxfrees = man->frees;\r
+               man->free[i].addr = addr;\r
+               man->free[i].size = size;\r
+               return 0;\r
+\r
+       }\r
+       man->losts++;\r
+       man->lostsize += size;\r
+       return -1;\r
+}\r
+\r
+void *memman_alloc_page(IO_MemoryControl *man)\r
+{\r
+       void *addr, *mem_head_4k, *offset;\r
+\r
+       addr = memman_alloc(man, 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
+               memman_free(man, addr, (uint)offset);\r
+       }\r
+       memman_free(man, mem_head_4k + 0x1000, 0x1000 - (uint)offset);\r
+\r
+       return mem_head_4k;\r
+}\r
+\r
+void sys_memman_init(void)\r
+{\r
+       memman_init(&system.io.mem.ctrl);\r
+}\r
+\r
+uint sys_memman_free_total(void)\r
+{\r
+       return memman_free_total(&system.io.mem.ctrl);\r
+}\r
+\r
+void *sys_memman_alloc(uint size)\r
+{\r
+       return memman_alloc(&system.io.mem.ctrl, size);\r
+}\r
+\r
+int sys_memman_free(void *addr, uint size)\r
+{\r
+       return memman_free(&system.io.mem.ctrl, addr, size);\r
+}\r
+\r
+void *sys_memman_alloc_page(void)\r
+{\r
+       return memman_alloc_page(&system.io.mem.ctrl);\r
+}\r
+\r