xref: /onnv-gate/usr/src/uts/common/sys/kdi_impl.h (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*
23*0Sstevel@tonic-gate  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24*0Sstevel@tonic-gate  * Use is subject to license terms.
25*0Sstevel@tonic-gate  */
26*0Sstevel@tonic-gate 
27*0Sstevel@tonic-gate #ifndef _KDI_IMPL_H
28*0Sstevel@tonic-gate #define	_KDI_IMPL_H
29*0Sstevel@tonic-gate 
30*0Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*0Sstevel@tonic-gate 
32*0Sstevel@tonic-gate #include <sys/kdi.h>
33*0Sstevel@tonic-gate #include <sys/kdi_machimpl.h>
34*0Sstevel@tonic-gate 
35*0Sstevel@tonic-gate #ifdef __cplusplus
36*0Sstevel@tonic-gate extern "C" {
37*0Sstevel@tonic-gate #endif
38*0Sstevel@tonic-gate 
39*0Sstevel@tonic-gate struct module;
40*0Sstevel@tonic-gate struct gdscr;
41*0Sstevel@tonic-gate 
42*0Sstevel@tonic-gate /*
43*0Sstevel@tonic-gate  * The debugvec is used by the kernel to interact with the debugger.
44*0Sstevel@tonic-gate  */
45*0Sstevel@tonic-gate struct kdi_debugvec {
46*0Sstevel@tonic-gate 	void	(*dv_enter)(void);
47*0Sstevel@tonic-gate 
48*0Sstevel@tonic-gate 	void	(*dv_cpu_init)(struct cpu *);
49*0Sstevel@tonic-gate 	void	(*dv_kctl_cpu_init)(void);
50*0Sstevel@tonic-gate 
51*0Sstevel@tonic-gate #if defined(__i386) || defined(__amd64)
52*0Sstevel@tonic-gate 	void	(*dv_idt_sync)(gate_desc_t *);
53*0Sstevel@tonic-gate #endif	/* __i386 || __amd64 */
54*0Sstevel@tonic-gate 
55*0Sstevel@tonic-gate 	void	(*dv_vmready)(void);
56*0Sstevel@tonic-gate 	void	(*dv_kctl_vmready)(void);
57*0Sstevel@tonic-gate 
58*0Sstevel@tonic-gate 	void	(*dv_kctl_memavail)(void);
59*0Sstevel@tonic-gate 	int	(*dv_memavail)(caddr_t, size_t);
60*0Sstevel@tonic-gate 
61*0Sstevel@tonic-gate #if defined(__sparc)
62*0Sstevel@tonic-gate 	void	(*dv_cpr_restart)(void);
63*0Sstevel@tonic-gate #endif
64*0Sstevel@tonic-gate 
65*0Sstevel@tonic-gate 	void	(*dv_kctl_modavail)(void);
66*0Sstevel@tonic-gate 	void	(*dv_kctl_thravail)(void);
67*0Sstevel@tonic-gate 	void	(*dv_mod_loaded)(struct modctl *);
68*0Sstevel@tonic-gate 	void	(*dv_mod_unloading)(struct modctl *);
69*0Sstevel@tonic-gate };
70*0Sstevel@tonic-gate 
71*0Sstevel@tonic-gate typedef struct kdi_plat {
72*0Sstevel@tonic-gate 	void (*pkdi_system_claim)(void);
73*0Sstevel@tonic-gate 	void (*pkdi_system_release)(void);
74*0Sstevel@tonic-gate 	void (*pkdi_console_claim)(void);
75*0Sstevel@tonic-gate 	void (*pkdi_console_release)(void);
76*0Sstevel@tonic-gate } kdi_plat_t;
77*0Sstevel@tonic-gate 
78*0Sstevel@tonic-gate #define	pkdi_system_claim	kdi_plat.pkdi_system_claim
79*0Sstevel@tonic-gate #define	pkdi_system_release	kdi_plat.pkdi_system_release
80*0Sstevel@tonic-gate #define	pkdi_console_claim	kdi_plat.pkdi_console_claim
81*0Sstevel@tonic-gate #define	pkdi_console_release	kdi_plat.pkdi_console_release
82*0Sstevel@tonic-gate 
83*0Sstevel@tonic-gate /*
84*0Sstevel@tonic-gate  * The KDI, or Kernel/Debugger Interface, consists of an ops vector describing
85*0Sstevel@tonic-gate  * kernel services that may be directly invoked by the debugger.  Unless
86*0Sstevel@tonic-gate  * otherwise specified, the functions implementing this ops vector are designed
87*0Sstevel@tonic-gate  * to function when the debugger has control of the system - when all other CPUs
88*0Sstevel@tonic-gate  * have been stopped.  In such an environment, blocking services such as memory
89*0Sstevel@tonic-gate  * allocation or synchronization primitives are not available.
90*0Sstevel@tonic-gate  */
91*0Sstevel@tonic-gate struct kdi {
92*0Sstevel@tonic-gate 	int kdi_version;
93*0Sstevel@tonic-gate 
94*0Sstevel@tonic-gate 	/*
95*0Sstevel@tonic-gate 	 * Determines whether significant changes (loads or unloads) have
96*0Sstevel@tonic-gate 	 * been made to the modules since the last time this op was invoked.
97*0Sstevel@tonic-gate 	 */
98*0Sstevel@tonic-gate 	int (*kdi_mods_changed)(void);
99*0Sstevel@tonic-gate 
100*0Sstevel@tonic-gate 	/*
101*0Sstevel@tonic-gate 	 * Iterates through the current set of modctls, and invokes the
102*0Sstevel@tonic-gate 	 * caller-provided callback on each one.
103*0Sstevel@tonic-gate 	 */
104*0Sstevel@tonic-gate 	int (*kdi_mod_iter)(int (*)(struct modctl *, void *), void *);
105*0Sstevel@tonic-gate 
106*0Sstevel@tonic-gate 	/*
107*0Sstevel@tonic-gate 	 * Determines whether or not a given module is loaded.
108*0Sstevel@tonic-gate 	 */
109*0Sstevel@tonic-gate 	int (*kdi_mod_isloaded)(struct modctl *);
110*0Sstevel@tonic-gate 
111*0Sstevel@tonic-gate 	/*
112*0Sstevel@tonic-gate 	 * Has anything changed between two versions of the same modctl?
113*0Sstevel@tonic-gate 	 */
114*0Sstevel@tonic-gate 	int (*kdi_mod_haschanged)(struct modctl *, struct module *,
115*0Sstevel@tonic-gate 	    struct modctl *, struct module *);
116*0Sstevel@tonic-gate 
117*0Sstevel@tonic-gate 	/*
118*0Sstevel@tonic-gate 	 * Invoked by the debugger when it assumes control of the machine.
119*0Sstevel@tonic-gate 	 */
120*0Sstevel@tonic-gate 	void (*kdi_system_claim)(void);
121*0Sstevel@tonic-gate 
122*0Sstevel@tonic-gate 	/*
123*0Sstevel@tonic-gate 	 * Invoked by the debugger when it relinquishes control of the machine.
124*0Sstevel@tonic-gate 	 */
125*0Sstevel@tonic-gate 	void (*kdi_system_release)(void);
126*0Sstevel@tonic-gate 
127*0Sstevel@tonic-gate 	int (*kdi_pread)(caddr_t, size_t, uint64_t, size_t *);
128*0Sstevel@tonic-gate 	int (*kdi_pwrite)(caddr_t, size_t, uint64_t, size_t *);
129*0Sstevel@tonic-gate 	void (*kdi_flush_caches)(void);
130*0Sstevel@tonic-gate 
131*0Sstevel@tonic-gate 	size_t (*kdi_range_is_nontoxic)(uintptr_t, size_t, int);
132*0Sstevel@tonic-gate 
133*0Sstevel@tonic-gate 	struct cons_polledio *(*kdi_get_polled_io)(void);
134*0Sstevel@tonic-gate 
135*0Sstevel@tonic-gate 	int (*kdi_vtop)(uintptr_t, uint64_t *);
136*0Sstevel@tonic-gate 
137*0Sstevel@tonic-gate 	kdi_dtrace_state_t (*kdi_dtrace_get_state)(void);
138*0Sstevel@tonic-gate 	int (*kdi_dtrace_set)(kdi_dtrace_set_t);
139*0Sstevel@tonic-gate 
140*0Sstevel@tonic-gate 	void (*kdi_plat_call)(void (*)(void));
141*0Sstevel@tonic-gate 
142*0Sstevel@tonic-gate 	kdi_mach_t kdi_mach;
143*0Sstevel@tonic-gate 	kdi_plat_t kdi_plat;
144*0Sstevel@tonic-gate };
145*0Sstevel@tonic-gate 
146*0Sstevel@tonic-gate extern void kdi_softcall(void (*)(void));
147*0Sstevel@tonic-gate extern int kdi_pread(caddr_t, size_t, uint64_t, size_t *);
148*0Sstevel@tonic-gate extern int kdi_pwrite(caddr_t, size_t, uint64_t, size_t *);
149*0Sstevel@tonic-gate extern size_t kdi_range_is_nontoxic(uintptr_t, size_t, int);
150*0Sstevel@tonic-gate extern void kdi_flush_caches(void);
151*0Sstevel@tonic-gate extern kdi_dtrace_state_t kdi_dtrace_get_state(void);
152*0Sstevel@tonic-gate extern int kdi_vtop(uintptr_t, uint64_t *);
153*0Sstevel@tonic-gate 
154*0Sstevel@tonic-gate extern void cpu_kdi_init(kdi_t *);
155*0Sstevel@tonic-gate extern void mach_kdi_init(kdi_t *);
156*0Sstevel@tonic-gate extern void plat_kdi_init(kdi_t *);
157*0Sstevel@tonic-gate 
158*0Sstevel@tonic-gate #ifdef __cplusplus
159*0Sstevel@tonic-gate }
160*0Sstevel@tonic-gate #endif
161*0Sstevel@tonic-gate 
162*0Sstevel@tonic-gate #endif /* _KDI_IMPL_H */
163