xref: /illumos-gate/usr/src/cmd/sgs/demo_rdb/common/gram.y (revision d9328cd4)
17c478bd9Sstevel@tonic-gate %{
27c478bd9Sstevel@tonic-gate /*
37c478bd9Sstevel@tonic-gate  * CDDL HEADER START
47c478bd9Sstevel@tonic-gate  *
57c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
620c1c355SRod Evans  * Common Development and Distribution License (the "License").
720c1c355SRod Evans  * You may not use this file except in compliance with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate 
2320c1c355SRod Evans /*
2420c1c355SRod Evans  * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
2520c1c355SRod Evans  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #include <stdio.h>
287c478bd9Sstevel@tonic-gate #include <sys/types.h>
297c478bd9Sstevel@tonic-gate #include <libelf.h>
307c478bd9Sstevel@tonic-gate #include "rdb.h"
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate extern	void	rdb_prompt();
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate %}
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate %token	VALUE STEP HELP NUMBER NEWLINE SYMBOL PLUS BREAK CONT DIS GETMAPS
377c478bd9Sstevel@tonic-gate %token	DELETE MAPS PLTSKIP WHERE PRINT OBJPAD QSTRING VARSTRING ECHO_OUT
387c478bd9Sstevel@tonic-gate %token	EVENT LINKMAPS
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate %union {
4120c1c355SRod Evans 	char	*str;
4220c1c355SRod Evans 	ulong_t	addr;
4320c1c355SRod Evans 	int	num;
447c478bd9Sstevel@tonic-gate }
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate %type <addr> NUMBER address
477c478bd9Sstevel@tonic-gate %type <str> SYMBOL QSTRING VARSTRING
487c478bd9Sstevel@tonic-gate 
497c478bd9Sstevel@tonic-gate %left PLUS
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate %%
527c478bd9Sstevel@tonic-gate start: commands
537c478bd9Sstevel@tonic-gate 	;
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate commands: /* empty */
567c478bd9Sstevel@tonic-gate 	| commands command
577c478bd9Sstevel@tonic-gate 	;
587c478bd9Sstevel@tonic-gate command: BREAK NEWLINE
597c478bd9Sstevel@tonic-gate 	{
607c478bd9Sstevel@tonic-gate 		list_breakpoints(&proch);
617c478bd9Sstevel@tonic-gate 		rdb_prompt();
627c478bd9Sstevel@tonic-gate 	}
637c478bd9Sstevel@tonic-gate 	| BREAK address NEWLINE
647c478bd9Sstevel@tonic-gate 	{
657c478bd9Sstevel@tonic-gate 		if (set_breakpoint(&proch, $2, FLG_BP_USERDEF) == RET_OK)
6620c1c355SRod Evans 			(void) printf("break point set at: 0x%lx\n",
6720c1c355SRod Evans 			    (unsigned long)$2);
687c478bd9Sstevel@tonic-gate 		else
6920c1c355SRod Evans 			(void) printf("unable to set breakpoint.\n");
707c478bd9Sstevel@tonic-gate 		rdb_prompt();
717c478bd9Sstevel@tonic-gate 	}
727c478bd9Sstevel@tonic-gate 	| CONT NEWLINE
737c478bd9Sstevel@tonic-gate 	{
7420c1c355SRod Evans 		(void) continue_to_break(&proch);
757c478bd9Sstevel@tonic-gate 		rdb_prompt();
767c478bd9Sstevel@tonic-gate 	}
777c478bd9Sstevel@tonic-gate 	| DELETE address NEWLINE
787c478bd9Sstevel@tonic-gate 	{
797c478bd9Sstevel@tonic-gate 		if (delete_breakpoint(&proch, $2, FLG_BP_USERDEF) != RET_OK)
8020c1c355SRod Evans 			(void) printf("unable to delete breakpoint at %#lx\n",
8120c1c355SRod Evans 			    (unsigned long)$2);
827c478bd9Sstevel@tonic-gate 		else
8320c1c355SRod Evans 			(void) printf("breakpoint deleted at 0x%lx\n",
8420c1c355SRod Evans 			    (unsigned long)$2);
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate 		rdb_prompt();
877c478bd9Sstevel@tonic-gate 	}
887c478bd9Sstevel@tonic-gate 	| DIS NEWLINE
897c478bd9Sstevel@tonic-gate 	{
907c478bd9Sstevel@tonic-gate 		disasm(&proch, 10);
917c478bd9Sstevel@tonic-gate 		rdb_prompt();
927c478bd9Sstevel@tonic-gate 	}
937c478bd9Sstevel@tonic-gate 	| DIS address NEWLINE
947c478bd9Sstevel@tonic-gate 	{
9520c1c355SRod Evans 		(void) disasm_addr(&proch, (ulong_t)$2, 10);
967c478bd9Sstevel@tonic-gate 		rdb_prompt();
977c478bd9Sstevel@tonic-gate 	}
987c478bd9Sstevel@tonic-gate 	| DIS address NUMBER NEWLINE
997c478bd9Sstevel@tonic-gate 	{
10020c1c355SRod Evans 		(void) disasm_addr(&proch, (ulong_t)$2, (int)$3);
1017c478bd9Sstevel@tonic-gate 		rdb_prompt();
1027c478bd9Sstevel@tonic-gate 	}
1037c478bd9Sstevel@tonic-gate 	| ECHO_OUT QSTRING NEWLINE
1047c478bd9Sstevel@tonic-gate 	{
10520c1c355SRod Evans 		(void) puts($2);
10620c1c355SRod Evans 		free($2);
1077c478bd9Sstevel@tonic-gate 		rdb_prompt();
1087c478bd9Sstevel@tonic-gate 	}
1097c478bd9Sstevel@tonic-gate 	| EVENT SYMBOL NEWLINE
1107c478bd9Sstevel@tonic-gate 	{
1117c478bd9Sstevel@tonic-gate 		if (strcmp($2, "on") == 0) {
11220c1c355SRod Evans 			(void) printf("rdb: event information enabled.\n");
1137c478bd9Sstevel@tonic-gate 			rdb_flags |= RDB_FL_EVENTS;
1147c478bd9Sstevel@tonic-gate 		} else if (strcmp($2, "off") == 0) {
11520c1c355SRod Evans 			(void) printf("rdb: event information disabled.\n");
1167c478bd9Sstevel@tonic-gate 			rdb_flags &= ~RDB_FL_EVENTS;
1177c478bd9Sstevel@tonic-gate 		} else {
11820c1c355SRod Evans 			(void) printf("rdb: unknown event command: %s\n", $2);
1197c478bd9Sstevel@tonic-gate 		}
1207c478bd9Sstevel@tonic-gate 		free($2);
1217c478bd9Sstevel@tonic-gate 		rdb_prompt();
1227c478bd9Sstevel@tonic-gate 	}
1237c478bd9Sstevel@tonic-gate 	| GETMAPS NEWLINE
1247c478bd9Sstevel@tonic-gate 	{
1257c478bd9Sstevel@tonic-gate 		if (get_linkmaps(&proch) != RET_OK)
12620c1c355SRod Evans 			(void) printf("get_linkmaps failed\n");
1277c478bd9Sstevel@tonic-gate 
1287c478bd9Sstevel@tonic-gate 		rdb_prompt();
1297c478bd9Sstevel@tonic-gate 	}
1307c478bd9Sstevel@tonic-gate 	| LINKMAPS NEWLINE
1317c478bd9Sstevel@tonic-gate 	{
1327c478bd9Sstevel@tonic-gate 		if (display_linkmaps(&proch) != RET_OK)
13320c1c355SRod Evans 			(void) printf("display_linkmaps failed\n");
1347c478bd9Sstevel@tonic-gate 		rdb_prompt();
1357c478bd9Sstevel@tonic-gate 	}
1367c478bd9Sstevel@tonic-gate 	| MAPS NEWLINE
1377c478bd9Sstevel@tonic-gate 	{
1387c478bd9Sstevel@tonic-gate 		if (display_maps(&proch) != RET_OK)
13920c1c355SRod Evans 			(void) printf("display_maps failed\n");
1407c478bd9Sstevel@tonic-gate 		rdb_prompt();
1417c478bd9Sstevel@tonic-gate 	}
1427c478bd9Sstevel@tonic-gate 	| STEP NEWLINE
1437c478bd9Sstevel@tonic-gate 	{
1447c478bd9Sstevel@tonic-gate 		sn_flags_e	sf;
1457c478bd9Sstevel@tonic-gate 
14620c1c355SRod Evans 		(void) printf("single step\n");
1477c478bd9Sstevel@tonic-gate 		sf = FLG_SN_VERBOSE;
1487c478bd9Sstevel@tonic-gate 		if (proch.pp_flags & FLG_PP_PLTSKIP)
1497c478bd9Sstevel@tonic-gate 			sf |= FLG_SN_PLTSKIP;
1507c478bd9Sstevel@tonic-gate 
15120c1c355SRod Evans 		(void) step_n(&proch, 1, sf);
1527c478bd9Sstevel@tonic-gate 		rdb_prompt();
1537c478bd9Sstevel@tonic-gate 	}
1547c478bd9Sstevel@tonic-gate 	| STEP NUMBER NEWLINE
1557c478bd9Sstevel@tonic-gate 	{
1567c478bd9Sstevel@tonic-gate 		sn_flags_e	sf;
1577c478bd9Sstevel@tonic-gate 
15820c1c355SRod Evans 		(void) printf("stepping %d\n", (int)$2);
1597c478bd9Sstevel@tonic-gate 		sf = FLG_SN_VERBOSE;
1607c478bd9Sstevel@tonic-gate 		if (proch.pp_flags & FLG_PP_PLTSKIP)
1617c478bd9Sstevel@tonic-gate 			sf |= FLG_SN_PLTSKIP;
1627c478bd9Sstevel@tonic-gate 
16320c1c355SRod Evans 		(void) step_n(&proch, $2, sf);
1647c478bd9Sstevel@tonic-gate 		rdb_prompt();
1657c478bd9Sstevel@tonic-gate 	}
1667c478bd9Sstevel@tonic-gate 	| STEP NUMBER SYMBOL NEWLINE
1677c478bd9Sstevel@tonic-gate 	{
1687c478bd9Sstevel@tonic-gate 		sn_flags_e	sf;
1697c478bd9Sstevel@tonic-gate 
1707c478bd9Sstevel@tonic-gate 		sf = FLG_SN_VERBOSE;
1717c478bd9Sstevel@tonic-gate 		if (proch.pp_flags & FLG_PP_PLTSKIP)
1727c478bd9Sstevel@tonic-gate 			sf |= FLG_SN_PLTSKIP;
1737c478bd9Sstevel@tonic-gate 
1747c478bd9Sstevel@tonic-gate 		if (strcmp("silent", $3) == 0)
17520c1c355SRod Evans 			(void) step_n(&proch, $2, sf);
1767c478bd9Sstevel@tonic-gate 		else
17720c1c355SRod Evans 			(void) printf("error: step <count> [silent]\n");
1787c478bd9Sstevel@tonic-gate 
1797c478bd9Sstevel@tonic-gate 		free($3);
1807c478bd9Sstevel@tonic-gate 		rdb_prompt();
1817c478bd9Sstevel@tonic-gate 	}
1827c478bd9Sstevel@tonic-gate 	| HELP NEWLINE
1837c478bd9Sstevel@tonic-gate 	{
1847c478bd9Sstevel@tonic-gate 		rdb_help(0);
1857c478bd9Sstevel@tonic-gate 		rdb_prompt();
1867c478bd9Sstevel@tonic-gate 	}
1877c478bd9Sstevel@tonic-gate 	| HELP SYMBOL NEWLINE
1887c478bd9Sstevel@tonic-gate 	{
1897c478bd9Sstevel@tonic-gate 		rdb_help($2);
1907c478bd9Sstevel@tonic-gate 		free($2);
1917c478bd9Sstevel@tonic-gate 		rdb_prompt();
1927c478bd9Sstevel@tonic-gate 	}
1937c478bd9Sstevel@tonic-gate 	| OBJPAD NUMBER NEWLINE
1947c478bd9Sstevel@tonic-gate 	{
19520c1c355SRod Evans 		(void) printf("setting object padding to: %#lx\n", $2);
19620c1c355SRod Evans 		(void) set_objpad(&proch, $2);
1977c478bd9Sstevel@tonic-gate 		rdb_prompt();
1987c478bd9Sstevel@tonic-gate 	}
1997c478bd9Sstevel@tonic-gate 	| PLTSKIP NEWLINE
2007c478bd9Sstevel@tonic-gate 	{
2017c478bd9Sstevel@tonic-gate 		if (proch.pp_flags & FLG_PP_PLTSKIP) {
2027c478bd9Sstevel@tonic-gate 			proch.pp_flags &= ~ FLG_PP_PLTSKIP;
20320c1c355SRod Evans 			(void) printf("plt skipping disabled\n");
2047c478bd9Sstevel@tonic-gate 		} else {
2057c478bd9Sstevel@tonic-gate 			proch.pp_flags |= FLG_PP_PLTSKIP;
20620c1c355SRod Evans 			(void) printf("plt skipping enabled\n");
2077c478bd9Sstevel@tonic-gate 		}
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate 		rdb_prompt();
2107c478bd9Sstevel@tonic-gate 	}
2117c478bd9Sstevel@tonic-gate 	| PRINT VARSTRING NEWLINE
2127c478bd9Sstevel@tonic-gate 	{
2137c478bd9Sstevel@tonic-gate 		print_varstring(&proch, $2);
2147c478bd9Sstevel@tonic-gate 		free($2);
2157c478bd9Sstevel@tonic-gate 		rdb_prompt();
2167c478bd9Sstevel@tonic-gate 	}
2177c478bd9Sstevel@tonic-gate 	| PRINT address NEWLINE
2187c478bd9Sstevel@tonic-gate 	{
2197c478bd9Sstevel@tonic-gate 		print_mem(&proch, $2, 4, "X");
2207c478bd9Sstevel@tonic-gate 		rdb_prompt();
2217c478bd9Sstevel@tonic-gate 	}
2227c478bd9Sstevel@tonic-gate 	| PRINT address NUMBER NEWLINE
2237c478bd9Sstevel@tonic-gate 	{
2247c478bd9Sstevel@tonic-gate 		print_mem(&proch, $2, (int)$3, "X");
2257c478bd9Sstevel@tonic-gate 		rdb_prompt();
2267c478bd9Sstevel@tonic-gate 	}
2277c478bd9Sstevel@tonic-gate 	| PRINT address NUMBER SYMBOL NEWLINE
2287c478bd9Sstevel@tonic-gate 	{
2297c478bd9Sstevel@tonic-gate 		print_mem(&proch, $2, (int)$3, $4);
2307c478bd9Sstevel@tonic-gate 		rdb_prompt();
2317c478bd9Sstevel@tonic-gate 	}
2327c478bd9Sstevel@tonic-gate 	| VALUE address NEWLINE
2337c478bd9Sstevel@tonic-gate 	{
23420c1c355SRod Evans 		(void) printf("value: %#lx\n", (unsigned long)$2);
2357c478bd9Sstevel@tonic-gate 		rdb_prompt();
2367c478bd9Sstevel@tonic-gate 	}
2377c478bd9Sstevel@tonic-gate 	| WHERE NEWLINE
2387c478bd9Sstevel@tonic-gate 	{
23920c1c355SRod Evans 		(void) printf("printing stack trace\n");
2407c478bd9Sstevel@tonic-gate 		CallStack(&proch);
2417c478bd9Sstevel@tonic-gate 		rdb_prompt();
2427c478bd9Sstevel@tonic-gate 	}
2437c478bd9Sstevel@tonic-gate 	| error NEWLINE
2447c478bd9Sstevel@tonic-gate 	{
2457c478bd9Sstevel@tonic-gate 		yyerrok;
2467c478bd9Sstevel@tonic-gate 		rdb_prompt();
2477c478bd9Sstevel@tonic-gate 	}
2487c478bd9Sstevel@tonic-gate 	| NEWLINE
2497c478bd9Sstevel@tonic-gate 	{
2507c478bd9Sstevel@tonic-gate 		disasm(&proch, 1);
2517c478bd9Sstevel@tonic-gate 		rdb_prompt();
2527c478bd9Sstevel@tonic-gate 	}
2537c478bd9Sstevel@tonic-gate 	;
2547c478bd9Sstevel@tonic-gate 
2557c478bd9Sstevel@tonic-gate address: address PLUS address
2567c478bd9Sstevel@tonic-gate 	{
2577c478bd9Sstevel@tonic-gate 		$$ = $1 + $3;
2587c478bd9Sstevel@tonic-gate 	}
2597c478bd9Sstevel@tonic-gate 	| SYMBOL
2607c478bd9Sstevel@tonic-gate 	{
2617c478bd9Sstevel@tonic-gate 		GElf_Sym	sym;
2627c478bd9Sstevel@tonic-gate 		if (str_to_sym(&proch, $1, &sym) == RET_OK)
2637c478bd9Sstevel@tonic-gate 			$$ = (ulong_t)sym.st_value;
2647c478bd9Sstevel@tonic-gate 		else {
26520c1c355SRod Evans 			(void) printf("unknown symbol: %s\n", $1);
2667c478bd9Sstevel@tonic-gate 			$$ = 0;
2677c478bd9Sstevel@tonic-gate 		}
2687c478bd9Sstevel@tonic-gate 		free($1);
2697c478bd9Sstevel@tonic-gate 	}
2707c478bd9Sstevel@tonic-gate 	| NUMBER
2717c478bd9Sstevel@tonic-gate 	{
2727c478bd9Sstevel@tonic-gate 		$$ = $1;
2737c478bd9Sstevel@tonic-gate 	}
2747c478bd9Sstevel@tonic-gate 	;
2757c478bd9Sstevel@tonic-gate %%
2767c478bd9Sstevel@tonic-gate 
2777c478bd9Sstevel@tonic-gate void
2787c478bd9Sstevel@tonic-gate rdb_prompt()
2797c478bd9Sstevel@tonic-gate {
2807c478bd9Sstevel@tonic-gate 	if (proch.pp_flags & FLG_PP_PROMPT) {
28120c1c355SRod Evans 		(void) fputs("<rdb> ", stdout);
28220c1c355SRod Evans 		(void) fflush(stdout);
2837c478bd9Sstevel@tonic-gate 	}
2847c478bd9Sstevel@tonic-gate }
285