1fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm/* libunwind - a platform-independent unwind library 25b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm Copyright (C) 2004 Hewlett-Packard Co 35b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 5fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmThis file is part of libunwind. 6fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 7fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining 8fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidma copy of this software and associated documentation files (the 9fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm"Software"), to deal in the Software without restriction, including 10fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish, 11fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to 12fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to 13fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmthe following conditions: 14fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 15fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmThe above copyright notice and this permission notice shall be 16fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmincluded in all copies or substantial portions of the Software. 17fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 18fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 25fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 26fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm#include "unwind_i.h" 27fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 28fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmHIDDEN int 295b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmtdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp, 305b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm int write) 31fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm{ 325b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm struct dwarf_loc loc; 33fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 34fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm switch (reg) 35fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm { 36fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm case UNW_HPPA_IP: 37fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm if (write) 385b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm c->dwarf.ip = *valp; /* update the IP cache */ 395b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip 405b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm || *valp >= c->dwarf.pi.end_ip)) 415b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm c->dwarf.pi_valid = 0; /* new IP outside of current proc */ 42fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm break; 43fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 445b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm case UNW_HPPA_CFA: 45fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm case UNW_HPPA_SP: 46fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm if (write) 47fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm return -UNW_EREADONLYREG; 485b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm *valp = c->dwarf.cfa; 49fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm return 0; 50fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 515b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm /* Do the exception-handling register remapping: */ 525b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm case UNW_HPPA_EH0: reg = UNW_HPPA_GR + 20; break; 535b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm case UNW_HPPA_EH1: reg = UNW_HPPA_GR + 21; break; 545b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm case UNW_HPPA_EH2: reg = UNW_HPPA_GR + 22; break; 555b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm case UNW_HPPA_EH3: reg = UNW_HPPA_GR + 31; break; 565b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 57fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm default: 585b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm break; 59fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm } 60fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm 615b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm if ((unsigned) (reg - UNW_HPPA_GR) >= 32) 625b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return -UNW_EBADREG; 635b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 645b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm loc = c->dwarf.loc[reg]; 655b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 665b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm if (write) 675b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return dwarf_put (&c->dwarf, loc, *valp); 685b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm else 695b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return dwarf_get (&c->dwarf, loc, valp); 705b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm} 715b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 725b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmHIDDEN int 735b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmtdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp, 745b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm int write) 755b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm{ 765b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm struct dwarf_loc loc; 775b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 785b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm if ((unsigned) (reg - UNW_HPPA_FR) >= 32) 795b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return -UNW_EBADREG; 805b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 815b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm loc = c->dwarf.loc[reg]; 825b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm 83fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm if (write) 845b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return dwarf_putfp (&c->dwarf, loc, *valp); 85fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm else 865b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm return dwarf_getfp (&c->dwarf, loc, valp); 87fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm} 88