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