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;
firstpagecount = fsize > firstpagecount ? firstpagecount : fsize;
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;
error = readexact(vnode, (void *)mempos, firstpagecount, foffset);
if (error)
return error;
// TODO switch out protection
memset(page, 0, firstpageoffset);
mempos += firstpagecount;
msize -= firstpagecount;
@@ -91,6 +89,10 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
msize -= remainingmsize;
mempos += remainingmsize;
}
error = vmm_changemmuflags(page, PAGE_SIZE, mmuflags, 0);
if (error)
return error;
}
// map middle of file
@@ -112,18 +114,21 @@ static int load(vnode_t *vnode, elfph64_t *ph) {
// map end of file
size_t lastpagecount = fsize % PAGE_SIZE;
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;
error = readexact(vnode, (void *)mempos, lastpagecount, foffset);
if (error)
return error;
// TODO switch out protection
memset((void *)(mempos + lastpagecount), 0, PAGE_SIZE - lastpagecount);
mempos += PAGE_SIZE;
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