summaryrefslogtreecommitdiffstats
path: root/sys/compat/pecoff/imgact_pecoff.h
blob: 0da3a5604e30c6d73bea93e8fbee958a7daef9da (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
139
140
141
142
/* $NetBSD$	 */
/* $FreeBSD$	*/
/*
 * Copyright (c) 2000 Masaru OKI
 */

#ifndef _PECOFF_EXEC_H_
#define _PECOFF_EXEC_H_

struct pecoff_dos_filehdr {
	u_int16_t       d_magic;/* +0x00 'MZ' */
	u_int8_t        d_stub[0x3a];
	u_int32_t       d_peofs;/* +0x3c */
};

#define PECOFF_DOS_MAGIC 0x5a4d
#define PECOFF_DOS_HDR_SIZE (sizeof(struct pecoff_dos_filehdr))

#define DOS_BADMAG(dp) ((dp)->d_magic != PECOFF_DOS_MAGIC)

/*
 * COFF file header
 */

struct coff_filehdr {
	u_short         f_magic;/* magic number */
	u_short         f_nscns;/* # of sections */
	long            f_timdat;	/* timestamp */
	long            f_symptr;	/* file offset of symbol table */
	long            f_nsyms;/* # of symbol table entries */
	u_short         f_opthdr;	/* size of optional header */
	u_short         f_flags;/* flags */
};

/*
 * COFF system header
 */

struct coff_aouthdr {
	short           a_magic;
	short           a_vstamp;
	long            a_tsize;
	long            a_dsize;
	long            a_bsize;
	long            a_entry;
	long            a_tstart;
	long            a_dstart;
};

/* magic */
#define COFF_OMAGIC	0407	/* text not write-protected; data seg is
				 * contiguous with text */
#define COFF_NMAGIC	0410	/* text is write-protected; data starts at
				 * next seg following text */
#define COFF_ZMAGIC	0413	/* text and data segs are aligned for direct
				 * paging */
#define COFF_SMAGIC	0443	/* shared lib */

struct pecoff_imghdr {
	long            i_vaddr;
	long            i_size;
};

struct pecoff_opthdr {
	long            w_base;
	long            w_salign;
	long            w_falign;
	long            w_osvers;
	long            w_imgvers;
	long            w_subvers;
	long            w_rsvd;
	long            w_imgsize;
	long            w_hdrsize;
	long            w_chksum;
	u_short         w_subsys;
	u_short         w_dllflags;
	long            w_ssize;
	long            w_cssize;
	long            w_hsize;
	long            w_chsize;
	long            w_lflag;
	long            w_nimghdr;
	struct pecoff_imghdr w_imghdr[16];
};

/*
 * COFF section header
 */

struct coff_scnhdr {
	char            s_name[8];
	long            s_paddr;
	long            s_vaddr;
	long            s_size;
	long            s_scnptr;
	long            s_relptr;
	long            s_lnnoptr;
	u_short         s_nreloc;
	u_short         s_nlnno;
	long            s_flags;
};

/* s_flags */
#define COFF_STYP_REG		0x00
#define COFF_STYP_DSECT		0x01
#define COFF_STYP_NOLOAD	0x02
#define COFF_STYP_GROUP		0x04
#define COFF_STYP_PAD		0x08
#define COFF_STYP_COPY		0x10
#define COFF_STYP_TEXT		0x20
#define COFF_STYP_DATA		0x40
#define COFF_STYP_BSS		0x80
#define COFF_STYP_INFO		0x200
#define COFF_STYP_OVER		0x400
#define COFF_STYP_SHLIB		0x800
/* s_flags for PE */
#define COFF_STYP_DISCARD	0x2000000
#define COFF_STYP_EXEC		0x20000000
#define COFF_STYP_READ		0x40000000
#define COFF_STYP_WRITE		0x80000000

struct pecoff_args {
	u_long          a_base;
	u_long          a_entry;
	u_long          a_end;
	u_long          a_subsystem;
	struct pecoff_imghdr a_imghdr[16];
	u_long          a_ldbase;
	u_long          a_ldexport;
};

#define COFF_LDPGSZ 4096	
#define COFF_ALIGN(a) ((a) & ~(COFF_LDPGSZ - 1))
#define COFF_ROUND(a) COFF_ALIGN((a) + COFF_LDPGSZ - 1)

#define COFF_HDR_SIZE \
	(sizeof(struct coff_filehdr) + sizeof(struct coff_aouthdr))

#define PECOFF_HDR_SIZE (COFF_HDR_SIZE + sizeof(struct pecoff_opthdr))


#endif
OpenPOWER on IntegriCloud