1 /* $NetBSD: netbsd32_exec.h,v 1.30 2009/08/15 23:39:35 matt Exp $ */
4 * Copyright (c) 1998, 2001 Matthew R. Green
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #ifndef _NETBSD32_EXEC_H_
30 #define _NETBSD32_EXEC_H_
32 #include <compat/netbsd32/netbsd32.h>
35 #include <sys/exec_aout.h>
38 /* from <sys/exec_aout.h> */
40 * Header prepended to each a.out file.
41 * only manipulate the a_midmag field via the
42 * N_SETMAGIC/N_GET{MAGIC,MID,FLAG} macros below.
44 struct netbsd32_exec
{
45 netbsd32_u_long a_midmag
; /* htonl(flags<<26 | mid<<16 | magic) */
46 netbsd32_u_long a_text
; /* text segment size */
47 netbsd32_u_long a_data
; /* initialized data size */
48 netbsd32_u_long a_bss
; /* uninitialized data size */
49 netbsd32_u_long a_syms
; /* symbol table size */
50 netbsd32_u_long a_entry
; /* entry point */
51 netbsd32_u_long a_trsize
; /* text relocation size */
52 netbsd32_u_long a_drsize
; /* data relocation size */
55 extern struct emul emul_netbsd32
;
58 int netbsd32_exec_aout_prep_zmagic(struct lwp
*, struct exec_package
*);
59 int netbsd32_exec_aout_prep_nmagic(struct lwp
*, struct exec_package
*);
60 int netbsd32_exec_aout_prep_omagic(struct lwp
*, struct exec_package
*);
61 int exec_netbsd32_makecmds(struct lwp
*, struct exec_package
*);
64 int netbsd32_elf32_probe(struct lwp
*, struct exec_package
*, void *,
66 int netbsd32_elf32_probe_noteless(struct lwp
*, struct exec_package
*,
67 void *, char *, vaddr_t
*);
68 int netbsd32_elf32_copyargs(struct lwp
*, struct exec_package
*,
69 struct ps_strings
*, char **, void *);
70 #endif /* EXEC_ELF32 */
72 static __inline
int netbsd32_copyargs(struct lwp
*, struct exec_package
*,
73 struct ps_strings
*, char **, void *);
75 void netbsd32_setregs (struct lwp
*, struct exec_package
*, vaddr_t stack
);
76 int netbsd32_sigreturn (struct proc
*, void *, register_t
*);
77 void netbsd32_sendsig (const ksiginfo_t
*, const sigset_t
*);
79 extern char netbsd32_esigcode
[], netbsd32_sigcode
[];
82 * We need to copy out all pointers as 32-bit values.
85 netbsd32_copyargs(struct lwp
*l
, struct exec_package
*pack
,
86 struct ps_strings
*arginfo
, char **stackp
, void *argp
)
88 u_int32_t
*cpp
= (u_int32_t
*)*stackp
;
89 netbsd32_pointer_t dp
;
93 int argc
= arginfo
->ps_nargvstr
;
94 int envc
= arginfo
->ps_nenvstr
;
97 if ((error
= copyout(&argc
, cpp
++, sizeof(argc
))) != 0)
100 NETBSD32PTR32(dp
, cpp
+ argc
+ envc
+ 2 + pack
->ep_esch
->es_arglen
);
103 /* XXX don't copy them out, remap them! */
104 /* remember location of argv for later */
105 arginfo
->ps_argvstr
= (char **)(u_long
)cpp
;
107 for (; --argc
>= 0; sp
+= len
, NETBSD32PTR32PLUS(dp
, len
)) {
108 if ((error
= copyout(&dp
, cpp
++, sizeof(dp
))) != 0 ||
109 (error
= copyoutstr(sp
, NETBSD32PTR64(dp
),
110 ARG_MAX
, &len
)) != 0)
113 if ((error
= copyout(&nullp
, cpp
++, sizeof(nullp
))) != 0)
116 /* remember location of envp for later */
117 arginfo
->ps_envstr
= (char **)(u_long
)cpp
;
119 for (; --envc
>= 0; sp
+= len
, NETBSD32PTR32PLUS(dp
, len
)) {
120 if ((error
= copyout(&dp
, cpp
++, sizeof(dp
))) != 0 ||
121 (error
= copyoutstr(sp
, NETBSD32PTR64(dp
),
122 ARG_MAX
, &len
)) != 0)
125 if ((error
= copyout(&nullp
, cpp
++, sizeof(nullp
))) != 0)
128 *stackp
= (char *)cpp
;
132 #endif /* !_NETBSD32_EXEC_H_ */