Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
backtrace.h
Go to the documentation of this file.
1 /*
2  * Copyright 2010 Tilera Corporation. All Rights Reserved.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation, version 2.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11  * NON INFRINGEMENT. See the GNU General Public License for
12  * more details.
13  */
14 
15 #ifndef _ASM_TILE_BACKTRACE_H
16 #define _ASM_TILE_BACKTRACE_H
17 
18 #include <linux/types.h>
19 
20 /* Reads 'size' bytes from 'address' and writes the data to 'result'.
21  * Returns true if successful, else false (e.g. memory not readable).
22  */
24  unsigned long address,
25  unsigned int size,
26  void *extra);
27 
28 typedef struct {
29  /* Current PC. */
30  unsigned long pc;
31 
32  /* Current stack pointer value. */
33  unsigned long sp;
34 
35  /* Current frame pointer value (i.e. caller's stack pointer) */
36  unsigned long fp;
37 
38  /* Internal use only: caller's PC for first frame. */
39  unsigned long initial_frame_caller_pc;
40 
41  /* Internal use only: callback to read memory. */
43 
44  /* Internal use only: arbitrary argument to read_memory_func. */
46 
48 
49 
50 typedef enum {
51 
52  /* We have no idea what the caller's pc is. */
54 
55  /* The caller's pc is currently in lr. */
57 
58  /* The caller's pc can be found by dereferencing the caller's sp. */
60 
62 
63 
64 typedef enum {
65 
66  /* We have no idea what the caller's sp is. */
68 
69  /* The caller's sp is currently in r52. */
71 
72  /* The caller's sp can be found by adding a certain constant
73  * to the current value of sp.
74  */
76 
78 
79 
80 /* Bit values ORed into CALLER_* values for info ops. */
81 enum {
82  /* Setting the low bit on any of these values means the info op
83  * applies only to one bundle ago.
84  */
86 
87  /* Setting this bit on a CALLER_SP_* value means the PC is in LR.
88  * If not set, PC is on the stack.
89  */
91 
92  /* This many of the low bits of a CALLER_SP_* value are for the
93  * flag bits above.
94  */
96 
97  /* We cannot have one in the memory pipe so this is the maximum. */
99 };
100 
101 
102 /* Internal constants used to define 'info' operands. */
103 enum {
104  /* 0 and 1 are reserved, as are all negative numbers. */
105 
107 
109 
111 };
112 
113 
114 /* Current backtracer state describing where it thinks the caller is. */
115 typedef struct {
116  /*
117  * Public fields
118  */
119 
120  /* How do we find the caller's PC? */
121  CallerPCLocation pc_location : 8;
122 
123  /* How do we find the caller's SP? */
124  CallerSPLocation sp_location : 8;
125 
126  /* If sp_location == SP_LOC_OFFSET, then caller_sp == sp +
127  * loc->sp_offset. Else this field is undefined.
128  */
130 
131  /* In the most recently visited bundle a terminating bundle? */
133 
134  /*
135  * Private fields
136  */
137 
138  /* Will the forward scanner see someone clobbering sp
139  * (i.e. changing it with something other than addi sp, sp, N?)
140  */
142 
143  /* Operand to next "visible" info op (no more than one bundle past
144  * the next terminating bundle), or -32768 if none.
145  */
147 
148  /* Is the info of in next_info_op in the very next bundle? */
150 
152 
154  BacktraceMemoryReader read_memory_func,
155  void *read_memory_func_extra,
156  unsigned long pc, unsigned long lr,
157  unsigned long sp, unsigned long r52);
158 
159 
161 
162 #endif /* _ASM_TILE_BACKTRACE_H */