
/* @(#)04     1.12.2.1  src/bos/kernel/kdb/kdb_kextdef.h, kdb, bos72X, x2021_20A5 3/31/21 07:28:31 */

/*
 * COMPONENT_NAME: (KDB) Kernel Debugger
 *
 * FUNCTIONS: kdb_is_avail()
 *
 * ORIGINS: 131
 *
 * Copyright (C) Bull S.A. 1997, 1999
 * LEVEL 1, 5 Years Bull Confidential Information
 */

#ifndef	_KDB_KEXTDEF_H
#define	_KDB_KEXTDEF_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 * cast used in db_printf format to match brkpoint() proto
 */
#ifdef __64BIT__
typedef char * __fmt_t;
#else  /* __64BIT__ */
typedef long __fmt_t;
#endif /* __64BIT__ */

/*
 * exported I/F prototypes
 */
#if defined(__64BIT__) || defined(_KEXT_PROTO) || !defined(_KERNEL)
int          db_register(char *, char *, char *, char *, char *,
			 int (*)(uchar_t *, int *, int));
int          db_unregister(int (*)(uchar_t *, int *, int));
void         db_printf(__fmt_t, ...);
uint_t       db_read_mem(void *, void *, uint_t);
uchar_t      db_read_byte(void *);
ushort_t     db_read_halfword(void *);
uint_t       db_read_word(void *);
int          db_expr(int, uchar_t *, int *, int, int *);
int          db_expr_ad(int, uchar_t *, int *, int, void **);
#endif /* __64BIT__ || _KEXT_PROTO || !_KERNEL */

u_longlong_t db_read_doubleword(void *);
u_longlong_t db_read_device_doubleword(void *);
int          db_expr_ul(int, uchar_t *, int *, int, ulong_t *);
ulong_t	     db_get_dec(void);
ulong_t	     db_get_hex(void);
uint_t	     db_get_hex_32(void);
u_longlong_t db_get_hex_64(void);
int	     db_usage_lookup(uchar_t *, int *, int);
int	     db_str_lookup(uchar_t *, int *, int, uchar_t *);
int	     db_eol(uchar_t *, int *, int);
void	     db_newline(int);
void	     db_deblank(uchar_t *, int *, int);
void	     db_blanc(int);
int	     db_more(int *, char *);
int	     db_more_on(void);
int	     db_more_off(void);
int	     db_symboladdr(void **, char *);
void	     db_dumpsymbol(char *, void *, int, int);
void	     db_kx2srval_set(int);
vmhandle_t   db_get_aspace_id(struct buf *);
long         db_check_register(char *, char **, char *, 
			       long (*)(char *,long, long, long, void *, long));
long         db_check_unregister(long (*)(char *,long, long, long, void *, long));

#if defined(__64BIT__) && defined(_KERNEL)
int    __kdb(void);
#define  kdb_is_avail() (__kdb())
#endif /* __64BIT__ && _KERNEL */

#if !defined(__64BIT__) && defined(_KERNEL)
/* =================================================
 * Kernel extension I/F to check if kdb is available
 * kdb_is_avail()
 * =================================================
 */
/*
 * This test returns true if kdb is ready to be used.
 */
int brkpoint(long, ...);
#define TWEQ_R1_R1 0x7C810808
#define kdb_is_avail() (*((int *)*((int *)brkpoint)) != TWEQ_R1_R1)

/*
 * Kernel extension I/F to manage new command, usage:
 *
 * #define db_register(...)   if (kdb_is_avail()) brkpoint(DB_REGISTER, ...)
 * #define db_unregister(...) if (kdb_is_avail()) brkpoint(DB_UNREGISTER, ...)
 */
#define DB_REGISTER    0x16011997
#define DB_UNREGISTER  0x02041997

/*
 * KDB extended I/F used by kernext display modules, usage:
 *
 * #define db_printf(__fmt_t, ...)    brkpoint(long, ...)
 * #define db_read_mem(vad, lad, siz) brkpoint(DB_READ_MEM, vad, lad, siz)
 * #define db_read_byte(vad)	      brkpoint(DB_READ_BYTE, vad)
 * #define db_read_halfword(vad)      brkpoint(DB_READ_HALFWORD, vad)
 * #define db_read_word(vad)	      brkpoint(DB_READ_WORD, vad)
 * #define db_expr(...)		      brkpoint(DB_EXPR, ...)
 * #define db_expr_ad(...)	      brkpoint(DB_EXPR_AD, ...)
 */
#define DB_READ_MEM      0x15031999
#define DB_READ_BYTE     0x16031999
#define DB_READ_HALFWORD 0x17031999
#define DB_READ_WORD     0x18031999
#define DB_EXPR		 0x17011997
#define DB_EXPR_AD	 0x11021998

#endif  /* !__64BIT__ */

/* Values for the option flag for kdb_dumpsymbol, kdb_dumpsymbol_64,
 * __kdb_dumpsymbol_64.  One of the options OFFS, OFFS_NN, or NOOFFS
 * should be used for all calls.  The NAME_AND_ADDR flag may be ORed
 * with the other flags to output the hex address to any symbolic name
 * output.
 */
#define OFFS 1              /* Print symbol name + offset */
#define OFFS_NN 2           /* Print symbol name + offset (if non-zero) */
#define NOOFFS 4            /* Print symbol name if value == symbol address */
                                /* else print the address. */
#define NAME_AND_ADDR 8     /* Include hex address following symbolic name */

/* 
 * typedef for 64-bit register support
 */
typedef unsigned long long kdb_long_t;  /* unsigned 64-bit type */
typedef unsigned long long kdb_eaddr_t; /* effective address type */
typedef unsigned long long kdb_paddr_t; /* physical address type */
typedef unsigned long long kdb_reg_t;   /* 64-bit register type */
typedef unsigned long long kdb_sid_t;   /* effective - virtual sid type */
typedef unsigned long long kdb_esid_t;
typedef unsigned long long kdb_vpn_t;   /* virtual page number type */
typedef unsigned long long kdb_rpn_t;   /* real page number type */
typedef unsigned long long kdb_sym_t;   /* symbol value type */

#define KDB_MIN_KERNEL_ADDRESS (99999)          /* XXX to be changed */
#define kdb_is_k_addr(value) \
        ((value) && (kdb_long_t)(value) >= KDB_MIN_KERNEL_ADDRESS)
#define kdb_is_k_entry(value) \
        ((value) && (kdb_long_t)(value) < KDB_MIN_KERNEL_ADDRESS)

#ifdef __cplusplus
}
#endif

#endif	/* _KDB_KEXTDEF_H */
