xref: /illumos-gate/usr/src/cmd/sgs/demo_rdb/common/gram.y (revision d9328cd43f1300af79f6fc8a3ad4760137618c63)
1*d9328cd4SRobert Mustacchi %{
2*d9328cd4SRobert Mustacchi /*
3*d9328cd4SRobert Mustacchi  * CDDL HEADER START
4*d9328cd4SRobert Mustacchi  *
5*d9328cd4SRobert Mustacchi  * The contents of this file are subject to the terms of the
6*d9328cd4SRobert Mustacchi  * Common Development and Distribution License (the "License").
7*d9328cd4SRobert Mustacchi  * You may not use this file except in compliance with the License.
8*d9328cd4SRobert Mustacchi  *
9*d9328cd4SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*d9328cd4SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
11*d9328cd4SRobert Mustacchi  * See the License for the specific language governing permissions
12*d9328cd4SRobert Mustacchi  * and limitations under the License.
13*d9328cd4SRobert Mustacchi  *
14*d9328cd4SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
15*d9328cd4SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*d9328cd4SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
17*d9328cd4SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
18*d9328cd4SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
19*d9328cd4SRobert Mustacchi  *
20*d9328cd4SRobert Mustacchi  * CDDL HEADER END
21*d9328cd4SRobert Mustacchi  */
22*d9328cd4SRobert Mustacchi 
23*d9328cd4SRobert Mustacchi /*
24*d9328cd4SRobert Mustacchi  * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
25*d9328cd4SRobert Mustacchi  */
26*d9328cd4SRobert Mustacchi 
27*d9328cd4SRobert Mustacchi #include <stdio.h>
28*d9328cd4SRobert Mustacchi #include <sys/types.h>
29*d9328cd4SRobert Mustacchi #include <libelf.h>
30*d9328cd4SRobert Mustacchi #include "rdb.h"
31*d9328cd4SRobert Mustacchi 
32*d9328cd4SRobert Mustacchi extern	void	rdb_prompt();
33*d9328cd4SRobert Mustacchi 
34*d9328cd4SRobert Mustacchi %}
35*d9328cd4SRobert Mustacchi 
36*d9328cd4SRobert Mustacchi %token	VALUE STEP HELP NUMBER NEWLINE SYMBOL PLUS BREAK CONT DIS GETMAPS
37*d9328cd4SRobert Mustacchi %token	DELETE MAPS PLTSKIP WHERE PRINT OBJPAD QSTRING VARSTRING ECHO_OUT
38*d9328cd4SRobert Mustacchi %token	EVENT LINKMAPS
39*d9328cd4SRobert Mustacchi 
40*d9328cd4SRobert Mustacchi %union {
41*d9328cd4SRobert Mustacchi 	char	*str;
42*d9328cd4SRobert Mustacchi 	ulong_t	addr;
43*d9328cd4SRobert Mustacchi 	int	num;
44*d9328cd4SRobert Mustacchi }
45*d9328cd4SRobert Mustacchi 
46*d9328cd4SRobert Mustacchi %type <addr> NUMBER address
47*d9328cd4SRobert Mustacchi %type <str> SYMBOL QSTRING VARSTRING
48*d9328cd4SRobert Mustacchi 
49*d9328cd4SRobert Mustacchi %left PLUS
50*d9328cd4SRobert Mustacchi 
51*d9328cd4SRobert Mustacchi %%
52*d9328cd4SRobert Mustacchi start: commands
53*d9328cd4SRobert Mustacchi 	;
54*d9328cd4SRobert Mustacchi 
55*d9328cd4SRobert Mustacchi commands: /* empty */
56*d9328cd4SRobert Mustacchi 	| commands command
57*d9328cd4SRobert Mustacchi 	;
58*d9328cd4SRobert Mustacchi command: BREAK NEWLINE
59*d9328cd4SRobert Mustacchi 	{
60*d9328cd4SRobert Mustacchi 		list_breakpoints(&proch);
61*d9328cd4SRobert Mustacchi 		rdb_prompt();
62*d9328cd4SRobert Mustacchi 	}
63*d9328cd4SRobert Mustacchi 	| BREAK address NEWLINE
64*d9328cd4SRobert Mustacchi 	{
65*d9328cd4SRobert Mustacchi 		if (set_breakpoint(&proch, $2, FLG_BP_USERDEF) == RET_OK)
66*d9328cd4SRobert Mustacchi 			(void) printf("break point set at: 0x%lx\n",
67*d9328cd4SRobert Mustacchi 			    (unsigned long)$2);
68*d9328cd4SRobert Mustacchi 		else
69*d9328cd4SRobert Mustacchi 			(void) printf("unable to set breakpoint.\n");
70*d9328cd4SRobert Mustacchi 		rdb_prompt();
71*d9328cd4SRobert Mustacchi 	}
72*d9328cd4SRobert Mustacchi 	| CONT NEWLINE
73*d9328cd4SRobert Mustacchi 	{
74*d9328cd4SRobert Mustacchi 		(void) continue_to_break(&proch);
75*d9328cd4SRobert Mustacchi 		rdb_prompt();
76*d9328cd4SRobert Mustacchi 	}
77*d9328cd4SRobert Mustacchi 	| DELETE address NEWLINE
78*d9328cd4SRobert Mustacchi 	{
79*d9328cd4SRobert Mustacchi 		if (delete_breakpoint(&proch, $2, FLG_BP_USERDEF) != RET_OK)
80*d9328cd4SRobert Mustacchi 			(void) printf("unable to delete breakpoint at %#lx\n",
81*d9328cd4SRobert Mustacchi 			    (unsigned long)$2);
82*d9328cd4SRobert Mustacchi 		else
83*d9328cd4SRobert Mustacchi 			(void) printf("breakpoint deleted at 0x%lx\n",
84*d9328cd4SRobert Mustacchi 			    (unsigned long)$2);
85*d9328cd4SRobert Mustacchi 
86*d9328cd4SRobert Mustacchi 		rdb_prompt();
87*d9328cd4SRobert Mustacchi 	}
88*d9328cd4SRobert Mustacchi 	| DIS NEWLINE
89*d9328cd4SRobert Mustacchi 	{
90*d9328cd4SRobert Mustacchi 		disasm(&proch, 10);
91*d9328cd4SRobert Mustacchi 		rdb_prompt();
92*d9328cd4SRobert Mustacchi 	}
93*d9328cd4SRobert Mustacchi 	| DIS address NEWLINE
94*d9328cd4SRobert Mustacchi 	{
95*d9328cd4SRobert Mustacchi 		(void) disasm_addr(&proch, (ulong_t)$2, 10);
96*d9328cd4SRobert Mustacchi 		rdb_prompt();
97*d9328cd4SRobert Mustacchi 	}
98*d9328cd4SRobert Mustacchi 	| DIS address NUMBER NEWLINE
99*d9328cd4SRobert Mustacchi 	{
100*d9328cd4SRobert Mustacchi 		(void) disasm_addr(&proch, (ulong_t)$2, (int)$3);
101*d9328cd4SRobert Mustacchi 		rdb_prompt();
102*d9328cd4SRobert Mustacchi 	}
103*d9328cd4SRobert Mustacchi 	| ECHO_OUT QSTRING NEWLINE
104*d9328cd4SRobert Mustacchi 	{
105*d9328cd4SRobert Mustacchi 		(void) puts($2);
106*d9328cd4SRobert Mustacchi 		free($2);
107*d9328cd4SRobert Mustacchi 		rdb_prompt();
108*d9328cd4SRobert Mustacchi 	}
109*d9328cd4SRobert Mustacchi 	| EVENT SYMBOL NEWLINE
110*d9328cd4SRobert Mustacchi 	{
111*d9328cd4SRobert Mustacchi 		if (strcmp($2, "on") == 0) {
112*d9328cd4SRobert Mustacchi 			(void) printf("rdb: event information enabled.\n");
113*d9328cd4SRobert Mustacchi 			rdb_flags |= RDB_FL_EVENTS;
114*d9328cd4SRobert Mustacchi 		} else if (strcmp($2, "off") == 0) {
115*d9328cd4SRobert Mustacchi 			(void) printf("rdb: event information disabled.\n");
116*d9328cd4SRobert Mustacchi 			rdb_flags &= ~RDB_FL_EVENTS;
117*d9328cd4SRobert Mustacchi 		} else {
118*d9328cd4SRobert Mustacchi 			(void) printf("rdb: unknown event command: %s\n", $2);
119*d9328cd4SRobert Mustacchi 		}
120*d9328cd4SRobert Mustacchi 		free($2);
121*d9328cd4SRobert Mustacchi 		rdb_prompt();
122*d9328cd4SRobert Mustacchi 	}
123*d9328cd4SRobert Mustacchi 	| GETMAPS NEWLINE
124*d9328cd4SRobert Mustacchi 	{
125*d9328cd4SRobert Mustacchi 		if (get_linkmaps(&proch) != RET_OK)
126*d9328cd4SRobert Mustacchi 			(void) printf("get_linkmaps failed\n");
127*d9328cd4SRobert Mustacchi 
128*d9328cd4SRobert Mustacchi 		rdb_prompt();
129*d9328cd4SRobert Mustacchi 	}
130*d9328cd4SRobert Mustacchi 	| LINKMAPS NEWLINE
131*d9328cd4SRobert Mustacchi 	{
132*d9328cd4SRobert Mustacchi 		if (display_linkmaps(&proch) != RET_OK)
133*d9328cd4SRobert Mustacchi 			(void) printf("display_linkmaps failed\n");
134*d9328cd4SRobert Mustacchi 		rdb_prompt();
135*d9328cd4SRobert Mustacchi 	}
136*d9328cd4SRobert Mustacchi 	| MAPS NEWLINE
137*d9328cd4SRobert Mustacchi 	{
138*d9328cd4SRobert Mustacchi 		if (display_maps(&proch) != RET_OK)
139*d9328cd4SRobert Mustacchi 			(void) printf("display_maps failed\n");
140*d9328cd4SRobert Mustacchi 		rdb_prompt();
141*d9328cd4SRobert Mustacchi 	}
142*d9328cd4SRobert Mustacchi 	| STEP NEWLINE
143*d9328cd4SRobert Mustacchi 	{
144*d9328cd4SRobert Mustacchi 		sn_flags_e	sf;
145*d9328cd4SRobert Mustacchi 
146*d9328cd4SRobert Mustacchi 		(void) printf("single step\n");
147*d9328cd4SRobert Mustacchi 		sf = FLG_SN_VERBOSE;
148*d9328cd4SRobert Mustacchi 		if (proch.pp_flags & FLG_PP_PLTSKIP)
149*d9328cd4SRobert Mustacchi 			sf |= FLG_SN_PLTSKIP;
150*d9328cd4SRobert Mustacchi 
151*d9328cd4SRobert Mustacchi 		(void) step_n(&proch, 1, sf);
152*d9328cd4SRobert Mustacchi 		rdb_prompt();
153*d9328cd4SRobert Mustacchi 	}
154*d9328cd4SRobert Mustacchi 	| STEP NUMBER NEWLINE
155*d9328cd4SRobert Mustacchi 	{
156*d9328cd4SRobert Mustacchi 		sn_flags_e	sf;
157*d9328cd4SRobert Mustacchi 
158*d9328cd4SRobert Mustacchi 		(void) printf("stepping %d\n", (int)$2);
159*d9328cd4SRobert Mustacchi 		sf = FLG_SN_VERBOSE;
160*d9328cd4SRobert Mustacchi 		if (proch.pp_flags & FLG_PP_PLTSKIP)
161*d9328cd4SRobert Mustacchi 			sf |= FLG_SN_PLTSKIP;
162*d9328cd4SRobert Mustacchi 
163*d9328cd4SRobert Mustacchi 		(void) step_n(&proch, $2, sf);
164*d9328cd4SRobert Mustacchi 		rdb_prompt();
165*d9328cd4SRobert Mustacchi 	}
166*d9328cd4SRobert Mustacchi 	| STEP NUMBER SYMBOL NEWLINE
167*d9328cd4SRobert Mustacchi 	{
168*d9328cd4SRobert Mustacchi 		sn_flags_e	sf;
169*d9328cd4SRobert Mustacchi 
170*d9328cd4SRobert Mustacchi 		sf = FLG_SN_VERBOSE;
171*d9328cd4SRobert Mustacchi 		if (proch.pp_flags & FLG_PP_PLTSKIP)
172*d9328cd4SRobert Mustacchi 			sf |= FLG_SN_PLTSKIP;
173*d9328cd4SRobert Mustacchi 
174*d9328cd4SRobert Mustacchi 		if (strcmp("silent", $3) == 0)
175*d9328cd4SRobert Mustacchi 			(void) step_n(&proch, $2, sf);
176*d9328cd4SRobert Mustacchi 		else
177*d9328cd4SRobert Mustacchi 			(void) printf("error: step <count> [silent]\n");
178*d9328cd4SRobert Mustacchi 
179*d9328cd4SRobert Mustacchi 		free($3);
180*d9328cd4SRobert Mustacchi 		rdb_prompt();
181*d9328cd4SRobert Mustacchi 	}
182*d9328cd4SRobert Mustacchi 	| HELP NEWLINE
183*d9328cd4SRobert Mustacchi 	{
184*d9328cd4SRobert Mustacchi 		rdb_help(0);
185*d9328cd4SRobert Mustacchi 		rdb_prompt();
186*d9328cd4SRobert Mustacchi 	}
187*d9328cd4SRobert Mustacchi 	| HELP SYMBOL NEWLINE
188*d9328cd4SRobert Mustacchi 	{
189*d9328cd4SRobert Mustacchi 		rdb_help($2);
190*d9328cd4SRobert Mustacchi 		free($2);
191*d9328cd4SRobert Mustacchi 		rdb_prompt();
192*d9328cd4SRobert Mustacchi 	}
193*d9328cd4SRobert Mustacchi 	| OBJPAD NUMBER NEWLINE
194*d9328cd4SRobert Mustacchi 	{
195*d9328cd4SRobert Mustacchi 		(void) printf("setting object padding to: %#lx\n", $2);
196*d9328cd4SRobert Mustacchi 		(void) set_objpad(&proch, $2);
197*d9328cd4SRobert Mustacchi 		rdb_prompt();
198*d9328cd4SRobert Mustacchi 	}
199*d9328cd4SRobert Mustacchi 	| PLTSKIP NEWLINE
200*d9328cd4SRobert Mustacchi 	{
201*d9328cd4SRobert Mustacchi 		if (proch.pp_flags & FLG_PP_PLTSKIP) {
202*d9328cd4SRobert Mustacchi 			proch.pp_flags &= ~ FLG_PP_PLTSKIP;
203*d9328cd4SRobert Mustacchi 			(void) printf("plt skipping disabled\n");
204*d9328cd4SRobert Mustacchi 		} else {
205*d9328cd4SRobert Mustacchi 			proch.pp_flags |= FLG_PP_PLTSKIP;
206*d9328cd4SRobert Mustacchi 			(void) printf("plt skipping enabled\n");
207*d9328cd4SRobert Mustacchi 		}
208*d9328cd4SRobert Mustacchi 
209*d9328cd4SRobert Mustacchi 		rdb_prompt();
210*d9328cd4SRobert Mustacchi 	}
211*d9328cd4SRobert Mustacchi 	| PRINT VARSTRING NEWLINE
212*d9328cd4SRobert Mustacchi 	{
213*d9328cd4SRobert Mustacchi 		print_varstring(&proch, $2);
214*d9328cd4SRobert Mustacchi 		free($2);
215*d9328cd4SRobert Mustacchi 		rdb_prompt();
216*d9328cd4SRobert Mustacchi 	}
217*d9328cd4SRobert Mustacchi 	| PRINT address NEWLINE
218*d9328cd4SRobert Mustacchi 	{
219*d9328cd4SRobert Mustacchi 		print_mem(&proch, $2, 4, "X");
220*d9328cd4SRobert Mustacchi 		rdb_prompt();
221*d9328cd4SRobert Mustacchi 	}
222*d9328cd4SRobert Mustacchi 	| PRINT address NUMBER NEWLINE
223*d9328cd4SRobert Mustacchi 	{
224*d9328cd4SRobert Mustacchi 		print_mem(&proch, $2, (int)$3, "X");
225*d9328cd4SRobert Mustacchi 		rdb_prompt();
226*d9328cd4SRobert Mustacchi 	}
227*d9328cd4SRobert Mustacchi 	| PRINT address NUMBER SYMBOL NEWLINE
228*d9328cd4SRobert Mustacchi 	{
229*d9328cd4SRobert Mustacchi 		print_mem(&proch, $2, (int)$3, $4);
230*d9328cd4SRobert Mustacchi 		rdb_prompt();
231*d9328cd4SRobert Mustacchi 	}
232*d9328cd4SRobert Mustacchi 	| VALUE address NEWLINE
233*d9328cd4SRobert Mustacchi 	{
234*d9328cd4SRobert Mustacchi 		(void) printf("value: %#lx\n", (unsigned long)$2);
235*d9328cd4SRobert Mustacchi 		rdb_prompt();
236*d9328cd4SRobert Mustacchi 	}
237*d9328cd4SRobert Mustacchi 	| WHERE NEWLINE
238*d9328cd4SRobert Mustacchi 	{
239*d9328cd4SRobert Mustacchi 		(void) printf("printing stack trace\n");
240*d9328cd4SRobert Mustacchi 		CallStack(&proch);
241*d9328cd4SRobert Mustacchi 		rdb_prompt();
242*d9328cd4SRobert Mustacchi 	}
243*d9328cd4SRobert Mustacchi 	| error NEWLINE
244*d9328cd4SRobert Mustacchi 	{
245*d9328cd4SRobert Mustacchi 		yyerrok;
246*d9328cd4SRobert Mustacchi 		rdb_prompt();
247*d9328cd4SRobert Mustacchi 	}
248*d9328cd4SRobert Mustacchi 	| NEWLINE
249*d9328cd4SRobert Mustacchi 	{
250*d9328cd4SRobert Mustacchi 		disasm(&proch, 1);
251*d9328cd4SRobert Mustacchi 		rdb_prompt();
252*d9328cd4SRobert Mustacchi 	}
253*d9328cd4SRobert Mustacchi 	;
254*d9328cd4SRobert Mustacchi 
255*d9328cd4SRobert Mustacchi address: address PLUS address
256*d9328cd4SRobert Mustacchi 	{
257*d9328cd4SRobert Mustacchi 		$$ = $1 + $3;
258*d9328cd4SRobert Mustacchi 	}
259*d9328cd4SRobert Mustacchi 	| SYMBOL
260*d9328cd4SRobert Mustacchi 	{
261*d9328cd4SRobert Mustacchi 		GElf_Sym	sym;
262*d9328cd4SRobert Mustacchi 		if (str_to_sym(&proch, $1, &sym) == RET_OK)
263*d9328cd4SRobert Mustacchi 			$$ = (ulong_t)sym.st_value;
264*d9328cd4SRobert Mustacchi 		else {
265*d9328cd4SRobert Mustacchi 			(void) printf("unknown symbol: %s\n", $1);
266*d9328cd4SRobert Mustacchi 			$$ = 0;
267*d9328cd4SRobert Mustacchi 		}
268*d9328cd4SRobert Mustacchi 		free($1);
269*d9328cd4SRobert Mustacchi 	}
270*d9328cd4SRobert Mustacchi 	| NUMBER
271*d9328cd4SRobert Mustacchi 	{
272*d9328cd4SRobert Mustacchi 		$$ = $1;
273*d9328cd4SRobert Mustacchi 	}
274*d9328cd4SRobert Mustacchi 	;
275*d9328cd4SRobert Mustacchi %%
276*d9328cd4SRobert Mustacchi 
277*d9328cd4SRobert Mustacchi void
278*d9328cd4SRobert Mustacchi rdb_prompt()
279*d9328cd4SRobert Mustacchi {
280*d9328cd4SRobert Mustacchi 	if (proch.pp_flags & FLG_PP_PROMPT) {
281*d9328cd4SRobert Mustacchi 		(void) fputs("<rdb> ", stdout);
282*d9328cd4SRobert Mustacchi 		(void) fflush(stdout);
283*d9328cd4SRobert Mustacchi 	}
284*d9328cd4SRobert Mustacchi }
285