//----------------------------------------------------------------------------// // OS on Kaleid // // // // Desc: Early and very dumb memory managment // // // // // // Copyright © 2018-2020 The OS/K Team // // // // This file is part of OS/K. // // // // OS/K is free software: you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation, either version 3 of the License, or // // any later version. // // // // OS/K is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY//without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with OS/K. If not, see . // //----------------------------------------------------------------------------// #include #include error_t KalAllocMemory(void **ptr, size_t req) { return KalAllocMemoryEx(ptr, req, 0, 0); } error_t KalAllocMemoryEx(void **ptr, size_t req, int flags, size_t align) { error_t rc; size_t brk; if (align == 0) align = M_DEFAULT_ALIGNMENT; if (align < M_MINIMAL_ALIGNMENT) { return EALIGN; } MmLockHeap(); brk = (size_t)_heap_start + MmGetHeapSize(); req = _ALIGN_UP(req + brk, align) - brk; /* DebugLog("MALLOC: start=%p, size=%lx, brk=%p, req=%lx\n", */ /* _heap_start, MmGetHeapSize(), brk, req); */ rc = MmGrowHeap(req); MmUnlockHeap(); if (rc) { if ((flags & M_CANFAIL) != 0) return rc; KeStartPanic("KalAllocMemory: Out of memory"); } *ptr = (void *)_ALIGN_UP(brk, align); if (flags & M_ZEROED) { memzero(*ptr, req); } assert(*ptr); return rc; } // // Frees allocated memory // error_t KalFreeMemory(void *ptr) { (void)ptr; return EOK; }