Ginit.c revision b33021e4b2f3a92141c01eb24b98bc51a97c498d
1b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino/* libunwind - a platform-independent unwind library
2b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   Copyright (C) 2006-2007 IBM
3b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino   Contributed by
4b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino     Corey Ashford <cjashfor@us.ibm.com>
5b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino     Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
6b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
7b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoThis file is part of libunwind.
8b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
9b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoPermission is hereby granted, free of charge, to any person obtaining
10b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoa copy of this software and associated documentation files (the
11b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino"Software"), to deal in the Software without restriction, including
12b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinowithout limitation the rights to use, copy, modify, merge, publish,
13b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinodistribute, sublicense, and/or sell copies of the Software, and to
14b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinopermit persons to whom the Software is furnished to do so, subject to
15b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinothe following conditions:
16b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
17b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoThe above copyright notice and this permission notice shall be
18b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoincluded in all copies or substantial portions of the Software.
19b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
20b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
27b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
28b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <stdlib.h>
29b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include <string.h>
30b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
31b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include "ucontext_i.h"
32b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#include "unwind_i.h"
33b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
34b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#ifdef UNW_REMOTE_ONLY
35b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
36b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino/* unw_local_addr_space is a NULL pointer in this case.  */
37b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoPROTECTED unw_addr_space_t unw_local_addr_space;
38b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
39b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#else /* !UNW_REMOTE_ONLY */
40b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
41b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic struct unw_addr_space local_addr_space;
42b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
43b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoPROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
44b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
45b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
46b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#define PAGE_SIZE 4096
47b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#define PAGE_START(a)	((a) & ~(PAGE_SIZE-1))
48b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
49b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
50b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic void *
51b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinouc_addr (ucontext_t *uc, int reg)
52b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
53b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  void *addr;
54b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
55b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if ((unsigned) (reg - UNW_PPC64_R0) < 32)
56b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    addr = &uc->uc_mcontext.gp_regs[reg - UNW_PPC64_R0];
57b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
58b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else if ((unsigned) (reg - UNW_PPC64_F0) < 32)
59b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    addr = &uc->uc_mcontext.fp_regs[reg - UNW_PPC64_F0];
60b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
61b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else if ((unsigned) (reg - UNW_PPC64_V0) < 32)
62b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    addr = (uc->uc_mcontext.v_regs == 0) ? NULL : &uc->uc_mcontext.v_regs->vrregs[reg - UNW_PPC64_V0][0];
63b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
64b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else
65b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
66b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      unsigned gregs_idx;
67b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
68b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      switch (reg)
69b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	{
70b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	case UNW_PPC64_NIP:
71b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  gregs_idx = NIP_IDX;
72b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  break;
73b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	case UNW_PPC64_CTR:
74b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  gregs_idx = CTR_IDX;
75b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  break;
76b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	case UNW_PPC64_LR:
77b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  gregs_idx = LINK_IDX;
78b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  break;
79b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	case UNW_PPC64_XER:
80b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  gregs_idx = XER_IDX;
81b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  break;
82b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	case UNW_PPC64_CR0:
83b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  gregs_idx = CCR_IDX;
84b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  break;
85b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	default:
86b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	  return NULL;
87b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	}
88b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      addr = &uc->uc_mcontext.gp_regs[gregs_idx];
89b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
90b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return addr;
91b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
92b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
93b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino# ifdef UNW_LOCAL_ONLY
94b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
95b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoHIDDEN void *
96b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinotdep_uc_addr (ucontext_t *uc, int reg)
97b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
98b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return uc_addr (uc, reg);
99b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
100b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
101b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino# endif	/* UNW_LOCAL_ONLY */
102b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
103b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoHIDDEN unw_dyn_info_list_t _U_dyn_info_list;
104b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
105b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
106b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic void
107b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoput_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
108b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
109b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /* it's a no-op */
110b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
111b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
112b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic int
113b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoget_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
114b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino			void *arg)
115b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
116b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
117b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return 0;
118b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
119b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
120b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic int
121b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoaccess_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
122b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	    void *arg)
123b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
124b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (write)
125b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
126b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "mem[%lx] <- %lx\n", addr, *val);
127b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *(unw_word_t *) addr = *val;
128b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
129b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else
130b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
131b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *val = *(unw_word_t *) addr;
132b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "mem[%lx] -> %lx\n", addr, *val);
133b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
134b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return 0;
135b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
136b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
137b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic int
138b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoaccess_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
139b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	    int write, void *arg)
140b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
141b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_word_t *addr;
142b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  ucontext_t *uc = arg;
143b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
144b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if ((unsigned int) (reg - UNW_PPC64_F0) < 32)
145b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
146b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if ((unsigned int) (reg - UNW_PPC64_V0) < 32)
147b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
148b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
149b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  addr = uc_addr (uc, reg);
150b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (!addr)
151b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
152b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
153b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (write)
154b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
155b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *(unw_word_t *) addr = *val;
156b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
157b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
158b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else
159b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
160b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *val = *(unw_word_t *) addr;
161b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "%s -> %lx\n", unw_regname (reg), *val);
162b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
163b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return 0;
164b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
165b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinobadreg:
166b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  Debug (1, "bad register number %u\n", reg);
167b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return -UNW_EBADREG;
168b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
169b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
170b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic int
171b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoaccess_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
172b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino	      int write, void *arg)
173b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
174b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  ucontext_t *uc = arg;
175b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_fpreg_t *addr;
176b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
177b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if ((unsigned) (reg - UNW_PPC64_F0) < 0)
178b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
179b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
180b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if ((unsigned) (reg - UNW_PPC64_V0) >= 32)
181b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
182b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
183b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
184b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  addr = uc_addr (uc, reg);
185b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (!addr)
186b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    goto badreg;
187b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
188b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  if (write)
189b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
190b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "%s <- %016Lf\n", unw_regname (reg), *val);
191b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *(unw_fpreg_t *) addr = *val;
192b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
193b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  else
194b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    {
195b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      *val = *(unw_fpreg_t *) addr;
196b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino      Debug (12, "%s -> %016Lf\n", unw_regname (reg), *val);
197b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino    }
198b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return 0;
199b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
200b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinobadreg:
201b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  Debug (1, "bad register number %u\n", reg);
202b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  /* attempt to access a non-preserved register */
203b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return -UNW_EBADREG;
204b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
205b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
206b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinostatic int
207b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoget_static_proc_name (unw_addr_space_t as, unw_word_t ip,
208b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		      char *buf, size_t buf_len, unw_word_t *offp,
209b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino		      void *arg)
210b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
211b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  return _Uelf64_get_proc_name (getpid (), ip, buf, buf_len, offp);
212b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
213b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
214b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar PaulinoHIDDEN void
215b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulinoppc64_local_addr_space_init (void)
216b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino{
217b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  memset (&local_addr_space, 0, sizeof (local_addr_space));
218b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
219b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
220b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.put_unwind_info = put_unwind_info;
221b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
222b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.access_mem = access_mem;
223b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.access_reg = access_reg;
224b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.access_fpreg = access_fpreg;
225b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.resume = ppc64_local_resume;
226b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  local_addr_space.acc.get_proc_name = get_static_proc_name;
227b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino  unw_flush_cache (&local_addr_space, 0, 0);
228b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino}
229b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino
230b33021e4b2f3a92141c01eb24b98bc51a97c498dJose Flavio Aguilar Paulino#endif /* !UNW_REMOTE_ONLY */
231