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