1
0
Files
irix-657m-src/irix/lib/klib/include/kl_libkern.h
2022-09-29 17:59:04 +03:00

722 lines
28 KiB
C

#ident "$Header: "
#include <klib/kl_page.h>
#include <klib/kl_struct_sizes.h>
#include <klib/kl_hwgraph.h>
#define HUBMASK1 0xf000000000000000
#define HUBMASK2 0xff00000000000000
/* the following is copied directly from
* from <sys/SN/SN0/addrs.h>
*/
#define HSPEC_BASE 0x9000000000000000
#define IO_BASE 0x9200000000000000
#define MSPEC_BASE 0x9400000000000000
#define UNCAC_BASE 0x9600000000000000
#define IRIX6_5 5
#define IRIX_SPECIAL 0
/* PANIC_TYPE indicates type of panic
*/
typedef enum {
no_panic, /* Looking at a live system */
reg_panic, /* internal panic */
nmi_panic, /* NMI induced core dump */
} PANIC_TYPE;
/* System information (hardware configuration, etc.)
*/
typedef struct sysinfo_s {
int32 IP; /* System type (e.g., IP19, IP22, etc.) */
int32 physmem; /* physical memory installed (pages) */
int32 numcpus; /* number of CPUs installed */
int32 maxcpus; /* Maximum number of CPUs as configured */
/* TLB dump information
*/
int32 ntlbentries; /* number of tlb entries */
int32 tlbentrysz; /* size of tlb dump entry */
int32 tlbdumpsize; /* size of tlb dump (per CPU) */
/* Node information
*/
int32 numnodes; /* Number of nodes */
int32 maxnodes; /* Maximum number of nodes */
int32 master_nasid; /* NASID of master node */
int32 nasid_shift; /* NASID_SHIFT */
int32 slot_shift; /* SLOT_SHIFT */
int32 parcel_shift; /* PARCEL_SHIFT */
int32 parcel_bitmask; /* PARCEL_BITMASK */
int32 parcels_per_slot; /* Number of parcels per slot */
int32 slots_per_node; /* MD_MEM_BANKS */
uint64 mem_per_node; /* Maximum bytes phys memory per node */
uint64 mem_per_slot; /* Maximum bytes of phys memory per slot */
uint64 nasid_bitmask; /* NASID_BITMASK */
uint64 slot_bitmask; /* SLOT_BITMASK */
uint64 systemsize; /* Pages of memory installed in system */
uint64 sysmemsize; /* MB of memory installed in system */
kaddr_t kend; /* Pointer to end of kernel */
uint64 mem_per_bank; /* Maximum bytes of phys memory per bank */
/* This is a constant equal to 512 MB. */
/* XXX - Memory configuration info ??? */
} sysinfo_t;
/* Kernel information
*/
typedef struct kerninfo_s {
int32 irix_rev; /* OS revision level (e.g., IRIX6_4) */
int32 syssegsz; /* size of system segment */
int32 nprocs; /* number of configured procs (from var) */
/* Values used in virtual to physical address translation, macros, etc.
*/
int32 regsz; /* Number of bytes in a register (always 8) */
int32 pagesz; /* Number of bytes in a page */
int32 nbpw; /* Number of bytes per word */
int32 nbpc; /* Number of bytes per click */
int32 ncps; /* Number of clics per segment */
int32 nbps; /* Number of bytes per segment */
int32 pnumshift; /* PFN shift */
kaddr_t to_phys_mask; /* virtual to physical address mask */
kaddr_t ram_offset; /* Offset to first memory address */
uint64 maxpfn; /* Largest possible physical page number */
kaddr_t maxphys; /* Largest possible physical address */
/* Information for accessing mapped pages in the proc/uthread (ublock,
* kernelstack, and kextstack).
*/
int32 usize; /* Number of mapped pages for proc/uthread */
int32 extusize; /* non-zero - supports kstack extension */
int32 upgidx; /* Index in p_upgs[] for ublock */
int32 kstkidx; /* Index in p_upgs[] for kernel stack */
int32 extstkidx; /* Index in p_upgs[] for kstack extension */
/* Addresses and sizes of the various address segments
*/
kaddr_t kubase; /* Base address of user address space */
uint64 kusize; /* Size of user segment */
kaddr_t k0base; /* Base address of K0 segment */
uint64 k0size; /* Size of the K0 segment */
kaddr_t k1base; /* Base address of K1 segment */
uint64 k1size; /* Size of the K1 segment */
kaddr_t k2base; /* Base address of K2 segment */
uint64 k2size; /* Size of the K2 segment */
kaddr_t kernstack; /* High address of kernel stack */
kaddr_t kernelstack; /* Start address of kernel stack */
kaddr_t kextstack; /* Start address of extension stack */
kaddr_t kptebase; /* Start address of K2 memory */
kaddr_t kpte_usize;
kaddr_t kpte_shdubase;
/* Node memory information
*/
/* Mapped kernel address information
*/
kaddr_t mapped_ro_base; /* read-only address base */
kaddr_t mapped_rw_base; /* read-write address base */
kaddr_t mapped_page_size; /* Size of the mapped segment */
} kerninfo_t;
/* Kernel data (global variables, counts, etc.) used by KLIB.
*/
typedef struct kerndata_s {
PANIC_TYPE panic_type; /* type of panic (internal, NMI, or none) */
int dumpcpu; /* ID of CPU that panicked the system */
int graph_size; /* actual size of hwgraph (not struct size) */
int vertex_size; /* Actual size of vertex (not struct size) */
kaddr_t dumpkthread; /* Kernel address of kthread that paniced */
kaddr_t defkthread; /* kernel address of default kthread */
kaddr_t hwgraphp; /* kernel address of hwgraph */
kaddr_t activefiles; /* linked list of open files (DEBUG only) */
kaddr_t dumpproc; /* kernel address of panicing process */
kaddr_t error_dumpbuf; /* HW error message buffer */
kaddr_t kptbl; /* kernel address of page table */
kaddr_t lbolt; /* current clock tick */
kaddr_t mlinfolist; /* loadable module info */
kaddr_t Nodepdaindr; /* start address of nodepdaindr array */
kaddr_t pdaindr; /* start address of pdaindr array */
kaddr_t pid_active_list; /* kernel address of active pids */
kaddr_t pidtab; /* pid_entry table */
kaddr_t pfdat; /* pfdat table */
kaddr_t putbuf; /* putbuf */
kaddr_t sthreadlist; /* start of sthread list */
kaddr_t strst; /* streams statistics stuff */
kaddr_t time; /* current time (coredump only) */
kaddr_t xthreadlist; /* start of active xthread list */
int pidtabsz; /* Number of elements in pidtab array */
short pid_base; /* base pid */
k_ptr_t dumpregs; /* copy of dumpped register values */
k_ptr_t kptblp; /* kernel page table (if not active) */
k_ptr_t hwgraph; /* hwgraph */
} kerndata_t;
typedef struct libkern_info_s {
sysinfo_t *k_sysinfo;
kerninfo_t *k_kerninfo;
kerndata_t *k_kerndata;
pdeinfo_t *k_pdeinfo;
struct_sizes_t *k_struct_sizes;
} libkern_info_t;
#define LIBKERN_DATA ((libkern_info_t *)(KLP)->k_libkern.k_data)
/* From the sysinfo_s struct
*/
#define K_IP (LIBKERN_DATA->k_sysinfo->IP)
#define K_PHYSMEM (LIBKERN_DATA->k_sysinfo->physmem)
#define K_NUMCPUS (LIBKERN_DATA->k_sysinfo->numcpus)
#define K_MAXCPUS (LIBKERN_DATA->k_sysinfo->maxcpus)
#define K_NTLBENTRIES (LIBKERN_DATA->k_sysinfo->ntlbentries)
#define K_TLBENTRYSZ (LIBKERN_DATA->k_sysinfo->tlbentrysz)
#define K_TLBDUMPSIZE (LIBKERN_DATA->k_sysinfo->tlbdumpsize)
#define K_NUMNODES (LIBKERN_DATA->k_sysinfo->numnodes)
#define K_MAXNODES (LIBKERN_DATA->k_sysinfo->maxnodes)
#define K_MASTER_NASID (LIBKERN_DATA->k_sysinfo->master_nasid)
#define K_NASID_SHIFT (LIBKERN_DATA->k_sysinfo->nasid_shift)
#define K_SLOT_SHIFT (LIBKERN_DATA->k_sysinfo->slot_shift)
#define K_PARCEL_SHIFT (LIBKERN_DATA->k_sysinfo->parcel_shift)
#define K_PARCEL_BITMASK (LIBKERN_DATA->k_sysinfo->parcel_bitmask)
#define K_PARCELS_PER_SLOT (LIBKERN_DATA->k_sysinfo->parcels_per_slot)
#define K_SLOTS_PER_NODE (LIBKERN_DATA->k_sysinfo->slots_per_node)
#define K_MEM_PER_NODE (LIBKERN_DATA->k_sysinfo->mem_per_node)
#define K_MEM_PER_SLOT (LIBKERN_DATA->k_sysinfo->mem_per_slot)
#define K_MEM_PER_BANK (LIBKERN_DATA->k_sysinfo->mem_per_bank)
#define K_NASID_BITMASK (LIBKERN_DATA->k_sysinfo->nasid_bitmask)
#define K_SLOT_BITMASK (LIBKERN_DATA->k_sysinfo->slot_bitmask)
#define K_SYSTEMSIZE (LIBKERN_DATA->k_sysinfo->systemsize)
#define K_SYSMEMSIZE (LIBKERN_DATA->k_sysinfo->sysmemsize)
#define K_END (LIBKERN_DATA->k_sysinfo->kend)
/* From the kerninfo_s struct
*/
#define K_IRIX_REV (LIBKERN_DATA->k_kerninfo->irix_rev)
#define K_SYSSEGSZ (LIBKERN_DATA->k_kerninfo->syssegsz)
#define K_NPROCS (LIBKERN_DATA->k_kerninfo->nprocs)
#define K_REGSZ (LIBKERN_DATA->k_kerninfo->regsz)
#define K_PAGESZ (LIBKERN_DATA->k_kerninfo->pagesz)
#define K_NBPW (LIBKERN_DATA->k_kerninfo->nbpw)
#define K_NBPC (LIBKERN_DATA->k_kerninfo->nbpc)
#define K_NCPS (LIBKERN_DATA->k_kerninfo->ncps)
#define K_NBPS (LIBKERN_DATA->k_kerninfo->nbps)
#define K_PNUMSHIFT (LIBKERN_DATA->k_kerninfo->pnumshift)
#define K_TO_PHYS_MASK (LIBKERN_DATA->k_kerninfo->to_phys_mask)
#define K_RAM_OFFSET (LIBKERN_DATA->k_kerninfo->ram_offset)
#define K_MAXPFN (LIBKERN_DATA->k_kerninfo->maxpfn)
#define K_MAXPHYS (LIBKERN_DATA->k_kerninfo->maxphys)
#define K_USIZE (LIBKERN_DATA->k_kerninfo->usize)
#define K_EXTUSIZE (LIBKERN_DATA->k_kerninfo->extusize)
#define K_UPGIDX (LIBKERN_DATA->k_kerninfo->upgidx)
#define K_KSTKIDX (LIBKERN_DATA->k_kerninfo->kstkidx)
#define K_EXTSTKIDX (LIBKERN_DATA->k_kerninfo->extstkidx)
#define K_KUBASE (LIBKERN_DATA->k_kerninfo->kubase)
#define K_KUSIZE (LIBKERN_DATA->k_kerninfo->kusize)
#define K_K0BASE (LIBKERN_DATA->k_kerninfo->k0base)
#define K_K0SIZE (LIBKERN_DATA->k_kerninfo->k0size)
#define K_K1BASE (LIBKERN_DATA->k_kerninfo->k1base)
#define K_K1SIZE (LIBKERN_DATA->k_kerninfo->k1size)
#define K_K2BASE (LIBKERN_DATA->k_kerninfo->k2base)
#define K_K2SIZE (LIBKERN_DATA->k_kerninfo->k2size)
#define K_KERNSTACK (LIBKERN_DATA->k_kerninfo->kernstack)
#define K_KERNELSTACK (LIBKERN_DATA->k_kerninfo->kernelstack)
#define K_KEXTSTACK (LIBKERN_DATA->k_kerninfo->kextstack)
#define K_KPTEBASE (LIBKERN_DATA->k_kerninfo->kptebase)
#define K_KPTE_USIZE (LIBKERN_DATA->k_kerninfo->kpte_usize)
#define K_KPTE_SHDUBASE (LIBKERN_DATA->k_kerninfo->kpte_shdubase)
#define K_MAPPED_RO_BASE (LIBKERN_DATA->k_kerninfo->mapped_ro_base)
#define K_MAPPED_RW_BASE (LIBKERN_DATA->k_kerninfo->mapped_rw_base)
#define K_MAPPED_PAGE_SIZE (LIBKERN_DATA->k_kerninfo->mapped_page_size)
/* From the kerndata_s struct
*/
#define K_PANIC_TYPE (LIBKERN_DATA->k_kerndata->panic_type)
#define K_DUMPCPU (LIBKERN_DATA->k_kerndata->dumpcpu)
#define K_GRAPH_SIZE (LIBKERN_DATA->k_kerndata->graph_size)
#define K_VERTEX_SIZE (LIBKERN_DATA->k_kerndata->vertex_size)
#define K_DUMPKTHREAD (LIBKERN_DATA->k_kerndata->dumpkthread)
#define K_DEFKTHREAD (LIBKERN_DATA->k_kerndata->defkthread)
#define K_HWGRAPHP (LIBKERN_DATA->k_kerndata->hwgraphp)
#define K_ACTIVEFILES (LIBKERN_DATA->k_kerndata->activefiles)
#define K_DUMPPROC (LIBKERN_DATA->k_kerndata->dumpproc)
#define K_ERROR_DUMPBUF (LIBKERN_DATA->k_kerndata->error_dumpbuf)
#define K_KPTBL (LIBKERN_DATA->k_kerndata->kptbl)
#define K_LBOLT (LIBKERN_DATA->k_kerndata->lbolt)
#define K_MLINFOLIST (LIBKERN_DATA->k_kerndata->mlinfolist)
#define K_NODEPDAINDR (LIBKERN_DATA->k_kerndata->Nodepdaindr)
#define K_PDAINDR (LIBKERN_DATA->k_kerndata->pdaindr)
#define K_PID_ACTIVE_LIST (LIBKERN_DATA->k_kerndata->pid_active_list)
#define K_PIDTAB (LIBKERN_DATA->k_kerndata->pidtab)
#define K_PFDAT (LIBKERN_DATA->k_kerndata->pfdat)
#define K_PUTBUF (LIBKERN_DATA->k_kerndata->putbuf)
#define K_STHREADLIST (LIBKERN_DATA->k_kerndata->sthreadlist)
#define K_STRST (LIBKERN_DATA->k_kerndata->strst)
#define K_TIME (LIBKERN_DATA->k_kerndata->time)
#define K_XTHREADLIST (LIBKERN_DATA->k_kerndata->xthreadlist)
#define K_PIDTABSZ (LIBKERN_DATA->k_kerndata->pidtabsz)
#define K_PID_BASE (LIBKERN_DATA->k_kerndata->pid_base)
#define K_DUMPREGS (LIBKERN_DATA->k_kerndata->dumpregs)
#define K_KPTBLP (LIBKERN_DATA->k_kerndata->kptblp)
#define K_HWGRAPH (LIBKERN_DATA->k_kerndata->hwgraph)
#define IS_PANIC (LIBKERN_DATA->k_kerndata->panic_type == reg_panic)
#define IS_NMI (LIBKERN_DATA->k_kerndata->panic_type == nmi_panic)
/* Generalized macros for pointing at different data types at particular
* offsets in kernel structs.
*/
#define ADDR(p, s, f) ((unsigned)(p) + kl_member_offset(s, f))
#define K_PTR(p, s, f) ((k_ptr_t)ADDR(p, s, f))
#define CHAR(p, s, f) ((char *)ADDR(p, s, f))
#define PTRSZ64 ((K_PTRSZ == 64) ? 1 : 0)
#define PTRSZ32 ((K_PTRSZ == 32) ? 1 : 0)
/* Basic address macros for use with multiple platforms
*/
#define k0_to_phys(X) ((kaddr_t)(X) & K_TO_PHYS_MASK)
#define k1_to_phys(X) ((kaddr_t)(X) & K_TO_PHYS_MASK)
#define is_kseg0(X) \
((kaddr_t)(X) >= K_K0BASE && (kaddr_t)(X) < K_K0BASE + K_K0SIZE)
#define is_kseg1(X) \
((kaddr_t)(X) >= K_K1BASE && (kaddr_t)(X) < K_K1BASE + K_K1SIZE)
/* TFP */
#define is_kseg2(X) \
((kaddr_t)(X) >= K_K2BASE && (kaddr_t)(X) < K_K2BASE + K_K2SIZE)
/* all else */
#define _is_kseg2(X) \
((kaddr_t)(X) >= K_K2BASE && (kaddr_t)(X) < K_KPTE_SHDUBASE)
#define is_kpteseg(X) ((kaddr_t)(X) >= K_KPTE_SHDUBASE && \
(kaddr_t)(X) < K_KPTEBASE + K_KUSIZE)
#define IS_KERNELSTACK(addr) (K_EXTUSIZE ? \
((addr >= K_KEXTSTACK) && (addr < K_KERNELSTACK)) : \
((addr >= K_KERNELSTACK) && (addr < K_KERNSTACK)))
#define Btoc(X) ((kaddr_t)(X) >> K_PNUMSHIFT)
#define Ctob(X) ((kaddr_t)(X) << K_PNUMSHIFT)
#define Pnum(X) ((kaddr_t)(X) >> K_PNUMSHIFT)
/*
* MACRO's mostly taken from immu.h. Why ?.
* Because we like it that's why.
* We have it in the #if for those icrash files which include the
* kernel header files with these defines..
*/
#if !defined(KERNEL) && !defined(_KERNEL)
#define BTOST(x) (uint)((kaddr_t)(x) / K_NBPS)
#define BTOS(x) (uint)(((kaddr_t)(x) + (K_NBPS - 1))/ K_NBPS)
#define STOB(x) (kaddr_t)((kaddr_t)(x) * K_NBPS)
#endif /* !defined(KERNEL) && !defined(_KERNEL) */
#define KL_HIUSRATTACH_32 0x7fff8000
#define KL_HIUSRATTACH_64 0x10000000000
/* this is the same as Number of page tbls to map user space.
* the same as NPGTBLS
*/
#define KL_SEGTABSIZE BTOS(KL_HIUSRATTACH_32)
#define KL_SEGTABMASK (KL_SEGTABSIZE-1)
/* This is defined as btobasetab in immu.h .. but this is the correct meaning..
* i.e., it returns an index into the base table.
*/
#define KL_BTOBASETABINDEX(x) ((__uint64_t)(x) / (K_NBPS * KL_SEGTABSIZE))
#define KL_BTOSEGTABINDEX(x) (BTOST(x) & KL_SEGTABMASK)
#define KL_PHYS_TO_K0(X) (X | K_K0BASE)
/*
* Platform independent defines.
*/
#define VALID_PFN(PFN) valid_pfn(PFN)
#define NEXT_PFDAT(FIRST, LAST) \
((PLATFORM_SNXX) ? sn0_next_valid_pfdat(FIRST, LAST) : (FIRST + PFDAT_SIZE))
#define KL_PFDATTOPFN(PFDAT) kl_pfdattopfn(PFDAT)
#define KL_PFNTOPFDAT(PFN) kl_pfntopfdat(PFN)
#define KL_SLOT_SIZE (1LL << K_SLOT_SHIFT)
#define KL_SLOT_PFNSHIFT (K_SLOT_SHIFT - K_PNUMSHIFT)
#define KL_PFN_TO_SLOT_NUM(PFN) (((PFN) >> SLOT_PFNSHIFT) & K_SLOT_BITMASK)
#define KL_PFDAT_TO_SLOT_NUM(PFD) (PFN_TO_SLOT_NUM(KL_PFDATTOPFN(PFD)))
#define KL_PFN_TO_SLOT_OFFSET(PFN) ((PFN) & ((KL_SLOT_SIZE/K_NBPC)-1))
#define KL_PFDAT_TO_SLOT_OFFSET(PFD) (PFN_TO_SLOT_OFFSET(KL_PFDATTOPFN(PFD)))
#define KL_PFN_NASIDSHIFT (K_NASID_SHIFT - K_PNUMSHIFT)
#define KL_PFN_NASIDMASK (K_NASID_BITMASK << KL_PFN_NASIDSHIFT)
#define KL_PFD_NASIDMASK (K_NASID_BITMASK << K_NASID_SHIFT)
#define KL_PFN_NASID(pfn) (PLATFORM_SNXX ? ((pfn) >> KL_PFN_NASIDSHIFT) : 0)
#define Kvtokptbl(X) (&_kptbl[Pnum((kaddr_t)(X) - (kaddr_t)K_K2BASE])
#define IS_HUBSPACE(X) (((kaddr_t)X & HUBMASK1) == HSPEC_BASE)
#define IS_PHYSICAL(X) ((kaddr_t)X <= (kaddr_t)K_MAXPHYS)
#define IS_SMALLMEM(X) (IS_PHYSICAL(X) ? (Btoc(X) < 0x20000) : \
(Btoc(kl_virtop(X, (k_ptr_t)NULL)) < 0x20000))
#define _PTE_TO_PFN(PTE) (uint)(((PTE) & K_PFN_MASK) >> K_PFN_SHIFT)
#define PTE_TO_PFN pte_to_pfn
#define PTE_TO_K0(PTE) (Ctob(PTE_TO_PFN(PTE)) | K_K0BASE)
#define PFN_TO_PHYS(PFN) Ctob(PFN)
#define PFN_TO_K0(PFN) ((PFN <= Pnum(K_K1SIZE)) ? (Ctob(PFN) | K_K0BASE) : 0)
#define PFN_TO_K1(PFN) ((PFN <= Pnum(K_K1SIZE)) ? (Ctob(PFN) | K_K1BASE) : 0)
#define PROC_TO_USER(p) KL_UINT((p), "proc", "p_user")
/* XXX -- A number of things were lifted from the sys/kthread.h file. We
* should really be including the header file and using the values there,
* but there is a lot of other junk that we don't want to pick up. So we
* have to make sure that these values stay in sync with the ones in the
* header file.
*/
#define KT_STACK_MALLOC 0x00000001
#define KT_WMUTEX 0x00000002 /* waiting on mutex */
#define KT_LOCK 0x00000004 /* lock for k_flags */
#define KT_WACC 0x00000008 /* waiting for mr(acc) */
/*UNUSED 0x00000010 */
#define KT_WSV 0x00000020 /* waiting on sv */
#define KT_WSVQUEUEING 0x00000040 /* about to go on an SV */
#define KT_INDIRECTQ 0x00000080 /* about to go on an SV */
#define KT_WSEMA 0x00000100 /* waiting on a sema */
#define KT_WMRLOCK 0x00000200 /* waiting on a mrlock */
#define KT_ISEMA 0x00000400 /* waiting on an interrupt sema */
#define KT_WUPD 0x00000800 /* waiting for mr(upd)lock */
#define KT_PS 0x00001000 /* priority scheduled */
#define KT_BIND 0x00002000 /* eligible for binding */
#define KT_NPRMPT 0x00004000 /* do not kick scheduler */
#define KT_BASEPS 0x00008000 /* orig priority scheduled */
#define KT_NBASEPRMPT 0x00010000 /* orig non-preemptive */
#define KT_PSMR 0x00020000 /* ps because kernel mustrun */
#define KT_HOLD 0x00040000 /* keep on this cpu */
#define KT_PSPIN 0x00080000 /* ps because kernel pin_thread */
#define KT_INTERRUPTED 0x00100000 /* thread was interrupted */
#define KT_SLEEP 0x00200000 /* thread asleep */
#define KT_NWAKE 0x00400000 /* thread cannot be interrupted */
#define KT_LTWAIT 0x00800000 /* long term wait */
#define KT_BHVINTR 0x01000000 /* thread interrupted for BHV lock*/
#define KT_SERVER 0x02000000 /* server thread */
#define KT_NOAFF 0x04000000 /* thread has no affinity */
#define KT_MUTEX_INHERIT 0x08000000 /* thread inherited through mutex */
#define KT_SYNCFLAGS \
(KT_WSEMA|KT_WSVQUEUEING|KT_WSV|KT_WMUTEX|KT_INDIRECTQ|KT_WMRLOCK)
/* Environment types that kthread can support
*/
#define KT_XTHREAD 1
#define KT_STHREAD 2
#define KT_UTHREAD 3
#define IS_STHREAD(ktp) (KL_UINT(ktp, "kthread", "k_type") == KT_STHREAD)
#define IS_UTHREAD(ktp) (KL_UINT(ktp, "kthread", "k_type") == KT_UTHREAD)
#define IS_XTHREAD(ktp) (KL_UINT(ktp, "kthread", "k_type") == KT_XTHREAD)
/* Flag values used by the addr_convert() function
*/
#define PFN_FLAG 1
#define PADDR_FLAG 2
#define VADDR_FLAG 3
/* Flag that tells kl_is_valid_kaddr() to perform a word aligned check
*/
#define WORD_ALIGN_FLAG 1
/* Macros useful when working with pidtab[]
*/
#define K_PID_INDEX(PID) (((PID) - K_PID_BASE) % K_PIDTABSZ)
#define K_PID_SLOT(PID) (K_PIDTAB + (K_PID_INDEX(PID) * PID_SLOT_SIZE))
/* Create a hash list of all the vfiles in the system.
* Do not keep duplicates of the viles.
* Each element in the hash table is a (list_of_ptrs_t *).
*/
#define VFILE_HASHSIZE 127
#define MD_MEM_BANKS 8 /* Number of banks per node in M_MODE for SN0. */
#define MD_BANK_SHFT 29 /* log2(512 MB) */
extern node_memory_t **node_memory;
/**
** system memory operation function prototypes
**/
int check_node_memory();
int map_system_memory();
/**
** kthread operation function prototypes
**/
int kl_set_defkthread(
kaddr_t /* kernel address of kthread */);
kaddr_t kl_get_curkthread(
int /* cpuid */);
kaddr_t kl_kthread_addr(
k_ptr_t /* pointer to block of memory containing kthread struct */);
k_ptr_t kl_kthread_name(
k_ptr_t /* pointer to block of memory containing kthread struct */);
int kl_kthread_type(
k_ptr_t /* pointer to block of memory containing kthread struct */);
kaddr_t kl_kthread_stack(
kaddr_t /* kernel address of kthread */,
int* /* pointer to where the stack size will be placed */);
/**
** proc/uthread operation function prototypes
**/
kaddr_t kl_proc_to_kthread(
k_ptr_t /* pointer to block of memory containing proc struct */,
int* /* pointer to where the kthread count is placed */);
int kl_uthread_to_pid(
k_ptr_t /* pointer to block of memory containing uthread struct */);
kaddr_t kl_pid_to_proc(
int /* pid */);
/**
** kernel structure operation function prototypes
**/
k_uint_t kl_get_struct(
kaddr_t /* kernel address of the struct */,
int /* struct size */,
k_ptr_t /* pointer to buffer where struct will be placed */,
char* /* name of the struct */);
k_ptr_t kl_get_ml_info(
kaddr_t /* kernel address of ml_inof struct */,
int /* mode */,
k_ptr_t /* pointer to buffer where ml_info struct will be placed */);
k_ptr_t kl_get_kthread(
kaddr_t /* kernel address of kthread struct */,
int /* flags */);
kaddr_t kl_get_nodepda_s(
kaddr_t /* address or id of node */,
k_ptr_t /* pointer to buffer where nodepda_s struct will be placed */);
kaddr_t kl_get_pda_s(
kaddr_t /* address or id of cpu */,
k_ptr_t /* pointer to buffer where pda_s struct will be placed */);
k_ptr_t kl_get_pde(
kaddr_t /* address of pde struct */,
k_ptr_t /* pointer to buffer where pde struct will be placed */);
k_ptr_t kl_get_proc(
kaddr_t /* pid or address of proc */,
int /* mode - (0 == address), (1 == pid) */,
int /* flags (K_TEMP/K_PERM) */);
k_ptr_t kl_get_sthread_s(
kaddr_t /* address of sthread_s struct */,
int /* mode (at this time must be 2) */,
int /* flags (K_TEMP/K_PERM) */);
k_ptr_t kl_get_uthread_s(
kaddr_t /* address of uthread_s struct */,
int /* mode (at this time must be 2) */,
int /* flags (K_TEMP/K_PERM) */);
k_ptr_t kl_get_xthread_s(
kaddr_t /* address of xthread_s struct */,
int /* mode (at this time must be 2) */,
int /* flags (K_TEMP/K_PERM) */);
/**
** Misc. operation function prototypes
**/
k_ptr_t kl_sp_to_pdap(
kaddr_t /* kernel address of stack (stack pointer) */,
k_ptr_t /* pointer to buffer where pda_s struct will be placed */);
int kl_is_cpu_stack(
kaddr_t /* kernel address of stack */,
k_ptr_t /* pointer to a buffer containing pda_s struct */);
int kl_get_curcpu(
k_ptr_t /* pointer to buffer where pda_s struct will be placed */);
kaddr_t kl_pda_s_addr(
int /* cpuid */);
int kl_get_cpuid(
kaddr_t /* kernel address of pda_s struct */);
kaddr_t kl_nodepda_s_addr(
int /* nodeid */);
int kl_get_nodeid(
kaddr_t /* kernel address of nodepda_s struct */);
int kl_cpu_nasid(
int /* cpuid */);
kaddr_t kl_NMI_regbase(
int /* cpuid */);
k_ptr_t kl_NMI_eframe(
int /* cpuid */,
kaddr_t* /* pointer to where eframe_s address will be placed */);
int kl_NMI_saveregs(
int /* cpuid */,
kaddr_t* /* pointer to where errorepc will be placed */,
kaddr_t* /* pointer to where epc will be placed */,
kaddr_t* /* pointer to where sp will be placed */,
kaddr_t* /* pointer to where ra will be placed */);
kaddr_t kl_bhv_pdata(
kaddr_t /* kernel address of bhv_desc struct */);
kaddr_t kl_bhv_vobj(
kaddr_t /* kernel address of bhv_desc struct */);
kaddr_t kl_bhvp_pdata(
k_ptr_t /* pointer to block containing bhv_desc struct */);
kaddr_t kl_bhvp_vobj(
k_ptr_t /* pointer to block containing bhv_desc struct */);
/**
** klib_s struct operation function prototypes
**/
/* Set the filename containing a dump of an icrashdef_s struct
*/
int kl_set_icrashdef(
char* /* pathname to file containing icrashdef struct */);
k_ptr_t kl_get_utsname(int);
int libkern_init();
/**
** memory access operation function prototypes
**/
k_uint_t kl_read_block(
kaddr_t /* kernel address to start reading at */,
unsigned /* size of memory block to read in */,
k_ptr_t /* pointer to buff where contents of memory will be placed */,
k_ptr_t /* pointer to block of memory containing kthread struct */,
char* /* name of what's being read in */);
k_uint_t kl_get_block(
kaddr_t /* kernel address to start reading at */,
unsigned /* size of memory block to read in */,
k_ptr_t /* pointer to buff where contents of memory will be placed */,
char* /* name of what's being read in */);
k_uint_t kl_get_kaddr(
kaddr_t /* kernel address to start reading at */,
k_ptr_t /* pointer to buff where contents of memory will be placed */,
char* /* name of what's being read in */);
kaddr_t kl_kaddr_to_ptr(
kaddr_t /* kernel address to start reading at */);
k_uint_t kl_uint(
k_ptr_t /* pointer to block containing struct */,
char* /* strut name */,
char* /* member name */,
unsigned offset);
k_int_t kl_int(
k_ptr_t /* pointer to block containing struct */,
char* /* strut name */,
char* /* member name */,
unsigned offset);
kaddr_t kl_kaddr(
k_ptr_t /* pointer to block containing struct */,
char* /* strut name */,
char* /* member name */);
kaddr_t kl_reg(
k_ptr_t /* pointer to block containing struct */,
char* /* strut name */,
char* /* member name */);
kaddr_t kl_kaddr_val(
k_ptr_t /* pointer to block containing a kernel address */);
/**
** memory page operation function prototypes
**/
k_uint_t kl_get_pgi(
k_ptr_t /* pointer to block containing a pde struct */);
int kl_pte_to_pfn(
k_ptr_t /* pointer to block containing a pde struct */);
k_ptr_t kl_locate_pfdat(
k_uint_t /* page number */,
kaddr_t /* tag */,
k_ptr_t /* pointer to buffer containing a pfdat struct */,
kaddr_t* /* pointer to buffer where pfdat address will be placed */);
k_ptr_t *kl_pmap_to_pde(
k_ptr_t /* pointer to buffer containing a pmap struct */,
kaddr_t /* kernel address to search for */,
k_ptr_t /* pointer to buffer where pde struct will be placed */,
kaddr_t* /* pointer to where kernel address of pde will be placed */);
/**
** virtual memory translation operation function prototypes
**/
kaddr_t kl_virtop(
kaddr_t /* virtual address to translate */,
k_ptr_t /* pointer to buffer containing a kthread struct */);
int kl_is_valid_kaddr(
kaddr_t /* kernel address */,
k_ptr_t /* pointer to buffer containing a kthread struct */,
int /* flags */);
int kl_addr_convert(
kaddr_t /* kernel_address/physican_address/pfn to convert */,
int /* flag (PFN_FLAG/PADDR_FLAG/VADDR_FLAG) */,
kaddr_t* /* pointer to buffer where physical address will be placed */,
uint* /* pointer to buffer where pfn will be placed */,
kaddr_t* /* pointer to buffer where k0 address will be placed */,
kaddr_t* /* pointer to buffer where k1 address will be placed */,
kaddr_t* /* pointer to buffer where k2 address will be placed */);
int is_mapped_kern_ro(
kaddr_t /* kernel address */);
int is_mapped_kern_rw(
kaddr_t /* kernel address */);
kaddr_t kl_pfn_to_K2(
uint /* pfn */);
int kl_get_addr_mode(
kaddr_t /* kernel address */);
int kl_addr_to_nasid(
kaddr_t /* kernel address */);
int kl_addr_to_slot(
kaddr_t /* kernel address */);