1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 *
25 * Copyright 2020 Joyent, Inc.
26 */
27
28 /*
29 * Kernel Run-Time Linker/Loader private interfaces.
30 */
31
32 #ifndef _SYS_KOBJ_IMPL_H
33 #define _SYS_KOBJ_IMPL_H
34
35 #include <sys/kdi.h>
36 #include <sys/kobj.h>
37 #include <sys/varargs.h>
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 /*
44 * Boot/aux vector attributes.
45 */
46
47 #define BA_DYNAMIC 0
48 #define BA_PHDR 1
49 #define BA_PHNUM 2
50 #define BA_PHENT 3
51 #define BA_ENTRY 4
52 #define BA_PAGESZ 5
53 #define BA_LPAGESZ 6
54 #define BA_LDELF 7
55 #define BA_LDSHDR 8
56 #define BA_LDNAME 9
57 #define BA_BSS 10
58 #define BA_IFLUSH 11
59 #define BA_CPU 12
60 #define BA_MMU 13
61 #define BA_GOTADDR 14
62 #define BA_NEXTGOT 15
63 #define BA_NUM 16
64
65 typedef union {
66 unsigned long ba_val;
67 void *ba_ptr;
68 } val_t;
69
70 /*
71 * Segment info.
72 */
73 struct proginfo {
74 uint_t size;
75 uint_t align;
76 };
77
78 /*
79 * Implementation-specific flags.
80 */
81 #define KOBJ_EXEC 0x0004 /* executable (unix module) */
82 #define KOBJ_INTERP 0x0008 /* the interpreter module */
83 #define KOBJ_PRIM 0x0010 /* a primary kernel module */
84 #define KOBJ_RESOLVED 0x0020 /* fully resolved */
85 #define KOBJ_TNF_PROBE 0x0040 /* Contains TNF probe(s) */
86 #define KOBJ_RELOCATED 0x0080 /* relocation completed */
87 #define KOBJ_NOPARENTS 0x0200 /* nothing can depend on this module */
88 #define KOBJ_IGNMULDEF 0x0400 /* ignore dups during sym resolution */
89 #define KOBJ_NOKSYMS 0x0800 /* module's symbols don't go into ksyms */
90 #define KOBJ_EXPORTED 0x1000 /* ctf, syms copied to vmem */
91
92 /*
93 * kobj_notify_add() data notification structure
94 */
95 typedef void kobj_notify_f(uint_t, struct modctl *);
96
97 typedef struct kobj_notify_list {
98 kobj_notify_f *kn_func; /* notification func */
99 uint_t kn_type; /* notification type */
100 struct kobj_notify_list *kn_prev;
101 struct kobj_notify_list *kn_next;
102 } kobj_notify_list_t;
103
104 /*
105 * krtld can provide notification to external clients on the
106 * following events.
107 */
108 #define KOBJ_NOTIFY_MODLOADING 1 /* very early in module load */
109 #define KOBJ_NOTIFY_MODUNLOADING 2 /* before module unload */
110 #define KOBJ_NOTIFY_MODLOADED 3 /* after module load */
111 #define KOBJ_NOTIFY_MODUNLOADED 4 /* after module unload */
112 #define KOBJ_NOTIFY_MAX 4
113
114 #define ALIGN(x, a) ((a) == 0 ? (uintptr_t)(x) : \
115 (((uintptr_t)(x) + (uintptr_t)(a) - 1l) & ~((uintptr_t)(a) - 1l)))
116
117 #ifdef DEBUG
118 #define KOBJ_DEBUG
119 #endif
120
121 #ifdef KOBJ_DEBUG
122 /*
123 * Debugging flags.
124 */
125 #define D_DEBUG 0x001 /* general debugging */
126 #define D_SYMBOLS 0x002 /* debug symbols */
127 #define D_RELOCATIONS 0x004 /* debug relocations */
128 #define D_LOADING 0x008 /* section loading */
129
130 extern int kobj_debug; /* different than moddebug */
131 #endif
132
133 /*
134 * Flags for kobj memory allocation.
135 */
136 #define KM_WAIT 0x0 /* wait for it */
137 #define KM_NOWAIT 0x1 /* return immediately */
138
139 #define KM_TMP 0x1000 /* freed before kobj_init returns */
140 #define KM_SCRATCH 0x2000 /* not freed until kobj_sync */
141
142 #ifdef KOBJ_OVERRIDES
143 /*
144 * Until the kernel is fully linked, all code running in the
145 * context of krtld/kobj using bcopy or bzero must be directed
146 * to the kobj equivalents. All (ok, most) references to bcopy
147 * or bzero are thus so vectored.
148 */
149 #define bcopy(s, d, n) kobj_bcopy((s), (d), (n))
150 #define bzero(p, n) kobj_bzero((p), (n))
151 #define strlcat(s, d, n) kobj_strlcat((s), (d), (n))
152 #endif
153
154 extern kdi_t kobj_kdi;
155
156 struct bootops;
157
158 extern struct modctl_list *kobj_linkmaps[];
159
160 extern char *kobj_kmdb_argv[];
161
162 extern int kobj_mmu_pagesize;
163
164 extern void kobj_init(void *romvec, void *dvec,
165 struct bootops *bootvec, val_t *bootaux);
166 extern int kobj_notify_add(kobj_notify_list_t *);
167 extern int kobj_notify_remove(kobj_notify_list_t *);
168 extern int do_relocations(struct module *);
169 extern int do_relocate(struct module *, char *, int, int, Addr);
170 extern struct bootops *ops;
171 extern void exitto(caddr_t);
172 extern void kobj_sync_instruction_memory(caddr_t, size_t);
173 extern uint_t kobj_gethashsize(uint_t);
174 extern void * kobj_mod_alloc(struct module *, size_t, int, reloc_dest_t *);
175 extern void mach_alloc_funcdesc(struct module *);
176 extern uint_t kobj_hash_name(const char *);
177 extern caddr_t kobj_segbrk(caddr_t *, size_t, size_t, caddr_t);
178 extern int get_progbits_size(struct module *, struct proginfo *,
179 struct proginfo *, struct proginfo *);
180 extern Sym *kobj_lookup_kernel(const char *);
181 extern struct modctl *kobj_boot_mod_lookup(const char *);
182 extern void kobj_export_module(struct module *);
183 extern int kobj_load_primary_module(struct modctl *);
184 extern int boot_compinfo(int, struct compinfo *);
185 extern void mach_modpath(char *, const char *);
186
187 extern void kobj_setup_standalone_vectors(void);
188 extern void kobj_restore_vectors(void);
189 extern void (*_kobj_printf)(void *, const char *fmt, ...) __KPRINTFLIKE(2);
190 extern void (*_vkobj_printf)(void *, const char *fmt, va_list)
191 __KVPRINTFLIKE(2);
192 extern void (*kobj_bcopy)(const void *, void *, size_t);
193 extern void (*kobj_bzero)(void *, size_t);
194 extern size_t (*kobj_strlcat)(char *, const char *, size_t);
195
196 #define KOBJ_LM_PRIMARY 0x0
197 #define KOBJ_LM_DEBUGGER 0x1
198
199 extern void kobj_lm_append(int, struct modctl *modp);
200 extern struct modctl_list *kobj_lm_lookup(int);
201 extern void kobj_lm_dump(int);
202
203 #ifdef __cplusplus
204 }
205 #endif
206
207 #endif /* _SYS_KOBJ_IMPL_H */