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