1/*	$NetBSD: linux_exec.h,v 1.55 2021/11/26 08:56:28 ryo Exp $	*/
2
3/*-
4 * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Frank van der Linden and Eric Haszlakiewicz.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef _LINUX_EXEC_H
33#define _LINUX_EXEC_H
34
35#if defined(EXEC_AOUT)
36#include <sys/exec_aout.h>
37#endif
38
39#if defined(EXEC_ELF32) || defined(EXEC_ELF64)
40#include <sys/exec_elf.h>
41#endif
42
43#if defined(__i386__)
44#include <compat/linux/arch/i386/linux_exec.h>
45#elif defined(__m68k__)
46#include <compat/linux/arch/m68k/linux_exec.h>
47#elif defined(__alpha__)
48#include <compat/linux/arch/alpha/linux_exec.h>
49#elif defined(__powerpc__)
50#include <compat/linux/arch/powerpc/linux_exec.h>
51#elif defined(__mips__)
52#include <compat/linux/arch/mips/linux_exec.h>
53#elif defined(__aarch64__)
54#include <compat/linux/arch/aarch64/linux_exec.h>
55#elif defined(__arm__)
56#include <compat/linux/arch/arm/linux_exec.h>
57#elif defined(__amd64__)
58#include <compat/linux/arch/amd64/linux_exec.h>
59#endif
60
61
62/* Defines for a.out executables */
63#define LINUX_AOUT_HDR_SIZE (sizeof (struct exec))
64#define	LINUX_AOUT_AUX_ARGSIZ	8
65
66#define LINUX_N_MAGIC(ep)    ((ep)->a_midmag & 0xffff)
67#define LINUX_N_MACHTYPE(ep) (((ep)->a_midmag >> 16) & 0xff)
68
69#define LINUX_N_TXTOFF(x,m) \
70 ((m) == ZMAGIC ? 1024 : ((m) == QMAGIC ? 0 : sizeof (struct exec)))
71
72#define LINUX_N_DATOFF(x,m) (LINUX_N_TXTOFF(x,m) + (x).a_text)
73
74#define LINUX_N_TXTADDR(x,m) ((m) == QMAGIC ? PAGE_SIZE : 0)
75
76#define LINUX__N_SEGMENT_ROUND(x) (((x) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
77
78#define LINUX__N_TXTENDADDR(x,m) (LINUX_N_TXTADDR(x,m)+(x).a_text)
79
80#define LINUX_N_DATADDR(x,m) \
81    ((m)==OMAGIC? (LINUX__N_TXTENDADDR(x,m)) \
82     : (LINUX__N_SEGMENT_ROUND (LINUX__N_TXTENDADDR(x,m))))
83
84#define LINUX_N_BSSADDR(x,m) (LINUX_N_DATADDR(x,m) + (x).a_data)
85
86#ifndef LINUX_MACHDEP_ELF_COPYARGS
87/* Counted from linux_exec_elf32.c */
88#define LINUX_ELF_AUX_ENTRIES	14
89#endif
90
91/*
92 * From Linux's include/linux/elf.h
93 */
94#define LINUX_AT_UID		11	/* real uid */
95#define LINUX_AT_EUID		12	/* effective uid */
96#define LINUX_AT_GID		13	/* real gid */
97#define LINUX_AT_EGID		14	/* effective gid */
98#define LINUX_AT_PLATFORM	15	/* CPU string for optimizations */
99#define LINUX_AT_HWCAP		16	/* arch dependent CPU capabilities */
100#define LINUX_AT_CLKTCK		17	/* frequency times() increments */
101#define LINUX_AT_SECURE		23	/* secure mode boolean */
102#define LINUX_AT_RANDOM		25	/* address of 16 random bytes */
103#define LINUX_AT_SYSINFO	32	/* pointer to __kernel_vsyscall */
104#define LINUX_AT_SYSINFO_EHDR	33	/* pointer to ELF header */
105
106#define LINUX_RANDOM_BYTES	16	/* 16 bytes for AT_RANDOM */
107
108/*
109 * Emulation specific sysctls.
110 */
111#define EMUL_LINUX_KERN			1
112
113#define EMUL_LINUX_KERN_OSTYPE		1
114#define EMUL_LINUX_KERN_OSRELEASE	2
115#define EMUL_LINUX_KERN_VERSION		3
116
117#ifdef _KERNEL
118__BEGIN_DECLS
119extern struct emul emul_linux;
120
121int linux_sysctl(int *, u_int, void *, size_t *, void *, size_t,
122    struct lwp *);
123void linux_setregs(struct lwp *, struct exec_package *, vaddr_t);
124#ifdef EXEC_AOUT
125int exec_linux_aout_makecmds(struct lwp *, struct exec_package *);
126int linux_aout_copyargs(struct lwp *, struct exec_package *,
127    struct ps_strings *, char **, void *);
128#endif
129void linux_trapsignal(struct lwp *, ksiginfo_t *);
130int linux_usertrap(struct lwp *, vaddr_t, void *);
131int linux_lwp_setprivate(struct lwp *, void *);
132
133void linux_e_proc_exec(struct proc *, struct exec_package *);
134void linux_e_proc_fork(struct proc *, struct lwp *, int);
135void linux_e_proc_exit(struct proc *);
136void linux_e_lwp_fork(struct lwp *, struct lwp *);
137void linux_e_lwp_exit(struct lwp *);
138
139#ifdef EXEC_ELF32
140int linux_elf32_probe(struct lwp *, struct exec_package *, void *,
141    char *, vaddr_t *);
142int linux_elf32_copyargs(struct lwp *, struct exec_package *,
143    struct ps_strings *, char **, void *);
144int linux_elf32_signature(struct lwp *, struct exec_package *,
145        Elf32_Ehdr *, char *);
146#ifdef LINUX_GCC_SIGNATURE
147int linux_elf32_gcc_signature(struct lwp *l,
148        struct exec_package *, Elf32_Ehdr *);
149#endif
150#ifdef LINUX_DEBUGLINK_SIGNATURE
151int linux_elf32_debuglink_signature(struct lwp *l,
152        struct exec_package *, Elf32_Ehdr *);
153#endif
154#ifdef LINUX_ATEXIT_SIGNATURE
155int linux_elf32_atexit_signature(struct lwp *l,
156        struct exec_package *, Elf32_Ehdr *);
157#endif
158#ifdef LINUX_GO_RT0_SIGNATURE
159int linux_elf32_go_rt0_signature(struct lwp *l,
160        struct exec_package *, Elf32_Ehdr *);
161#endif
162#endif
163#ifdef EXEC_ELF64
164int linux_elf64_probe(struct lwp *, struct exec_package *, void *,
165    char *, vaddr_t *);
166int linux_elf64_copyargs(struct lwp *, struct exec_package *,
167    struct ps_strings *, char **, void *);
168int linux_elf64_signature(struct lwp *, struct exec_package *,
169        Elf64_Ehdr *, char *);
170#ifdef LINUX_GCC_SIGNATURE
171int linux_elf64_gcc_signature(struct lwp *l,
172        struct exec_package *, Elf64_Ehdr *);
173#endif
174#ifdef LINUX_DEBUGLINK_SIGNATURE
175int linux_elf64_debuglink_signature(struct lwp *l,
176        struct exec_package *, Elf64_Ehdr *);
177#endif
178#ifdef LINUX_ATEXIT_SIGNATURE
179int linux_elf64_atexit_signature(struct lwp *l,
180        struct exec_package *, Elf64_Ehdr *);
181#endif
182#ifdef LINUX_GO_RT0_SIGNATURE
183int linux_elf64_go_rt0_signature(struct lwp *l,
184        struct exec_package *, Elf64_Ehdr *);
185#endif
186#endif
187__END_DECLS
188#endif /* !_KERNEL */
189
190#endif /* !_LINUX_EXEC_H */
191