mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 14:38:21 +00:00
vmm: send SIGBUS on vmm OOM
This commit is contained in:
+12
-5
@@ -505,7 +505,9 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
// cacheable vnode
|
// cacheable vnode
|
||||||
page_t *res = NULL;
|
page_t *res = NULL;
|
||||||
int error = vmmcache_getpage(range->vnode, range->offset + mapoffset, &res);
|
int error = vmmcache_getpage(range->vnode, range->offset + mapoffset, &res);
|
||||||
if (error == ENXIO) {
|
if (error == ENXIO || error == ENOMEM) {
|
||||||
|
if (error == ENOMEM)
|
||||||
|
printf("vmm: out of memory to handle getpage (sending SIGBUS)\n");
|
||||||
// address is past the last page of the file
|
// address is past the last page of the file
|
||||||
signal_signalthread(_cpu()->thread, SIGBUS, true);
|
signal_signalthread(_cpu()->thread, SIGBUS, true);
|
||||||
status = true;
|
status = true;
|
||||||
@@ -515,8 +517,10 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
} else {
|
} else {
|
||||||
status = arch_mmu_map(_cpu()->vmmctx->pagetable, pmm_getpageaddress(res), addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
status = arch_mmu_map(_cpu()->vmmctx->pagetable, pmm_getpageaddress(res), addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("vmm: out of memory to map file into address space\n");
|
printf("vmm: out of memory to map file into address space (sending SIGBUS)\n");
|
||||||
pmm_release(pmm_getpageaddress(res));
|
pmm_release(pmm_getpageaddress(res));
|
||||||
|
signal_signalthread(_cpu()->thread, SIGBUS, true);
|
||||||
|
status = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -524,7 +528,9 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
// anonymous memory. map the zero'd page
|
// anonymous memory. map the zero'd page
|
||||||
status = arch_mmu_map(_cpu()->vmmctx->pagetable, zeropage, addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
status = arch_mmu_map(_cpu()->vmmctx->pagetable, zeropage, addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("vmm: out of memory to map zero page into address space\n");
|
printf("vmm: out of memory to map zero page into address space (sending SIGBUS)\n");
|
||||||
|
signal_signalthread(_cpu()->thread, SIGBUS, true);
|
||||||
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
pmm_hold(zeropage);
|
pmm_hold(zeropage);
|
||||||
}
|
}
|
||||||
@@ -542,8 +548,9 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
// do copy on write
|
// do copy on write
|
||||||
void *newphys = pmm_allocpage(PMM_SECTION_DEFAULT);
|
void *newphys = pmm_allocpage(PMM_SECTION_DEFAULT);
|
||||||
if (newphys == NULL) {
|
if (newphys == NULL) {
|
||||||
printf("vmm: out of memory to do copy on write on address space\n");
|
printf("vmm: out of memory to do copy on write on address space (sending SIGBUS)\n");
|
||||||
status = false;
|
signal_signalthread(_cpu()->thread, SIGBUS, true);
|
||||||
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
memcpy(MAKE_HHDM(newphys), MAKE_HHDM(oldphys), PAGE_SIZE);
|
memcpy(MAKE_HHDM(newphys), MAKE_HHDM(oldphys), PAGE_SIZE);
|
||||||
arch_mmu_remap(_cpu()->vmmctx->pagetable, newphys, addr, range->mmuflags);
|
arch_mmu_remap(_cpu()->vmmctx->pagetable, newphys, addr, range->mmuflags);
|
||||||
|
|||||||
Reference in New Issue
Block a user