xref: /freebsd/sys/sys/imgact_aout.h (revision 29363fb446372cb3f10bc98664e9767c53fbb457)
124881d11SDavid Greenman /*-
2*51369649SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3*51369649SPedro F. Giffuni  *
424881d11SDavid Greenman  * Copyright (c) 1992, 1993
524881d11SDavid Greenman  *	The Regents of the University of California.  All rights reserved.
624881d11SDavid Greenman  *
724881d11SDavid Greenman  * Redistribution and use in source and binary forms, with or without
824881d11SDavid Greenman  * modification, are permitted provided that the following conditions
924881d11SDavid Greenman  * are met:
1024881d11SDavid Greenman  * 1. Redistributions of source code must retain the above copyright
1124881d11SDavid Greenman  *    notice, this list of conditions and the following disclaimer.
1224881d11SDavid Greenman  * 2. Redistributions in binary form must reproduce the above copyright
1324881d11SDavid Greenman  *    notice, this list of conditions and the following disclaimer in the
1424881d11SDavid Greenman  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
1624881d11SDavid Greenman  *    may be used to endorse or promote products derived from this software
1724881d11SDavid Greenman  *    without specific prior written permission.
1824881d11SDavid Greenman  *
1924881d11SDavid Greenman  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2024881d11SDavid Greenman  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2124881d11SDavid Greenman  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2224881d11SDavid Greenman  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2324881d11SDavid Greenman  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2424881d11SDavid Greenman  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2524881d11SDavid Greenman  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2624881d11SDavid Greenman  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2724881d11SDavid Greenman  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2824881d11SDavid Greenman  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2924881d11SDavid Greenman  * SUCH DAMAGE.
3024881d11SDavid Greenman  */
3124881d11SDavid Greenman 
3224881d11SDavid Greenman #ifndef	_IMGACT_AOUT_H_
3324881d11SDavid Greenman #define	_IMGACT_AOUT_H_
3424881d11SDavid Greenman 
3524881d11SDavid Greenman #define N_GETMAGIC(ex) \
3649a39408SDavid E. O'Brien 	( le32toh((ex).a_midmag) & 0xffff )
3724881d11SDavid Greenman #define N_GETMID(ex) \
3824881d11SDavid Greenman 	( (N_GETMAGIC_NET(ex) == ZMAGIC) ? N_GETMID_NET(ex) : \
3924881d11SDavid Greenman 	((ex).a_midmag >> 16) & 0x03ff )
4024881d11SDavid Greenman #define N_GETFLAG(ex) \
4124881d11SDavid Greenman 	( (N_GETMAGIC_NET(ex) == ZMAGIC) ? N_GETFLAG_NET(ex) : \
4224881d11SDavid Greenman 	((ex).a_midmag >> 26) & 0x3f )
4324881d11SDavid Greenman #define N_SETMAGIC(ex,mag,mid,flag) \
4449a39408SDavid E. O'Brien 	( (ex).a_midmag = htole32((((flag) & 0x3f) <<26) | \
4549a39408SDavid E. O'Brien 	(((mid) & 0x03ff) << 16) | \
4649a39408SDavid E. O'Brien 	((mag) & 0xffff)) )
4724881d11SDavid Greenman 
4824881d11SDavid Greenman #define N_GETMAGIC_NET(ex) \
4990ce56c2SThomas Moestl 	(ntohl((ex).a_midmag) & 0xffff)
5024881d11SDavid Greenman #define N_GETMID_NET(ex) \
5190ce56c2SThomas Moestl 	((ntohl((ex).a_midmag) >> 16) & 0x03ff)
5224881d11SDavid Greenman #define N_GETFLAG_NET(ex) \
5390ce56c2SThomas Moestl 	((ntohl((ex).a_midmag) >> 26) & 0x3f)
5424881d11SDavid Greenman #define N_SETMAGIC_NET(ex,mag,mid,flag) \
5590ce56c2SThomas Moestl 	( (ex).a_midmag = htonl( (((flag)&0x3f)<<26) | (((mid)&0x03ff)<<16) \
56fd8e4ebcSMike Barcroft 	| (((mag)&0xffff)) ) )
5724881d11SDavid Greenman 
5824881d11SDavid Greenman #define N_ALIGN(ex,x) \
5924881d11SDavid Greenman 	(N_GETMAGIC(ex) == ZMAGIC || N_GETMAGIC(ex) == QMAGIC || \
6024881d11SDavid Greenman 	 N_GETMAGIC_NET(ex) == ZMAGIC || N_GETMAGIC_NET(ex) == QMAGIC ? \
6149a39408SDavid E. O'Brien 	 ((x) + __LDPGSZ - 1) & ~(uint32_t)(__LDPGSZ - 1) : (x))
6224881d11SDavid Greenman 
6324881d11SDavid Greenman /* Valid magic number check. */
6424881d11SDavid Greenman #define	N_BADMAG(ex) \
6524881d11SDavid Greenman 	(N_GETMAGIC(ex) != OMAGIC && N_GETMAGIC(ex) != NMAGIC && \
6624881d11SDavid Greenman 	 N_GETMAGIC(ex) != ZMAGIC && N_GETMAGIC(ex) != QMAGIC && \
6724881d11SDavid Greenman 	 N_GETMAGIC_NET(ex) != OMAGIC && N_GETMAGIC_NET(ex) != NMAGIC && \
6824881d11SDavid Greenman 	 N_GETMAGIC_NET(ex) != ZMAGIC && N_GETMAGIC_NET(ex) != QMAGIC)
6924881d11SDavid Greenman 
7024881d11SDavid Greenman /* Address of the bottom of the text segment. */
71ea354351SBruce Evans /*
72ea354351SBruce Evans  * This can not be done right.  Abuse a_entry in some cases to handle kernels.
73ea354351SBruce Evans  */
7424881d11SDavid Greenman #define N_TXTADDR(ex) \
7524881d11SDavid Greenman 	((N_GETMAGIC(ex) == OMAGIC || N_GETMAGIC(ex) == NMAGIC || \
76ea354351SBruce Evans 	N_GETMAGIC(ex) == ZMAGIC) ? \
7749a39408SDavid E. O'Brien 	(le32toh((ex).a_entry) < le32toh((ex).a_text) ? 0 : \
7849a39408SDavid E. O'Brien 	le32toh((ex).a_entry) & ~__LDPGSZ) : __LDPGSZ)
7924881d11SDavid Greenman 
8024881d11SDavid Greenman /* Address of the bottom of the data segment. */
8124881d11SDavid Greenman #define N_DATADDR(ex) \
8249a39408SDavid E. O'Brien 	N_ALIGN(ex, N_TXTADDR(ex) + le32toh((ex).a_text))
8324881d11SDavid Greenman 
8424881d11SDavid Greenman /* Text segment offset. */
8524881d11SDavid Greenman #define	N_TXTOFF(ex) \
8624881d11SDavid Greenman 	(N_GETMAGIC(ex) == ZMAGIC ? __LDPGSZ : (N_GETMAGIC(ex) == QMAGIC || \
8724881d11SDavid Greenman 	N_GETMAGIC_NET(ex) == ZMAGIC) ? 0 : sizeof(struct exec))
8824881d11SDavid Greenman 
8924881d11SDavid Greenman /* Data segment offset. */
9024881d11SDavid Greenman #define	N_DATOFF(ex) \
9149a39408SDavid E. O'Brien 	N_ALIGN(ex, N_TXTOFF(ex) + le32toh((ex).a_text))
9224881d11SDavid Greenman 
9324881d11SDavid Greenman /* Relocation table offset. */
9424881d11SDavid Greenman #define N_RELOFF(ex) \
9549a39408SDavid E. O'Brien 	N_ALIGN(ex, N_DATOFF(ex) + le32toh((ex).a_data))
9624881d11SDavid Greenman 
9724881d11SDavid Greenman /* Symbol table offset. */
9824881d11SDavid Greenman #define N_SYMOFF(ex) \
9949a39408SDavid E. O'Brien 	(N_RELOFF(ex) + le32toh((ex).a_trsize) + le32toh((ex).a_drsize))
10024881d11SDavid Greenman 
10124881d11SDavid Greenman /* String table offset. */
10249a39408SDavid E. O'Brien #define	N_STROFF(ex) 	(N_SYMOFF(ex) + le32toh((ex).a_syms))
10324881d11SDavid Greenman 
10424881d11SDavid Greenman /*
10524881d11SDavid Greenman  * Header prepended to each a.out file.
10615e34306SMaxim Konovalov  * Only manipulate the a_midmag field via the
10760dc30aaSMaxim Konovalov  * N_SETMAGIC/N_GET{MAGIC,MID,FLAG} macros.
10824881d11SDavid Greenman  */
10924881d11SDavid Greenman 
11024881d11SDavid Greenman struct exec {
11149a39408SDavid E. O'Brien      uint32_t	a_midmag;	/* flags<<26 | mid<<16 | magic */
11249a39408SDavid E. O'Brien      uint32_t	a_text;		/* text segment size */
11349a39408SDavid E. O'Brien      uint32_t	a_data;		/* initialized data size */
11449a39408SDavid E. O'Brien      uint32_t	a_bss;		/* uninitialized data size */
11549a39408SDavid E. O'Brien      uint32_t	a_syms;		/* symbol table size */
11649a39408SDavid E. O'Brien      uint32_t	a_entry;	/* entry point */
11749a39408SDavid E. O'Brien      uint32_t	a_trsize;	/* text relocation size */
11849a39408SDavid E. O'Brien      uint32_t	a_drsize;	/* data relocation size */
11924881d11SDavid Greenman };
120acdb2ef4SWarner Losh #define a_magic a_midmag	/* Hack for emulators */
12124881d11SDavid Greenman 
12224881d11SDavid Greenman /* a_magic */
12324881d11SDavid Greenman #define	OMAGIC		0407	/* old impure format */
12424881d11SDavid Greenman #define	NMAGIC		0410	/* read-only text */
12524881d11SDavid Greenman #define	ZMAGIC		0413	/* demand load format */
12624881d11SDavid Greenman #define QMAGIC          0314    /* "compact" demand load format */
12724881d11SDavid Greenman 
12824881d11SDavid Greenman /* a_mid */
12924881d11SDavid Greenman #define	MID_ZERO	0	/* unknown - implementation dependent */
13024881d11SDavid Greenman #define	MID_SUN010	1	/* sun 68010/68020 binary */
13124881d11SDavid Greenman #define	MID_SUN020	2	/* sun 68020-only binary */
13224881d11SDavid Greenman #define MID_I386	134	/* i386 BSD binary */
13324881d11SDavid Greenman #define MID_SPARC	138	/* sparc */
13474a90a09SOlivier Houchard #define MID_ARM6	143	/* ARM6 */
13524881d11SDavid Greenman #define	MID_HP200	200	/* hp200 (68010) BSD binary */
13624881d11SDavid Greenman #define	MID_HP300	300	/* hp300 (68020+68881) BSD binary */
13724881d11SDavid Greenman #define	MID_HPUX	0x20C	/* hp200/300 HP-UX binary */
13824881d11SDavid Greenman #define	MID_HPUX800     0x20B   /* hp800 HP-UX binary */
13924881d11SDavid Greenman 
14024881d11SDavid Greenman /*
14124881d11SDavid Greenman  * a_flags
14224881d11SDavid Greenman  */
1436c5e9bbdSMike Pritchard #define EX_PIC		0x10	/* contains position independent code */
14424881d11SDavid Greenman #define EX_DYNAMIC	0x20	/* contains run-time link-edit info */
14524881d11SDavid Greenman #define EX_DPMASK	0x30	/* mask for the above */
14624881d11SDavid Greenman 
147664a31e4SPeter Wemm #ifdef _KERNEL
148b40ce416SJulian Elischer struct thread;
149680f22fbSBruce Evans struct vnode;
15022d4b0fbSJohn Polstra 
151e7228204SAlfred Perlstein int	aout_coredump(struct thread *td, struct vnode *vp, off_t limit,
152e7228204SAlfred Perlstein     int flags);
153664a31e4SPeter Wemm #endif
15422d4b0fbSJohn Polstra 
15524881d11SDavid Greenman #endif /* !_IMGACT_AOUT_H_ */
156