pack
_asr_pack_init(struct asr_pack *pack, char *buf, size_t len)
pack->buf = buf;
pack->len = len;
pack->offset = 0;
pack->err = 0;
__pragma(pack(push, 1)) \
__pragma(pack(pop))
packed_init(struct packed *pack, char *data, size_t len)
pack->data = data;
pack->len = len;
pack->offset = 0;
pack->err = NULL;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tfp->tf_regs[FRAME_PC] = pack->ep_entry & ~3;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_rip = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_usr_lr = pack->ep_entry;
tf->tf_pc = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
if (pack->ep_flags & EXEC_NOBTCFI)
tf->tf_lr = pack->ep_entry;
tf->tf_elr = pack->ep_entry; /* ??? */
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_iioq_head = pack->ep_entry | HPPA_PC_PRIV_USER;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_eip = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_exip = (pack->ep_entry & XIP_ADDR) + 4;
tf->tf_snip = ((pack->ep_entry + 8) & FIP_ADDR) | FIP_V;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->srr0 = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->pc = pack->ep_entry & ~3;
tf->t9 = pack->ep_entry & ~3; /* abicall req */
exec_md_map(struct proc *p, struct exec_package *pack)
setregs(struct proc *p, struct exec_package *pack, u_long stack,
frame->fixreg[6] = (register_t)pack->ep_auxinfo;
frame->fixreg[12] = pack->ep_entry;
frame->srr0 = pack->ep_entry;
DECLARE_INSN(pack, MATCH_PACK, MASK_PACK)
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_ra = pack->ep_entry;
tf->tf_sepc = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
tf->tf_spc = pack->ep_entry;
setregs(struct proc *p, struct exec_package *pack, u_long stack,
Elf_Ehdr *eh = pack->ep_hdr;
tf->tf_pc = pack->ep_entry & ~3;
const struct ixl_hmc_pack *pack = &packing[i];
unsigned int offset = pack->lsb / 8;
unsigned int align = pack->lsb % 8;
const uint8_t *in = src + pack->offset;
int width = pack->width;
struct exec_package pack;
pack.ep_name = (char *)SCARG(uap, path);
pack.ep_hdr = malloc(exec_maxhdrsz, M_EXEC, M_WAITOK);
pack.ep_hdrlen = exec_maxhdrsz;
pack.ep_hdrvalid = 0;
pack.ep_ndp = &nid;
pack.ep_interp = NULL;
pack.ep_args = NULL;
pack.ep_auxinfo = NULL;
VMCMDSET_INIT(&pack.ep_vmcmds);
pack.ep_vap = &attr;
pack.ep_flags = 0;
pack.ep_pins = NULL;
pack.ep_npins = 0;
if ((error = check_exec(p, &pack)) != 0) {
if (pack.ep_flags & EXEC_HASARGL) {
for(; pack.ep_fa[argc] != NULL; argc++) {
len = strlcpy(dp, pack.ep_fa[argc], dstsize);
if (pack.ep_fa[argc+1] != NULL)
free(pack.ep_fa[argc], M_EXEC, len);
free(pack.ep_fa[argc], M_EXEC, MAXPATHLEN);
free(pack.ep_fa, M_EXEC, 4 * sizeof(char *));
pack.ep_flags &= ~EXEC_HASARGL;
if (pack.ep_flags & EXEC_SKIPARG)
if (len > pack.ep_ssize) { /* in effect, compare to initial limit */
pack.ep_ssize = len; /* maybe should go elsewhere, but... */
vm->vm_taddr = (char *)trunc_page(pack.ep_taddr);
vm->vm_tsize = atop(round_page(pack.ep_taddr + pack.ep_tsize) -
trunc_page(pack.ep_taddr));
vm->vm_daddr = (char *)trunc_page(pack.ep_daddr);
vm->vm_dsize = atop(round_page(pack.ep_daddr + pack.ep_dsize) -
trunc_page(pack.ep_daddr));
vm->vm_ssize = atop(round_page(pack.ep_ssize));
vm->vm_maxsaddr = (char *)pack.ep_maxsaddr;
vm->vm_minsaddr = (char *)pack.ep_minsaddr;
if (pack.ep_vmcmds.evs_used == 0)
error = exec_process_vmcmds(p, &pack);
if (!copyargs(&pack, &arginfo, stack, argp))
pr->ps_auxinfo = (vaddr_t)pack.ep_auxinfo;
if (pack.ep_npins) {
pr->ps_pin.pn_start = pack.ep_pinstart;
pr->ps_pin.pn_end = pack.ep_pinend;
pr->ps_pin.pn_pins = pack.ep_pins;
pack.ep_pins = NULL;
pr->ps_pin.pn_npins = pack.ep_npins;
vref(pack.ep_vp);
pr->ps_textvp = pack.ep_vp;
if (pack.ep_flags & EXEC_NOBTCFI)
if (pack.ep_flags & EXEC_PROFILE)
if (pack.ep_flags & EXEC_WXNEEDED)
vn_close(pack.ep_vp, FREAD, cred, p);
if (exec_elf_fixup(p, &pack) != 0)
setregs(p, &pack, (u_long)stack + slen, &arginfo);
setregs(p, &pack, (u_long)stack, &arginfo);
if (exec_md_map(p, &pack))
free(pack.ep_hdr, M_EXEC, pack.ep_hdrlen);
if ((pack.ep_flags & EXEC_HASFD) && pack.ep_fd < 255)
p->p_descfd = pack.ep_fd;
kill_vmcmds(&pack.ep_vmcmds);
if (pack.ep_flags & EXEC_HASFD) {
pack.ep_flags &= ~EXEC_HASFD;
(void) fdrelease(p, pack.ep_fd);
if (pack.ep_interp != NULL)
pool_put(&namei_pool, pack.ep_interp);
free(pack.ep_args, M_TEMP, sizeof *pack.ep_args);
free(pack.ep_pins, M_PINSYSCALL, pack.ep_npins * sizeof(u_int));
vn_close(pack.ep_vp, FREAD, cred, p);
free(pack.ep_hdr, M_EXEC, pack.ep_hdrlen);
if (pack.ep_interp != NULL)
pool_put(&namei_pool, pack.ep_interp);
free(pack.ep_args, M_TEMP, sizeof *pack.ep_args);
vn_close(pack.ep_vp, FREAD, cred, p);
free(pack.ep_hdr, M_EXEC, pack.ep_hdrlen);
copyargs(struct exec_package *pack, struct ps_strings *arginfo, void *stack,
if (pack->ep_args != NULL)
pack->ep_auxinfo = cpp;
void pack(void);
pack();
int pack = 0;
pack++;
if (pack)
int pack = 0;
pack++;
if (pack)
struct unpack pack;
unpack_init(&pack, ar->ar_data, ar->ar_datalen);
unpack_header(&pack, &h);
unpack_query(&pack, &q);
unpack_rr(&pack, &rr);
struct unpack pack;
unpack_init(&pack, ar->ar_data, ar->ar_datalen);
unpack_header(&pack, &h);
unpack_query(&pack, &q);
unpack_rr(&pack, &rr);
struct unpack pack;
unpack_init(&pack, ar->ar_data, ar->ar_datalen);
unpack_header(&pack, &h);
unpack_query(&pack, &q);
unpack_rr(&pack, &rr);