memory: fix paging_map_PageAllocated/2M

This commit is contained in:
Edgaru089 2021-10-11 23:23:24 +08:00
parent ddc08cabaf
commit 5a7e1863e8

View File

@ -3,6 +3,7 @@
#include "paging_internal.h" #include "paging_internal.h"
#include "../runtime/panic_assert.h" #include "../runtime/panic_assert.h"
#include "string.h" #include "string.h"
#include "../util/minmax.h"
// some learning: // some learning:
@ -113,35 +114,39 @@ void paging_map_Page1G(uint64_t physical, uint64_t virtual, int pageCount, int p
void paging_map_PageAllocated(uint64_t virtual, int pageCount, int protectionFlags) { void paging_map_PageAllocated(uint64_t virtual, int pageCount, int protectionFlags) {
assert(virtual % SYSTEM_PAGE_SIZE == 0 && "Virtual address not page-aligned"); assert(virtual % SYSTEM_PAGE_SIZE == 0 && "Virtual address not page-aligned");
// skip the first 1M uint64_t *buf = (uint64_t *)Buffer;
int i = 1024 / 4 / BITMAP_BITS; int bufSize = HELOS_BUFFER_SIZE / sizeof(uint64_t *);
while (pageCount--) {
uint64_t freshPage = 0;
// this code is in sync with paging_physical.c, paging_physical_AllocateOneFrame, so you have to modify both while (pageCount > 0) {
for (; i < paging_EndPhysicalPage / BITMAP_BITS; i++) int pageCur = intmin(pageCount, bufSize);
if (paging_physical_Bitmap[i] != ~0ull) int allocated = paging_physical_AllocateFrames(pageCur, buf);
for (int j = 0; j < BITMAP_BITS; j++) for (int i = 0; i < allocated; i++) {
if ((paging_physical_Bitmap[i] & (1ull << j)) == 0) { io_Printf("paging_map_PageAllocated: mapping physical %llx to virtual %llx\n", buf[i], virtual);
paging_physical_Bitmap[i] |= (1ull << j); paging_map_Page(buf[i], virtual, 1, protectionFlags);
freshPage = (((uint64_t)i) * BITMAP_BITS + j) * SYSTEM_PAGE_SIZE;
memset((void *)freshPage, 0, SYSTEM_PAGE_SIZE);
} }
paging_map_Page(freshPage, virtual, 1, protectionFlags); virtual += SYSTEM_PAGE_SIZE * allocated;
virtual += SYSTEM_PAGE_SIZE; pageCount -= allocated;
} }
} }
void paging_map_PageAllocated2M(uint64_t virtual, int pageCount, int protectionFlags) { void paging_map_PageAllocated2M(uint64_t virtual, int pageCount, int protectionFlags) {
assert(pageCount > HELOS_BUFFER_SIZE / SYSTEM_PAGE_2M_SIZE * 8 && "helos_Buffer unable to hold all pointers");
assert(virtual % SYSTEM_PAGE_2M_SIZE == 0 && "Virtual address not page-aligned"); assert(virtual % SYSTEM_PAGE_2M_SIZE == 0 && "Virtual address not page-aligned");
uint64_t *buf = (uint64_t *)Buffer; uint64_t *buf = (uint64_t *)Buffer;
int bufSize = HELOS_BUFFER_SIZE / sizeof(uint64_t *);
int allocated = paging_physical_AllocateFrames2M(pageCount, buf); while (pageCount > 0) {
for (int i = 0; i < allocated; i++) int pageCur = intmin(pageCount, bufSize);
paging_map_Page2M(buf[i], virtual + SYSTEM_PAGE_2M_SIZE * i, 1, protectionFlags); int allocated = paging_physical_AllocateFrames2M(pageCur, buf);
for (int i = 0; i < allocated; i++) {
io_Printf("paging_map_PageAllocated: mapping physical %llx to virtual %llx\n", buf[i], virtual);
paging_map_Page2M(buf[i], virtual, 1, protectionFlags);
}
virtual += SYSTEM_PAGE_2M_SIZE * allocated;
pageCount -= allocated;
}
} }
void paging_map_FreeAllocated(uint64_t virtual, uint64_t end) { void paging_map_FreeAllocated(uint64_t virtual, uint64_t end) {