1d9328cd4SRobert Mustacchi /* 2d9328cd4SRobert Mustacchi * CDDL HEADER START 3d9328cd4SRobert Mustacchi * 4d9328cd4SRobert Mustacchi * The contents of this file are subject to the terms of the 5d9328cd4SRobert Mustacchi * Common Development and Distribution License (the "License"). 6d9328cd4SRobert Mustacchi * You may not use this file except in compliance with the License. 7d9328cd4SRobert Mustacchi * 8d9328cd4SRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9d9328cd4SRobert Mustacchi * or http://www.opensolaris.org/os/licensing. 10d9328cd4SRobert Mustacchi * See the License for the specific language governing permissions 11d9328cd4SRobert Mustacchi * and limitations under the License. 12d9328cd4SRobert Mustacchi * 13d9328cd4SRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each 14d9328cd4SRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15d9328cd4SRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the 16d9328cd4SRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying 17d9328cd4SRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner] 18d9328cd4SRobert Mustacchi * 19d9328cd4SRobert Mustacchi * CDDL HEADER END 20d9328cd4SRobert Mustacchi */ 21d9328cd4SRobert Mustacchi 22d9328cd4SRobert Mustacchi /* 23d9328cd4SRobert Mustacchi * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved. 24d9328cd4SRobert Mustacchi */ 25d9328cd4SRobert Mustacchi #ifndef _RDB_H 26d9328cd4SRobert Mustacchi #define _RDB_H 27d9328cd4SRobert Mustacchi 28d9328cd4SRobert Mustacchi #include <rtld_db.h> 29d9328cd4SRobert Mustacchi #include <sys/types.h> 30d9328cd4SRobert Mustacchi #include <procfs.h> 31d9328cd4SRobert Mustacchi #include <proc_service.h> 32d9328cd4SRobert Mustacchi #include <libelf.h> 33d9328cd4SRobert Mustacchi #include <gelf.h> 34d9328cd4SRobert Mustacchi 35d9328cd4SRobert Mustacchi #include <rdb_mach.h> 36d9328cd4SRobert Mustacchi 37d9328cd4SRobert Mustacchi #ifdef __cplusplus 38d9328cd4SRobert Mustacchi extern "C" { 39d9328cd4SRobert Mustacchi #endif 40d9328cd4SRobert Mustacchi 41d9328cd4SRobert Mustacchi /* 42d9328cd4SRobert Mustacchi * Definitions from 2.7 sys/procfs_isa.h. 43d9328cd4SRobert Mustacchi */ 44d9328cd4SRobert Mustacchi #ifndef PR_MODEL_LP64 45d9328cd4SRobert Mustacchi #define PR_MODEL_UNKNOWN 0 46d9328cd4SRobert Mustacchi #define PR_MODEL_ILP32 1 /* process data model is ILP32 */ 47d9328cd4SRobert Mustacchi #define PR_MODEL_LP64 2 /* process data model is LP64 */ 48d9328cd4SRobert Mustacchi #endif 49d9328cd4SRobert Mustacchi 50d9328cd4SRobert Mustacchi #define INTERPSECT ".interp" 51d9328cd4SRobert Mustacchi #define PLTSECT ".plt" 52d9328cd4SRobert Mustacchi 53d9328cd4SRobert Mustacchi /* 54d9328cd4SRobert Mustacchi * Flags for step_n routine 55d9328cd4SRobert Mustacchi */ 56d9328cd4SRobert Mustacchi typedef enum { 57d9328cd4SRobert Mustacchi FLG_SN_NONE = 0, 58d9328cd4SRobert Mustacchi FLG_SN_VERBOSE = (1 << 0), /* disassemble instructions */ 59d9328cd4SRobert Mustacchi FLG_SN_PLTSKIP = (1 << 1) /* step *over* PLTS */ 60d9328cd4SRobert Mustacchi } sn_flags_e; 61d9328cd4SRobert Mustacchi 62d9328cd4SRobert Mustacchi 63d9328cd4SRobert Mustacchi typedef enum { 64d9328cd4SRobert Mustacchi RET_FAILED = -1, 65d9328cd4SRobert Mustacchi RET_OK = 0 66d9328cd4SRobert Mustacchi } retc_t; 67d9328cd4SRobert Mustacchi 68d9328cd4SRobert Mustacchi /* 69d9328cd4SRobert Mustacchi * sym_tbl_t contains a primary and an (optional) auxiliary symbol table, which 70d9328cd4SRobert Mustacchi * we wish to treat as a single logical symbol table. In this logical table, 71d9328cd4SRobert Mustacchi * the data from the auxiliary table precedes that from the primary. Symbol 72d9328cd4SRobert Mustacchi * indices start at [0], which is the first item in the auxiliary table 73d9328cd4SRobert Mustacchi * if there is one. The sole purpose for this is so that we can treat the 74d9328cd4SRobert Mustacchi * combination of .SUNW_ldynsym and .dynsym sections as a logically single 75d9328cd4SRobert Mustacchi * entity without having to violate the public interface to libelf. 76d9328cd4SRobert Mustacchi * 77d9328cd4SRobert Mustacchi * Both tables must share the same string table section. 78d9328cd4SRobert Mustacchi * 79d9328cd4SRobert Mustacchi * The symtab_getsym() function serves as a gelf_getsym() replacement 80d9328cd4SRobert Mustacchi * that is aware of the two tables and makes them look like a single table 81d9328cd4SRobert Mustacchi * to the caller. 82d9328cd4SRobert Mustacchi * 83d9328cd4SRobert Mustacchi */ 84d9328cd4SRobert Mustacchi typedef struct sym_tbl { 85d9328cd4SRobert Mustacchi Elf_Data *st_syms_pri; /* start of primary table */ 86d9328cd4SRobert Mustacchi Elf_Data *st_syms_aux; /* start of auxiliary table */ 87d9328cd4SRobert Mustacchi char *st_strs; /* ptr to strings */ 88d9328cd4SRobert Mustacchi size_t st_symn; /* Total # of entries in both tables */ 89d9328cd4SRobert Mustacchi size_t st_symn_aux; /* # of entries in auxiliary table */ 90d9328cd4SRobert Mustacchi } sym_tbl_t; 91d9328cd4SRobert Mustacchi 92d9328cd4SRobert Mustacchi typedef struct map_info { 93d9328cd4SRobert Mustacchi char *mi_name; /* file info */ 94d9328cd4SRobert Mustacchi char *mi_refname; /* filter reference name */ 95d9328cd4SRobert Mustacchi ulong_t mi_addr; /* start address */ 96d9328cd4SRobert Mustacchi ulong_t mi_end; /* end address */ 97d9328cd4SRobert Mustacchi int mi_mapfd; /* file desc. for mapping */ 98d9328cd4SRobert Mustacchi size_t mi_pltentsz; /* size of PLT entries */ 99d9328cd4SRobert Mustacchi Elf *mi_elf; /* elf handle so we can close */ 100d9328cd4SRobert Mustacchi GElf_Ehdr mi_ehdr; 101d9328cd4SRobert Mustacchi sym_tbl_t mi_symtab; /* symbol table */ 102d9328cd4SRobert Mustacchi sym_tbl_t mi_dynsym; /* dynamic symbol table */ 103d9328cd4SRobert Mustacchi Lmid_t mi_lmident; /* Link Map Ident */ 104d9328cd4SRobert Mustacchi ulong_t mi_pltbase; /* PLT base address */ 105d9328cd4SRobert Mustacchi ulong_t mi_pltsize; /* size of PLT table */ 106d9328cd4SRobert Mustacchi struct map_info *mi_next; 107d9328cd4SRobert Mustacchi ulong_t mi_flags; /* misc flags */ 108d9328cd4SRobert Mustacchi rd_loadobj_t mi_loadobj; /* keep the old loadobj for */ 109d9328cd4SRobert Mustacchi /* good luck */ 110d9328cd4SRobert Mustacchi } map_info_t; 111d9328cd4SRobert Mustacchi 112d9328cd4SRobert Mustacchi #define FLG_MI_EXEC 0x0001 /* is object an EXEC */ 113d9328cd4SRobert Mustacchi 114d9328cd4SRobert Mustacchi #define FLG_PAP_SONAME 0x0001 /* embed SONAME in sym name */ 115d9328cd4SRobert Mustacchi #define FLG_PAP_NOHEXNAME 0x0002 /* if no symbol return */ 116d9328cd4SRobert Mustacchi /* null string */ 117d9328cd4SRobert Mustacchi #define FLG_PAP_PLTDECOM 0x0004 /* decompe PLT name if */ 118d9328cd4SRobert Mustacchi /* possible */ 119d9328cd4SRobert Mustacchi typedef struct map_list { 120d9328cd4SRobert Mustacchi map_info_t *ml_head; 121d9328cd4SRobert Mustacchi map_info_t *ml_tail; 122d9328cd4SRobert Mustacchi } map_list_t; 123d9328cd4SRobert Mustacchi 124d9328cd4SRobert Mustacchi /* 125d9328cd4SRobert Mustacchi * Break point information 126d9328cd4SRobert Mustacchi */ 127d9328cd4SRobert Mustacchi typedef struct bpt_struct { 128d9328cd4SRobert Mustacchi ulong_t bl_addr; /* address of breakpoint */ 129d9328cd4SRobert Mustacchi bptinstr_t bl_instr; /* original instruction */ 130d9328cd4SRobert Mustacchi unsigned bl_flags; /* break point flags */ 131d9328cd4SRobert Mustacchi struct bpt_struct *bl_next; 132d9328cd4SRobert Mustacchi } bptlist_t; 133d9328cd4SRobert Mustacchi 134d9328cd4SRobert Mustacchi #define FLG_BP_USERDEF 0x0001 /* user defined BP */ 135d9328cd4SRobert Mustacchi #define FLG_BP_RDPREINIT 0x0002 /* PREINIT BreakPoint */ 136d9328cd4SRobert Mustacchi #define FLG_BP_RDPOSTINIT 0x0004 /* POSTINIT BreakPoint */ 137d9328cd4SRobert Mustacchi #define FLG_BP_RDDLACT 0x0008 /* DLACT BreakPoint */ 138d9328cd4SRobert Mustacchi #define FLG_BP_PLTRES 0x0010 /* PLT Resolve BP */ 139d9328cd4SRobert Mustacchi 140d9328cd4SRobert Mustacchi #define MASK_BP_SPECIAL \ 141d9328cd4SRobert Mustacchi (FLG_BP_RDPREINIT | FLG_BP_RDPOSTINIT | FLG_BP_RDDLACT) 142d9328cd4SRobert Mustacchi #define MASK_BP_STOP \ 143d9328cd4SRobert Mustacchi (FLG_BP_USERDEF | FLG_BP_PLTRES) 144d9328cd4SRobert Mustacchi #define MASK_BP_ALL \ 145d9328cd4SRobert Mustacchi (MASK_BP_SPECIAL | FLG_BP_USERDEF) 146d9328cd4SRobert Mustacchi 147d9328cd4SRobert Mustacchi /* 148d9328cd4SRobert Mustacchi * Proc Services Structure 149d9328cd4SRobert Mustacchi */ 150d9328cd4SRobert Mustacchi struct ps_prochandle { 151d9328cd4SRobert Mustacchi pid_t pp_pid; /* debug process pid */ 152d9328cd4SRobert Mustacchi rd_agent_t *pp_rap; /* rtld_db handle */ 153d9328cd4SRobert Mustacchi int pp_ctlfd; /* open ctl proc fd */ 154d9328cd4SRobert Mustacchi int pp_statusfd; /* open status proc fd */ 155d9328cd4SRobert Mustacchi int pp_asfd; /* open as proc fd */ 156d9328cd4SRobert Mustacchi int pp_mapfd; /* open map proc fd */ 157d9328cd4SRobert Mustacchi uintptr_t pp_ldsobase; /* ld.so.1 base address */ 158d9328cd4SRobert Mustacchi uintptr_t pp_execphdr; /* a.out phdr address */ 159d9328cd4SRobert Mustacchi map_info_t pp_ldsomap; /* ld.so.1 map info */ 160d9328cd4SRobert Mustacchi map_info_t pp_execmap; /* exec map info */ 161d9328cd4SRobert Mustacchi map_list_t pp_lmaplist; /* list of link map infos */ 162d9328cd4SRobert Mustacchi bptlist_t *pp_breakpoints; /* break point list */ 163d9328cd4SRobert Mustacchi void *pp_auxvp; /* pointer to AUX vectors */ 164d9328cd4SRobert Mustacchi int pp_flags; /* misc flags */ 165d9328cd4SRobert Mustacchi int pp_dmodel; /* data model */ 166d9328cd4SRobert Mustacchi }; 167d9328cd4SRobert Mustacchi 168d9328cd4SRobert Mustacchi #define FLG_PP_PROMPT 0x0001 /* display debugger prompt */ 169d9328cd4SRobert Mustacchi #define FLG_PP_LMAPS 0x0002 /* link maps available */ 170d9328cd4SRobert Mustacchi #define FLG_PP_PACT 0x0004 /* active process being traced */ 171d9328cd4SRobert Mustacchi #define FLG_PP_PLTSKIP 0x0008 /* PLT skipping is active */ 172d9328cd4SRobert Mustacchi 173d9328cd4SRobert Mustacchi /* 174d9328cd4SRobert Mustacchi * Debugging Structure 175d9328cd4SRobert Mustacchi */ 176d9328cd4SRobert Mustacchi typedef struct rtld_debug { 177d9328cd4SRobert Mustacchi int rd_vers; 178d9328cd4SRobert Mustacchi caddr_t rd_preinit; 179d9328cd4SRobert Mustacchi caddr_t rd_postinit; 180d9328cd4SRobert Mustacchi } rtld_debug_t; 181d9328cd4SRobert Mustacchi 182d9328cd4SRobert Mustacchi #define TRAPBREAK 0x91d02001 /* ta ST_BREAKPOINT */ 183d9328cd4SRobert Mustacchi 184d9328cd4SRobert Mustacchi /* 185d9328cd4SRobert Mustacchi * values for rdb_flags 186d9328cd4SRobert Mustacchi */ 187d9328cd4SRobert Mustacchi #define RDB_FL_EVENTS 0x0001 /* enable printing event information */ 188d9328cd4SRobert Mustacchi 189d9328cd4SRobert Mustacchi /* 190d9328cd4SRobert Mustacchi * Globals 191d9328cd4SRobert Mustacchi */ 192d9328cd4SRobert Mustacchi 193d9328cd4SRobert Mustacchi extern struct ps_prochandle proch; 194d9328cd4SRobert Mustacchi extern unsigned long rdb_flags; 195d9328cd4SRobert Mustacchi 196d9328cd4SRobert Mustacchi /* 197d9328cd4SRobert Mustacchi * Functions 198d9328cd4SRobert Mustacchi */ 199d9328cd4SRobert Mustacchi extern map_info_t *addr_to_map(struct ps_prochandle *, ulong_t); 200d9328cd4SRobert Mustacchi extern retc_t addr_to_sym(struct ps_prochandle *, ulong_t, 201d9328cd4SRobert Mustacchi GElf_Sym *, char **); 202d9328cd4SRobert Mustacchi extern void CallStack(struct ps_prochandle *ph); 203d9328cd4SRobert Mustacchi extern unsigned continue_to_break(struct ps_prochandle *); 204d9328cd4SRobert Mustacchi extern retc_t delete_all_breakpoints(struct ps_prochandle *); 205d9328cd4SRobert Mustacchi extern retc_t delete_breakpoint(struct ps_prochandle *, ulong_t, 206d9328cd4SRobert Mustacchi unsigned); 207d9328cd4SRobert Mustacchi extern void disasm(struct ps_prochandle *, int); 208d9328cd4SRobert Mustacchi extern retc_t disasm_addr(struct ps_prochandle *, ulong_t, int); 209d9328cd4SRobert Mustacchi extern retc_t display_all_regs(struct ps_prochandle *); 210d9328cd4SRobert Mustacchi extern retc_t display_maps(struct ps_prochandle *); 211d9328cd4SRobert Mustacchi extern retc_t display_linkmaps(struct ps_prochandle *); 212d9328cd4SRobert Mustacchi extern void free_linkmaps(struct ps_prochandle *); 213d9328cd4SRobert Mustacchi extern retc_t get_linkmaps(struct ps_prochandle *); 214d9328cd4SRobert Mustacchi extern ulong_t hexstr_to_num(const char *); 215d9328cd4SRobert Mustacchi extern ulong_t is_plt(struct ps_prochandle *, ulong_t); 216d9328cd4SRobert Mustacchi extern void list_breakpoints(struct ps_prochandle *); 217d9328cd4SRobert Mustacchi extern retc_t load_map(struct ps_prochandle *, caddr_t, 218d9328cd4SRobert Mustacchi map_info_t *mp); 219d9328cd4SRobert Mustacchi extern char *print_address(unsigned long); 220d9328cd4SRobert Mustacchi extern char *print_address_ps(struct ps_prochandle *, 221d9328cd4SRobert Mustacchi unsigned long, unsigned); 222d9328cd4SRobert Mustacchi extern void print_mem(struct ps_prochandle *, ulong_t, int, 223d9328cd4SRobert Mustacchi char *); 224d9328cd4SRobert Mustacchi extern void print_varstring(struct ps_prochandle *, const char *); 225d9328cd4SRobert Mustacchi extern void print_mach_varstring(struct ps_prochandle *, 226d9328cd4SRobert Mustacchi const char *); 227d9328cd4SRobert Mustacchi extern void rdb_help(const char *); 228d9328cd4SRobert Mustacchi extern void rdb_prompt(); 229d9328cd4SRobert Mustacchi extern void perr(char *); 230d9328cd4SRobert Mustacchi extern retc_t proc_string_read(struct ps_prochandle *, 231d9328cd4SRobert Mustacchi ulong_t, char *, int); 232d9328cd4SRobert Mustacchi extern retc_t ps_close(struct ps_prochandle *); 233d9328cd4SRobert Mustacchi extern retc_t ps_init(int, int, pid_t, struct ps_prochandle *); 234d9328cd4SRobert Mustacchi extern retc_t set_breakpoint(struct ps_prochandle *, ulong_t, 235d9328cd4SRobert Mustacchi unsigned); 236d9328cd4SRobert Mustacchi extern retc_t set_objpad(struct ps_prochandle *, size_t); 237d9328cd4SRobert Mustacchi extern retc_t step_n(struct ps_prochandle *, size_t, sn_flags_e); 238d9328cd4SRobert Mustacchi extern void step_to_addr(struct ps_prochandle *, ulong_t); 239d9328cd4SRobert Mustacchi extern retc_t str_map_sym(const char *, map_info_t *, GElf_Sym *, 240d9328cd4SRobert Mustacchi char **); 241d9328cd4SRobert Mustacchi extern map_info_t *str_to_map(struct ps_prochandle *, const char *); 242d9328cd4SRobert Mustacchi extern retc_t str_to_sym(struct ps_prochandle *, const char *, 243d9328cd4SRobert Mustacchi GElf_Sym *); 244d9328cd4SRobert Mustacchi extern int yyparse(void); 245*1a90c98dSToomas Soome extern int yyerror(const char *); 246d9328cd4SRobert Mustacchi extern int yylex(void); 247d9328cd4SRobert Mustacchi 248d9328cd4SRobert Mustacchi #ifdef __cplusplus 249d9328cd4SRobert Mustacchi } 250d9328cd4SRobert Mustacchi #endif 251d9328cd4SRobert Mustacchi 252d9328cd4SRobert Mustacchi #endif /* _RDB_H */ 253