elf: switch first and last page protection

This commit is contained in:
Matheus
2024-09-12 20:53:41 -03:00
parent 3c924116ee
commit cf3e58ffe1
+12 -7
View File
@@ -65,15 +65,13 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
size_t firstpagecount = PAGE_SIZE - firstpageoffset; size_t firstpagecount = PAGE_SIZE - firstpageoffset;
firstpagecount = fsize > firstpagecount ? firstpagecount : fsize; firstpagecount = fsize > firstpagecount ? firstpagecount : fsize;
void *page = (void *)ROUND_DOWN(mempos, PAGE_SIZE); void *page = (void *)ROUND_DOWN(mempos, PAGE_SIZE);
if (vmm_map(page, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, mmuflags | ARCH_MMU_FLAGS_WRITE, NULL) == NULL) if (vmm_map(page, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
return ENOMEM; return ENOMEM;
error = readexact(vnode, (void *)mempos, firstpagecount, foffset); error = readexact(vnode, (void *)mempos, firstpagecount, foffset);
if (error) if (error)
return error; return error;
// TODO switch out protection
memset(page, 0, firstpageoffset); memset(page, 0, firstpageoffset);
mempos += firstpagecount; mempos += firstpagecount;
msize -= firstpagecount; msize -= firstpagecount;
@@ -91,6 +89,10 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
msize -= remainingmsize; msize -= remainingmsize;
mempos += remainingmsize; mempos += remainingmsize;
} }
error = vmm_changemmuflags(page, PAGE_SIZE, mmuflags, 0);
if (error)
return error;
} }
// map middle of file // map middle of file
@@ -112,18 +114,21 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
// map end of file // map end of file
size_t lastpagecount = fsize % PAGE_SIZE; size_t lastpagecount = fsize % PAGE_SIZE;
if (lastpagecount) { if (lastpagecount) {
if (vmm_map((void *)mempos, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, mmuflags | ARCH_MMU_FLAGS_WRITE, NULL) == NULL) if (vmm_map((void *)mempos, PAGE_SIZE, VMM_FLAGS_EXACT | VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_USER | ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE, NULL) == NULL)
return ENOMEM; return ENOMEM;
error = readexact(vnode, (void *)mempos, lastpagecount, foffset); error = readexact(vnode, (void *)mempos, lastpagecount, foffset);
if (error) if (error)
return error; return error;
// TODO switch out protection
memset((void *)(mempos + lastpagecount), 0, PAGE_SIZE - lastpagecount); memset((void *)(mempos + lastpagecount), 0, PAGE_SIZE - lastpagecount);
mempos += PAGE_SIZE;
msize -= msize > PAGE_SIZE ? PAGE_SIZE : msize; msize -= msize > PAGE_SIZE ? PAGE_SIZE : msize;
error = vmm_changemmuflags((void *)mempos, PAGE_SIZE, mmuflags, 0);
if (error)
return error;
mempos += PAGE_SIZE;
} }
// zero some parts if needed // zero some parts if needed