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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _KMDB_WR_IMPL_H
28#define	_KMDB_WR_IMPL_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#include <kmdb/kmdb_wr.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38#define	WNTASK_DMOD_LOAD	0x0001		/* Load a specific dmod */
39#define	WNTASK_DMOD_LOAD_ALL	0x0002		/* Load all dmods for kmods */
40#define	WNTASK_DMOD_UNLOAD	0x0004		/* Unload a specific dmod */
41#define	WNTASK_DMOD_PATH_CHANGE	0x0008		/* Change dmod search path */
42
43#define	WNFLAGS_NOFREE		0x0001		/* Don't free this wr on ack */
44
45#define	WNTASK_ACK		0x8000		/* Acknowledgement of req */
46
47#define	WR_ISACK(wr)		((((kmdb_wr_t *)(wr))->wn_task) & WNTASK_ACK)
48#define	WR_ACK(wr)		(((kmdb_wr_t *)(wr))->wn_task) |= WNTASK_ACK
49#define	WR_TASK(wr)		((((kmdb_wr_t *)(wr))->wn_task) & ~WNTASK_ACK)
50
51struct kmdb_wr {
52	struct kmdb_wr		*wn_next;	/* List of work requests */
53	struct kmdb_wr		*wn_prev;	/* List of work requests */
54	ushort_t		wn_task;	/* Task to be performed */
55	ushort_t		wn_flags;	/* Flags for this request */
56	uint_t			wn_errno;	/* Status for completed reqs */
57};
58
59/*
60 * Debugger-initiated loads: Debugger creates, passes to driver, driver loads
61 * the module, returns the request as an ack.  Driver-initiated loads: driver
62 * creates, loads module, passes to debugger as announcement, debugger returns
63 * as an ack.
64 */
65typedef struct kmdb_wr_load {
66	kmdb_wr_t		dlr_node;
67
68	/* Supplied by requestor */
69	char			*dlr_fname;
70
71	/* Filled in by driver upon successful completion */
72	struct modctl		*dlr_modctl;
73
74	/*
75	 * Used by the driver to track outstanding driver-initiated
76	 * notifications for leak prevention.
77	 */
78	struct kmdb_wr_load	*dlr_next;
79	struct kmdb_wr_load	*dlr_prev;
80} kmdb_wr_load_t;
81
82#define	dlr_errno	dlr_node.wn_errno
83
84/*
85 * The debugger creates a request for a module to be unloaded, and passes it
86 * to the driver.  The driver unloads the module, and returns the message to
87 * the debugger as an ack.
88 */
89typedef struct kmdb_wr_unload {
90	kmdb_wr_t		dur_node;
91
92	/* Supplied by requestor */
93	char			*dur_modname;
94	struct modctl		*dur_modctl;
95} kmdb_wr_unload_t;
96
97#define	dur_errno	dur_node.wn_errno
98
99/*
100 * The debugger creates a new path-change "request" when the dmod search path
101 * changes, and sends it to the driver.  The driver hangs onto the request
102 * until either the path changes again or the debugger is unloaded.  Either way,
103 * the state change request is passed back at that time as an ack.
104 */
105typedef struct kmdb_wr_path {
106	kmdb_wr_t		dpth_node;
107
108	/* Supplied by requestor */
109	const char		**dpth_path;
110	size_t			dpth_pathlen;
111} kmdb_wr_path_t;
112
113#define	dpth_errno	dpth_node.wn_errno
114
115#ifdef __cplusplus
116}
117#endif
118
119#endif /* _KMDB_WR_IMPL_H */
120