1*d9328cd4SRobert Mustacchi /*
2*d9328cd4SRobert Mustacchi * CDDL HEADER START
3*d9328cd4SRobert Mustacchi *
4*d9328cd4SRobert Mustacchi * The contents of this file are subject to the terms of the
5*d9328cd4SRobert Mustacchi * Common Development and Distribution License (the "License").
6*d9328cd4SRobert Mustacchi * You may not use this file except in compliance with the License.
7*d9328cd4SRobert Mustacchi *
8*d9328cd4SRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d9328cd4SRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
10*d9328cd4SRobert Mustacchi * See the License for the specific language governing permissions
11*d9328cd4SRobert Mustacchi * and limitations under the License.
12*d9328cd4SRobert Mustacchi *
13*d9328cd4SRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
14*d9328cd4SRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d9328cd4SRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
16*d9328cd4SRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
17*d9328cd4SRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
18*d9328cd4SRobert Mustacchi *
19*d9328cd4SRobert Mustacchi * CDDL HEADER END
20*d9328cd4SRobert Mustacchi */
21*d9328cd4SRobert Mustacchi
22*d9328cd4SRobert Mustacchi /*
23*d9328cd4SRobert Mustacchi * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
24*d9328cd4SRobert Mustacchi */
25*d9328cd4SRobert Mustacchi
26*d9328cd4SRobert Mustacchi #include <stdio.h>
27*d9328cd4SRobert Mustacchi #include <libelf.h>
28*d9328cd4SRobert Mustacchi #include <string.h>
29*d9328cd4SRobert Mustacchi
30*d9328cd4SRobert Mustacchi #include "rdb.h"
31*d9328cd4SRobert Mustacchi
32*d9328cd4SRobert Mustacchi typedef struct {
33*d9328cd4SRobert Mustacchi char *ht_key; /* HELP keyword for topic */
34*d9328cd4SRobert Mustacchi char *ht_desc; /* description of topic */
35*d9328cd4SRobert Mustacchi void (*ht_func)(); /* detailed info on topic */
36*d9328cd4SRobert Mustacchi } help_topics;
37*d9328cd4SRobert Mustacchi
38*d9328cd4SRobert Mustacchi static void
break_help()39*d9328cd4SRobert Mustacchi break_help()
40*d9328cd4SRobert Mustacchi {
41*d9328cd4SRobert Mustacchi (void) printf("Break Help:\n"
42*d9328cd4SRobert Mustacchi "\tbreak - list breakpoints\n"
43*d9328cd4SRobert Mustacchi "\tbreak <address> - set break point at <address\n");
44*d9328cd4SRobert Mustacchi }
45*d9328cd4SRobert Mustacchi
46*d9328cd4SRobert Mustacchi static void
delete_help()47*d9328cd4SRobert Mustacchi delete_help()
48*d9328cd4SRobert Mustacchi {
49*d9328cd4SRobert Mustacchi (void) printf("Delete Help:\n"
50*d9328cd4SRobert Mustacchi "\tdelete <address> - delete breakpoint at <address>\n");
51*d9328cd4SRobert Mustacchi }
52*d9328cd4SRobert Mustacchi
53*d9328cd4SRobert Mustacchi static void
dis_help()54*d9328cd4SRobert Mustacchi dis_help()
55*d9328cd4SRobert Mustacchi {
56*d9328cd4SRobert Mustacchi (void) printf("Disassemble Help:\n"
57*d9328cd4SRobert Mustacchi "\tdis -\t\t\tdisassemble from current PC\n"
58*d9328cd4SRobert Mustacchi "\tdis <address> [count] -\tdisassemble from address for\n"
59*d9328cd4SRobert Mustacchi "\t\t\t\t<count> instructions\n");
60*d9328cd4SRobert Mustacchi }
61*d9328cd4SRobert Mustacchi
62*d9328cd4SRobert Mustacchi static void
echo_help()63*d9328cd4SRobert Mustacchi echo_help()
64*d9328cd4SRobert Mustacchi {
65*d9328cd4SRobert Mustacchi (void) printf("Echo Help:\n"
66*d9328cd4SRobert Mustacchi "\tEcho '<quoted string>'\n"
67*d9328cd4SRobert Mustacchi "\t\tthe echo command can be used to display output to\n"
68*d9328cd4SRobert Mustacchi "\t\tthe main terminal. This is useful when running\n"
69*d9328cd4SRobert Mustacchi "\t\tcommand scripts and wanting to display status\n"
70*d9328cd4SRobert Mustacchi "\n"
71*d9328cd4SRobert Mustacchi "\t\tcurrently only <quoted strings> may be displayed\n");
72*d9328cd4SRobert Mustacchi }
73*d9328cd4SRobert Mustacchi
74*d9328cd4SRobert Mustacchi static void
print_help()75*d9328cd4SRobert Mustacchi print_help()
76*d9328cd4SRobert Mustacchi {
77*d9328cd4SRobert Mustacchi (void) printf("Print Help:\n"
78*d9328cd4SRobert Mustacchi "\tprint <address> [count [format]]\n"
79*d9328cd4SRobert Mustacchi "\t\tcount - number of units to print (default 4)\n"
80*d9328cd4SRobert Mustacchi "\t\tformat - how to display data:\n"
81*d9328cd4SRobert Mustacchi "\t\t\t\tX - Hex Words (default)\n"
82*d9328cd4SRobert Mustacchi "\t\t\t\tb - unsigned hex bytes\n"
83*d9328cd4SRobert Mustacchi "\t\t\t\ts - string\n"
84*d9328cd4SRobert Mustacchi "\tprint <varname>\n"
85*d9328cd4SRobert Mustacchi "\t\thelp varname for more info\n");
86*d9328cd4SRobert Mustacchi }
87*d9328cd4SRobert Mustacchi
88*d9328cd4SRobert Mustacchi static void
step_help()89*d9328cd4SRobert Mustacchi step_help()
90*d9328cd4SRobert Mustacchi {
91*d9328cd4SRobert Mustacchi (void) printf("Step Help:\n");
92*d9328cd4SRobert Mustacchi (void) printf("\tstep - step one instruction.\n");
93*d9328cd4SRobert Mustacchi (void) printf("\tstep count [silent] - step count instructions\n");
94*d9328cd4SRobert Mustacchi (void) printf("\t\t\t\tif silent is specified to not disassemble\n"
95*d9328cd4SRobert Mustacchi "\t\t\t\tinstr. during stepping\n");
96*d9328cd4SRobert Mustacchi }
97*d9328cd4SRobert Mustacchi
98*d9328cd4SRobert Mustacchi static void
value_help()99*d9328cd4SRobert Mustacchi value_help()
100*d9328cd4SRobert Mustacchi {
101*d9328cd4SRobert Mustacchi (void) printf("Value Help:\n"
102*d9328cd4SRobert Mustacchi "\tvalue <symbol name> -\tdisplay the value associated with\n"
103*d9328cd4SRobert Mustacchi "\t\t\t\tsymbol <symbol name>.\n");
104*d9328cd4SRobert Mustacchi }
105*d9328cd4SRobert Mustacchi
106*d9328cd4SRobert Mustacchi static void
varname_help()107*d9328cd4SRobert Mustacchi varname_help()
108*d9328cd4SRobert Mustacchi {
109*d9328cd4SRobert Mustacchi (void) printf("Variable Name Help:\n"
110*d9328cd4SRobert Mustacchi "\tVariable names are in the form of $<name> and are used\n"
111*d9328cd4SRobert Mustacchi "\tto access special information. Possible varnames\n"
112*d9328cd4SRobert Mustacchi "\tare:\n"
113*d9328cd4SRobert Mustacchi "\t\tcommon:\n"
114*d9328cd4SRobert Mustacchi "\t\t\t$regs - display all registers\n"
115*d9328cd4SRobert Mustacchi "\t\tsparc:\n"
116*d9328cd4SRobert Mustacchi "\t\t\t$ins - display IN registers\n"
117*d9328cd4SRobert Mustacchi "\t\t\t$globs - display GLOBAL registers\n"
118*d9328cd4SRobert Mustacchi "\t\t\t$outs - display OUT registers\n"
119*d9328cd4SRobert Mustacchi "\t\t\t$locs - display LOCAL registers\n"
120*d9328cd4SRobert Mustacchi "\t\t\t$specs - display SPECIAL registers\n"
121*d9328cd4SRobert Mustacchi "\t\ti86pc:\n");
122*d9328cd4SRobert Mustacchi }
123*d9328cd4SRobert Mustacchi
124*d9328cd4SRobert Mustacchi static const help_topics htops[] = {
125*d9328cd4SRobert Mustacchi {
126*d9328cd4SRobert Mustacchi "break",
127*d9328cd4SRobert Mustacchi "Set and display breakpoints",
128*d9328cd4SRobert Mustacchi break_help
129*d9328cd4SRobert Mustacchi },
130*d9328cd4SRobert Mustacchi {
131*d9328cd4SRobert Mustacchi "cont",
132*d9328cd4SRobert Mustacchi "continue execution of process",
133*d9328cd4SRobert Mustacchi 0
134*d9328cd4SRobert Mustacchi },
135*d9328cd4SRobert Mustacchi {
136*d9328cd4SRobert Mustacchi "delete",
137*d9328cd4SRobert Mustacchi "delete breakpoints",
138*d9328cd4SRobert Mustacchi delete_help
139*d9328cd4SRobert Mustacchi },
140*d9328cd4SRobert Mustacchi {
141*d9328cd4SRobert Mustacchi "dis",
142*d9328cd4SRobert Mustacchi "Help on the Disassemble Command",
143*d9328cd4SRobert Mustacchi dis_help
144*d9328cd4SRobert Mustacchi },
145*d9328cd4SRobert Mustacchi {
146*d9328cd4SRobert Mustacchi "echo",
147*d9328cd4SRobert Mustacchi "Help on the Echo Command",
148*d9328cd4SRobert Mustacchi echo_help
149*d9328cd4SRobert Mustacchi },
150*d9328cd4SRobert Mustacchi {
151*d9328cd4SRobert Mustacchi "event",
152*d9328cd4SRobert Mustacchi "event [on|off] to enable or disable event information",
153*d9328cd4SRobert Mustacchi 0
154*d9328cd4SRobert Mustacchi },
155*d9328cd4SRobert Mustacchi {
156*d9328cd4SRobert Mustacchi "getmaps",
157*d9328cd4SRobert Mustacchi "Read Link_Map structure from run-time linker",
158*d9328cd4SRobert Mustacchi 0
159*d9328cd4SRobert Mustacchi },
160*d9328cd4SRobert Mustacchi {
161*d9328cd4SRobert Mustacchi "linkmaps",
162*d9328cd4SRobert Mustacchi "Display link-map information",
163*d9328cd4SRobert Mustacchi 0
164*d9328cd4SRobert Mustacchi },
165*d9328cd4SRobert Mustacchi {
166*d9328cd4SRobert Mustacchi "maps",
167*d9328cd4SRobert Mustacchi "Display memory mapping information",
168*d9328cd4SRobert Mustacchi 0
169*d9328cd4SRobert Mustacchi },
170*d9328cd4SRobert Mustacchi {
171*d9328cd4SRobert Mustacchi "objpad",
172*d9328cd4SRobert Mustacchi "Set object padding for ld.so.1 mmap'ed objects",
173*d9328cd4SRobert Mustacchi 0
174*d9328cd4SRobert Mustacchi },
175*d9328cd4SRobert Mustacchi {
176*d9328cd4SRobert Mustacchi "pltskip",
177*d9328cd4SRobert Mustacchi "Enables and disables stepping through PLT's",
178*d9328cd4SRobert Mustacchi 0
179*d9328cd4SRobert Mustacchi },
180*d9328cd4SRobert Mustacchi {
181*d9328cd4SRobert Mustacchi "print",
182*d9328cd4SRobert Mustacchi "Display memory at <address>",
183*d9328cd4SRobert Mustacchi print_help
184*d9328cd4SRobert Mustacchi },
185*d9328cd4SRobert Mustacchi {
186*d9328cd4SRobert Mustacchi "step",
187*d9328cd4SRobert Mustacchi "Help on the Step Command",
188*d9328cd4SRobert Mustacchi step_help
189*d9328cd4SRobert Mustacchi },
190*d9328cd4SRobert Mustacchi {
191*d9328cd4SRobert Mustacchi "value",
192*d9328cd4SRobert Mustacchi "Help on the Value Command",
193*d9328cd4SRobert Mustacchi value_help
194*d9328cd4SRobert Mustacchi },
195*d9328cd4SRobert Mustacchi {
196*d9328cd4SRobert Mustacchi "varname",
197*d9328cd4SRobert Mustacchi "Help on $variable values",
198*d9328cd4SRobert Mustacchi varname_help
199*d9328cd4SRobert Mustacchi },
200*d9328cd4SRobert Mustacchi {
201*d9328cd4SRobert Mustacchi "where",
202*d9328cd4SRobert Mustacchi "Display stack trace",
203*d9328cd4SRobert Mustacchi 0
204*d9328cd4SRobert Mustacchi },
205*d9328cd4SRobert Mustacchi {
206*d9328cd4SRobert Mustacchi 0,
207*d9328cd4SRobert Mustacchi 0,
208*d9328cd4SRobert Mustacchi 0
209*d9328cd4SRobert Mustacchi }
210*d9328cd4SRobert Mustacchi };
211*d9328cd4SRobert Mustacchi
212*d9328cd4SRobert Mustacchi void
rdb_help(const char * topic)213*d9328cd4SRobert Mustacchi rdb_help(const char *topic) {
214*d9328cd4SRobert Mustacchi int i;
215*d9328cd4SRobert Mustacchi
216*d9328cd4SRobert Mustacchi if (topic) {
217*d9328cd4SRobert Mustacchi for (i = 0; htops[i].ht_key; i++) {
218*d9328cd4SRobert Mustacchi if (strcmp(htops[i].ht_key, topic) == 0) {
219*d9328cd4SRobert Mustacchi if (htops[i].ht_func)
220*d9328cd4SRobert Mustacchi htops[i].ht_func();
221*d9328cd4SRobert Mustacchi else
222*d9328cd4SRobert Mustacchi (void) printf("no additional help "
223*d9328cd4SRobert Mustacchi "available for %s\n",
224*d9328cd4SRobert Mustacchi htops[i].ht_key);
225*d9328cd4SRobert Mustacchi return;
226*d9328cd4SRobert Mustacchi }
227*d9328cd4SRobert Mustacchi }
228*d9328cd4SRobert Mustacchi (void) printf("Help not available for topic: %s\n", topic);
229*d9328cd4SRobert Mustacchi }
230*d9328cd4SRobert Mustacchi
231*d9328cd4SRobert Mustacchi (void) printf("The following commands are available\n");
232*d9328cd4SRobert Mustacchi
233*d9328cd4SRobert Mustacchi for (i = 0; htops[i].ht_key; i++) {
234*d9328cd4SRobert Mustacchi (void) printf("\t%10s\t%s", htops[i].ht_key, htops[i].ht_desc);
235*d9328cd4SRobert Mustacchi if (htops[i].ht_func)
236*d9328cd4SRobert Mustacchi (void) putchar('*');
237*d9328cd4SRobert Mustacchi (void) putchar('\n');
238*d9328cd4SRobert Mustacchi }
239*d9328cd4SRobert Mustacchi (void) printf("\n(*) more help is available by typing "
240*d9328cd4SRobert Mustacchi "'help <topic>'\n\n");
241*d9328cd4SRobert Mustacchi }
242