1cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm/* libunwind - a platform-independent unwind library
2cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm   Copyright (C) 2004 Hewlett-Packard Co
3cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
5cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmThis file is part of libunwind.
6cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
7cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
8cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidma copy of this software and associated documentation files (the
9cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm"Software"), to deal in the Software without restriction, including
10cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
11cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
12cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
13cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmthe following conditions:
14cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
15cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmThe above copyright notice and this permission notice shall be
16cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmincluded in all copies or substantial portions of the Software.
17cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
18cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
26cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm#include "unwind_i.h"
27cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
28cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmPROTECTED int
29cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidmunw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
30cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm{
31cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  struct cursor *c = (struct cursor *) cursor;
32cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  dwarf_loc_t loc;
33cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
34cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  loc = DWARF_NULL_LOC;		/* default to "not saved" */
35cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
36cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  switch (reg)
37cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    {
38cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EIP: loc = c->dwarf.loc[EIP]; break;
39cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_CFA: break;
40cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EAX: loc = c->dwarf.loc[EAX]; break;
41cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ECX: loc = c->dwarf.loc[ECX]; break;
42cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EDX: loc = c->dwarf.loc[EDX]; break;
43cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EBX: loc = c->dwarf.loc[EBX]; break;
44cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ESP: loc = c->dwarf.loc[ESP]; break;
45cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EBP: loc = c->dwarf.loc[EBP]; break;
46cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ESI: loc = c->dwarf.loc[ESI]; break;
47cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EDI: loc = c->dwarf.loc[EDI]; break;
48cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_EFLAGS: loc = c->dwarf.loc[EFLAGS]; break;
49cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_TRAPNO: loc = c->dwarf.loc[TRAPNO]; break;
50cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST0: loc = c->dwarf.loc[ST0]; break;
51cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
52cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FCW:
53cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FSW:
54cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FTW:
55cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FOP:
56cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FCS:
57cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FIP:
58cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FEA:
59cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FDS:
60cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_MXCSR:
61cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_GS:
62cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_FS:
63cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ES:
64cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_DS:
65cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_SS:
66cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_CS:
67cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_TSS:
68cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_LDT:
69cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      loc = x86_scratch_loc (c, reg);
70cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      break;
71cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
72cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      /* stacked fp registers */
73cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST1:
74cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST2:
75cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST3:
76cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST4:
77cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST5:
78cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST6:
79cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_ST7:
80cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      /* SSE fp registers */
81cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM0_lo:
82cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM0_hi:
83cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM1_lo:
84cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM1_hi:
85cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM2_lo:
86cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM2_hi:
87cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM3_lo:
88cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM3_hi:
89cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM4_lo:
90cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM4_hi:
91cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM5_lo:
92cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM5_hi:
93cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM6_lo:
94cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM6_hi:
95cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM7_lo:
96cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    case UNW_X86_XMM7_hi:
97a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM0:
98a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM1:
99a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM2:
100a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM3:
101a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM4:
102a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM5:
103a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM6:
104a8be10e2518fe41fbbfc7cd277a170c5f8ab5b39David Mosberger-Tang    case UNW_X86_XMM7:
105cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      loc = x86_scratch_loc (c, reg);
106cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      break;
107cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
108cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    default:
109cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      break;
110cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    }
111cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
112f89fb17695e8137a5f4e23570bf9f53374186c96Arun  memset (sloc, 0, sizeof (*sloc));
113cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
114cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  if (DWARF_IS_NULL_LOC (loc))
115cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    {
116cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      sloc->type = UNW_SLT_NONE;
117cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      return 0;
118cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    }
119cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm
120cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm#if !defined(UNW_LOCAL_ONLY)
121cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  if (DWARF_IS_REG_LOC (loc))
122cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    {
123cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      sloc->type = UNW_SLT_REG;
124cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      sloc->u.regnum = DWARF_GET_LOC (loc);
125cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    }
126cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  else
127cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm#endif
128cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    {
129cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      sloc->type = UNW_SLT_MEMORY;
130cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm      sloc->u.addr = DWARF_GET_LOC (loc);
131cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm    }
132cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm  return 0;
133cf0945223e63918f20af7d5079d9e11cc1c7e0behomeip.net!davidm}
134