/* * Copy arguments onto the stack in the normal way, but add some * extra information in case of dynamic binding. */ int linux32_elf32_copyargs(struct lwp *l, struct exec_package *pack, struct ps_strings *arginfo, char **stackp, void *argp) { Aux32Info ai[LINUX32_ELF_AUX_ENTRIES], *a; uint32_t randbytes[4]; struct elf_args *ap; struct vattr *vap; size_t len; int error; if ((error = netbsd32_copyargs(l, pack, arginfo, stackp, argp)) != 0) return error; a = ai; memset(ai, 0, sizeof(ai)); /* * Push extra arguments on the stack needed by dynamically * linked binaries and static binaries as well. */ a->a_type = AT_PAGESZ; a->a_v = PAGE_SIZE; a++; if ((ap = (struct elf_args *)pack->ep_emul_arg)) { a->a_type = AT_PHDR; a->a_v = ap->arg_phaddr; a++; a->a_type = AT_PHENT; a->a_v = ap->arg_phentsize; a++; a->a_type = AT_PHNUM; a->a_v = ap->arg_phnum; a++; a->a_type = AT_BASE; a->a_v = ap->arg_interp; a++; a->a_type = AT_FLAGS; a->a_v = 0; a++; a->a_type = AT_ENTRY; a->a_v = ap->arg_entry; a++; exec_free_emul_arg(pack); } /* Linux-specific items */ a->a_type = LINUX_AT_CLKTCK; a->a_v = hz; a++; vap = pack->ep_vap; a->a_type = LINUX_AT_UID; a->a_v = kauth_cred_getuid(l->l_cred); a++; a->a_type = LINUX_AT_EUID; a->a_v = ((vap->va_mode & S_ISUID) ? vap->va_uid : kauth_cred_geteuid(l->l_cred)); a++; a->a_type = LINUX_AT_GID; a->a_v = kauth_cred_getgid(l->l_cred); a++; a->a_type = LINUX_AT_EGID; a->a_v = ((vap->va_mode & S_ISGID) ? vap->va_gid : kauth_cred_getegid(l->l_cred)); a++; a->a_type = LINUX_AT_SECURE; a->a_v = 0; a++; a->a_type = LINUX_AT_RANDOM; a->a_v = NETBSD32PTR32I(*stackp); a++; #if 0 /* XXX: increase LINUX32_ELF_AUX_ENTRIES if we enable those things */ a->a_type = LINUX_AT_SYSINFO; a->a_v = NETBSD32PTR32I(&esdp->kernel_vsyscall[0]); a++; a->a_type = LINUX_AT_SYSINFO_EHDR; a->a_v = NETBSD32PTR32I(&esdp->elfhdr); a++; a->a_type = LINUX_AT_HWCAP; a->a_v = LINUX32_CPUCAP; a++; a->a_type = LINUX_AT_PLATFORM; a->a_v = NETBSD32PTR32I(&esdp->hw_platform[0]); a++; #endif a->a_type = AT_NULL; a->a_v = 0; a++; randbytes[0] = cprng_strong32(); randbytes[1] = cprng_strong32(); randbytes[2] = cprng_strong32(); randbytes[3] = cprng_strong32(); len = sizeof(randbytes); if ((error = copyout(randbytes, *stackp, len)) != 0) return error; *stackp += len; #if 0 memcpy(esd.kernel_vsyscall, linux32_kernel_vsyscall, sizeof(linux32_kernel_vsyscall)); memcpy(&esd.elfhdr, eh, sizeof(*eh)); strcpy(esd.hw_platform, LINUX32_PLATFORM); /* * Copy out the ELF auxiliary table and hw platform name */ if ((error = copyout(&esd, esdp, sizeof(esd))) != 0) return error; *stackp += sizeof(esd); #endif len = (a - ai) * sizeof(Aux32Info); KASSERT(len <= LINUX32_ELF_AUX_ENTRIES * sizeof(Aux32Info)); if ((error = copyout(ai, *stackp, len)) != 0) return error; *stackp += len; return 0; }
int svr4_32_copyargs(struct lwp *l, struct exec_package *pack, struct ps_strings *arginfo, char **stackp, void *argp) { size_t len; AuxInfo ai[SVR4_32_AUX_ARGSIZ], *a; struct elf_args *ap; int error; if ((error = netbsd32_copyargs(l, pack, arginfo, stackp, argp)) != 0) return error; a = ai; memset(ai, 0, sizeof(ai)); /* * Push extra arguments on the stack needed by dynamically * linked binaries */ if ((ap = (struct elf_args *)pack->ep_emul_arg)) { a->a_type = AT_PHDR; a->a_v = ap->arg_phaddr; a++; a->a_type = AT_PHENT; a->a_v = ap->arg_phentsize; a++; a->a_type = AT_PHNUM; a->a_v = ap->arg_phnum; a++; a->a_type = AT_PAGESZ; a->a_v = PAGE_SIZE; a++; a->a_type = AT_BASE; a->a_v = ap->arg_interp; a++; a->a_type = AT_ENTRY; a->a_v = ap->arg_entry; a++; if (sun_flags) { a->a_type = AT_FLAGS; a->a_v = sun_flags; a++; } exec_free_emul_arg(pack); } a->a_type = AT_NULL; a->a_v = 0; a++; len = (a - ai) * sizeof(AuxInfo); if ((error = copyout(ai, *stackp, len)) != 0) return error; *stackp += len; return 0; }
int svr4_32_copyargs(struct lwp *l, struct exec_package *pack, struct ps_strings *arginfo, char **stackp, void *argp) { size_t len; AuxInfo ai[SVR4_32_AUX_ARGSIZ], *a, *platform=NULL, *exec=NULL; struct elf_args *ap; extern char machine_model[]; int error; if ((error = netbsd32_copyargs(l, pack, arginfo, stackp, argp)) != 0) return error; a = ai; memset(ai, 0, sizeof(ai)); /* * Push extra arguments on the stack needed by dynamically * linked binaries */ if ((ap = (struct elf_args *)pack->ep_emul_arg)) { struct proc *p = curproc; /* XXXXX */ a->a_type = AT_SUN_PLATFORM; platform = a; /* Patch this later. */ a++; a->a_type = AT_SUN_EXECNAME; exec = a; /* Patch this later. */ a++; a->a_type = AT_PHDR; a->a_v = ap->arg_phaddr; a++; a->a_type = AT_PHENT; a->a_v = ap->arg_phentsize; a++; a->a_type = AT_PHNUM; a->a_v = ap->arg_phnum; a++; a->a_type = AT_ENTRY; a->a_v = ap->arg_entry; a++; a->a_type = AT_BASE; a->a_v = ap->arg_interp; a++; if (sun_flags) { a->a_type = AT_FLAGS; a->a_v = sun_flags; a++; } a->a_type = AT_PAGESZ; a->a_v = PAGE_SIZE; a++; a->a_type = AT_EUID; a->a_v = kauth_cred_geteuid(l->l_cred); a++; a->a_type = AT_RUID; a->a_v = kauth_cred_getuid(l->l_cred); a++; a->a_type = AT_EGID; a->a_v = kauth_cred_getegid(l->l_cred); a++; a->a_type = AT_RGID; a->a_v = kauth_cred_getgid(l->l_cred); a++; if (sun_hwcap) { a->a_type = AT_SUN_HWCAP; a->a_v = sun_hwcap; a++; } exec_free_emul_arg(pack); } a->a_type = AT_NULL; a->a_v = 0; a++; len = (a - ai) * sizeof(AuxInfo); if (platform) { char *ptr = (char *)a; const char *path = NULL; /* Copy out the platform name. */ platform->a_v = (u_long)(*stackp) + len; /* XXXX extremely inefficient.... */ strcpy(ptr, machine_model); ptr += strlen(machine_model) + 1; len += strlen(machine_model) + 1; if (exec) { path = pack->ep_resolvedname; /* Copy out the file we're executing. */ exec->a_v = (u_long)(*stackp) + len; strcpy(ptr, path); len += strlen(ptr)+1; } /* Round to 32-bits */ len = (len+7)&~0x7L; } if ((error = copyout(ai, *stackp, len)) != 0) return error; *stackp += len; return error; }
/* * Copy arguments onto the stack in the normal way, but add some * extra information in case of dynamic binding. */ int netbsd32_elf32_copyargs(struct lwp *l, struct exec_package *pack, struct ps_strings *arginfo, char **stackp, void *argp) { size_t len; AuxInfo ai[ELF_AUX_ENTRIES], *a; struct elf_args *ap; int error; if ((error = netbsd32_copyargs(l, pack, arginfo, stackp, argp)) != 0) return error; a = ai; /* * Push extra arguments on the stack needed by dynamically * linked binaries */ if ((ap = (struct elf_args *)pack->ep_emul_arg)) { a->a_type = AT_PHDR; a->a_v = ap->arg_phaddr; a++; a->a_type = AT_PHENT; a->a_v = ap->arg_phentsize; a++; a->a_type = AT_PHNUM; a->a_v = ap->arg_phnum; a++; a->a_type = AT_PAGESZ; a->a_v = PAGE_SIZE; a++; a->a_type = AT_BASE; a->a_v = ap->arg_interp; a++; a->a_type = AT_FLAGS; a->a_v = 0; a++; a->a_type = AT_ENTRY; a->a_v = ap->arg_entry; a++; a->a_type = AT_EUID; a->a_v = kauth_cred_geteuid(l->l_cred); a++; a->a_type = AT_RUID; a->a_v = kauth_cred_getuid(l->l_cred); a++; a->a_type = AT_EGID; a->a_v = kauth_cred_getegid(l->l_cred); a++; a->a_type = AT_RGID; a->a_v = kauth_cred_getgid(l->l_cred); a++; exec_free_emul_arg(pack); } a->a_type = AT_NULL; a->a_v = 0; a++; len = (a - ai) * sizeof(AuxInfo); if ((error = copyout(ai, *stackp, len)) != 0) return error; *stackp += len; return 0; }