Home | History | Annotate | Download | only in kmdb
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _KVM_H
     27 #define	_KVM_H
     28 
     29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 /*
     32  * The kmdb target
     33  */
     34 
     35 #include <mdb/mdb_modapi.h>
     36 #include <mdb/mdb_target.h>
     37 #include <kmdb/kmdb_dpi.h>
     38 #include <kmdb/kvm_isadep.h>
     39 #include <kmdb/kvm_cpu.h>
     40 
     41 #include <sys/kobj.h>
     42 
     43 #ifdef __cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 #define	KM_F_PRIMARY		1
     48 
     49 #define	KMT_TRAP_NOTENUM	-1	/* Glob for unnamed traps */
     50 #define	KMT_TRAP_ALL		-2	/* Glob for all traps */
     51 
     52 typedef struct kmt_module {
     53 	mdb_list_t	km_list;	/* List forward/back pointers */
     54 	char		*km_name;	/* Module name */
     55 	char		km_seen;
     56 	GElf_Ehdr	km_ehdr;
     57 
     58 	mdb_gelf_symtab_t *km_symtab;
     59 	Shdr		km_symtab_hdr;
     60 	Shdr		km_strtab_hdr;
     61 	const void	*km_symtab_va;
     62 	const void	*km_strtab_va;
     63 
     64 	uintptr_t	km_text_va;
     65 	size_t		km_text_size;
     66 	uintptr_t	km_data_va;
     67 	size_t		km_data_size;
     68 	uintptr_t	km_bss_va;
     69 	size_t		km_bss_size;
     70 	const void	*km_ctf_va;
     71 	size_t		km_ctf_size;
     72 
     73 	ctf_file_t	*km_ctfp;
     74 	struct modctl	km_modctl;
     75 	struct module	km_module;
     76 	int		km_flags;
     77 } kmt_module_t;
     78 
     79 typedef struct kmt_data {
     80 	const mdb_tgt_regdesc_t	*kmt_rds;	/* Register description table */
     81 	mdb_nv_t	kmt_modules;		/* Hash table of modules */
     82 	mdb_list_t	kmt_modlist;		/* List of mods in load order */
     83 	const char	*kmt_rtld_name;		/* Module containing krtld */
     84 	caddr_t		kmt_writemap;		/* Used to map PAs for writes */
     85 	size_t		kmt_writemapsz;		/* Size of same */
     86 	mdb_map_t	kmt_map;		/* Persistant map for callers */
     87 	ulong_t		*kmt_trapmap;
     88 	size_t		kmt_trapmax;
     89 	kmt_cpu_t	*kmt_cpu;		/* CPU-specific plugin */
     90 	int		kmt_cpu_retry;		/* Try CPU detect again? */
     91 	int		kmt_symavail;		/* Symbol resolution allowed */
     92 	uint_t		kmt_narmedbpts;		/* Number of armed brkpts */
     93 #if defined(__i386) || defined(__amd64)
     94 	struct {
     95 		GElf_Sym	_kmt_cmnint;
     96 		GElf_Sym	_kmt_cmntrap;
     97 		GElf_Sym	_kmt_sysenter;
     98 		GElf_Sym	_kmt_brand_sysenter;
     99 #if defined(__amd64)
    100 		GElf_Sym	_kmt_syscall;
    101 		GElf_Sym	_kmt_brand_syscall;
    102 #endif
    103 	} kmt_intrsyms;
    104 #endif
    105 } kmt_data_t;
    106 
    107 #if defined(__i386) || defined(__amd64)
    108 #define	kmt_cmnint	kmt_intrsyms._kmt_cmnint
    109 #define	kmt_cmntrap	kmt_intrsyms._kmt_cmntrap
    110 #endif
    111 
    112 typedef struct kmt_defbp {
    113 	mdb_list_t dbp_bplist;
    114 	char *dbp_objname;
    115 	char *dbp_symname;
    116 	int dbp_ref;
    117 } kmt_defbp_t;
    118 
    119 typedef struct kmt_brkpt {
    120 	uintptr_t kb_addr;			/* Breakpoint address */
    121 	mdb_instr_t kb_oinstr;			/* Replaced instruction */
    122 } kmt_brkpt_t;
    123 
    124 typedef struct kmt_bparg {
    125 	uintptr_t ka_addr;			/* Explicit address */
    126 	char *ka_symbol;			/* Symbolic name */
    127 	kmt_defbp_t *ka_defbp;
    128 } kmt_bparg_t;
    129 
    130 extern void kmt_printregs(const mdb_tgt_gregset_t *gregs);
    131 
    132 extern const char *kmt_def_dismode(void);
    133 
    134 extern void kmt_init_isadep(mdb_tgt_t *);
    135 extern void kmt_startup_isadep(mdb_tgt_t *);
    136 
    137 extern ssize_t kmt_write(mdb_tgt_t *, const void *, size_t, uintptr_t);
    138 extern ssize_t kmt_pwrite(mdb_tgt_t *, const void *, size_t, physaddr_t);
    139 extern ssize_t kmt_rw(mdb_tgt_t *, void *, size_t, uint64_t,
    140     ssize_t (*)(void *, size_t, uint64_t));
    141 extern ssize_t kmt_writer(void *, size_t, uint64_t);
    142 extern ssize_t kmt_ioread(mdb_tgt_t *, void *, size_t, uintptr_t);
    143 extern ssize_t kmt_iowrite(mdb_tgt_t *, const void *, size_t, uintptr_t);
    144 
    145 extern int kmt_step_out(mdb_tgt_t *, uintptr_t *);
    146 extern int kmt_step_branch(mdb_tgt_t *);
    147 extern int kmt_next(mdb_tgt_t *, uintptr_t *);
    148 
    149 extern int kmt_stack(uintptr_t, uint_t, int, const mdb_arg_t *);
    150 extern int kmt_stackv(uintptr_t, uint_t, int, const mdb_arg_t *);
    151 extern int kmt_stackr(uintptr_t, uint_t, int, const mdb_arg_t *);
    152 extern int kmt_cpustack(uintptr_t, uint_t, int, const mdb_arg_t *, int, int);
    153 
    154 extern const char *kmt_trapname(int);
    155 
    156 #ifdef __cplusplus
    157 }
    158 #endif
    159 
    160 #endif /* _KVM_H */
    161