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