mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
elf: switch first and last page protection
This commit is contained in:
+12
-7
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user