summaryrefslogtreecommitdiff
path: root/sys/compat/netbsd32/netbsd32_exec.h
blob: d79e49d6f11284410621b2dd1ff9dbc3d680f638 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*	$NetBSD: netbsd32_exec.h,v 1.34 2019/01/27 02:08:40 pgoyette Exp $	*/

/*
 * Copyright (c) 1998, 2001 Matthew R. Green
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef	_NETBSD32_EXEC_H_
#define	_NETBSD32_EXEC_H_

#include <compat/netbsd32/netbsd32.h>

#ifdef EXEC_AOUT
#include <sys/exec_aout.h>
#endif

/* from <sys/exec_aout.h> */
/*
 * Header prepended to each a.out file.
 * only manipulate the a_midmag field via the
 * N_SETMAGIC/N_GET{MAGIC,MID,FLAG} macros below.
 */
struct netbsd32_exec {
	netbsd32_u_long	a_midmag;	/* htonl(flags<<26 | mid<<16 | magic) */
	netbsd32_u_long	a_text;		/* text segment size */
	netbsd32_u_long	a_data;		/* initialized data size */
	netbsd32_u_long	a_bss;		/* uninitialized data size */
	netbsd32_u_long	a_syms;		/* symbol table size */
	netbsd32_u_long	a_entry;	/* entry point */
	netbsd32_u_long	a_trsize;	/* text relocation size */
	netbsd32_u_long	a_drsize;	/* data relocation size */
};

#ifdef EXEC_AOUT
int netbsd32_exec_aout_prep_zmagic(struct lwp *, struct exec_package *);
int netbsd32_exec_aout_prep_nmagic(struct lwp *, struct exec_package *);
int netbsd32_exec_aout_prep_omagic(struct lwp *, struct exec_package *);
int exec_netbsd32_makecmds(struct lwp *, struct exec_package *);
#endif
#ifdef EXEC_ELF32
int netbsd32_elf32_probe(struct lwp *, struct exec_package *, void *,
    char *, vaddr_t *);
int netbsd32_elf32_probe_noteless(struct lwp *, struct exec_package *,
    void *, char *, vaddr_t *);
int netbsd32_elf32_copyargs(struct lwp *, struct exec_package *,
    struct ps_strings *, char **, void *);
#endif /* EXEC_ELF32 */

static __inline int netbsd32_copyargs(struct lwp *, struct exec_package *,
    struct ps_strings *, char **, void *);

void netbsd32_setregs (struct lwp *, struct exec_package *, vaddr_t stack);
int netbsd32_sigreturn (struct proc *, void *, register_t *);
void netbsd32_sendsig (const ksiginfo_t *, const sigset_t *);

extern char netbsd32_esigcode[], netbsd32_sigcode[];

/*
 * We need to copy out all pointers as 32-bit values.
 */
static __inline int
netbsd32_copyargs(struct lwp *l, struct exec_package *pack,
		struct ps_strings *arginfo, char **stackp, void *argp)
{
	u_int32_t *cpp = (u_int32_t *)*stackp;
	netbsd32_pointer_t dp;
	u_int32_t nullp = 0;
	char *sp;
	size_t len;
	int argc = arginfo->ps_nargvstr;
	int envc = arginfo->ps_nenvstr;
	int error;

	NETBSD32PTR32(dp, (char *)(cpp +
	    1 +				/* int argc */
	    argc +			/* char *argv[] */
	    1 +				/* \0 */
	    envc +			/* char *env[] */
	    1) +			/* \0 */
	    pack->ep_esch->es_arglen);	/* auxinfo */
	sp = argp;

	if ((error = copyout(&argc, cpp++, sizeof(argc))) != 0)
		return error;

	/* XXX don't copy them out, remap them! */
	/* remember location of argv for later */
	arginfo->ps_argvstr = (char **)(u_long)cpp;

	for (; --argc >= 0; sp += len, NETBSD32PTR32PLUS(dp, len)) {
		if ((error = copyout(&dp, cpp++, sizeof(dp))) != 0)
			return error;
		if ((error = copyoutstr(sp, NETBSD32PTR64(dp),
		    ARG_MAX, &len)) != 0)
			return error;
	}
	if ((error = copyout(&nullp, cpp++, sizeof(nullp))) != 0)
		return error;

	/* remember location of envp for later */
	arginfo->ps_envstr = (char **)(u_long)cpp;

	for (; --envc >= 0; sp += len, NETBSD32PTR32PLUS(dp, len)) {
		if ((error = copyout(&dp, cpp++, sizeof(dp))) != 0)
			return error;
		if ((error = copyoutstr(sp, NETBSD32PTR64(dp),
		    ARG_MAX, &len)) != 0)
			return error;
	}
	if ((error = copyout(&nullp, cpp++, sizeof(nullp))) != 0)
		return error;

	*stackp = (char *)cpp;
	return 0;
}

#endif /* !_NETBSD32_EXEC_H_ */