root/usr/src/uts/common/sys/kobj_impl.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright 2020 Joyent, Inc.
 */

/*
 * Kernel Run-Time Linker/Loader private interfaces.
 */

#ifndef _SYS_KOBJ_IMPL_H
#define _SYS_KOBJ_IMPL_H

#include <sys/kdi.h>
#include <sys/kobj.h>
#include <sys/varargs.h>

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * Boot/aux vector attributes.
 */

#define BA_DYNAMIC      0
#define BA_PHDR         1
#define BA_PHNUM        2
#define BA_PHENT        3
#define BA_ENTRY        4
#define BA_PAGESZ       5
#define BA_LPAGESZ      6
#define BA_LDELF        7
#define BA_LDSHDR       8
#define BA_LDNAME       9
#define BA_BSS          10
#define BA_IFLUSH       11
#define BA_CPU          12
#define BA_MMU          13
#define BA_GOTADDR      14
#define BA_NEXTGOT      15
#define BA_NUM          16

typedef union {
        unsigned long ba_val;
        void *ba_ptr;
} val_t;

/*
 * Segment info.
 */
struct proginfo {
        uint_t size;
        uint_t align;
};

/*
 * Implementation-specific flags.
 */
#define KOBJ_EXEC       0x0004  /* executable (unix module) */
#define KOBJ_INTERP     0x0008  /* the interpreter module */
#define KOBJ_PRIM       0x0010  /* a primary kernel module */
#define KOBJ_RESOLVED   0x0020  /* fully resolved */
/*                      0x0040  unused. */
#define KOBJ_RELOCATED  0x0080  /* relocation completed */
#define KOBJ_NOPARENTS  0x0200  /* nothing can depend on this module */
#define KOBJ_IGNMULDEF  0x0400  /* ignore dups during sym resolution */
#define KOBJ_NOKSYMS    0x0800  /* module's symbols don't go into ksyms */
#define KOBJ_EXPORTED   0x1000  /* ctf, syms copied to vmem */

/*
 * kobj_notify_add() data notification structure
 */
typedef void kobj_notify_f(uint_t, struct modctl *);

typedef struct kobj_notify_list {
        kobj_notify_f           *kn_func;       /* notification func */
        uint_t                  kn_type;        /* notification type */
        struct kobj_notify_list *kn_prev;
        struct kobj_notify_list *kn_next;
} kobj_notify_list_t;

/*
 * krtld can provide notification to external clients on the
 * following events.
 */
#define KOBJ_NOTIFY_MODLOADING          1       /* very early in module load */
#define KOBJ_NOTIFY_MODUNLOADING        2       /* before module unload */
#define KOBJ_NOTIFY_MODLOADED           3       /* after module load */
#define KOBJ_NOTIFY_MODUNLOADED         4       /* after module unload */
#define KOBJ_NOTIFY_MAX                 4

#define ALIGN(x, a)     ((a) == 0 ? (uintptr_t)(x) : \
        (((uintptr_t)(x) + (uintptr_t)(a) - 1l) & ~((uintptr_t)(a) - 1l)))

#ifdef  DEBUG
#define KOBJ_DEBUG
#endif

#ifdef KOBJ_DEBUG
/*
 * Debugging flags.
 */
#define D_DEBUG                 0x001   /* general debugging */
#define D_SYMBOLS               0x002   /* debug symbols */
#define D_RELOCATIONS           0x004   /* debug relocations */
#define D_LOADING               0x008   /* section loading */

extern int kobj_debug;          /* different than moddebug */
#endif

/*
 * Flags for kobj memory allocation.
 */
#define KM_WAIT                 0x0     /* wait for it */
#define KM_NOWAIT               0x1     /* return immediately */

#define KM_TMP                  0x1000  /* freed before kobj_init returns */
#define KM_SCRATCH              0x2000  /* not freed until kobj_sync */

#ifdef  KOBJ_OVERRIDES
/*
 * Until the kernel is fully linked, all code running in the
 * context of krtld/kobj using bcopy or bzero must be directed
 * to the kobj equivalents.  All (ok, most) references to bcopy
 * or bzero are thus so vectored.
 */
#define bcopy(s, d, n)          kobj_bcopy((s), (d), (n))
#define bzero(p, n)             kobj_bzero((p), (n))
#define strlcat(s, d, n)        kobj_strlcat((s), (d), (n))
#endif

extern kdi_t kobj_kdi;

struct bootops;

extern struct modctl_list *kobj_linkmaps[];

extern char *kobj_kmdb_argv[];

extern int kobj_mmu_pagesize;

extern void kobj_init(void *romvec, void *dvec,
        struct bootops *bootvec, val_t *bootaux);
extern int kobj_notify_add(kobj_notify_list_t *);
extern int kobj_notify_remove(kobj_notify_list_t *);
extern int do_relocations(struct module *);
extern int do_relocate(struct module *, char *, int, int, Addr);
extern struct bootops *ops;
extern void exitto(caddr_t);
extern void kobj_sync_instruction_memory(caddr_t, size_t);
extern uint_t kobj_gethashsize(uint_t);
extern void * kobj_mod_alloc(struct module *, size_t, int, reloc_dest_t *);
extern void mach_alloc_funcdesc(struct module *);
extern uint_t kobj_hash_name(const char *);
extern caddr_t kobj_segbrk(caddr_t *, size_t, size_t, caddr_t);
extern int get_progbits_size(struct module *, struct proginfo *,
        struct proginfo *, struct proginfo *);
extern Sym *kobj_lookup_kernel(const char *);
extern struct modctl *kobj_boot_mod_lookup(const char *);
extern void kobj_export_module(struct module *);
extern int kobj_load_primary_module(struct modctl *);
extern int boot_compinfo(int, struct compinfo *);
extern void mach_modpath(char *, const char *);

extern void kobj_setup_standalone_vectors(void);
extern void kobj_restore_vectors(void);
extern void (*_kobj_printf)(void *, const char *fmt, ...) __KPRINTFLIKE(2);
extern void (*_vkobj_printf)(void *, const char *fmt, va_list)
    __KVPRINTFLIKE(2);
extern void (*kobj_bcopy)(const void *, void *, size_t);
extern void (*kobj_bzero)(void *, size_t);
extern size_t (*kobj_strlcat)(char *, const char *, size_t);

#define KOBJ_LM_PRIMARY         0x0
#define KOBJ_LM_DEBUGGER        0x1

extern void kobj_lm_append(int, struct modctl *modp);
extern struct modctl_list *kobj_lm_lookup(int);
extern void kobj_lm_dump(int);

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_KOBJ_IMPL_H */