The branch main has been updated by jrtc27:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=659a0041dd06355704f1bce0c5d7cbcb0b32c0a4

commit 659a0041dd06355704f1bce0c5d7cbcb0b32c0a4
Author:     Jessica Clarke <jrt...@freebsd.org>
AuthorDate: 2023-05-30 23:15:43 +0000
Commit:     Jessica Clarke <jrt...@freebsd.org>
CommitDate: 2023-05-30 23:15:43 +0000

    imgact: Make et_dyn_addr part of image_params
    
    This already gets passed around between various imgact_elf functions, so
    moving it removes an argument from all those places. A future commit
    will make use of this for hwpmc, though, to provide the load base for
    PIEs, which currently isn't available to tools like pmcstat.
    
    Reviewed by:    kib, markj, jhb
    Differential Revision:  https://reviews.freebsd.org/D39594
---
 sys/kern/imgact_elf.c | 35 +++++++++++++++++------------------
 sys/sys/imgact.h      |  1 +
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index e81810c33b33..35975af565fc 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -924,7 +924,7 @@ __CONCAT(rnd_, __elfN(base))(vm_map_t map, u_long minv, 
u_long maxv,
 
 static int
 __elfN(enforce_limits)(struct image_params *imgp, const Elf_Ehdr *hdr,
-    const Elf_Phdr *phdr, u_long et_dyn_addr)
+    const Elf_Phdr *phdr)
 {
        struct vmspace *vmspace;
        const char *err_str;
@@ -939,9 +939,9 @@ __elfN(enforce_limits)(struct image_params *imgp, const 
Elf_Ehdr *hdr,
                if (phdr[i].p_type != PT_LOAD || phdr[i].p_memsz == 0)
                        continue;
 
-               seg_addr = trunc_page(phdr[i].p_vaddr + et_dyn_addr);
+               seg_addr = trunc_page(phdr[i].p_vaddr + imgp->et_dyn_addr);
                seg_size = round_page(phdr[i].p_memsz +
-                   phdr[i].p_vaddr + et_dyn_addr - seg_addr);
+                   phdr[i].p_vaddr + imgp->et_dyn_addr - seg_addr);
 
                /*
                 * Make the largest executable segment the official
@@ -1106,7 +1106,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
        char *interp;
        Elf_Brandinfo *brand_info;
        struct sysentvec *sv;
-       u_long addr, baddr, et_dyn_addr, entry, proghdr;
+       u_long addr, baddr, entry, proghdr;
        u_long maxalign, maxsalign, mapsz, maxv, maxv1, anon_loc;
        uint32_t fctl0;
        int32_t osrel;
@@ -1235,7 +1235,6 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
                goto ret;
        }
        sv = brand_info->sysvec;
-       et_dyn_addr = 0;
        if (hdr->e_type == ET_DYN) {
                if ((brand_info->flags & BI_CAN_EXEC_DYN) == 0) {
                        uprintf("Cannot execute shared object\n");
@@ -1249,13 +1248,13 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params 
*imgp)
                if (baddr == 0) {
                        if ((sv->sv_flags & SV_ASLR) == 0 ||
                            (fctl0 & NT_FREEBSD_FCTL_ASLR_DISABLE) != 0)
-                               et_dyn_addr = __elfN(pie_base);
+                               imgp->et_dyn_addr = __elfN(pie_base);
                        else if ((__elfN(pie_aslr_enabled) &&
                            (imgp->proc->p_flag2 & P2_ASLR_DISABLE) == 0) ||
                            (imgp->proc->p_flag2 & P2_ASLR_ENABLE) != 0)
-                               et_dyn_addr = ET_DYN_ADDR_RAND;
+                               imgp->et_dyn_addr = ET_DYN_ADDR_RAND;
                        else
-                               et_dyn_addr = __elfN(pie_base);
+                               imgp->et_dyn_addr = __elfN(pie_base);
                }
        }
 
@@ -1288,11 +1287,11 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params 
*imgp)
        if ((sv->sv_flags & SV_ASLR) == 0 ||
            (imgp->proc->p_flag2 & P2_ASLR_DISABLE) != 0 ||
            (fctl0 & NT_FREEBSD_FCTL_ASLR_DISABLE) != 0) {
-               KASSERT(et_dyn_addr != ET_DYN_ADDR_RAND,
-                   ("et_dyn_addr == RAND and !ASLR"));
+               KASSERT(imgp->et_dyn_addr != ET_DYN_ADDR_RAND,
+                   ("imgp->et_dyn_addr == RAND and !ASLR"));
        } else if ((imgp->proc->p_flag2 & P2_ASLR_ENABLE) != 0 ||
            (__elfN(aslr_enabled) && hdr->e_type == ET_EXEC) ||
-           et_dyn_addr == ET_DYN_ADDR_RAND) {
+           imgp->et_dyn_addr == ET_DYN_ADDR_RAND) {
                imgp->map_flags |= MAP_ASLR;
                /*
                 * If user does not care about sbrk, utilize the bss
@@ -1329,24 +1328,24 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params 
*imgp)
                error = ENOEXEC;
        }
 
-       if (error == 0 && et_dyn_addr == ET_DYN_ADDR_RAND) {
+       if (error == 0 && imgp->et_dyn_addr == ET_DYN_ADDR_RAND) {
                KASSERT((map->flags & MAP_ASLR) != 0,
                    ("ET_DYN_ADDR_RAND but !MAP_ASLR"));
                error = __CONCAT(rnd_, __elfN(base))(map,
                    vm_map_min(map) + mapsz + lim_max(td, RLIMIT_DATA),
                    /* reserve half of the address space to interpreter */
-                   maxv / 2, maxalign, &et_dyn_addr);
+                   maxv / 2, maxalign, &imgp->et_dyn_addr);
        }
 
        vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
        if (error != 0)
                goto ret;
 
