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 */