1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
#ifndef ION_DEBUGGER_DEF
#define ION_DEBUGGER_DEF
#define BACKTRACE_SIZE 10
/* #include <linux/mutex.h> */
typedef enum {
ION_FUNCTION_OPEN,
ION_FUNCTION_CLOSE,
ION_FUNCTION_CREATE_CLIENT,
ION_FUNCTION_DESTROY_CLIENT,
ION_FUNCTION_ALLOC,
ION_FUNCTION_ALLOC_MM,
ION_FUNCTION_ALLOC_CONT,
ION_FUNCTION_FREE,
ION_FUNCTION_IMPORT,
ION_FUNCTION_MMAP,
ION_FUNCTION_MUNMAP,
ION_FUNCTION_SHARE,
ION_FUNCTION_SHARE_CLOSE,
ION_FUNCTION_CHECK_ENABLE
} ION_FUNCTION_TYPE;
typedef enum {
BUFFER_ALLOCATION_LIST,
BUFFER_FREE_LIST,
ADDRESS_ALLOCATION_LIST,
ADDRESS_FREE_LIST,
FD_ALLOCATION_LIST,
FD_FREE_LIST
} ION_DEBUGGER_LIST_TYPE;
typedef enum {
ADDRESS_USER_VIRTUAL,
ADDRESS_KERNEL_VIRTUAL,
ADDRESS_KERNEL_PHYSICAL,
ADDRESS_MAX
} ION_MAPPING_ADDRESS_TYPE;
typedef enum {
RECORD_ID,
RECORD_CLIENT,
RECORD_HANDLE,
RECORD_ALLOCATE_BACKTRACE_NUM,
RECORD_FREED_BACKTRACE_NUM,
RECORD_ALLOCATE_MAPPING_NUM,
RECORD_FREED_MAPPING_NUM,
RECORD_FD,
RECORD_ADDRESS,
RECORD_SIZE,
RECORD_NEXT
} ION_DEBUGGDER_RECORD_DATA;
typedef enum {
SEARCH_PID,
SEARCH_PID_CLIENT,
SEARCH_PROCESS_PID,
SEARCH_BUFFER,
SEARCH_FD_GPID,
SEARCH_FILE,
SEARCH_MAX
} ION_SEARCH_METHOD;
typedef enum {
LIST_BUFFER,
LIST_PROCESS,
NODE_BUFFER,
NODE_FD,
NODE_CLIENT,
NODE_MMAP,
NODE_MAX
} ION_RECORD_TYPE;
typedef enum {
HASH_NODE_CLIENT,
HASH_NODE_HANDLE,
HASH_NODE_BUFFER,
HASH_NODE_USER_BACKTRACE,
HASH_NODE_KERNEL_BACKTRACE,
HASH_NODE_USER_MAPPING,
HASH_NODE_KERNEL_SYMBOL,
HASH_NODE_MAX
} ION_HASH_NODE_TYPE;
typedef enum {
ALLOCATE_BACKTRACE_INFO,
RELEASE_BACKTRACE_INFO,
KERNEL_BACKTRACE,
USER_BACKTRACE,
BACKTRACE_MAX
} BACKTRACE_INFO;
struct mapping {
char *name;
unsigned int address;
unsigned int size;
};
typedef struct ion_sys_record_param {
pid_t group_id;
pid_t pid;
unsigned int action;
unsigned int address_type;
unsigned int address;
unsigned int length;
unsigned int backtrace[BACKTRACE_SIZE];
unsigned int kernel_symbol[BACKTRACE_SIZE];
struct mapping mapping_record[BACKTRACE_SIZE];
unsigned int backtrace_num;
struct ion_handle *handle;
struct ion_client *client;
struct ion_buffer *buffer;
struct file *file;
int fd;
} ion_sys_record_t;
typedef struct ion_record_ID {
pid_t pid;
pid_t group_pid;
unsigned int client_address;
struct ion_client *client;
union {
struct ion_buffer_record *buffer;
struct ion_process_record *process_record;
};
} ion_record_ID_t;
typedef struct ion_record_basic_info {
struct ion_record_ID recordID;
unsigned int record_type;
unsigned int from_kernel;
unsigned int allocate_backtrace_type;
unsigned int *allocate_backtrace;
unsigned int *allocate_map;
unsigned int release_backtrace_type;
unsigned int *release_backtrace;
unsigned int *release_map;
} ion_record_basic_info_t;
typedef struct ion_buffer_usage_record {
struct ion_buffer_usage_record *next;
struct ion_record_basic_info tracking_info;
struct ion_handle *handle;
int fd;
struct file *file;
unsigned int function_type;
} ion_buffer_usage_record_t;
typedef struct ion_address_usage_record {
struct ion_address_usage_record *next;
struct ion_record_basic_info tracking_info;
unsigned int address_type;
unsigned int mapping_address;
unsigned int size;
int fd;
struct ion_buffer *buffer;
} ion_address_usage_record_t;
typedef struct ion_fd_usage_record {
struct ion_fd_usage_record *next;
struct ion_record_basic_info tracking_info;
int fd;
struct ion_handle *handle;
struct ion_buffer *buffer;
struct file *file;
} ion_fd_usage_record_t;
typedef struct ion_client_usage_record {
struct ion_client_usage_recrod *next;
struct ion_record_basic_info tracking_info;
int fd;
} ion_client_usage_record_t;
#if 0
struct ion_buffer_record {
struct ion_buffer_record *next;
struct ion_buffer *buffer;
unsigned int heap_type;
union {
void *priv_virt;
unsigned long priv_phys;
};
struct ion_buffer_usage_record *buffer_using_list;
struct ion_buffer_usage_record *buffer_freed_list;
struct mutex ion_buffer_usage_mutex;
struct ion_address_usage_record *address_using_list;
struct ion_address_usage_record *address_freed_list;
struct mutex ion_address_usage_mutex;
struct ion_fd_usage_record *fd_using_list;
struct ion_fd_usage_record *fd_freed_list;
struct mutex ion_fd_usage_mutex;
};
extern void *ion_get_list(struct ion_buffer_record *buffer, unsigned int list_type);
extern struct ion_buffer_usage_record *ion_get_inuse_buffer_record();
extern struct ion_buffer_usage_record *ion_get_freed_buffer_record();
extern unsigned int ion_get_data_from_record(void *record, unsigned int data_type);
#endif
#endif
|