diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 2edc23d..3ca7b01 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -43,6 +43,7 @@ extern void *sharePage(PagingInfo *destination, void *sourceAddress, void *destinationAddress); extern void freePage(void *pageAddress); +extern void freePhysicalPage(uint32_t pageId); extern void unmapPage(void *pageAddress); extern void free(void *address); diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 2edc23d..3ca7b01 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -43,6 +43,7 @@ extern void *sharePage(PagingInfo *destination, void *sourceAddress, void *destinationAddress); extern void freePage(void *pageAddress); +extern void freePhysicalPage(uint32_t pageId); extern void unmapPage(void *pageAddress); extern void free(void *address); diff --git a/src/kernel/memory/paging.c b/src/kernel/memory/paging.c index 4332c44..51b034e 100644 --- a/src/kernel/memory/paging.c +++ b/src/kernel/memory/paging.c @@ -254,3 +254,8 @@ } void freePage(void *address) { freePageFrom(kernelVirtualPages, address); } + +void freePhysicalPage(uint32_t pageId) { + markPageFree(kernelPhysicalPages, pageId / 32, pageId % 32, + 1 << (pageId % 32)); +} diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 2edc23d..3ca7b01 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -43,6 +43,7 @@ extern void *sharePage(PagingInfo *destination, void *sourceAddress, void *destinationAddress); extern void freePage(void *pageAddress); +extern void freePhysicalPage(uint32_t pageId); extern void unmapPage(void *pageAddress); extern void free(void *address); diff --git a/src/kernel/memory/paging.c b/src/kernel/memory/paging.c index 4332c44..51b034e 100644 --- a/src/kernel/memory/paging.c +++ b/src/kernel/memory/paging.c @@ -254,3 +254,8 @@ } void freePage(void *address) { freePageFrom(kernelVirtualPages, address); } + +void freePhysicalPage(uint32_t pageId) { + markPageFree(kernelPhysicalPages, pageId / 32, pageId % 32, + 1 << (pageId % 32)); +} diff --git a/src/kernel/syscalls/syscall.c b/src/kernel/syscalls/syscall.c index 4ea80fc..3987d0f 100644 --- a/src/kernel/syscalls/syscall.c +++ b/src/kernel/syscalls/syscall.c @@ -21,6 +21,11 @@ uint32_t parameter1, uint32_t parameter2, uint32_t parameter3) { if (!function) { + Service *service = currentSyscall->service; + void *espPhysical = getPhysicalAddress( + service->pagingInfo.pageDirectory, currentSyscall->esp); + freePage(currentSyscall->esp); + if (currentSyscall->respondingTo) { listAdd(&callsToProcess, currentSyscall->respondingTo); }