crash/lkcd_x86_trace.h

786 lines
20 KiB
C

/*
* Copyright 1999 Silicon Graphics, Inc. All rights reserved.
*/
/*
* lkcd_x86_trace.h
*
* Copyright (C) 2002, 2003, 2004, 2005, 2010 David Anderson
* Copyright (C) 2002, 2003, 2004, 2005, 2010 Red Hat, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Adapted as noted from the following LKCD files:
*
* lkcdutils-4.1/libklib/include/asm-i386/kl_types.h
* lkcdutils-4.1/lcrash/include/lc_command.h
* lkcdutils-4.1/libklib/include/klib.h
* lkcdutils-4.1/lcrash/include/asm-i386/lc_dis.h
* lkcdutils-4.1/lcrash/include/asm-i386/lc_trace.h
* lkcdutils-4.1/libutil/kl_queue.h
* lkcdutils-4.1/libklib/include/kl_error.h
*/
#ifdef REDHAT
#include "defs.h"
#define TASK_STRUCT_SZ (SIZE(task_struct))
#define KL_PAGE_OFFSET (machdep->kvbase)
#define LINUX_2_2_X(KL_LINUX_RELEASE) (VALID_MEMBER(task_struct_tss))
#define KLE_PRINT_TRACE_ERROR KLE_INVALID_KERNELSTACK
typedef struct syment syment_t;
#define s_addr value
#define s_name name
typedef uint32_t kaddr_t;
extern int INT_EFRAME_SS;
extern int INT_EFRAME_ESP;
extern int INT_EFRAME_EFLAGS;
extern int INT_EFRAME_CS;
extern int INT_EFRAME_EIP;
extern int INT_EFRAME_ERR;
extern int INT_EFRAME_ES;
extern int INT_EFRAME_DS;
extern int INT_EFRAME_EAX;
extern int INT_EFRAME_EBP;
extern int INT_EFRAME_EDI;
extern int INT_EFRAME_ESI;
extern int INT_EFRAME_EDX;
extern int INT_EFRAME_ECX;
extern int INT_EFRAME_EBX;
extern int INT_EFRAME_GS;
extern ulong int_eframe[];
#endif /* REDHAT */
/*
* lkcdutils-4.1/libklib/include/asm-i386/kl_types.h
*/
typedef uint32_t uaddr_t;
typedef uint64_t k_error_t;
/*
* lkcdutils-4.1/lcrash/include/lc_command.h
*/
#define C_ALL 0x00000004 /* All elements */
#define C_PERM 0x00000008 /* Allocate perminant blocks */
#define C_TEMP 0 /* For completeness */
#define C_FULL 0x00000010 /* Full output */
/*
* lkcdutils-4.1/libklib/include/klib.h
*/
#define K_TEMP 1
#define K_PERM 2
/*
* lkcdutils-4.1/lcrash/include/asm-i386/lc_dis.h
*/
/* Buffer to hold a cache of instruction bytes...we have to make sure
* that there are AT LEAST 15 unread bytes in the buffer at all times,
* as this is the maximum number of bytest that can belong to a single
* instruction.
*
* Copyright 1999 Silicon Graphics, Inc. All rights reserved.
*/
typedef struct instr_buf_s {
kaddr_t addr;
int size;
unsigned char *ptr;
unsigned char buf[256];
} instr_buf_t;
typedef struct opcode_rec_s {
char *name;
int Op1;
int opdata1;
int Op2;
int opdata2;
int Op3;
int opdata3;
} opcode_rec_t;
typedef struct op_s {
int op_type;
int op_seg;
int op_reg;
int op_disp;
int op_base;
int op_index;
int op_scale;
kaddr_t op_addr;
} op_t;
typedef struct instr_rec_s {
struct instr_rec_s *next;
struct instr_rec_s *prev;
kaddr_t addr; /* start address of instruction */
opcode_rec_t *opcodep;
int size;
int aflag;
int dflag;
unsigned int prefixes;
unsigned int opcode;
unsigned char modrm;
unsigned char sib;
int have_sib; /* needed because sib can be zero */
op_t operand[3];
} instr_rec_t;
/* Addressing methods
*/
#define M_NONE 0
#define M_A 1
#define M_C 2
#define M_D 3
#define M_E 4
#define M_indirE 5
#define M_F 6
#define M_G 7
#define M_I 8
#define M_sI 9
#define M_J 10
#define M_M 11
#define M_O 12
#define M_P 13
#define M_Q 14
#define M_R 15
#define M_S 16
#define M_T 17
#define M_V 18
#define M_W 19
#define M_X 20
#define M_Y 21
#define M_MMX 22
#define M_EM 23
#define M_MS 24
#define M_GRP 25
#define M_REG 26
#define M_indirREG 27
#define M_FLOAT 28
#define M_FGRP 29
#define M_BAD 30 /* Must be last on list */
/* Operand data types
*/
#define T_NONE 0
#define T_a 1
#define T_b 2
#define T_c 3
#define T_d 4
#define T_dq 5
#define T_p 6
#define T_pi 7
#define T_ps 8
#define T_q 9
#define T_s 10
#define T_ss 11
#define T_si 12
#define T_v 13
#define T_w 14
#define T_BAD 15 /* Must be last in list */
/* Register operand types
*/
#define R_eAX 0
#define R_eCX 1
#define R_eDX 2
#define R_eBX 3
#define R_eSP 4
#define R_eBP 5
#define R_eSI 6
#define R_eDI 7
#define R_AX 8
#define R_CX 9
#define R_DX 10
#define R_BX 11
#define R_SP 12
#define R_BP 13
#define R_SI 14
#define R_DI 15
#define R_AL 16
#define R_CL 17
#define R_DL 18
#define R_BL 19
#define R_AH 20
#define R_CH 21
#define R_DH 22
#define R_BH 23
#define R_ES 24
#define R_CS 25
#define R_SS 26
#define R_DS 27
#define R_FS 28
#define R_GS 29
#define R_BX_SI 30
#define R_BX_DI 31
#define R_BP_SI 32
#define R_BP_DI 33
#define R_BAD 34 /* Must be last on list */
/* Operand codes
*/
#define BAD M_BAD, T_BAD
#define NONE M_NONE, T_NONE
#define Ap M_A, T_p
#define Av M_A, T_v
#define Cd M_C, T_d
#define Dd M_D, T_d
#define Dx M_D, T_x
#define Td M_T, T_d
#define Eb M_E, T_b
#define indirEb M_indirE, T_b
#define Ev M_E, T_v
#define indirEv M_indirE, T_v
#define Ew M_E, T_w
#define Gb M_G, T_b
#define Gv M_G, T_v
#define Gw M_G, T_w
#define Ib M_I, T_b
#define sIb M_sI, T_b
#define Iv M_I, T_v
#define sIv M_sI, T_v
#define Iw M_I, T_w
#define sIw M_sI, T_w
#define Jb M_J, T_b
#define Jp M_J, T_p
#define Jv M_J, T_v
#define M M_M, T_NONE
#define Ma M_M, T_a
#define Mp M_M, T_p
#define Ob M_O, T_b
#define Ov M_O, T_v
#define Pq M_P, T_q
#define Qq M_Q, T_q
#define Qd M_Q, T_d
#define Rw M_R, T_w
#define Rd M_R, T_d
#define Sw M_S, T_w
#define Vq M_V, T_q
#define Vss M_V, T_ss
#define Wq M_W, T_q
#define Wss M_W, T_ss
#define Xb M_X, T_b
#define Xv M_X, T_v
#define Yb M_Y, T_b
#define Yv M_Y, T_v
/* 32-bit */
#define eAX M_REG, R_eAX
#define eBX M_REG, R_eBX
#define eCX M_REG, R_eCX
#define eDX M_REG, R_eDX
#define eSP M_REG, R_eSP
#define eBP M_REG, R_eBP
#define eSI M_REG, R_eSI
#define eDI M_REG, R_eDI
/* 16-bit */
#define AX M_REG, R_AX
#define BX M_REG, R_BX
#define CX M_REG, R_CX
#define DX M_REG, R_DX
#define indirDX M_indirREG, R_DX
#define DX M_REG, R_DX
#define BP M_REG, R_BP
#define SI M_REG, R_SI
#define DI M_REG, R_DI
#define SP M_REG, R_SP
/* 8-bit */
#define AH M_REG, R_AH
#define AL M_REG, R_AL
#define BH M_REG, R_BH
#define BL M_REG, R_BL
#define CH M_REG, R_CH
#define CL M_REG, R_CL
#define DH M_REG, R_DH
#define DL M_REG, R_DL
/* Segment Registers */
#define cs M_REG, R_CS
#define ds M_REG, R_DS
#define ss M_REG, R_SS
#define es M_REG, R_ES
#define fs M_REG, R_FS
#define gs M_REG, R_GS
#define MX M_MMX, T_NONE
#define EM M_EM, T_NONE
#define MS M_MS, T_NONE
#define GRP1b "GRP1b", M_GRP, 0
#define GRP1S "GRP1S", M_GRP, 1
#define GRP1Ss "GRP1Ss", M_GRP, 2
#define GRP2b "GRP2b", M_GRP, 3
#define GRP2S "GRP2S", M_GRP, 4
#define GRP2b_one "GRP2b_one", M_GRP, 5
#define GRP2S_one "GRP2S_one", M_GRP, 6
#define GRP2b_cl "GRP2b_cl", M_GRP, 7
#define GRP2S_cl "GRP2S_cl", M_GRP, 8
#define GRP3b "GRP3b", M_GRP, 9
#define GRP3S "GRP3S", M_GRP, 10
#define GRP4 "GRP4", M_GRP, 11
#define GRP5 "GRP5", M_GRP, 12
#define GRP6 "GRP6", M_GRP, 13
#define GRP7 "GRP7", M_GRP, 14
#define GRP8 "GRP8", M_GRP, 15
#define GRP9 "GRP9", M_GRP, 16
#define GRP10 "GRP10", M_GRP, 17
#define GRP11 "GRP11", M_GRP, 18
#define GRP12 "GRP12", M_GRP, 19
#define FLOAT "FLOAT", M_FLOAT, T_NONE
#define ST M_FLOAT, T_NONE
#define STi M_FLOAT, T_NONE
#define FGRPd9_2 "FGRPd9_2", M_FGRP, 0
#define FGRPd9_4 "FGRPd9_4", M_FGRP, 1
#define FGRPd9_5 "FGRPd9_5", M_FGRP, 2
#define FGRPd9_6 "FGRPd9_6", M_FGRP, 3
#define FGRPd9_7 "FGRPd9_7", M_FGRP, 4
#define FGRPda_5 "FGRPda_5", M_FGRP, 5
#define FGRPdb_4 "FGRPdb_4", M_FGRP, 6
#define FGRPde_3 "FGRPde_3", M_FGRP, 7
#define FGRPdf_4 "FGRPdf_4", M_FGRP, 8
#define PREFIX_REPZ 0x0001
#define PREFIX_REPNZ 0x0002
#define PREFIX_LOCK 0x0004
#define PREFIX_CS 0x0008
#define PREFIX_SS 0x0010
#define PREFIX_DS 0x0020
#define PREFIX_ES 0x0040
#define PREFIX_FS 0x0080
#define PREFIX_GS 0x0100
#define PREFIX_DATA 0x0200
#define PREFIX_ADR 0x0400
#define PREFIX_FWAIT 0x0800
/* Operand types
*/
#define O_REG 0x0001
#define O_IMMEDIATE 0x0002
#define O_ADDR 0x0004
#define O_OFF 0x0008
#define O_DISP 0x0010
#define O_BASE 0x0020
#define O_INDEX 0x0040
#define O_SCALE 0x0080
#define O_INDIR 0x0100
#define O_SEG 0x0200
#define O_CR 0x0400
#define O_DB 0x0800
#define O_LPTR 0x1000
#ifndef REDHAT
/* Function prototypes
*/
int get_instr_info(
kaddr_t /* pc */,
instr_rec_t * /* pointer to instr_rec_s struct */);
instr_rec_t *get_instr_stream(
kaddr_t /* program counter */,
int /* before count */,
int /* after count */);
void free_instr_stream(
instr_rec_t *);
#endif /* !REDHAT */
/*
* lkcdutils-4.1/lcrash/include/asm-i386/lc_trace.h
*/
/*
* Copyright 1999 Silicon Graphics, Inc. All rights reserved.
*/
#define STACK_SEGMENTS 1
#ifdef REDHAT
#define STACK_SIZE (STACKSIZE())
#define KSTACK_SIZE (STACKSIZE())
#else /* REDHAT */
#define STACK_SIZE 0x2000
#endif /* !REDHAT */
#ifdef NOT
#define INCLUDE_REGINFO 1
#endif
#ifdef INCLUDE_REGINFO
#define NUM_REGS 8
#define REGVAL_UNKNOWN 0
#define REGVAL_VALID 1
#define REGVAL_BAD 2 /* Value loaded into register before it was saved */
/* Register record
*/
typedef struct reg_rec {
uint32_t state;
uint32_t value;
} reg_rec_t;
#endif
/* Stack frame
*/
typedef struct sframe_rec {
struct sframe_rec *next;
struct sframe_rec *prev;
int flag;
int level;
char *funcname;
char *srcfile;
int line_no;
kaddr_t pc;
kaddr_t ra;
kaddr_t sp;
kaddr_t fp;
uint32_t *asp;
int frame_size;
int ptr;
uint64_t error;
#ifdef INCLUDE_REGINFO
reg_rec_t regs[NUM_REGS];
#endif
} sframe_t;
/* flag field of sframe_t */
#define EX_FRAME 0x1 /* this frame is an interrupt or exception
frame, pt_regs field of sframe_t is valid
in this case */
#define INCOMPLETE_EX_FRAME 0x2
#define SET_EX_FRAME_ADDR 0x4
/* Stack segment structure
*/
struct stack_s {
int type;
uint32_t size;
kaddr_t addr;
uint32_t *ptr;
};
/* Stack trace header
*/
typedef struct trace_rec {
int flags;
kaddr_t task;
struct task_struct *tsp;
struct stack_s stack[STACK_SEGMENTS];
int stackcnt;
sframe_t *frame;
int nframes;
#ifdef REDHAT
struct bt_info *bt;
#endif
} trace_t;
#define TF_TRACEREC_VALID 0x01 /* The trace_rec_s has been setup already! */
#define TF_SUPPRESS_HEADER 0x02 /* Suppress header output from trace cmds */
/* Stack types
*/
#define S_USERSTACK 0
#define S_KERNELSTACK 1
/* Stack frame updating macro
*/
#define UPDATE_FRAME(FUNCNAME, PC, RA, SP, FP, ASP, SRCNAME, LINE_NO, SIZE, FLAG) \
curframe->funcname = FUNCNAME; \
curframe->pc = PC; \
curframe->sp = SP; \
curframe->ra = RA; \
curframe->fp = FP; \
curframe->asp = ASP; \
curframe->srcfile = SRCNAME; \
curframe->line_no = LINE_NO; \
curframe->frame_size = SIZE; \
curframe->ptr = curstkidx; \
kl_enqueue((element_t **)&trace->frame, (element_t *)curframe); \
trace->nframes++; \
curframe->flag |= FLAG; \
#ifndef REDHAT
/* Function prototypes
*/
void print_pc(
kaddr_t /* PC */,
FILE * /* output file pointer */);
trace_t *alloc_trace_rec(
int /* flag */);
int setup_trace_rec(kaddr_t, kaddr_t, int, trace_t *);
int find_trace(kaddr_t, kaddr_t, kaddr_t, kaddr_t, trace_t *, int);
void trace_banner(FILE *);
int print_traces(kaddr_t, int, int, FILE *);
void print_trace(trace_t *, int, FILE *);
void free_trace_rec(trace_t *t);
int task_trace(kaddr_t, int, FILE *);
int do_list(kaddr_t, int, FILE *);
void live_vmdump(int, int);
int do_report(int, FILE *);
void stab_type_banner(FILE *, int);
void ktype_banner(FILE *, int);
void print_stab_type(stab_type_t *, int, FILE *);
void print_ktype(kltype_t *, int, FILE *);
void walk_ktype(kltype_t *, int, FILE *);
int list_stab_types(int, FILE *);
int list_ktypes(int, FILE *);
void structlist(FILE *);
int walk_structs(char *, char *, int, kaddr_t, int, FILE *);
sframe_t *alloc_sframe(trace_t *, int);
int add_frame(trace_t *, kaddr_t, kaddr_t);
void finish_trace(trace_t *);
int dumptask_trace(kaddr_t, dump_header_asm_t *, int, FILE *);
#endif /* !REDHAT */
/*
* lkcdutils-4.1/libutil/kl_queue.h
*/
/*
* Copyright 1999 Silicon Graphics, Inc. All rights reserved.
*/
#ifndef _KL_QUEUE_H
#define _KL_QUEUE_H
/* List element header
*/
typedef struct element_s {
struct element_s *next;
struct element_s *prev;
} element_t;
/* Some useful macros
*/
#define ENQUEUE(list, elem) \
kl_enqueue((element_t **)list, (element_t *)elem)
#define DEQUEUE(list) kl_dequeue((element_t **)list)
#define FINDQUEUE(list, elem) \
kl_findqueue((element_t **)list, (element_t *)elem)
#define REMQUEUE(list, elem) kl_remqueue((element_t **)list, (element_t *)elem)
typedef struct list_of_ptrs {
element_t elem;
unsigned long long val64;
} list_of_ptrs_t;
#define FINDLIST_QUEUE(list, elem, compare) \
kl_findlist_queue((list_of_ptrs_t **)list, \
(list_of_ptrs_t *)elem, compare)
#ifndef REDHAT
/**
** Function prototypes
**/
/* Add a new element to the tail of a doubly linked list.
*/
void kl_enqueue(
element_t** /* ptr to head of list */,
element_t* /* ptr to element to add to the list */);
/* Remove an element from the head of a doubly linked list. A pointer
* to the element will be returned. In the event that the list is
* empty, a NULL pointer will be returned.
*/
element_t *kl_dequeue(
element_t** /* ptr to list head (first item removed) */);
/* Checks to see if a particular element is in a list. If it is, a
* value of one (1) will be returned. Otherwise, a value of zero (0)
* will be returned.
*/
int kl_findqueue(
element_t** /* ptr to head of list */,
element_t* /* ptr to element to find on list */);
/* Walks through a list of pointers to queues and looks for a
* particular list.
*/
int kl_findlist_queue(
list_of_ptrs_t** /* ptr to list of lists */,
list_of_ptrs_t* /* ptr to list to look for */,
int(*)(void *, void *) /* ptr to compare function */);
/* Remove specified element from doubly linked list.
*/
void kl_remqueue(
element_t** /* ptr to head of list */,
element_t* /* ptr to element to remove from list */);
#endif /* !REDHAT */
#endif /* _KL_QUEUE_H */
/*
* lkcdutils-4.1/libklib/include/kl_error.h
*/
/*
* kl_error.h
*
* Copyright 1999 Silicon Graphics, Inc. All rights reserved.
*/
/**
** This header file contains basic definitions and declarations
** for the KLIB error handling facility.
**
**/
#ifndef __KL_ERROR_H
#define __KL_ERROR_H
/* Error Classes
*/
#define KLEC_APP 0
#define KLEC_KLIB 1
#define KLEC_MEM 2
#define KLEC_SYM 3
#define KLEC_KERN 4
#define KLEC_CLASS_MASK 0x00000000ff000000
#define KLEC_CLASS_SHIFT 24
#define KLEC_ECODE_MASK 0x0000000000ffffff
#define KLEC_TYPE_MASK 0xffffffff00000000
#define KLEC_TYPE_SHIFT 32
#define KLEC_CLASS(e) ((e & KLEC_CLASS_MASK) >> KLEC_CLASS_SHIFT)
#define KLEC_ECODE(e) (e & KLEC_ECODE_MASK)
#define KLEC_TYPE(e) ((e & KLEC_TYPE_MASK) >> KLEC_TYPE_SHIFT)
extern uint64_t klib_error;
void kl_reset_error(void);
void kl_print_error(void);
/**
** Some macros for accessing data in klib_error
**/
#define KLIB_ERROR klib_error
#define KL_ERROR klib_error
#define KL_ERRORVAL klib_errorval
#define KL_ERRORFP stderr
/* Error codes
*
* There are basically two types of error codes -- with each type
* residing in a single word in a two word error code value. The lower
* 32-bits contains an error class and code that represents exactly
* WHAT error occurred (e.g., non-numeric text in a numeric value
* entered by a user, bad virtual address, etc.).
*
* The upper 32-bits represents what type of data was being referenced
* when the error occurred (e.g., bad proc struct). Having two tiers of
* error codes makes it easier to generate useful and specific error
* messages. Note that is possible to have situations where one or the
* other type of error codes is not set. This is OK as long as at least
* one type s set.
*/
/** General klib error codes
**/
#define KLE_KLIB (KLEC_KLIB << KLEC_CLASS_SHIFT)
#define KLE_NO_MEMORY (KLE_KLIB|1)
#define KLE_OPEN_ERROR (KLE_KLIB|2)
#define KLE_ZERO_BLOCK (KLE_KLIB|3)
#define KLE_INVALID_VALUE (KLE_KLIB|4)
#define KLE_NULL_BUFF (KLE_KLIB|5)
#define KLE_ZERO_SIZE (KLE_KLIB|6)
#define KLE_ACTIVE (KLE_KLIB|7)
#define KLE_MISC_ERROR (KLE_KLIB|97)
#define KLE_NOT_SUPPORTED (KLE_KLIB|98)
#define KLE_UNKNOWN_ERROR (KLE_KLIB|99)
/** memory error codes
**/
#define KLE_MEM (KLEC_MEM << KLEC_CLASS_SHIFT)
#define KLE_BAD_MAP_FILE (KLE_MEM|1)
#define KLE_BAD_DUMP (KLE_MEM|2)
#define KLE_BAD_DUMPTYPE (KLE_MEM|3)
#define KLE_INVALID_LSEEK (KLE_MEM|4)
#define KLE_INVALID_READ (KLE_MEM|5)
#define KLE_BAD_MEMINFO (KLE_MEM|6)
#define KLE_INVALID_PADDR (KLE_MEM|7)
#define KLE_INVALID_VADDR (KLE_MEM|8)
#define KLE_INVALID_VADDR_ALIGN (KLE_MEM|9)
#define KLE_INVALID_MAPPING (KLE_MEM|10)
#define KLE_CMP_ERROR (KLE_MEM|11)
#define KLE_INVALID_DUMP_MAGIC (KLE_MEM|12)
#define KLE_KERNEL_MAGIC_MISMATCH (KLE_MEM|13)
#define KLE_NO_END_SYMBOL (KLE_MEM|14)
#define KLE_INVALID_DUMP_HEADER (KLE_MEM|15)
#define KLE_DUMP_INDEX_CREATION (KLE_MEM|16)
#define KLE_DUMP_HEADER_ONLY (KLE_MEM|17)
/** symbol error codes
**/
#define KLE_SYM (KLEC_SYM << KLEC_CLASS_SHIFT)
#define KLE_NO_SYMTAB (KLE_SYM|1)
#define KLE_NO_SYMBOLS (KLE_SYM|2)
#define KLE_INVALID_TYPE (KLE_SYM|3)
#define KLE_NO_MODULE_LIST (KLE_SYM|4)
/** kernel data error codes
**/
#define KLE_KERN (KLEC_KERN << KLEC_CLASS_SHIFT)
#define KLE_INVALID_KERNELSTACK (KLE_KERN|1)
#define KLE_INVALID_STRUCT_SIZE (KLE_KERN|2)
#define KLE_BEFORE_RAM_OFFSET (KLE_KERN|3)
#define KLE_AFTER_MAXPFN (KLE_KERN|4)
#define KLE_AFTER_PHYSMEM (KLE_KERN|5)
#define KLE_AFTER_MAXMEM (KLE_KERN|6)
#define KLE_PHYSMEM_NOT_INSTALLED (KLE_KERN|7)
#define KLE_NO_DEFTASK (KLE_KERN|8)
#define KLE_PID_NOT_FOUND (KLE_KERN|9)
#define KLE_DEFTASK_NOT_ON_CPU (KLE_KERN|10)
#define KLE_NO_CURCPU (KLE_KERN|11)
#define KLE_NO_CPU (KLE_KERN|12)
#define KLE_SIG_ERROR (KLE_KERN|13)
/** Error codes that indicate what type of data was bad. These are
** placed in the upper 32-bits of klib_error.
**/
#define KLE_BAD_TASK_STRUCT (((uint64_t)1)<<32)
#define KLE_BAD_SYMNAME (((uint64_t)2)<<32)
#define KLE_BAD_SYMADDR (((uint64_t)3)<<32)
#define KLE_BAD_FUNCADDR (((uint64_t)4)<<32)
#define KLE_BAD_STRUCT (((uint64_t)5)<<32)
#define KLE_BAD_FIELD (((uint64_t)6)<<32)
#define KLE_BAD_PC (((uint64_t)7)<<32)
#define KLE_BAD_RA (((uint64_t)8)<<32)
#define KLE_BAD_SP (((uint64_t)9)<<32)
#define KLE_BAD_EP (((uint64_t)10)<<32)
#define KLE_BAD_SADDR (((uint64_t)11)<<32)
#define KLE_BAD_KERNELSTACK (((uint64_t)12)<<32)
#define KLE_BAD_LINENO (((uint64_t)13)<<32)
#define KLE_MAP_FILE (((uint64_t)14)<<32)
#define KLE_DUMP (((uint64_t)15)<<32)
#define KLE_BAD_STRING (((uint64_t)16)<<32)
#endif /* __KL_ERROR_H */