git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Unifying the Lunaix's Physical Memory Model (#28)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
exe
/
elf32
/
ldelf32.c
diff --git
a/lunaix-os/kernel/exe/elf32/ldelf32.c
b/lunaix-os/kernel/exe/elf32/ldelf32.c
index 1204be4e1f8e0f760b48c03b2ca5e3d333a4d711..69ae939a0c2f7595a6b1888f3891002f8ae4ddd7 100644
(file)
--- a/
lunaix-os/kernel/exe/elf32/ldelf32.c
+++ b/
lunaix-os/kernel/exe/elf32/ldelf32.c
@@
-1,17
+1,20
@@
#include <lunaix/exebi/elf32.h>
#include <lunaix/load.h>
#include <lunaix/mm/mmap.h>
#include <lunaix/exebi/elf32.h>
#include <lunaix/load.h>
#include <lunaix/mm/mmap.h>
-#include <lunaix/mm/
page
.h>
+#include <lunaix/mm/
valloc
.h>
#include <lunaix/spike.h>
#include <lunaix/spike.h>
+#include <sys/mm/mempart.h>
+
int
elf32_smap(struct load_context* ldctx,
const struct elf32* elf,
int
elf32_smap(struct load_context* ldctx,
const struct elf32* elf,
- struct elf32_phdr* phdre)
+ struct elf32_phdr* phdre,
+ uintptr_t base_va)
{
struct v_file* elfile = (struct v_file*)elf->elf_file;
{
struct v_file* elfile = (struct v_file*)elf->elf_file;
- assert(
PG_ALIGNED
(phdre->p_offset));
+ assert(
!va_offset
(phdre->p_offset));
int proct = 0;
if ((phdre->p_flags & PF_R)) {
int proct = 0;
if ((phdre->p_flags & PF_R)) {
@@
-24,26
+27,26
@@
elf32_smap(struct load_context* ldctx,
proct |= PROT_EXEC;
}
proct |= PROT_EXEC;
}
+ uintptr_t va = phdre->p_va + base_va;
struct exec_container* container = ldctx->container;
struct mmap_param param = { .vms_mnt = container->vms_mnt,
struct exec_container* container = ldctx->container;
struct mmap_param param = { .vms_mnt = container->vms_mnt,
- .pvms =
&container->proc->mm
,
+ .pvms =
vmspace(container->proc)
,
.proct = proct,
.proct = proct,
- .offset = PG_ALIGN(phdre->p_offset),
- .mlen = ROUNDUP(phdre->p_memsz, PG_SIZE),
- .flen = phdre->p_filesz + PG_MOD(phdre->p_va),
+ .offset = page_aligned(phdre->p_offset),
+ .mlen = page_upaligned(phdre->p_memsz),
.flags = MAP_FIXED | MAP_PRIVATE,
.type = REGION_TYPE_CODE };
struct mm_region* seg_reg;
.flags = MAP_FIXED | MAP_PRIVATE,
.type = REGION_TYPE_CODE };
struct mm_region* seg_reg;
- int status = m
em_map(NULL, &seg_reg, PG_ALIGN(phdre->p_
va), elfile, ¶m);
+ int status = m
map_user(NULL, &seg_reg, page_aligned(
va), elfile, ¶m);
if (!status) {
if (!status) {
- size_t next_addr = phdre->p_memsz +
phdre->p_
va;
- ldctx->end = MAX(ldctx->end,
ROUNDUP(next_addr, PG_SIZE
));
+ size_t next_addr = phdre->p_memsz + va;
+ ldctx->end = MAX(ldctx->end,
page_upaligned(next_addr
));
ldctx->mem_sz += phdre->p_memsz;
} else {
// we probably fucked up our process
ldctx->mem_sz += phdre->p_memsz;
} else {
// we probably fucked up our process
- terminate_
proc
(-1);
+ terminate_
current
(-1);
}
return status;
}
return status;
@@
-62,13
+65,19
@@
load_executable(struct load_context* context, const struct v_file* exefile)
goto done;
}
goto done;
}
- if (!elf32_check_exec(&elf)) {
+ if (!elf32_check_arch(&elf)) {
+ errno = EINVAL;
+ goto done;
+ }
+
+ if (!(elf32_check_exec(&elf, ET_EXEC) || elf32_check_exec(&elf, ET_DYN))) {
errno = ENOEXEC;
goto done;
}
errno = ENOEXEC;
goto done;
}
- ldpath = valloc(512);
- errno = elf32_find_loader(&elf, ldpath, 512);
+ ldpath = valloc(256);
+ errno = elf32_find_loader(&elf, ldpath, 256);
+ uintptr_t load_base = 0;
if (errno < 0) {
goto done;
if (errno < 0) {
goto done;
@@
-88,36
+97,40
@@
load_executable(struct load_context* context, const struct v_file* exefile)
}
// Is this the valid loader?
}
// Is this the valid loader?
- if (!elf32_static_linked(&elf) || !elf32_check_exec(&elf)) {
+ if (!elf32_static_linked(&elf) || !elf32_check_exec(&elf
, ET_DYN
)) {
errno = ELIBBAD;
goto done_close_elf32;
}
errno = ELIBBAD;
goto done_close_elf32;
}
- // TODO: relocate loader
- } else {
- context->entry = elf.eheader.e_entry;
+ load_base = USR_MMAP;
}
}
+ context->entry = elf.eheader.e_entry + load_base;
+
struct v_file* elfile = (struct v_file*)elf.elf_file;
for (size_t i = 0; i < elf.eheader.e_phnum && !errno; i++) {
struct elf32_phdr* phdr = &elf.pheaders[i];
struct v_file* elfile = (struct v_file*)elf.elf_file;
for (size_t i = 0; i < elf.eheader.e_phnum && !errno; i++) {
struct elf32_phdr* phdr = &elf.pheaders[i];
- if (phdr->p_type == PT_LOAD) {
- if (phdr->p_align != PG_SIZE) {
- // surprising alignment!
- errno = ENOEXEC;
- continue;
- }
+ if (phdr->p_type != PT_LOAD) {
+ continue;
+ }
- errno = elf32_smap(context, &elf, phdr);
+ if (phdr->p_align != PAGE_SIZE) {
+ // surprising alignment!
+ errno = ENOEXEC;
+ break;
}
}
- // TODO Handle relocation
+
+ errno = elf32_smap(context, &elf, phdr, load_base);
}
done_close_elf32:
elf32_close(&elf);
}
done_close_elf32:
elf32_close(&elf);
+
done:
done:
- vfree_safe(ldpath);
+ if (!container->argv_pp[1]) {
+ vfree_safe(ldpath);
+ }
return errno;
}
return errno;
}