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