Skip to content

Commit

Permalink
Replace usage of phdr.p_paddr with phdr.p_vaddr
Browse files Browse the repository at this point in the history
According to ELF specification:
```
On systems for which physical addressing is relevant, this member
is reserved for the segment's physical address. Because System V
ignores physical addressing for application programs, this member
has unspecified contents for executable files and shared objects.
```
Furthermore:
```
On systems for which physical addressing is relevant, this member is
reserved for the segment's physical address. Because System V ignores
physical addressing for application programs, this member has
unspecified contents for executable files and shared objects.
```

Thus, even though in practice `p_paddr` is almost always equal to
`p_vaddr`, ensure consistency with the specification and use `p_vaddr`
instead.

Signed-off-by: Sergiu Moga <sergiu@unikraft.io>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
Reviewed-by: Michalis Pappas <michalis@unikraft.io>
GitHub-Closes: #64
  • Loading branch information
mogasergiu authored and razvand committed Dec 23, 2023
1 parent bd56580 commit e4c6aa7
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions elf_load.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,27 +183,27 @@ static int elf_load_parse(struct elf_prog *elf_prog, Elf *elf)
(uint64_t) phdr.p_memsz,
(uint64_t) phdr.p_align);
uk_pr_debug("%s: \\_ segment at pie + 0x%"PRIx64" (len: 0x%"PRIx64") from file @ 0x%"PRIx64" (len: 0x%"PRIx64")\n",
elf_prog->name, phdr.p_paddr, phdr.p_memsz,
elf_prog->name, phdr.p_vaddr, phdr.p_memsz,
(uint64_t) phdr.p_offset, (uint64_t) phdr.p_filesz);

if (elf_prog->lowerl == 0 && elf_prog->upperl == 0) {
/* first run */
elf_prog->lowerl = phdr.p_paddr;
elf_prog->lowerl = phdr.p_vaddr;
elf_prog->upperl = elf_prog->lowerl + phdr.p_memsz;
} else {
/* Move lower and upper border */
if (phdr.p_paddr < elf_prog->lowerl)
elf_prog->lowerl = phdr.p_paddr;
if (phdr.p_paddr + phdr.p_memsz > elf_prog->upperl)
elf_prog->upperl = phdr.p_paddr + phdr.p_memsz;
if (phdr.p_vaddr < elf_prog->lowerl)
elf_prog->lowerl = phdr.p_vaddr;
if (phdr.p_vaddr + phdr.p_memsz > elf_prog->upperl)
elf_prog->upperl = phdr.p_vaddr + phdr.p_memsz;
}
UK_ASSERT(elf_prog->lowerl <= elf_prog->upperl);

/* Calculate the in-memory phdr offset */
if (phdr.p_offset <= ehdr.e_phoff &&
ehdr.e_phoff < phdr.p_offset + phdr.p_filesz)
elf_prog->phdr.off = ehdr.e_phoff - phdr.p_offset +
phdr.p_paddr;
phdr.p_vaddr;
}
uk_pr_debug("%s: base: pie + 0x%"PRIx64", len: 0x%"PRIx64"\n",
elf_prog->name, elf_prog->lowerl, elf_prog->upperl - elf_prog->lowerl);
Expand Down Expand Up @@ -299,7 +299,7 @@ static int elf_load_imgcpy(struct elf_prog *elf_prog, Elf *elf,
if (phdr.p_type != PT_LOAD)
continue;

vastart = phdr.p_paddr + (uintptr_t) elf_prog->vabase;
vastart = phdr.p_vaddr + (uintptr_t)elf_prog->vabase;
vaend = vastart + phdr.p_filesz;
if (!elf_prog->start || (vastart < elf_prog->start))
elf_prog->start = vastart;
Expand Down Expand Up @@ -433,7 +433,7 @@ static int do_elf_load_fdphdr_0(struct elf_prog *elf_prog,
(uint64_t)elf_prog->vabase + elf_prog->valen);


vastart = (uintptr_t)mmap((void *)vastart + phdr->p_paddr,
vastart = (uintptr_t)mmap((void *)vastart + phdr->p_vaddr,
phdr->p_filesz,
PROT_EXEC | PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_FIXED,
Expand Down Expand Up @@ -487,9 +487,9 @@ static int do_elf_load_fdphdr_not0(struct elf_prog *elf_prog,
* Therefore, taking care of the address misalignment will also take
* care of the file misalignment.
*/
delta_p_offset = phdr->p_paddr - PAGE_ALIGN_DOWN(phdr->p_paddr);
delta_p_offset = phdr->p_vaddr - PAGE_ALIGN_DOWN(phdr->p_vaddr);

addr = (void *)PAGE_ALIGN_DOWN((phdr->p_paddr +
addr = (void *)PAGE_ALIGN_DOWN((phdr->p_vaddr +
(uintptr_t)elf_prog->vabase));

uk_pr_debug("%s: Memory mapping 0x%"PRIx64" - 0x%"PRIx64" to 0x%"PRIx64" - 0x%"PRIx64"\n",
Expand Down Expand Up @@ -570,7 +570,7 @@ static int elf_load_fdphdr(struct elf_prog *elf_prog, GElf_Phdr *phdr, int fd)
uintptr_t vastart, vaend;
int ret;

vastart = phdr->p_paddr + (uintptr_t)elf_prog->vabase;
vastart = phdr->p_vaddr + (uintptr_t)elf_prog->vabase;
vaend = vastart + phdr->p_filesz;
if (!elf_prog->start || (vastart < elf_prog->start))
elf_prog->start = vastart;
Expand Down Expand Up @@ -756,7 +756,7 @@ static int elf_load_ptprotect(struct elf_prog *elf_prog, Elf *elf)
if (phdr.p_type != PT_LOAD)
continue;

vastart = phdr.p_paddr + (uintptr_t) elf_prog->vabase;
vastart = phdr.p_vaddr + (uintptr_t)elf_prog->vabase;
vaend = vastart + phdr.p_memsz;
vastart = PAGE_ALIGN_DOWN(vastart);
vaend = PAGE_ALIGN_UP(vaend);
Expand Down

0 comments on commit e4c6aa7

Please sign in to comment.