-       error = __elfN(load_sections)(imgp, hdr, phdr, et_dyn_addr, NULL);
+       error = __elfN(load_sections)(imgp, hdr, phdr, imgp->et_dyn_addr, NULL);
        if (error != 0)
                goto ret;
 
-       error = __elfN(enforce_limits)(imgp, hdr, phdr, et_dyn_addr);
+       error = __elfN(enforce_limits)(imgp, hdr, phdr);
        if (error != 0)
                goto ret;
 
@@ -1370,7 +1369,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
                map->anon_loc = addr;
        }
 
-       entry = (u_long)hdr->e_entry + et_dyn_addr;
+       entry = (u_long)hdr->e_entry + imgp->et_dyn_addr;
        imgp->entry_addr = entry;
 
        if (interp != NULL) {
@@ -1389,7 +1388,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
                if (error != 0)
                        goto ret;
        } else
-               addr = et_dyn_addr;
+               addr = imgp->et_dyn_addr;
 
        error = exec_map_stack(imgp);
        if (error != 0)
@@ -1405,7 +1404,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
                vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
        }
        elf_auxargs->execfd = -1;
-       elf_auxargs->phdr = proghdr + et_dyn_addr;
+       elf_auxargs->phdr = proghdr + imgp->et_dyn_addr;
        elf_auxargs->phent = hdr->e_phentsize;
        elf_auxargs->phnum = hdr->e_phnum;
        elf_auxargs->pagesz = PAGE_SIZE;
diff --git a/sys/sys/imgact.h b/sys/sys/imgact.h
index 963f53aa387b..7f3219a972fe 100644
--- a/sys/sys/imgact.h
+++ b/sys/sys/imgact.h
@@ -66,6 +66,7 @@ struct image_params {
        const char *image_header;       /* header of file to exec */
        unsigned long entry_addr;       /* entry address of target executable */
        unsigned long reloc_base;       /* load address of image */
+       unsigned long et_dyn_addr;      /* PIE load base */
        char *interpreter_name;         /* name of the interpreter */
        void *auxargs;                  /* ELF Auxinfo structure pointer */
        struct sf_buf *firstpage;       /* first page that we mapped */

Reply via email to