14499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino/* libunwind - a platform-independent unwind library 24499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Copyright (C) 2006-2007 IBM 34499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Contributed by 44499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Corey Ashford <cjashfor@us.ibm.com> 54499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com> 64499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 74499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoThis file is part of libunwind. 84499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 94499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoPermission is hereby granted, free of charge, to any person obtaining 104499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoa copy of this software and associated documentation files (the 114499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino"Software"), to deal in the Software without restriction, including 124499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinowithout limitation the rights to use, copy, modify, merge, publish, 134499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinodistribute, sublicense, and/or sell copies of the Software, and to 144499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinopermit persons to whom the Software is furnished to do so, subject to 154499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinothe following conditions: 164499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 174499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoThe above copyright notice and this permission notice shall be 184499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoincluded in all copies or substantial portions of the Software. 194499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 204499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 214499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 224499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 234499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 244499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 254499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 264499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 274499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 284499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#include <stdlib.h> 294499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#include <string.h> 304499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 314499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#include "ucontext_i.h" 324499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#include "unwind_i.h" 334499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 344499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#ifdef UNW_REMOTE_ONLY 354499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 364499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino/* unw_local_addr_space is a NULL pointer in this case. */ 374499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoPROTECTED unw_addr_space_t unw_local_addr_space; 384499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 394499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#else /* !UNW_REMOTE_ONLY */ 404499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 414499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic struct unw_addr_space local_addr_space; 424499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 434499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoPROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space; 444499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 454499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic void * 464499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinouc_addr (ucontext_t *uc, int reg) 474499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 484499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino void *addr; 494499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 504499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if ((unsigned) (reg - UNW_PPC32_R0) < 32) 514499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino addr = &uc->uc_mcontext.uc_regs->gregs[reg - UNW_PPC32_R0]; 524499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 539ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino else 549ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino if ( ((unsigned) (reg - UNW_PPC32_F0) < 32) && 559ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino ((unsigned) (reg - UNW_PPC32_F0) >= 0) ) 564499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino addr = &uc->uc_mcontext.uc_regs->fpregs.fpregs[reg - UNW_PPC32_F0]; 574499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 584499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino else 594499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 604499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino unsigned gregs_idx; 614499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 624499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino switch (reg) 634499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 644499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino case UNW_PPC32_CTR: 654499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino gregs_idx = CTR_IDX; 664499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino break; 674499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino case UNW_PPC32_LR: 684499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino gregs_idx = LINK_IDX; 694499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino break; 704499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino case UNW_PPC32_XER: 714499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino gregs_idx = XER_IDX; 724499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino break; 739ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino case UNW_PPC32_CCR: 744499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino gregs_idx = CCR_IDX; 754499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino break; 764499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino default: 774499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return NULL; 784499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 794499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino addr = &uc->uc_mcontext.uc_regs->gregs[gregs_idx]; 804499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 814499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return addr; 824499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 834499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 844499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino# ifdef UNW_LOCAL_ONLY 854499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 864499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoHIDDEN void * 874499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinotdep_uc_addr (ucontext_t *uc, int reg) 884499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 894499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return uc_addr (uc, reg); 904499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 914499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 924499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino# endif /* UNW_LOCAL_ONLY */ 934499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 944499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoHIDDEN unw_dyn_info_list_t _U_dyn_info_list; 954499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 964499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 974499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic void 984499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoput_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 994499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 1004499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino /* it's a no-op */ 1014499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 1024499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1034499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic int 1044499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoget_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 1054499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino void *arg) 1064499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 1074499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 1084499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return 0; 1094499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 1104499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1114499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic int 1124499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoaccess_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write, 1134499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino void *arg) 1144499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 1154499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if (write) 1164499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 1177d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* ANDROID support update. */ 118cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY 119f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris if (map_local_is_writable (addr)) 1207d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris { 121cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif 1227d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris Debug (12, "mem[%lx] <- %lx\n", addr, *val); 1237d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris *(unw_word_t *) addr = *val; 124cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY 1257d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris } 1267d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris else 1277d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris { 1287d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris Debug (12, "Unwritable memory mem[%lx] <- %lx\n", addr, *val); 1297d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris return -1; 1307d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris } 131cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif 1327d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* End of ANDROID update. */ 1334499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 1344499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino else 1354499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 1367d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* ANDROID support update. */ 137cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY 138f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris if (map_local_is_readable (addr)) 1397d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris { 140cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif 1417d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris *val = *(unw_word_t *) addr; 1427d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris Debug (12, "mem[%lx] -> %lx\n", addr, *val); 143cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY 1447d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris } 1457d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris else 1467d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris { 1477d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris Debug (12, "Unreadable memory mem[%lx] -> XXX\n", addr); 1487d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris return -1; 1497d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris } 150cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif 1517d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* End of ANDROID update. */ 1524499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 1534499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return 0; 1544499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 1554499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1564499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic int 1574499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoaccess_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, 1584499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino int write, void *arg) 1594499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 1604499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino unw_word_t *addr; 1614499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino ucontext_t *uc = arg; 1624499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1639ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino if ( ((unsigned int) (reg - UNW_PPC32_F0) < 32) && 1649ea6af8ed5ee7b07f8de6d774bc6df2b7320f0e8Jose Flavio Aguilar Paulino ((unsigned int) (reg - UNW_PPC32_F0) >= 0)) 1654499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino goto badreg; 1664499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1674499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino addr = uc_addr (uc, reg); 1684499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if (!addr) 1694499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino goto badreg; 1704499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1714499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if (write) 1724499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 1734499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino *(unw_word_t *) addr = *val; 1744499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (12, "%s <- %lx\n", unw_regname (reg), *val); 1754499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 1764499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino else 1774499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 1784499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino *val = *(unw_word_t *) addr; 1794499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (12, "%s -> %lx\n", unw_regname (reg), *val); 1804499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 1814499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return 0; 1824499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1834499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinobadreg: 1844499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (1, "bad register number %u\n", reg); 1854499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return -UNW_EBADREG; 1864499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 1874499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1884499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic int 1894499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoaccess_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val, 1904499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino int write, void *arg) 1914499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 1924499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino ucontext_t *uc = arg; 1934499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino unw_fpreg_t *addr; 1944499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1954499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if ((unsigned) (reg - UNW_PPC32_F0) < 0) 1964499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino goto badreg; 1974499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 1984499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino addr = uc_addr (uc, reg); 1994499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if (!addr) 2004499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino goto badreg; 2014499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 2024499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino if (write) 2034499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 2044499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (12, "%s <- %016Lf\n", unw_regname (reg), *val); 2054499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino *(unw_fpreg_t *) addr = *val; 2064499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 2074499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino else 2084499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino { 2094499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino *val = *(unw_fpreg_t *) addr; 2104499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (12, "%s -> %016Lf\n", unw_regname (reg), *val); 2114499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino } 2124499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return 0; 2134499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 2144499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinobadreg: 2154499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino Debug (1, "bad register number %u\n", reg); 2164499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino /* attempt to access a non-preserved register */ 2174499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return -UNW_EBADREG; 2184499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 2194499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 2204499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinostatic int 2214499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoget_static_proc_name (unw_addr_space_t as, unw_word_t ip, 2224499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino char *buf, size_t buf_len, unw_word_t *offp, 2234499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino void *arg) 2244499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 2254499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp); 2264499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 2274499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 2284499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar PaulinoHIDDEN void 2294499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulinoppc32_local_addr_space_init (void) 2304499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino{ 2314499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino memset (&local_addr_space, 0, sizeof (local_addr_space)); 2324499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.caching_policy = UNW_CACHE_GLOBAL; 2334499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.find_proc_info = dwarf_find_proc_info; 2344499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.put_unwind_info = put_unwind_info; 2354499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr; 2364499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.access_mem = access_mem; 2374499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.access_reg = access_reg; 2384499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.access_fpreg = access_fpreg; 2394499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.resume = ppc32_local_resume; 2404499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino local_addr_space.acc.get_proc_name = get_static_proc_name; 2414499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino unw_flush_cache (&local_addr_space, 0, 0); 242f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris 243f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris map_local_init (); 2444499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino} 2454499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino 2464499bb29a6214b5df5b3b21e03c6b4f3c8f26cfdJose Flavio Aguilar Paulino#endif /* !UNW_REMOTE_ONLY */ 247