Blame lkcd_x86_trace.h

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