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