| The Android Open Source Project | dd7bc33 | 2009-03-03 19:32:55 -0800 | [diff] [blame] | 1 | /* ARM EABI compliant unwinding routines. | 
|  | 2 | Copyright (C) 2004, 2005 Free Software Foundation, Inc. | 
|  | 3 | Contributed by Paul Brook | 
|  | 4 |  | 
|  | 5 | This file is free software; you can redistribute it and/or modify it | 
|  | 6 | under the terms of the GNU General Public License as published by the | 
|  | 7 | Free Software Foundation; either version 2, or (at your option) any | 
|  | 8 | later version. | 
|  | 9 |  | 
|  | 10 | In addition to the permissions in the GNU General Public License, the | 
|  | 11 | Free Software Foundation gives you unlimited permission to link the | 
|  | 12 | compiled version of this file into combinations with other programs, | 
|  | 13 | and to distribute those combinations without any restriction coming | 
|  | 14 | from the use of this file.  (The General Public License restrictions | 
|  | 15 | do apply in other respects; for example, they cover modification of | 
|  | 16 | the file, and distribution when not linked into a combine | 
|  | 17 | executable.) | 
|  | 18 |  | 
|  | 19 | This file is distributed in the hope that it will be useful, but | 
|  | 20 | WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 21 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | 22 | General Public License for more details. | 
|  | 23 |  | 
|  | 24 | You should have received a copy of the GNU General Public License | 
|  | 25 | along with this program; see the file COPYING.  If not, write to | 
|  | 26 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, | 
|  | 27 | Boston, MA 02110-1301, USA.  */ | 
|  | 28 |  | 
|  | 29 | /**************************************************************************** | 
|  | 30 | * The functions here are derived from gcc/config/arm/unwind-arm.c from the | 
|  | 31 | * 4.3.x release. The main changes here involve the use of ptrace to retrieve | 
|  | 32 | * memory/processor states from a remote process. | 
|  | 33 | ****************************************************************************/ | 
|  | 34 |  | 
|  | 35 | #include <cutils/logd.h> | 
|  | 36 | #include <sys/ptrace.h> | 
|  | 37 | #include <unwind.h> | 
|  | 38 | #include "utility.h" | 
|  | 39 |  | 
|  | 40 | typedef struct _ZSt9type_info type_info; /* This names C++ type_info type */ | 
|  | 41 |  | 
|  | 42 | void __attribute__((weak)) __cxa_call_unexpected(_Unwind_Control_Block *ucbp); | 
|  | 43 | bool __attribute__((weak)) __cxa_begin_cleanup(_Unwind_Control_Block *ucbp); | 
|  | 44 | bool __attribute__((weak)) __cxa_type_match(_Unwind_Control_Block *ucbp, | 
|  | 45 | const type_info *rttip, | 
|  | 46 | bool is_reference, | 
|  | 47 | void **matched_object); | 
|  | 48 |  | 
|  | 49 | /* Misc constants.  */ | 
|  | 50 | #define R_IP	12 | 
|  | 51 | #define R_SP	13 | 
|  | 52 | #define R_LR	14 | 
|  | 53 | #define R_PC	15 | 
|  | 54 |  | 
|  | 55 | #define EXIDX_CANTUNWIND 1 | 
|  | 56 | #define uint32_highbit (((_uw) 1) << 31) | 
|  | 57 |  | 
|  | 58 | #define UCB_FORCED_STOP_FN(ucbp) ((ucbp)->unwinder_cache.reserved1) | 
|  | 59 | #define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2) | 
|  | 60 | #define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3) | 
|  | 61 | #define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4) | 
|  | 62 |  | 
|  | 63 | struct core_regs | 
|  | 64 | { | 
|  | 65 | _uw r[16]; | 
|  | 66 | }; | 
|  | 67 |  | 
|  | 68 | /* We use normal integer types here to avoid the compiler generating | 
|  | 69 | coprocessor instructions.  */ | 
|  | 70 | struct vfp_regs | 
|  | 71 | { | 
|  | 72 | _uw64 d[16]; | 
|  | 73 | _uw pad; | 
|  | 74 | }; | 
|  | 75 |  | 
|  | 76 | struct vfpv3_regs | 
|  | 77 | { | 
|  | 78 | /* Always populated via VSTM, so no need for the "pad" field from | 
|  | 79 | vfp_regs (which is used to store the format word for FSTMX).  */ | 
|  | 80 | _uw64 d[16]; | 
|  | 81 | }; | 
|  | 82 |  | 
|  | 83 | struct fpa_reg | 
|  | 84 | { | 
|  | 85 | _uw w[3]; | 
|  | 86 | }; | 
|  | 87 |  | 
|  | 88 | struct fpa_regs | 
|  | 89 | { | 
|  | 90 | struct fpa_reg f[8]; | 
|  | 91 | }; | 
|  | 92 |  | 
|  | 93 | struct wmmxd_regs | 
|  | 94 | { | 
|  | 95 | _uw64 wd[16]; | 
|  | 96 | }; | 
|  | 97 |  | 
|  | 98 | struct wmmxc_regs | 
|  | 99 | { | 
|  | 100 | _uw wc[4]; | 
|  | 101 | }; | 
|  | 102 |  | 
|  | 103 | /* Unwind descriptors.  */ | 
|  | 104 |  | 
|  | 105 | typedef struct | 
|  | 106 | { | 
|  | 107 | _uw16 length; | 
|  | 108 | _uw16 offset; | 
|  | 109 | } EHT16; | 
|  | 110 |  | 
|  | 111 | typedef struct | 
|  | 112 | { | 
|  | 113 | _uw length; | 
|  | 114 | _uw offset; | 
|  | 115 | } EHT32; | 
|  | 116 |  | 
|  | 117 | /* The ABI specifies that the unwind routines may only use core registers, | 
|  | 118 | except when actually manipulating coprocessor state.  This allows | 
|  | 119 | us to write one implementation that works on all platforms by | 
|  | 120 | demand-saving coprocessor registers. | 
|  | 121 |  | 
|  | 122 | During unwinding we hold the coprocessor state in the actual hardware | 
|  | 123 | registers and allocate demand-save areas for use during phase1 | 
|  | 124 | unwinding.  */ | 
|  | 125 |  | 
|  | 126 | typedef struct | 
|  | 127 | { | 
|  | 128 | /* The first fields must be the same as a phase2_vrs.  */ | 
|  | 129 | _uw demand_save_flags; | 
|  | 130 | struct core_regs core; | 
|  | 131 | _uw prev_sp; /* Only valid during forced unwinding.  */ | 
|  | 132 | struct vfp_regs vfp; | 
|  | 133 | struct vfpv3_regs vfp_regs_16_to_31; | 
|  | 134 | struct fpa_regs fpa; | 
|  | 135 | struct wmmxd_regs wmmxd; | 
|  | 136 | struct wmmxc_regs wmmxc; | 
|  | 137 | } phase1_vrs; | 
|  | 138 |  | 
|  | 139 | /* This must match the structure created by the assembly wrappers.  */ | 
|  | 140 | typedef struct | 
|  | 141 | { | 
|  | 142 | _uw demand_save_flags; | 
|  | 143 | struct core_regs core; | 
|  | 144 | } phase2_vrs; | 
|  | 145 |  | 
|  | 146 |  | 
|  | 147 | /* An exception index table entry.  */ | 
|  | 148 |  | 
|  | 149 | typedef struct __EIT_entry | 
|  | 150 | { | 
|  | 151 | _uw fnoffset; | 
|  | 152 | _uw content; | 
|  | 153 | } __EIT_entry; | 
|  | 154 |  | 
|  | 155 | /* Derived version to use ptrace */ | 
|  | 156 | typedef _Unwind_Reason_Code (*personality_routine_with_ptrace) | 
|  | 157 | (_Unwind_State, | 
|  | 158 | _Unwind_Control_Block *, | 
|  | 159 | _Unwind_Context *, | 
|  | 160 | pid_t); | 
|  | 161 |  | 
|  | 162 | /* Derived version to use ptrace */ | 
|  | 163 | /* ABI defined personality routines.  */ | 
|  | 164 | static _Unwind_Reason_Code unwind_cpp_pr0_with_ptrace (_Unwind_State, | 
|  | 165 | _Unwind_Control_Block *, _Unwind_Context *, pid_t); | 
|  | 166 | static _Unwind_Reason_Code unwind_cpp_pr1_with_ptrace (_Unwind_State, | 
|  | 167 | _Unwind_Control_Block *, _Unwind_Context *, pid_t); | 
|  | 168 | static _Unwind_Reason_Code unwind_cpp_pr2_with_ptrace (_Unwind_State, | 
|  | 169 | _Unwind_Control_Block *, _Unwind_Context *, pid_t); | 
|  | 170 |  | 
|  | 171 | /* Execute the unwinding instructions described by UWS.  */ | 
|  | 172 | extern _Unwind_Reason_Code | 
|  | 173 | unwind_execute_with_ptrace(_Unwind_Context * context, __gnu_unwind_state * uws, | 
|  | 174 | pid_t pid); | 
|  | 175 |  | 
|  | 176 | /* Derived version to use ptrace. Only handles core registers. Disregards | 
|  | 177 | * FP and others. | 
|  | 178 | */ | 
|  | 179 | /* ABI defined function to pop registers off the stack.  */ | 
|  | 180 |  | 
|  | 181 | _Unwind_VRS_Result unwind_VRS_Pop_with_ptrace (_Unwind_Context *context, | 
|  | 182 | _Unwind_VRS_RegClass regclass, | 
|  | 183 | _uw discriminator, | 
|  | 184 | _Unwind_VRS_DataRepresentation representation, | 
|  | 185 | pid_t pid) | 
|  | 186 | { | 
|  | 187 | phase1_vrs *vrs = (phase1_vrs *) context; | 
|  | 188 |  | 
|  | 189 | switch (regclass) | 
|  | 190 | { | 
|  | 191 | case _UVRSC_CORE: | 
|  | 192 | { | 
|  | 193 | _uw *ptr; | 
|  | 194 | _uw mask; | 
|  | 195 | int i; | 
|  | 196 |  | 
|  | 197 | if (representation != _UVRSD_UINT32) | 
|  | 198 | return _UVRSR_FAILED; | 
|  | 199 |  | 
|  | 200 | mask = discriminator & 0xffff; | 
|  | 201 | ptr = (_uw *) vrs->core.r[R_SP]; | 
|  | 202 | /* Pop the requested registers.  */ | 
|  | 203 | for (i = 0; i < 16; i++) | 
|  | 204 | { | 
|  | 205 | if (mask & (1 << i)) { | 
|  | 206 | vrs->core.r[i] = get_remote_word(pid, ptr); | 
|  | 207 | ptr++; | 
|  | 208 | } | 
|  | 209 | } | 
|  | 210 | /* Writeback the stack pointer value if it wasn't restored.  */ | 
|  | 211 | if ((mask & (1 << R_SP)) == 0) | 
|  | 212 | vrs->core.r[R_SP] = (_uw) ptr; | 
|  | 213 | } | 
|  | 214 | return _UVRSR_OK; | 
|  | 215 |  | 
|  | 216 | default: | 
|  | 217 | return _UVRSR_FAILED; | 
|  | 218 | } | 
|  | 219 | } | 
|  | 220 |  | 
|  | 221 | /* Core unwinding functions.  */ | 
|  | 222 |  | 
|  | 223 | /* Calculate the address encoded by a 31-bit self-relative offset at address | 
|  | 224 | P.  */ | 
|  | 225 | static inline _uw | 
|  | 226 | selfrel_offset31 (const _uw *p, pid_t pid) | 
|  | 227 | { | 
|  | 228 | _uw offset = get_remote_word(pid, (void*)p); | 
|  | 229 |  | 
|  | 230 | //offset = *p; | 
|  | 231 | /* Sign extend to 32 bits.  */ | 
|  | 232 | if (offset & (1 << 30)) | 
|  | 233 | offset |= 1u << 31; | 
|  | 234 | else | 
|  | 235 | offset &= ~(1u << 31); | 
|  | 236 |  | 
|  | 237 | return offset + (_uw) p; | 
|  | 238 | } | 
|  | 239 |  | 
|  | 240 |  | 
|  | 241 | /* Perform a binary search for RETURN_ADDRESS in TABLE.  The table contains | 
|  | 242 | NREC entries.  */ | 
|  | 243 |  | 
|  | 244 | static const __EIT_entry * | 
|  | 245 | search_EIT_table (const __EIT_entry * table, int nrec, _uw return_address, | 
|  | 246 | pid_t pid) | 
|  | 247 | { | 
|  | 248 | _uw next_fn; | 
|  | 249 | _uw this_fn; | 
|  | 250 | int n, left, right; | 
|  | 251 |  | 
|  | 252 | if (nrec == 0) | 
|  | 253 | return (__EIT_entry *) 0; | 
|  | 254 |  | 
|  | 255 | left = 0; | 
|  | 256 | right = nrec - 1; | 
|  | 257 |  | 
|  | 258 | while (1) | 
|  | 259 | { | 
|  | 260 | n = (left + right) / 2; | 
|  | 261 | this_fn = selfrel_offset31 (&table[n].fnoffset, pid); | 
|  | 262 | if (n != nrec - 1) | 
|  | 263 | next_fn = selfrel_offset31 (&table[n + 1].fnoffset, pid) - 1; | 
|  | 264 | else | 
|  | 265 | next_fn = (_uw)0 - 1; | 
|  | 266 |  | 
|  | 267 | if (return_address < this_fn) | 
|  | 268 | { | 
|  | 269 | if (n == left) | 
|  | 270 | return (__EIT_entry *) 0; | 
|  | 271 | right = n - 1; | 
|  | 272 | } | 
|  | 273 | else if (return_address <= next_fn) | 
|  | 274 | return &table[n]; | 
|  | 275 | else | 
|  | 276 | left = n + 1; | 
|  | 277 | } | 
|  | 278 | } | 
|  | 279 |  | 
|  | 280 | /* Find the exception index table eintry for the given address. */ | 
|  | 281 | static const __EIT_entry* | 
|  | 282 | get_eitp(_uw return_address, pid_t pid, mapinfo *map, mapinfo **containing_map) | 
|  | 283 | { | 
|  | 284 | const __EIT_entry *eitp = NULL; | 
|  | 285 | int nrec; | 
|  | 286 | mapinfo *mi; | 
|  | 287 |  | 
|  | 288 | /* The return address is the address of the instruction following the | 
|  | 289 | call instruction (plus one in thumb mode).  If this was the last | 
|  | 290 | instruction in the function the address will lie in the following | 
|  | 291 | function.  Subtract 2 from the address so that it points within the call | 
|  | 292 | instruction itself.  */ | 
|  | 293 | if (return_address >= 2) | 
|  | 294 | return_address -= 2; | 
|  | 295 |  | 
|  | 296 | for (mi = map; mi != NULL; mi = mi->next) { | 
|  | 297 | if (return_address >= mi->start && return_address <= mi->end) break; | 
|  | 298 | } | 
|  | 299 |  | 
|  | 300 | if (mi) { | 
|  | 301 | if (containing_map) *containing_map = mi; | 
|  | 302 | eitp = (__EIT_entry *) mi->exidx_start; | 
|  | 303 | nrec = (mi->exidx_end - mi->exidx_start)/sizeof(__EIT_entry); | 
|  | 304 | eitp = search_EIT_table (eitp, nrec, return_address, pid); | 
|  | 305 | } | 
|  | 306 | return eitp; | 
|  | 307 | } | 
|  | 308 |  | 
|  | 309 | /* Find the exception index table eintry for the given address. | 
|  | 310 | Fill in the relevant fields of the UCB. | 
|  | 311 | Returns _URC_FAILURE if an error occurred, _URC_OK on success.  */ | 
|  | 312 |  | 
|  | 313 | static _Unwind_Reason_Code | 
|  | 314 | get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address, pid_t pid, | 
|  | 315 | mapinfo *map, mapinfo **containing_map) | 
|  | 316 | { | 
|  | 317 | const __EIT_entry *eitp; | 
|  | 318 |  | 
|  | 319 | eitp = get_eitp(return_address, pid, map, containing_map); | 
|  | 320 |  | 
|  | 321 | if (!eitp) | 
|  | 322 | { | 
|  | 323 | UCB_PR_ADDR (ucbp) = 0; | 
|  | 324 | return _URC_FAILURE; | 
|  | 325 | } | 
|  | 326 | ucbp->pr_cache.fnstart = selfrel_offset31 (&eitp->fnoffset, pid); | 
|  | 327 |  | 
|  | 328 | _uw eitp_content = get_remote_word(pid, (void *)&eitp->content); | 
|  | 329 |  | 
|  | 330 | /* Can this frame be unwound at all?  */ | 
|  | 331 | if (eitp_content == EXIDX_CANTUNWIND) | 
|  | 332 | { | 
|  | 333 | UCB_PR_ADDR (ucbp) = 0; | 
|  | 334 | return _URC_END_OF_STACK; | 
|  | 335 | } | 
|  | 336 |  | 
|  | 337 | /* Obtain the address of the "real" __EHT_Header word.  */ | 
|  | 338 |  | 
|  | 339 | if (eitp_content & uint32_highbit) | 
|  | 340 | { | 
|  | 341 | /* It is immediate data.  */ | 
|  | 342 | ucbp->pr_cache.ehtp = (_Unwind_EHT_Header *)&eitp->content; | 
|  | 343 | ucbp->pr_cache.additional = 1; | 
|  | 344 | } | 
|  | 345 | else | 
|  | 346 | { | 
|  | 347 | /* The low 31 bits of the content field are a self-relative | 
|  | 348 | offset to an _Unwind_EHT_Entry structure.  */ | 
|  | 349 | ucbp->pr_cache.ehtp = | 
|  | 350 | (_Unwind_EHT_Header *) selfrel_offset31 (&eitp->content, pid); | 
|  | 351 | ucbp->pr_cache.additional = 0; | 
|  | 352 | } | 
|  | 353 |  | 
|  | 354 | /* Discover the personality routine address.  */ | 
|  | 355 | if (get_remote_word(pid, ucbp->pr_cache.ehtp) & (1u << 31)) | 
|  | 356 | { | 
|  | 357 | /* One of the predefined standard routines.  */ | 
|  | 358 | _uw idx = (get_remote_word(pid, ucbp->pr_cache.ehtp) >> 24) & 0xf; | 
|  | 359 | if (idx == 0) | 
|  | 360 | UCB_PR_ADDR (ucbp) = (_uw) &unwind_cpp_pr0_with_ptrace; | 
|  | 361 | else if (idx == 1) | 
|  | 362 | UCB_PR_ADDR (ucbp) = (_uw) &unwind_cpp_pr1_with_ptrace; | 
|  | 363 | else if (idx == 2) | 
|  | 364 | UCB_PR_ADDR (ucbp) = (_uw) &unwind_cpp_pr2_with_ptrace; | 
|  | 365 | else | 
|  | 366 | { /* Failed */ | 
|  | 367 | UCB_PR_ADDR (ucbp) = 0; | 
|  | 368 | return _URC_FAILURE; | 
|  | 369 | } | 
|  | 370 | } | 
|  | 371 | else | 
|  | 372 | { | 
|  | 373 | /* Execute region offset to PR */ | 
|  | 374 | UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp, pid); | 
|  | 375 | /* Since we are unwinding the stack from a different process, it is | 
|  | 376 | * impossible to execute the personality routine in debuggerd. Punt here. | 
|  | 377 | */ | 
|  | 378 | return _URC_FAILURE; | 
|  | 379 | } | 
|  | 380 | return _URC_OK; | 
|  | 381 | } | 
|  | 382 |  | 
|  | 383 | /* Print out the current call level, pc, and module name in the crash log */ | 
|  | 384 | static _Unwind_Reason_Code log_function(_Unwind_Context *context, pid_t pid, | 
|  | 385 | int tfd, | 
|  | 386 | int stack_level, | 
|  | 387 | mapinfo *map, | 
|  | 388 | unsigned int sp_list[], | 
|  | 389 | bool at_fault) | 
|  | 390 | { | 
|  | 391 | _uw pc; | 
|  | 392 | _uw rel_pc; | 
|  | 393 | phase2_vrs *vrs = (phase2_vrs*) context; | 
|  | 394 | const mapinfo *mi; | 
|  | 395 | bool only_in_tombstone = !at_fault; | 
|  | 396 |  | 
|  | 397 | if (stack_level < STACK_CONTENT_DEPTH) { | 
|  | 398 | sp_list[stack_level] = vrs->core.r[R_SP]; | 
|  | 399 | } | 
|  | 400 | pc = vrs->core.r[R_PC]; | 
|  | 401 |  | 
|  | 402 | // Top level frame | 
|  | 403 | if (stack_level == 0) { | 
|  | 404 | pc &= ~1; | 
|  | 405 | } | 
|  | 406 | // For deeper framers, rollback pc by one instruction | 
|  | 407 | else { | 
|  | 408 | pc = vrs->core.r[R_PC]; | 
|  | 409 | /* Thumb mode - need to check whether the bl(x) has long offset or not. | 
|  | 410 | * Examples: | 
|  | 411 | * | 
|  | 412 | * arm blx in the middle of thumb: | 
|  | 413 | * 187ae:       2300            movs    r3, #0 | 
|  | 414 | * 187b0:       f7fe ee1c       blx     173ec | 
|  | 415 | * 187b4:       2c00            cmp     r4, #0 | 
|  | 416 | * | 
|  | 417 | * arm bl in the middle of thumb: | 
|  | 418 | * 187d8:       1c20            adds    r0, r4, #0 | 
|  | 419 | * 187da:       f136 fd15       bl      14f208 | 
|  | 420 | * 187de:       2800            cmp     r0, #0 | 
|  | 421 | * | 
|  | 422 | * pure thumb: | 
|  | 423 | * 18894:       189b            adds    r3, r3, r2 | 
|  | 424 | * 18896:       4798            blx     r3 | 
|  | 425 | * 18898:       b001            add     sp, #4 | 
|  | 426 | */ | 
|  | 427 | if (pc & 1) { | 
|  | 428 | _uw prev_word; | 
|  | 429 | pc = (pc & ~1); | 
|  | 430 | prev_word = get_remote_word(pid, (void *) pc-4); | 
|  | 431 | // Long offset | 
|  | 432 | if ((prev_word & 0xf0000000) == 0xf0000000 && | 
|  | 433 | (prev_word & 0x0000e000) == 0x0000e000) { | 
|  | 434 | pc -= 4; | 
|  | 435 | } | 
|  | 436 | else { | 
|  | 437 | pc -= 2; | 
|  | 438 | } | 
|  | 439 | } | 
|  | 440 | else { | 
|  | 441 | pc -= 4; | 
|  | 442 | } | 
|  | 443 | } | 
|  | 444 |  | 
|  | 445 | /* We used to print the absolute PC in the back trace, and mask out the top | 
|  | 446 | * 3 bits to guesstimate the offset in the .so file. This is not working for | 
|  | 447 | * non-prelinked libraries since the starting offset may not be aligned on | 
|  | 448 | * 1MB boundaries, and the library may be larger than 1MB. So for .so | 
|  | 449 | * addresses we print the relative offset in back trace. | 
|  | 450 | */ | 
|  | 451 | rel_pc = pc; | 
|  | 452 | mi = pc_to_mapinfo(map, pc, &rel_pc); | 
|  | 453 |  | 
|  | 454 | _LOG(tfd, only_in_tombstone, | 
|  | 455 | "         #%02d  pc %08x  %s\n", stack_level, rel_pc, | 
|  | 456 | mi ? mi->name : ""); | 
|  | 457 |  | 
|  | 458 | return _URC_NO_REASON; | 
|  | 459 | } | 
|  | 460 |  | 
|  | 461 | /* Derived from __gnu_Unwind_Backtrace to use ptrace */ | 
|  | 462 | /* Perform stack backtrace through unwind data. Return the level of stack it | 
|  | 463 | * unwinds. | 
|  | 464 | */ | 
|  | 465 | int unwind_backtrace_with_ptrace(int tfd, pid_t pid, mapinfo *map, | 
|  | 466 | unsigned int sp_list[], int *frame0_pc_sane, | 
|  | 467 | bool at_fault) | 
|  | 468 | { | 
|  | 469 | phase1_vrs saved_vrs; | 
|  | 470 | _Unwind_Reason_Code code = _URC_OK; | 
|  | 471 | struct pt_regs r; | 
|  | 472 | int i; | 
|  | 473 | int stack_level = 0; | 
|  | 474 |  | 
|  | 475 | _Unwind_Control_Block ucb; | 
|  | 476 | _Unwind_Control_Block *ucbp = &ucb; | 
|  | 477 |  | 
|  | 478 | if(ptrace(PTRACE_GETREGS, pid, 0, &r)) return 0; | 
|  | 479 |  | 
|  | 480 | for (i = 0; i < 16; i++) { | 
|  | 481 | saved_vrs.core.r[i] = r.uregs[i]; | 
|  | 482 | /* | 
|  | 483 | _LOG(tfd, "r[%d] = 0x%x\n", i, saved_vrs.core.r[i]); | 
|  | 484 | */ | 
|  | 485 | } | 
|  | 486 |  | 
|  | 487 | /* Set demand-save flags.  */ | 
|  | 488 | saved_vrs.demand_save_flags = ~(_uw) 0; | 
|  | 489 |  | 
|  | 490 | /* | 
|  | 491 | * If the app crashes because of calling the weeds, we cannot pass the PC | 
|  | 492 | * to the usual unwinding code as the EXIDX mapping will fail. | 
|  | 493 | * Instead, we simply print out the 0 as the top frame, and resume the | 
|  | 494 | * unwinding process with the value stored in LR. | 
|  | 495 | */ | 
|  | 496 | if (get_eitp(saved_vrs.core.r[R_PC], pid, map, NULL) == NULL) { | 
|  | 497 | *frame0_pc_sane = 0; | 
|  | 498 | log_function ((_Unwind_Context *) &saved_vrs, pid, tfd, stack_level, | 
|  | 499 | map, sp_list, at_fault); | 
|  | 500 | saved_vrs.core.r[R_PC] = saved_vrs.core.r[R_LR]; | 
|  | 501 | stack_level++; | 
|  | 502 | } | 
|  | 503 |  | 
|  | 504 | do { | 
|  | 505 | mapinfo *this_map = NULL; | 
|  | 506 | /* Find the entry for this routine.  */ | 
|  | 507 | if (get_eit_entry(ucbp, saved_vrs.core.r[R_PC], pid, map, &this_map) | 
|  | 508 | != _URC_OK) { | 
|  | 509 | /* Uncomment the code below to study why the unwinder failed */ | 
|  | 510 | #if 0 | 
|  | 511 | /* Shed more debugging info for stack unwinder improvement */ | 
|  | 512 | if (this_map) { | 
|  | 513 | _LOG(tfd, 1, | 
|  | 514 | "Relative PC=%#x from %s not contained in EXIDX\n", | 
|  | 515 | saved_vrs.core.r[R_PC] - this_map->start, this_map->name); | 
|  | 516 | } | 
|  | 517 | _LOG(tfd, 1, "PC=%#x SP=%#x\n", | 
|  | 518 | saved_vrs.core.r[R_PC], saved_vrs.core.r[R_SP]); | 
|  | 519 | #endif | 
|  | 520 | code = _URC_FAILURE; | 
|  | 521 | break; | 
|  | 522 | } | 
|  | 523 |  | 
|  | 524 | /* The dwarf unwinder assumes the context structure holds things | 
|  | 525 | like the function and LSDA pointers.  The ARM implementation | 
|  | 526 | caches these in the exception header (UCB).  To avoid | 
|  | 527 | rewriting everything we make the virtual IP register point at | 
|  | 528 | the UCB.  */ | 
|  | 529 | _Unwind_SetGR((_Unwind_Context *)&saved_vrs, 12, (_Unwind_Ptr) ucbp); | 
|  | 530 |  | 
|  | 531 | /* Call log function.  */ | 
|  | 532 | if (log_function ((_Unwind_Context *) &saved_vrs, pid, tfd, stack_level, | 
|  | 533 | map, sp_list, at_fault) != _URC_NO_REASON) { | 
|  | 534 | code = _URC_FAILURE; | 
|  | 535 | break; | 
|  | 536 | } | 
|  | 537 | stack_level++; | 
|  | 538 |  | 
|  | 539 | /* Call the pr to decide what to do.  */ | 
|  | 540 | code = ((personality_routine_with_ptrace) UCB_PR_ADDR (ucbp))( | 
|  | 541 | _US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND, ucbp, | 
|  | 542 | (void *) &saved_vrs, pid); | 
|  | 543 | /* | 
|  | 544 | * In theory the unwinding process will stop when the end of stack is | 
|  | 545 | * reached or there is no unwinding information for the code address. | 
|  | 546 | * To add another level of guarantee that the unwinding process | 
|  | 547 | * will terminate we will stop it when the STACK_CONTENT_DEPTH is reached. | 
|  | 548 | */ | 
|  | 549 | } while (code != _URC_END_OF_STACK && code != _URC_FAILURE && | 
|  | 550 | stack_level < STACK_CONTENT_DEPTH); | 
|  | 551 | return stack_level; | 
|  | 552 | } | 
|  | 553 |  | 
|  | 554 |  | 
|  | 555 | /* Derived version to use ptrace */ | 
|  | 556 | /* Common implementation for ARM ABI defined personality routines. | 
|  | 557 | ID is the index of the personality routine, other arguments are as defined | 
|  | 558 | by __aeabi_unwind_cpp_pr{0,1,2}.  */ | 
|  | 559 |  | 
|  | 560 | static _Unwind_Reason_Code | 
|  | 561 | unwind_pr_common_with_ptrace (_Unwind_State state, | 
|  | 562 | _Unwind_Control_Block *ucbp, | 
|  | 563 | _Unwind_Context *context, | 
|  | 564 | int id, | 
|  | 565 | pid_t pid) | 
|  | 566 | { | 
|  | 567 | __gnu_unwind_state uws; | 
|  | 568 | _uw *data; | 
|  | 569 | int phase2_call_unexpected_after_unwind = 0; | 
|  | 570 |  | 
|  | 571 | state &= _US_ACTION_MASK; | 
|  | 572 |  | 
|  | 573 | data = (_uw *) ucbp->pr_cache.ehtp; | 
|  | 574 | uws.data = get_remote_word(pid, data); | 
|  | 575 | data++; | 
|  | 576 | uws.next = data; | 
|  | 577 | if (id == 0) | 
|  | 578 | { | 
|  | 579 | uws.data <<= 8; | 
|  | 580 | uws.words_left = 0; | 
|  | 581 | uws.bytes_left = 3; | 
|  | 582 | } | 
|  | 583 | else | 
|  | 584 | { | 
|  | 585 | uws.words_left = (uws.data >> 16) & 0xff; | 
|  | 586 | uws.data <<= 16; | 
|  | 587 | uws.bytes_left = 2; | 
|  | 588 | data += uws.words_left; | 
|  | 589 | } | 
|  | 590 |  | 
|  | 591 | /* Restore the saved pointer.  */ | 
|  | 592 | if (state == _US_UNWIND_FRAME_RESUME) | 
|  | 593 | data = (_uw *) ucbp->cleanup_cache.bitpattern[0]; | 
|  | 594 |  | 
|  | 595 | if ((ucbp->pr_cache.additional & 1) == 0) | 
|  | 596 | { | 
|  | 597 | /* Process descriptors.  */ | 
|  | 598 | while (get_remote_word(pid, data)) { | 
|  | 599 | /********************************************************************** | 
|  | 600 | * The original code here seems to deal with exceptions that are not | 
|  | 601 | * applicable in our toolchain, thus there is no way to test it for now. | 
|  | 602 | * Instead of leaving it here and causing potential instability in | 
|  | 603 | * debuggerd, we'd better punt here and leave the stack unwound. | 
|  | 604 | * In the future when we discover cases where the stack should be unwound | 
|  | 605 | * further but is not, we can revisit the code here. | 
|  | 606 | **********************************************************************/ | 
|  | 607 | return _URC_FAILURE; | 
|  | 608 | } | 
|  | 609 | /* Finished processing this descriptor.  */ | 
|  | 610 | } | 
|  | 611 |  | 
|  | 612 | if (unwind_execute_with_ptrace (context, &uws, pid) != _URC_OK) | 
|  | 613 | return _URC_FAILURE; | 
|  | 614 |  | 
|  | 615 | if (phase2_call_unexpected_after_unwind) | 
|  | 616 | { | 
|  | 617 | /* Enter __cxa_unexpected as if called from the call site.  */ | 
|  | 618 | _Unwind_SetGR (context, R_LR, _Unwind_GetGR (context, R_PC)); | 
|  | 619 | _Unwind_SetGR (context, R_PC, (_uw) &__cxa_call_unexpected); | 
|  | 620 | return _URC_INSTALL_CONTEXT; | 
|  | 621 | } | 
|  | 622 |  | 
|  | 623 | return _URC_CONTINUE_UNWIND; | 
|  | 624 | } | 
|  | 625 |  | 
|  | 626 |  | 
|  | 627 | /* ABI defined personality routine entry points.  */ | 
|  | 628 |  | 
|  | 629 | static _Unwind_Reason_Code | 
|  | 630 | unwind_cpp_pr0_with_ptrace (_Unwind_State state, | 
|  | 631 | _Unwind_Control_Block *ucbp, | 
|  | 632 | _Unwind_Context *context, | 
|  | 633 | pid_t pid) | 
|  | 634 | { | 
|  | 635 | return unwind_pr_common_with_ptrace (state, ucbp, context, 0, pid); | 
|  | 636 | } | 
|  | 637 |  | 
|  | 638 | static _Unwind_Reason_Code | 
|  | 639 | unwind_cpp_pr1_with_ptrace (_Unwind_State state, | 
|  | 640 | _Unwind_Control_Block *ucbp, | 
|  | 641 | _Unwind_Context *context, | 
|  | 642 | pid_t pid) | 
|  | 643 | { | 
|  | 644 | return unwind_pr_common_with_ptrace (state, ucbp, context, 1, pid); | 
|  | 645 | } | 
|  | 646 |  | 
|  | 647 | static _Unwind_Reason_Code | 
|  | 648 | unwind_cpp_pr2_with_ptrace (_Unwind_State state, | 
|  | 649 | _Unwind_Control_Block *ucbp, | 
|  | 650 | _Unwind_Context *context, | 
|  | 651 | pid_t pid) | 
|  | 652 | { | 
|  | 653 | return unwind_pr_common_with_ptrace (state, ucbp, context, 2, pid); | 
|  | 654 | } |