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.
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.
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]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #pragma ident "%Z%%M% %I% %E% SMI"
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>
47 #define KM_F_PRIMARY 1
49 #define KMT_TRAP_NOTENUM -1 /* Glob for unnamed traps */
50 #define KMT_TRAP_ALL -2 /* Glob for all traps */
52 typedef struct kmt_module
{
53 mdb_list_t km_list
; /* List forward/back pointers */
54 char *km_name
; /* Module name */
58 mdb_gelf_symtab_t
*km_symtab
;
61 const void *km_symtab_va
;
62 const void *km_strtab_va
;
70 const void *km_ctf_va
;
74 struct modctl km_modctl
;
75 struct module km_module
;
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 */
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)
96 GElf_Sym _kmt_cmntrap
;
97 GElf_Sym _kmt_sysenter
;
98 GElf_Sym _kmt_brand_sysenter
;
100 GElf_Sym _kmt_syscall
;
101 GElf_Sym _kmt_brand_syscall
;
107 #if defined(__i386) || defined(__amd64)
108 #define kmt_cmnint kmt_intrsyms._kmt_cmnint
109 #define kmt_cmntrap kmt_intrsyms._kmt_cmntrap
112 typedef struct kmt_defbp
{
113 mdb_list_t dbp_bplist
;
119 typedef struct kmt_brkpt
{
120 uintptr_t kb_addr
; /* Breakpoint address */
121 mdb_instr_t kb_oinstr
; /* Replaced instruction */
124 typedef struct kmt_bparg
{
125 uintptr_t ka_addr
; /* Explicit address */
126 char *ka_symbol
; /* Symbolic name */
127 kmt_defbp_t
*ka_defbp
;
130 extern void kmt_printregs(const mdb_tgt_gregset_t
*gregs
);
132 extern const char *kmt_def_dismode(void);
134 extern void kmt_init_isadep(mdb_tgt_t
*);
135 extern void kmt_startup_isadep(mdb_tgt_t
*);
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);
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 *);
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);
154 extern const char *kmt_trapname(int);