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