Merge lp:~dannf/ubuntu/trusty/crash/lp1354349 into lp:ubuntu/trusty/crash
- Trusty (14.04)
- lp1354349
- Merge into trusty
Proposed by
dann frazier
Status: | Merged |
---|---|
Merge reported by: | Colin Watson |
Merged at revision: | not available |
Proposed branch: | lp:~dannf/ubuntu/trusty/crash/lp1354349 |
Merge into: | lp:ubuntu/trusty/crash |
Diff against target: |
7868 lines (+7650/-59) 9 files modified
.pc/.version (+1/-0) .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/arm64.c (+1351/-0) .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/defs.h (+5946/-0) .pc/applied-patches (+1/-0) arm64.c (+57/-47) debian/changelog (+7/-0) debian/patches/Updated-the-ARM64-implementation-to-support-Linux-3..patch (+265/-0) debian/patches/series (+1/-0) defs.h (+21/-12) |
To merge this branch: | bzr merge lp:~dannf/ubuntu/trusty/crash/lp1354349 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu branches | Pending | ||
Review via email: mp+233948@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added directory '.pc' |
2 | === added file '.pc/.version' |
3 | --- .pc/.version 1970-01-01 00:00:00 +0000 |
4 | +++ .pc/.version 2014-09-09 15:21:10 +0000 |
5 | @@ -0,0 +1,1 @@ |
6 | +2 |
7 | |
8 | === added directory '.pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch' |
9 | === added file '.pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/arm64.c' |
10 | --- .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/arm64.c 1970-01-01 00:00:00 +0000 |
11 | +++ .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/arm64.c 2014-09-09 15:21:10 +0000 |
12 | @@ -0,0 +1,1351 @@ |
13 | +/* |
14 | + * arm64.c - core analysis suite |
15 | + * |
16 | + * Copyright (C) 2012,2013 David Anderson |
17 | + * Copyright (C) 2012,2013 Red Hat, Inc. All rights reserved. |
18 | + * |
19 | + * This program is free software; you can redistribute it and/or modify |
20 | + * it under the terms of the GNU General Public License as published by |
21 | + * the Free Software Foundation; either version 2 of the License, or |
22 | + * (at your option) any later version. |
23 | + * |
24 | + * This program is distributed in the hope that it will be useful, |
25 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
26 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
27 | + * GNU General Public License for more details. |
28 | + */ |
29 | + |
30 | +#ifdef ARM64 |
31 | + |
32 | +#include "defs.h" |
33 | +#include <elf.h> |
34 | + |
35 | +#define NOT_IMPLEMENTED(X) error((X), "%s: function not implemented\n", __func__) |
36 | + |
37 | +static struct machine_specific arm64_machine_specific = { 0 }; |
38 | +static int arm64_verify_symbol(const char *, ulong, char); |
39 | +static void arm64_parse_cmdline_args(void); |
40 | +static void arm64_calc_phys_offset(void); |
41 | +static int arm64_kdump_phys_base(ulong *); |
42 | +static ulong arm64_processor_speed(void); |
43 | +static void arm64_init_kernel_pgd(void); |
44 | +static int arm64_kvtop(struct task_context *, ulong, physaddr_t *, int); |
45 | +static int arm64_uvtop(struct task_context *, ulong, physaddr_t *, int); |
46 | +static int arm64_vtop_2level_64k(ulong, ulong, physaddr_t *, int); |
47 | +static int arm64_vtop_3level_4k(ulong, ulong, physaddr_t *, int); |
48 | +static ulong arm64_get_task_pgd(ulong); |
49 | +static void arm64_stackframe_init(void); |
50 | +static int arm64_eframe_search(struct bt_info *); |
51 | +static int arm64_in_exception_text(ulong); |
52 | +static void arm64_back_trace_cmd(struct bt_info *); |
53 | +static void arm64_print_stackframe_entry(struct bt_info *, int, struct arm64_stackframe *); |
54 | +static int arm64_unwind_frame(struct bt_info *, struct arm64_stackframe *); |
55 | +static int arm64_get_dumpfile_stackframe(struct bt_info *, struct arm64_stackframe *); |
56 | +static int arm64_get_stackframe(struct bt_info *, struct arm64_stackframe *); |
57 | +static void arm64_get_stack_frame(struct bt_info *, ulong *, ulong *); |
58 | +static int arm64_translate_pte(ulong, void *, ulonglong); |
59 | +static ulong arm64_vmalloc_start(void); |
60 | +static int arm64_is_task_addr(ulong); |
61 | +static int arm64_dis_filter(ulong, char *, unsigned int); |
62 | +static void arm64_cmd_mach(void); |
63 | +static void arm64_display_machine_stats(void); |
64 | +static int arm64_get_smp_cpus(void); |
65 | +static void arm64_clear_machdep_cache(void); |
66 | +static int arm64_in_alternate_stack(int, ulong); |
67 | +static int arm64_get_kvaddr_ranges(struct vaddr_range *); |
68 | +static int arm64_get_crash_notes(void); |
69 | + |
70 | +/* |
71 | + * Do all necessary machine-specific setup here. This is called several times |
72 | + * during initialization. |
73 | + */ |
74 | +void |
75 | +arm64_init(int when) |
76 | +{ |
77 | + ulong value; |
78 | + |
79 | +#if defined(__x86_64__) |
80 | + if (ACTIVE()) |
81 | + error(FATAL, "compiled for the ARM64 architecture\n"); |
82 | +#endif |
83 | + |
84 | + switch (when) { |
85 | + case PRE_SYMTAB: |
86 | + machdep->machspec = &arm64_machine_specific; |
87 | + machdep->process_elf_notes = process_elf64_notes; |
88 | + if (pc->flags & KERNEL_DEBUG_QUERY) |
89 | + return; |
90 | + machdep->verify_paddr = generic_verify_paddr; |
91 | + machdep->verify_symbol = arm64_verify_symbol; |
92 | + if (machdep->cmdline_args[0]) |
93 | + arm64_parse_cmdline_args(); |
94 | + break; |
95 | + |
96 | + case PRE_GDB: |
97 | + if (kernel_symbol_exists("swapper_pg_dir") && |
98 | + kernel_symbol_exists("idmap_pg_dir")) { |
99 | + value = symbol_value("swapper_pg_dir") - |
100 | + symbol_value("idmap_pg_dir"); |
101 | + machdep->pagesize = value / 2; |
102 | + } else |
103 | + machdep->pagesize = memory_page_size(); /* host */ |
104 | + machdep->pageshift = ffs(machdep->pagesize) - 1; |
105 | + machdep->pageoffset = machdep->pagesize - 1; |
106 | + machdep->pagemask = ~((ulonglong)machdep->pageoffset); |
107 | + switch (machdep->pagesize) |
108 | + { |
109 | + case 4096: |
110 | + machdep->flags |= VM_L3_4K; |
111 | + machdep->ptrs_per_pgd = PTRS_PER_PGD_L3_4K; |
112 | + if ((machdep->pgd = |
113 | + (char *)malloc(PTRS_PER_PGD_L3_4K * 8)) == NULL) |
114 | + error(FATAL, "cannot malloc pgd space."); |
115 | + if ((machdep->pmd = |
116 | + (char *)malloc(PTRS_PER_PMD_L3_4K * 8)) == NULL) |
117 | + error(FATAL, "cannot malloc pmd space."); |
118 | + if ((machdep->ptbl = |
119 | + (char *)malloc(PTRS_PER_PTE_L3_4K * 8)) == NULL) |
120 | + error(FATAL, "cannot malloc ptbl space."); |
121 | + machdep->pud = NULL; /* not used */ |
122 | + break; |
123 | + |
124 | + case 65536: |
125 | + machdep->flags |= VM_L2_64K; |
126 | + machdep->ptrs_per_pgd = PTRS_PER_PGD_L2_64K; |
127 | + if ((machdep->pgd = |
128 | + (char *)malloc(PTRS_PER_PGD_L2_64K * 8)) == NULL) |
129 | + error(FATAL, "cannot malloc pgd space."); |
130 | + if ((machdep->ptbl = |
131 | + (char *)malloc(PTRS_PER_PTE_L2_64K * 8)) == NULL) |
132 | + error(FATAL, "cannot malloc ptbl space."); |
133 | + machdep->pmd = NULL; /* not used */ |
134 | + machdep->pud = NULL; /* not used */ |
135 | + break; |
136 | + |
137 | + default: |
138 | + error(FATAL, "invalid/unknown page size: %d\n", |
139 | + machdep->pagesize); |
140 | + } |
141 | + machdep->last_pud_read = 0; /* not used */ |
142 | + machdep->last_pgd_read = 0; |
143 | + machdep->last_pmd_read = 0; |
144 | + machdep->last_ptbl_read = 0; |
145 | + machdep->clear_machdep_cache = arm64_clear_machdep_cache; |
146 | + |
147 | + machdep->stacksize = ARM64_STACK_SIZE; |
148 | + machdep->machspec->userspace_top = ARM64_USERSPACE_TOP; |
149 | + machdep->machspec->page_offset = ARM64_PAGE_OFFSET; |
150 | + machdep->machspec->vmalloc_start_addr = ARM64_VMALLOC_START; |
151 | + machdep->machspec->vmalloc_end = ARM64_VMALLOC_END; |
152 | + machdep->machspec->vmemmap_vaddr = ARM64_VMEMMAP_VADDR; |
153 | + machdep->machspec->vmemmap_end = ARM64_VMEMMAP_END; |
154 | + machdep->machspec->modules_vaddr = ARM64_MODULES_VADDR; |
155 | + machdep->machspec->modules_end = ARM64_MODULES_END; |
156 | + |
157 | + machdep->kvbase = ARM64_VMALLOC_START; |
158 | + machdep->identity_map_base = ARM64_PAGE_OFFSET; |
159 | + |
160 | + arm64_calc_phys_offset(); |
161 | + |
162 | + machdep->uvtop = arm64_uvtop; |
163 | + machdep->kvtop = arm64_kvtop; |
164 | + machdep->is_kvaddr = generic_is_kvaddr; |
165 | + machdep->is_uvaddr = generic_is_uvaddr; |
166 | + machdep->eframe_search = arm64_eframe_search; |
167 | + machdep->back_trace = arm64_back_trace_cmd; |
168 | + machdep->in_alternate_stack = arm64_in_alternate_stack; |
169 | + machdep->processor_speed = arm64_processor_speed; |
170 | + machdep->get_task_pgd = arm64_get_task_pgd; |
171 | + machdep->get_stack_frame = arm64_get_stack_frame; |
172 | + machdep->get_stackbase = generic_get_stackbase; |
173 | + machdep->get_stacktop = generic_get_stacktop; |
174 | + machdep->translate_pte = arm64_translate_pte; |
175 | + machdep->memory_size = generic_memory_size; |
176 | + machdep->vmalloc_start = arm64_vmalloc_start; |
177 | + machdep->get_kvaddr_ranges = arm64_get_kvaddr_ranges; |
178 | + machdep->is_task_addr = arm64_is_task_addr; |
179 | + machdep->dis_filter = arm64_dis_filter; |
180 | + machdep->cmd_mach = arm64_cmd_mach; |
181 | + machdep->get_smp_cpus = arm64_get_smp_cpus; |
182 | + machdep->line_number_hooks = NULL; |
183 | + machdep->value_to_symbol = generic_machdep_value_to_symbol; |
184 | + machdep->dump_irq = generic_dump_irq; |
185 | + machdep->show_interrupts = generic_show_interrupts; |
186 | + machdep->get_irq_affinity = generic_get_irq_affinity; |
187 | + machdep->dumpfile_init = NULL; |
188 | + machdep->verify_line_number = NULL; |
189 | + machdep->init_kernel_pgd = arm64_init_kernel_pgd; |
190 | + break; |
191 | + |
192 | + case POST_GDB: |
193 | + machdep->section_size_bits = _SECTION_SIZE_BITS; |
194 | + machdep->max_physmem_bits = _MAX_PHYSMEM_BITS; |
195 | + if (THIS_KERNEL_VERSION >= LINUX(3,10,0)) { |
196 | + machdep->machspec->pte_protnone = PTE_PROT_NONE_3_10; |
197 | + machdep->machspec->pte_file = PTE_FILE_3_10; |
198 | + } else { |
199 | + machdep->machspec->pte_protnone = PTE_PROT_NONE; |
200 | + machdep->machspec->pte_file = PTE_FILE; |
201 | + } |
202 | + |
203 | + if (symbol_exists("irq_desc")) |
204 | + ARRAY_LENGTH_INIT(machdep->nr_irqs, irq_desc, |
205 | + "irq_desc", NULL, 0); |
206 | + else if (kernel_symbol_exists("nr_irqs")) |
207 | + get_symbol_data("nr_irqs", sizeof(unsigned int), |
208 | + &machdep->nr_irqs); |
209 | + |
210 | + if (!machdep->hz) |
211 | + machdep->hz = 100; |
212 | + |
213 | + arm64_stackframe_init(); |
214 | + break; |
215 | + |
216 | + case POST_VM: |
217 | + /* |
218 | + * crash_notes contains machine specific information about the |
219 | + * crash. In particular, it contains CPU registers at the time |
220 | + * of the crash. We need this information to extract correct |
221 | + * backtraces from the panic task. |
222 | + */ |
223 | + if (!ACTIVE() && !arm64_get_crash_notes()) |
224 | + error(WARNING, "could not retrieve crash_notes\n"); |
225 | + |
226 | + break; |
227 | + |
228 | + case LOG_ONLY: |
229 | + machdep->machspec = &arm64_machine_specific; |
230 | + machdep->identity_map_base = ARM64_PAGE_OFFSET; |
231 | + arm64_calc_phys_offset(); |
232 | + break; |
233 | + } |
234 | +} |
235 | + |
236 | +/* |
237 | + * Accept or reject a symbol from the kernel namelist. |
238 | + */ |
239 | +static int |
240 | +arm64_verify_symbol(const char *name, ulong value, char type) |
241 | +{ |
242 | +// if (STREQ(name, "swapper_pg_dir")) |
243 | +// machdep->flags |= KSYMS_START; |
244 | +// |
245 | +// if (!name || !strlen(name) || !(machdep->flags & KSYMS_START)) |
246 | +// return FALSE; |
247 | +// |
248 | +// if (STREQ(name, "$a") || STREQ(name, "$n") || STREQ(name, "$d")) |
249 | +// return FALSE; |
250 | +// |
251 | +// if (STREQ(name, "PRRR") || STREQ(name, "NMRR")) |
252 | +// return FALSE; |
253 | +// |
254 | +// if ((type == 'A') && STRNEQ(name, "__crc_")) |
255 | +// return FALSE; |
256 | +// |
257 | +// if (CRASHDEBUG(8) && name && strlen(name)) |
258 | +// fprintf(fp, "%08lx %s\n", value, name); |
259 | +// |
260 | + NOT_IMPLEMENTED(WARNING); |
261 | + return TRUE; |
262 | +} |
263 | + |
264 | + |
265 | +void |
266 | +arm64_dump_machdep_table(ulong arg) |
267 | +{ |
268 | + const struct machine_specific *ms; |
269 | + int others, i; |
270 | + |
271 | + others = 0; |
272 | + fprintf(fp, " flags: %lx (", machdep->flags); |
273 | + if (machdep->flags & KSYMS_START) |
274 | + fprintf(fp, "%sKSYMS_START", others++ ? "|" : ""); |
275 | + if (machdep->flags & PHYS_OFFSET) |
276 | + fprintf(fp, "%sPHYS_OFFSET", others++ ? "|" : ""); |
277 | + if (machdep->flags & VM_L2_64K) |
278 | + fprintf(fp, "%sVM_L2_64K", others++ ? "|" : ""); |
279 | + if (machdep->flags & VM_L3_4K) |
280 | + fprintf(fp, "%sVM_L3_4K", others++ ? "|" : ""); |
281 | + fprintf(fp, ")\n"); |
282 | + |
283 | + fprintf(fp, " kvbase: %lx\n", machdep->kvbase); |
284 | + fprintf(fp, " identity_map_base: %lx\n", machdep->kvbase); |
285 | + fprintf(fp, " pagesize: %d\n", machdep->pagesize); |
286 | + fprintf(fp, " pageshift: %d\n", machdep->pageshift); |
287 | + fprintf(fp, " pagemask: %lx\n", (ulong)machdep->pagemask); |
288 | + fprintf(fp, " pageoffset: %lx\n", machdep->pageoffset); |
289 | + fprintf(fp, " stacksize: %ld\n", machdep->stacksize); |
290 | + fprintf(fp, " hz: %d\n", machdep->hz); |
291 | + fprintf(fp, " mhz: %ld\n", machdep->mhz); |
292 | + fprintf(fp, " memsize: %lld (0x%llx)\n", |
293 | + (ulonglong)machdep->memsize, (ulonglong)machdep->memsize); |
294 | + fprintf(fp, " bits: %d\n", machdep->bits); |
295 | + fprintf(fp, " nr_irqs: %d\n", machdep->nr_irqs); |
296 | + fprintf(fp, " eframe_search: arm64_eframe_search()\n"); |
297 | + fprintf(fp, " back_trace: arm64_back_trace_cmd()\n"); |
298 | + fprintf(fp, " in_alternate_stack: arm64_in_alternate_stack()\n"); |
299 | + fprintf(fp, " processor_speed: arm64_processor_speed()\n"); |
300 | + fprintf(fp, " uvtop: arm64_uvtop()->%s()\n", |
301 | + machdep->flags & VM_L3_4K ? |
302 | + "arm64_vtop_3level_4k" : "arm64_vtop_2level_64k"); |
303 | + fprintf(fp, " kvtop: arm64_kvtop()->%s()\n", |
304 | + machdep->flags & VM_L3_4K ? |
305 | + "arm64_vtop_3level_4k" : "arm64_vtop_2level_64k"); |
306 | + fprintf(fp, " get_task_pgd: arm64_get_task_pgd()\n"); |
307 | + fprintf(fp, " dump_irq: generic_dump_irq()\n"); |
308 | + fprintf(fp, " get_stack_frame: arm64_get_stack_frame()\n"); |
309 | + fprintf(fp, " get_stackbase: generic_get_stackbase()\n"); |
310 | + fprintf(fp, " get_stacktop: generic_get_stacktop()\n"); |
311 | + fprintf(fp, " translate_pte: arm64_translate_pte()\n"); |
312 | + fprintf(fp, " memory_size: generic_memory_size()\n"); |
313 | + fprintf(fp, " vmalloc_start: arm64_vmalloc_start()\n"); |
314 | + fprintf(fp, " get_kvaddr_ranges: arm64_get_kvaddr_ranges()\n"); |
315 | + fprintf(fp, " is_task_addr: arm64_is_task_addr()\n"); |
316 | + fprintf(fp, " verify_symbol: arm64_verify_symbol()\n"); |
317 | + fprintf(fp, " dis_filter: arm64_dis_filter()\n"); |
318 | + fprintf(fp, " cmd_mach: arm64_cmd_mach()\n"); |
319 | + fprintf(fp, " get_smp_cpus: arm64_get_smp_cpus()\n"); |
320 | + fprintf(fp, " is_kvaddr: generic_is_kvaddr()\n"); |
321 | + fprintf(fp, " is_uvaddr: generic_is_uvaddr()\n"); |
322 | + fprintf(fp, " value_to_symbol: generic_machdep_value_to_symbol()\n"); |
323 | + fprintf(fp, " init_kernel_pgd: arm64_init_kernel_pgd\n"); |
324 | + fprintf(fp, " verify_paddr: generic_verify_paddr()\n"); |
325 | + fprintf(fp, " show_interrupts: generic_show_interrupts()\n"); |
326 | + fprintf(fp, " get_irq_affinity: generic_get_irq_affinity()\n"); |
327 | + fprintf(fp, " dumpfile_init: (not used)\n"); |
328 | + fprintf(fp, " process_elf_notes: process_elf64_notes()\n"); |
329 | + fprintf(fp, " verify_line_number: (not used)\n"); |
330 | + |
331 | + fprintf(fp, " xendump_p2m_create: (n/a)\n"); |
332 | + fprintf(fp, "xen_kdump_p2m_create: (n/a)\n"); |
333 | + fprintf(fp, " xendump_panic_task: (n/a)\n"); |
334 | + fprintf(fp, " get_xendump_regs: (n/a)\n"); |
335 | + fprintf(fp, " line_number_hooks: (not used)\n"); |
336 | + fprintf(fp, " last_pud_read: (not used)\n"); |
337 | + fprintf(fp, " last_pgd_read: %lx\n", machdep->last_pgd_read); |
338 | + fprintf(fp, " last_pmd_read: "); |
339 | + if (PAGESIZE() == 65536) |
340 | + fprintf(fp, "(not used)\n"); |
341 | + else |
342 | + fprintf(fp, "%lx\n", machdep->last_pmd_read); |
343 | + fprintf(fp, " last_ptbl_read: %lx\n", machdep->last_ptbl_read); |
344 | + fprintf(fp, " clear_machdep_cache: arm64_clear_machdep_cache()\n"); |
345 | + fprintf(fp, " pgd: %lx\n", (ulong)machdep->pgd); |
346 | + fprintf(fp, " pmd: %lx\n", (ulong)machdep->pmd); |
347 | + fprintf(fp, " ptbl: %lx\n", (ulong)machdep->ptbl); |
348 | + fprintf(fp, " ptrs_per_pgd: %d\n", machdep->ptrs_per_pgd); |
349 | + fprintf(fp, " section_size_bits: %ld\n", machdep->section_size_bits); |
350 | + fprintf(fp, " max_physmem_bits: %ld\n", machdep->max_physmem_bits); |
351 | + fprintf(fp, " sections_per_root: %ld\n", machdep->sections_per_root); |
352 | + |
353 | + for (i = 0; i < MAX_MACHDEP_ARGS; i++) { |
354 | + fprintf(fp, " cmdline_args[%d]: %s\n", |
355 | + i, machdep->cmdline_args[i] ? |
356 | + machdep->cmdline_args[i] : "(unused)"); |
357 | + } |
358 | + |
359 | + ms = machdep->machspec; |
360 | + |
361 | + fprintf(fp, " machspec: %lx\n", (ulong)ms); |
362 | + fprintf(fp, " userspace_top: %016lx\n", ms->userspace_top); |
363 | + fprintf(fp, " page_offset: %016lx\n", ms->page_offset); |
364 | + fprintf(fp, " vmalloc_start_addr: %016lx\n", ms->vmalloc_start_addr); |
365 | + fprintf(fp, " vmalloc_end: %016lx\n", ms->vmalloc_end); |
366 | + fprintf(fp, " modules_vaddr: %016lx\n", ms->modules_vaddr); |
367 | + fprintf(fp, " modules_end: %016lx\n", ms->modules_end); |
368 | + fprintf(fp, " vmemmap_vaddr: %016lx\n", ms->vmemmap_vaddr); |
369 | + fprintf(fp, " phys_offset: %lx\n", ms->phys_offset); |
370 | + fprintf(fp, "__exception_text_start: %lx\n", ms->__exception_text_start); |
371 | + fprintf(fp, " __exception_text_end: %lx\n", ms->__exception_text_end); |
372 | + fprintf(fp, " panic_task_regs: %lx\n", (ulong)ms->panic_task_regs); |
373 | + fprintf(fp, " pte_protnone: %lx\n", ms->pte_protnone); |
374 | + fprintf(fp, " pte_file: %lx\n", ms->pte_file); |
375 | +} |
376 | + |
377 | + |
378 | +/* |
379 | + * Parse machine dependent command line arguments. |
380 | + * |
381 | + * Force the phys_offset address via: |
382 | + * |
383 | + * --machdep phys_offset=<address> |
384 | + */ |
385 | +static void |
386 | +arm64_parse_cmdline_args(void) |
387 | +{ |
388 | + int index, i, c, err; |
389 | + char *arglist[MAXARGS]; |
390 | + char buf[BUFSIZE]; |
391 | + char *p; |
392 | + ulong value = 0; |
393 | + |
394 | + for (index = 0; index < MAX_MACHDEP_ARGS; index++) { |
395 | + if (!machdep->cmdline_args[index]) |
396 | + break; |
397 | + |
398 | + if (!strstr(machdep->cmdline_args[index], "=")) { |
399 | + error(WARNING, "ignoring --machdep option: %x\n", |
400 | + machdep->cmdline_args[index]); |
401 | + continue; |
402 | + } |
403 | + |
404 | + strcpy(buf, machdep->cmdline_args[index]); |
405 | + |
406 | + for (p = buf; *p; p++) { |
407 | + if (*p == ',') |
408 | + *p = ' '; |
409 | + } |
410 | + |
411 | + c = parse_line(buf, arglist); |
412 | + |
413 | + for (i = 0; i < c; i++) { |
414 | + err = 0; |
415 | + |
416 | + if (STRNEQ(arglist[i], "phys_offset=")) { |
417 | + int megabytes = FALSE; |
418 | + int flags = RETURN_ON_ERROR | QUIET; |
419 | + |
420 | + if ((LASTCHAR(arglist[i]) == 'm') || |
421 | + (LASTCHAR(arglist[i]) == 'M')) { |
422 | + LASTCHAR(arglist[i]) = NULLCHAR; |
423 | + megabytes = TRUE; |
424 | + } |
425 | + |
426 | + p = arglist[i] + strlen("phys_offset="); |
427 | + if (strlen(p)) { |
428 | + if (megabytes) |
429 | + value = dtol(p, flags, &err); |
430 | + else |
431 | + value = htol(p, flags, &err); |
432 | + } |
433 | + |
434 | + if (!err) { |
435 | + if (megabytes) |
436 | + value = MEGABYTES(value); |
437 | + |
438 | + machdep->machspec->phys_offset = value; |
439 | + |
440 | + error(NOTE, |
441 | + "setting phys_offset to: 0x%lx\n", |
442 | + machdep->machspec->phys_offset); |
443 | + |
444 | + machdep->flags |= PHYS_OFFSET; |
445 | + continue; |
446 | + } |
447 | + } |
448 | + |
449 | + error(WARNING, "ignoring --machdep option: %s\n", |
450 | + arglist[i]); |
451 | + } |
452 | + } |
453 | +} |
454 | + |
455 | + |
456 | +static void |
457 | +arm64_calc_phys_offset(void) |
458 | +{ |
459 | + struct machine_specific *ms = machdep->machspec; |
460 | + ulong phys_offset; |
461 | + |
462 | + if (machdep->flags & PHYS_OFFSET) /* --machdep override */ |
463 | + return; |
464 | + |
465 | + /* |
466 | + * Next determine suitable value for phys_offset. User can override this |
467 | + * by passing valid '--machdep phys_offset=<addr>' option. |
468 | + */ |
469 | + ms->phys_offset = 0; |
470 | + |
471 | + if (ACTIVE()) { |
472 | + char buf[BUFSIZE]; |
473 | + char *p1; |
474 | + int errflag; |
475 | + FILE *fp; |
476 | + |
477 | + if ((fp = fopen("/proc/iomem", "r")) == NULL) |
478 | + return; |
479 | + |
480 | + /* |
481 | + * Memory regions are sorted in ascending order. We take the |
482 | + * first region which should be correct for most uses. |
483 | + */ |
484 | + errflag = 1; |
485 | + while (fgets(buf, BUFSIZE, fp)) { |
486 | + if (strstr(buf, ": System RAM")) { |
487 | + clean_line(buf); |
488 | + errflag = 0; |
489 | + break; |
490 | + } |
491 | + } |
492 | + fclose(fp); |
493 | + |
494 | + if (errflag) |
495 | + return; |
496 | + |
497 | + if (!(p1 = strstr(buf, "-"))) |
498 | + return; |
499 | + |
500 | + *p1 = NULLCHAR; |
501 | + |
502 | + phys_offset = htol(buf, RETURN_ON_ERROR | QUIET, &errflag); |
503 | + if (errflag) |
504 | + return; |
505 | + |
506 | + ms->phys_offset = phys_offset; |
507 | + } else if (DISKDUMP_DUMPFILE() && diskdump_phys_base(&phys_offset)) { |
508 | + ms->phys_offset = phys_offset; |
509 | + } else if (KDUMP_DUMPFILE() && arm64_kdump_phys_base(&phys_offset)) { |
510 | + ms->phys_offset = phys_offset; |
511 | + } else { |
512 | + error(WARNING, |
513 | + "phys_offset cannot be determined from the dumpfile.\n"); |
514 | + error(CONT, |
515 | + "Using default value of 0. If this is not correct, then try\n"); |
516 | + error(CONT, |
517 | + "using the command line option: --machdep phys_offset=<addr>\n"); |
518 | + } |
519 | + |
520 | + if (CRASHDEBUG(1)) |
521 | + fprintf(fp, "using %lx as phys_offset\n", ms->phys_offset); |
522 | +} |
523 | + |
524 | + |
525 | +/* |
526 | + * Borrow the 32-bit ARM functionality. |
527 | + */ |
528 | +static int |
529 | +arm64_kdump_phys_base(ulong *phys_offset) |
530 | +{ |
531 | + return arm_kdump_phys_base(phys_offset); |
532 | +} |
533 | + |
534 | +static void |
535 | +arm64_init_kernel_pgd(void) |
536 | +{ |
537 | + int i; |
538 | + ulong value; |
539 | + |
540 | + if (!kernel_symbol_exists("init_mm") || |
541 | + !readmem(symbol_value("init_mm") + OFFSET(mm_struct_pgd), KVADDR, |
542 | + &value, sizeof(void *), "init_mm.pgd", RETURN_ON_ERROR)) { |
543 | + if (kernel_symbol_exists("swapper_pg_dir")) |
544 | + value = symbol_value("swapper_pg_dir"); |
545 | + else { |
546 | + error(WARNING, "cannot determine kernel pgd location\n"); |
547 | + return; |
548 | + } |
549 | + } |
550 | + |
551 | + for (i = 0; i < NR_CPUS; i++) |
552 | + vt->kernel_pgd[i] = value; |
553 | +} |
554 | + |
555 | +static int |
556 | +arm64_kvtop(struct task_context *tc, ulong kvaddr, physaddr_t *paddr, int verbose) |
557 | +{ |
558 | + ulong kernel_pgd; |
559 | + |
560 | + if (!IS_KVADDR(kvaddr)) |
561 | + return FALSE; |
562 | + |
563 | + if (!vt->vmalloc_start) { |
564 | + *paddr = VTOP(kvaddr); |
565 | + return TRUE; |
566 | + } |
567 | + |
568 | + if (!IS_VMALLOC_ADDR(kvaddr)) { |
569 | + *paddr = VTOP(kvaddr); |
570 | + if (!verbose) |
571 | + return TRUE; |
572 | + } |
573 | + |
574 | + kernel_pgd = vt->kernel_pgd[0]; |
575 | + |
576 | + switch (machdep->flags & (VM_L2_64K|VM_L3_4K)) |
577 | + { |
578 | + case VM_L2_64K: |
579 | + return arm64_vtop_2level_64k(kernel_pgd, kvaddr, paddr, verbose); |
580 | + case VM_L3_4K: |
581 | + return arm64_vtop_3level_4k(kernel_pgd, kvaddr, paddr, verbose); |
582 | + default: |
583 | + return FALSE; |
584 | + } |
585 | +} |
586 | + |
587 | +static int |
588 | +arm64_uvtop(struct task_context *tc, ulong uvaddr, physaddr_t *paddr, int verbose) |
589 | +{ |
590 | + ulong user_pgd; |
591 | + |
592 | + readmem(tc->mm_struct + OFFSET(mm_struct_pgd), KVADDR, |
593 | + &user_pgd, sizeof(long), "user pgd", FAULT_ON_ERROR); |
594 | + |
595 | + switch (machdep->flags & (VM_L2_64K|VM_L3_4K)) |
596 | + { |
597 | + case VM_L2_64K: |
598 | + return arm64_vtop_2level_64k(user_pgd, uvaddr, paddr, verbose); |
599 | + case VM_L3_4K: |
600 | + return arm64_vtop_3level_4k(user_pgd, uvaddr, paddr, verbose); |
601 | + default: |
602 | + return FALSE; |
603 | + } |
604 | +} |
605 | + |
606 | +static int |
607 | +arm64_vtop_2level_64k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose) |
608 | +{ |
609 | + ulong *pgd_base, *pgd_ptr, pgd_val; |
610 | + ulong *pte_base, *pte_ptr, pte_val; |
611 | + |
612 | + if (verbose) |
613 | + fprintf(fp, "PAGE DIRECTORY: %lx\n", pgd); |
614 | + |
615 | + pgd_base = (ulong *)pgd; |
616 | + FILL_PGD(pgd_base, KVADDR, PTRS_PER_PGD_L2_64K * sizeof(ulong)); |
617 | + pgd_ptr = pgd_base + (((vaddr) >> PGDIR_SHIFT_L2_64K) & (PTRS_PER_PGD_L2_64K - 1)); |
618 | + pgd_val = ULONG(machdep->pgd + PAGEOFFSET(pgd_ptr)); |
619 | + if (verbose) |
620 | + fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd_ptr, pgd_val); |
621 | + if (!pgd_val) |
622 | + goto no_page; |
623 | + |
624 | + /* |
625 | + * #define __PAGETABLE_PUD_FOLDED |
626 | + * #define __PAGETABLE_PMD_FOLDED |
627 | + */ |
628 | + |
629 | + pte_base = (ulong *)PTOV(pgd_val & PHYS_MASK & (s32)machdep->pagemask); |
630 | + FILL_PTBL(pte_base, KVADDR, PTRS_PER_PTE_L2_64K * sizeof(ulong)); |
631 | + pte_ptr = pte_base + (((vaddr) >> machdep->pageshift) & (PTRS_PER_PTE_L2_64K - 1)); |
632 | + pte_val = ULONG(machdep->ptbl + PAGEOFFSET(pte_ptr)); |
633 | + if (verbose) |
634 | + fprintf(fp, " PTE: %lx => %lx\n", (ulong)pte_ptr, pte_val); |
635 | + if (!pte_val) |
636 | + goto no_page; |
637 | + |
638 | + if (pte_val & PTE_VALID) { |
639 | + *paddr = (PAGEBASE(pte_val) & PHYS_MASK) + PAGEOFFSET(vaddr); |
640 | + if (verbose) { |
641 | + fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr)); |
642 | + arm64_translate_pte(pte_val, 0, 0); |
643 | + } |
644 | + } else { |
645 | + if (verbose) { |
646 | + fprintf(fp, "\n"); |
647 | + arm64_translate_pte(pte_val, 0, 0); |
648 | + } |
649 | + goto no_page; |
650 | + } |
651 | + |
652 | + return TRUE; |
653 | +no_page: |
654 | + return FALSE; |
655 | +} |
656 | + |
657 | +static int |
658 | +arm64_vtop_3level_4k(ulong pgd, ulong vaddr, physaddr_t *paddr, int verbose) |
659 | +{ |
660 | + ulong *pgd_base, *pgd_ptr, pgd_val; |
661 | + ulong *pmd_base, *pmd_ptr, pmd_val; |
662 | + ulong *pte_base, *pte_ptr, pte_val; |
663 | + |
664 | + if (verbose) |
665 | + fprintf(fp, "PAGE DIRECTORY: %lx\n", pgd); |
666 | + |
667 | + pgd_base = (ulong *)pgd; |
668 | + FILL_PGD(pgd_base, KVADDR, PTRS_PER_PGD_L3_4K * sizeof(ulong)); |
669 | + pgd_ptr = pgd_base + (((vaddr) >> PGDIR_SHIFT_L3_4K) & (PTRS_PER_PGD_L3_4K - 1)); |
670 | + pgd_val = ULONG(machdep->pgd + PAGEOFFSET(pgd_ptr)); |
671 | + if (verbose) |
672 | + fprintf(fp, " PGD: %lx => %lx\n", (ulong)pgd_ptr, pgd_val); |
673 | + if (!pgd_val) |
674 | + goto no_page; |
675 | + |
676 | + /* |
677 | + * #define __PAGETABLE_PUD_FOLDED |
678 | + */ |
679 | + |
680 | + pmd_base = (ulong *)PTOV(pgd_val & PHYS_MASK & (s32)machdep->pagemask); |
681 | + FILL_PMD(pmd_base, KVADDR, PTRS_PER_PMD_L3_4K * sizeof(ulong)); |
682 | + pmd_ptr = pmd_base + (((vaddr) >> PMD_SHIFT_L3_4K) & (PTRS_PER_PMD_L3_4K - 1)); |
683 | + pmd_val = ULONG(machdep->pmd + PAGEOFFSET(pmd_ptr)); |
684 | + if (verbose) |
685 | + fprintf(fp, " PMD: %lx => %lx\n", (ulong)pmd_ptr, pmd_val); |
686 | + if (!pmd_val) |
687 | + goto no_page; |
688 | + |
689 | + pte_base = (ulong *)PTOV(pmd_val & PHYS_MASK & (s32)machdep->pagemask); |
690 | + FILL_PTBL(pte_base, KVADDR, PTRS_PER_PTE_L3_4K * sizeof(ulong)); |
691 | + pte_ptr = pte_base + (((vaddr) >> machdep->pageshift) & (PTRS_PER_PTE_L3_4K - 1)); |
692 | + pte_val = ULONG(machdep->ptbl + PAGEOFFSET(pte_ptr)); |
693 | + if (verbose) |
694 | + fprintf(fp, " PTE: %lx => %lx\n", (ulong)pte_ptr, pte_val); |
695 | + if (!pte_val) |
696 | + goto no_page; |
697 | + |
698 | + if (pte_val & PTE_VALID) { |
699 | + *paddr = (PAGEBASE(pte_val) & PHYS_MASK) + PAGEOFFSET(vaddr); |
700 | + if (verbose) { |
701 | + fprintf(fp, " PAGE: %lx\n\n", PAGEBASE(*paddr)); |
702 | + arm64_translate_pte(pte_val, 0, 0); |
703 | + } |
704 | + } else { |
705 | + if (verbose) { |
706 | + fprintf(fp, "\n"); |
707 | + arm64_translate_pte(pte_val, 0, 0); |
708 | + } |
709 | + goto no_page; |
710 | + } |
711 | + |
712 | + return TRUE; |
713 | +no_page: |
714 | + return FALSE; |
715 | +} |
716 | + |
717 | +static ulong |
718 | +arm64_get_task_pgd(ulong task) |
719 | +{ |
720 | + struct task_context *tc; |
721 | + ulong pgd; |
722 | + |
723 | + if ((tc = task_to_context(task)) && |
724 | + readmem(tc->mm_struct + OFFSET(mm_struct_pgd), KVADDR, |
725 | + &pgd, sizeof(long), "user pgd", RETURN_ON_ERROR)) |
726 | + return pgd; |
727 | + else |
728 | + return NO_TASK; |
729 | +} |
730 | + |
731 | +static ulong |
732 | +arm64_processor_speed(void) |
733 | +{ |
734 | + return 0; |
735 | +}; |
736 | + |
737 | + |
738 | +/* |
739 | + * Gather and verify all of the backtrace requirements. |
740 | + */ |
741 | +static void |
742 | +arm64_stackframe_init(void) |
743 | +{ |
744 | + long task_struct_thread; |
745 | + long thread_struct_context; |
746 | + long context_sp, context_pc, context_fp; |
747 | + |
748 | + STRUCT_SIZE_INIT(note_buf, "note_buf_t"); |
749 | + STRUCT_SIZE_INIT(elf_prstatus, "elf_prstatus"); |
750 | + MEMBER_OFFSET_INIT(elf_prstatus_pr_pid, "elf_prstatus", "pr_pid"); |
751 | + MEMBER_OFFSET_INIT(elf_prstatus_pr_reg, "elf_prstatus", "pr_reg"); |
752 | + |
753 | + machdep->machspec->__exception_text_start = |
754 | + symbol_value("__exception_text_start"); |
755 | + machdep->machspec->__exception_text_end = |
756 | + symbol_value("__exception_text_end"); |
757 | + |
758 | + task_struct_thread = MEMBER_OFFSET("task_struct", "thread"); |
759 | + thread_struct_context = MEMBER_OFFSET("thread_struct", "context"); |
760 | + |
761 | + if ((task_struct_thread == INVALID_OFFSET) || |
762 | + (thread_struct_context == INVALID_OFFSET)) { |
763 | + error(INFO, |
764 | + "cannot determine task_struct.thread.context offset\n"); |
765 | + return; |
766 | + } |
767 | + |
768 | + /* |
769 | + * Pay for the convenience of using a hardcopy of a kernel structure. |
770 | + */ |
771 | + if (offsetof(struct arm64_stackframe, sp) != |
772 | + MEMBER_OFFSET("stackframe", "sp")) { |
773 | + error(INFO, "builtin stackframe.sp offset incorrect!\n"); |
774 | + return; |
775 | + } |
776 | + if (offsetof(struct arm64_stackframe, fp) != |
777 | + MEMBER_OFFSET("stackframe", "fp")) { |
778 | + error(INFO, "builtin stackframe.fp offset incorrect!\n"); |
779 | + return; |
780 | + } |
781 | + if (offsetof(struct arm64_stackframe, pc) != |
782 | + MEMBER_OFFSET("stackframe", "pc")) { |
783 | + error(INFO, "builtin stackframe.pc offset incorrect!\n"); |
784 | + return; |
785 | + } |
786 | + |
787 | + context_sp = MEMBER_OFFSET("cpu_context", "sp"); |
788 | + context_fp = MEMBER_OFFSET("cpu_context", "fp"); |
789 | + context_pc = MEMBER_OFFSET("cpu_context", "pc"); |
790 | + if (context_sp == INVALID_OFFSET) { |
791 | + error(INFO, "cannot determine cpu_context.sp offset\n"); |
792 | + return; |
793 | + } |
794 | + if (context_fp == INVALID_OFFSET) { |
795 | + error(INFO, "cannot determine cpu_context.fp offset\n"); |
796 | + return; |
797 | + } |
798 | + if (context_pc == INVALID_OFFSET) { |
799 | + error(INFO, "cannot determine cpu_context.pc offset\n"); |
800 | + return; |
801 | + } |
802 | + ASSIGN_OFFSET(task_struct_thread_context_sp) = |
803 | + task_struct_thread + thread_struct_context + context_sp; |
804 | + ASSIGN_OFFSET(task_struct_thread_context_fp) = |
805 | + task_struct_thread + thread_struct_context + context_fp; |
806 | + ASSIGN_OFFSET(task_struct_thread_context_pc) = |
807 | + task_struct_thread + thread_struct_context + context_pc; |
808 | +} |
809 | + |
810 | +static int arm64_eframe_search(struct bt_info *bt) |
811 | +{ |
812 | + return (NOT_IMPLEMENTED(FATAL)); |
813 | +} |
814 | + |
815 | +static int |
816 | +arm64_in_exception_text(ulong ptr) |
817 | +{ |
818 | + struct machine_specific *ms = machdep->machspec; |
819 | + |
820 | + return((ptr >= ms->__exception_text_start) && |
821 | + (ptr < ms->__exception_text_end)); |
822 | +} |
823 | + |
824 | +static void |
825 | +arm64_print_stackframe_entry(struct bt_info *bt, int level, struct arm64_stackframe *frame) |
826 | +{ |
827 | + char *name, *name_plus_offset; |
828 | + ulong symbol_offset; |
829 | + struct syment *sp; |
830 | + struct load_module *lm; |
831 | + char buf[BUFSIZE]; |
832 | + |
833 | + name = closest_symbol(frame->pc); |
834 | + name_plus_offset = NULL; |
835 | + |
836 | + if (bt->flags & BT_SYMBOL_OFFSET) { |
837 | + sp = value_search(frame->pc, &symbol_offset); |
838 | + if (sp && symbol_offset) |
839 | + name_plus_offset = |
840 | + value_to_symstr(frame->pc, buf, bt->radix); |
841 | + } |
842 | + |
843 | + fprintf(fp, "%s#%d [%8lx] %s at %lx", level < 10 ? " " : "", level, |
844 | + frame->sp, name_plus_offset ? name_plus_offset : name, frame->pc); |
845 | + |
846 | + if (module_symbol(frame->pc, NULL, &lm, NULL, 0)) |
847 | + fprintf(fp, " [%s]", lm->mod_name); |
848 | + |
849 | + fprintf(fp, "\n"); |
850 | +} |
851 | + |
852 | +static int arm64_unwind_frame(struct bt_info *bt, struct arm64_stackframe *frame) |
853 | +{ |
854 | + unsigned long high, low, fp; |
855 | + unsigned long stack_mask; |
856 | + |
857 | + stack_mask = (unsigned long)(ARM64_STACK_SIZE) - 1; |
858 | + fp = frame->fp; |
859 | + |
860 | + low = frame->sp; |
861 | + high = (low + stack_mask) & ~(stack_mask); |
862 | + |
863 | + if (fp < low || fp > high || fp & 0xf) |
864 | + return FALSE; |
865 | + |
866 | + frame->sp = fp + 0x10; |
867 | + frame->fp = *(unsigned long *)(fp); |
868 | + frame->pc = *(unsigned long *)(fp + 8); |
869 | + |
870 | + return TRUE; |
871 | +} |
872 | + |
873 | +static void arm64_back_trace_cmd(struct bt_info *bt) |
874 | +{ |
875 | + struct arm64_stackframe stackframe; |
876 | + int level; |
877 | + |
878 | + if (BT_REFERENCE_CHECK(bt)) |
879 | + option_not_supported('R'); |
880 | + |
881 | + if (bt->flags & BT_USER_SPACE) { |
882 | + fprintf(fp, "#0 [user space]\n"); |
883 | + return; |
884 | + } |
885 | + |
886 | + stackframe.sp = bt->stkptr; |
887 | + stackframe.pc = bt->instptr; |
888 | + stackframe.fp = bt->frameptr; |
889 | + |
890 | + level = 0; |
891 | + while (1) { |
892 | + bt->instptr = stackframe.pc; |
893 | + |
894 | + arm64_print_stackframe_entry(bt, level, &stackframe); |
895 | + |
896 | + if (!arm64_unwind_frame(bt, &stackframe)) |
897 | + break; |
898 | + |
899 | + if (arm64_in_exception_text(bt->instptr)) |
900 | + fprintf(fp, "TBD: dump exception frame: pt_regs @ stackframe.sp\n"); |
901 | + |
902 | + level++; |
903 | + } |
904 | +} |
905 | + |
906 | +static int |
907 | +arm64_get_dumpfile_stackframe(struct bt_info *bt, struct arm64_stackframe *frame) |
908 | +{ |
909 | + struct machine_specific *ms = machdep->machspec; |
910 | + struct arm64_pt_regs *ptregs; |
911 | + |
912 | + if (!ms->panic_task_regs) |
913 | + return FALSE; |
914 | + |
915 | + ptregs = &ms->panic_task_regs[bt->tc->processor]; |
916 | + frame->sp = ptregs->sp; |
917 | + frame->pc = ptregs->pc; |
918 | + frame->fp = ptregs->regs[29]; |
919 | + |
920 | + if (!is_kernel_text(frame->pc) && |
921 | + in_user_stack(bt->tc->task, frame->sp)) |
922 | + bt->flags |= BT_USER_SPACE; |
923 | + |
924 | + return TRUE; |
925 | +} |
926 | + |
927 | +static int |
928 | +arm64_get_stackframe(struct bt_info *bt, struct arm64_stackframe *frame) |
929 | +{ |
930 | + if (!fill_task_struct(bt->task)) |
931 | + return FALSE; |
932 | + |
933 | + frame->sp = ULONG(tt->task_struct + OFFSET(task_struct_thread_context_sp)); |
934 | + frame->pc = ULONG(tt->task_struct + OFFSET(task_struct_thread_context_pc)); |
935 | + frame->fp = ULONG(tt->task_struct + OFFSET(task_struct_thread_context_fp)); |
936 | + |
937 | + return TRUE; |
938 | +} |
939 | + |
940 | +static void |
941 | +arm64_get_stack_frame(struct bt_info *bt, ulong *pcp, ulong *spp) |
942 | +{ |
943 | + int ret; |
944 | + struct arm64_stackframe stackframe; |
945 | + |
946 | + if (DUMPFILE() && is_task_active(bt->task)) |
947 | + ret = arm64_get_dumpfile_stackframe(bt, &stackframe); |
948 | + else |
949 | + ret = arm64_get_stackframe(bt, &stackframe); |
950 | + |
951 | + if (!ret) { |
952 | + error(WARNING, |
953 | + "cannot get stackframe for task %lx\n", bt->task); |
954 | + return; |
955 | + } |
956 | + |
957 | + bt->frameptr = stackframe.fp; |
958 | + if (pcp) |
959 | + *pcp = stackframe.pc; |
960 | + if (spp) |
961 | + *spp = stackframe.sp; |
962 | +} |
963 | + |
964 | +/* |
965 | + * Translate a PTE, returning TRUE if the page is present. |
966 | + * If a physaddr pointer is passed in, don't print anything. |
967 | + */ |
968 | +static int |
969 | +arm64_translate_pte(ulong pte, void *physaddr, ulonglong unused) |
970 | +{ |
971 | + int c, others, len1, len2, len3; |
972 | + ulong paddr; |
973 | + char buf1[BUFSIZE]; |
974 | + char buf2[BUFSIZE]; |
975 | + char buf3[BUFSIZE]; |
976 | + char ptebuf[BUFSIZE]; |
977 | + char physbuf[BUFSIZE]; |
978 | + char *arglist[MAXARGS]; |
979 | + int page_present; |
980 | + |
981 | + paddr = pte & PHYS_MASK & (s32)machdep->pagemask; |
982 | + page_present = pte & (PTE_VALID | machdep->machspec->pte_protnone); |
983 | + |
984 | + if (physaddr) { |
985 | + *((ulong *)physaddr) = paddr; |
986 | + return page_present; |
987 | + } |
988 | + |
989 | + sprintf(ptebuf, "%lx", pte); |
990 | + len1 = MAX(strlen(ptebuf), strlen("PTE")); |
991 | + fprintf(fp, "%s ", mkstring(buf1, len1, CENTER|LJUST, "PTE")); |
992 | + |
993 | + if (!page_present && (pte & PTE_FILE)) { |
994 | + swap_location(pte, buf1); |
995 | + if ((c = parse_line(buf1, arglist)) != 3) |
996 | + error(FATAL, "cannot determine swap location\n"); |
997 | + |
998 | + len2 = MAX(strlen(arglist[0]), strlen("SWAP")); |
999 | + len3 = MAX(strlen(arglist[2]), strlen("OFFSET")); |
1000 | + |
1001 | + fprintf(fp, "%s %s\n", |
1002 | + mkstring(buf2, len2, CENTER|LJUST, "SWAP"), |
1003 | + mkstring(buf3, len3, CENTER|LJUST, "OFFSET")); |
1004 | + |
1005 | + strcpy(buf2, arglist[0]); |
1006 | + strcpy(buf3, arglist[2]); |
1007 | + fprintf(fp, "%s %s %s\n", |
1008 | + mkstring(ptebuf, len1, CENTER|RJUST, NULL), |
1009 | + mkstring(buf2, len2, CENTER|RJUST, NULL), |
1010 | + mkstring(buf3, len3, CENTER|RJUST, NULL)); |
1011 | + |
1012 | + return page_present; |
1013 | + } |
1014 | + |
1015 | + sprintf(physbuf, "%lx", paddr); |
1016 | + len2 = MAX(strlen(physbuf), strlen("PHYSICAL")); |
1017 | + fprintf(fp, "%s ", mkstring(buf1, len2, CENTER|LJUST, "PHYSICAL")); |
1018 | + |
1019 | + fprintf(fp, "FLAGS\n"); |
1020 | + |
1021 | + fprintf(fp, "%s %s ", |
1022 | + mkstring(ptebuf, len1, CENTER|RJUST, NULL), |
1023 | + mkstring(physbuf, len2, CENTER|RJUST, NULL)); |
1024 | + fprintf(fp, "("); |
1025 | + others = 0; |
1026 | + |
1027 | + if (pte) { |
1028 | + if (pte & PTE_VALID) |
1029 | + fprintf(fp, "%sVALID", others++ ? "|" : ""); |
1030 | + if (THIS_KERNEL_VERSION >= LINUX(3,10,0)) { |
1031 | + if (pte & machdep->machspec->pte_file) |
1032 | + fprintf(fp, "%sFILE", others++ ? "|" : ""); |
1033 | + if (pte & machdep->machspec->pte_protnone) |
1034 | + fprintf(fp, "%sPROTNONE", others++ ? "|" : ""); |
1035 | + } else { |
1036 | + if (pte & machdep->machspec->pte_protnone) |
1037 | + fprintf(fp, "%sPROTNONE", others++ ? "|" : ""); |
1038 | + if (pte & machdep->machspec->pte_file) |
1039 | + fprintf(fp, "%sFILE", others++ ? "|" : ""); |
1040 | + } |
1041 | + if (pte & PTE_USER) |
1042 | + fprintf(fp, "%sUSER", others++ ? "|" : ""); |
1043 | + if (pte & PTE_RDONLY) |
1044 | + fprintf(fp, "%sRDONLY", others++ ? "|" : ""); |
1045 | + if (pte & PTE_SHARED) |
1046 | + fprintf(fp, "%sSHARED", others++ ? "|" : ""); |
1047 | + if (pte & PTE_AF) |
1048 | + fprintf(fp, "%sAF", others++ ? "|" : ""); |
1049 | + if (pte & PTE_NG) |
1050 | + fprintf(fp, "%sNG", others++ ? "|" : ""); |
1051 | + if (pte & PTE_PXN) |
1052 | + fprintf(fp, "%sPXN", others++ ? "|" : ""); |
1053 | + if (pte & PTE_UXN) |
1054 | + fprintf(fp, "%sUXN", others++ ? "|" : ""); |
1055 | + if (pte & PTE_DIRTY) |
1056 | + fprintf(fp, "%sDIRTY", others++ ? "|" : ""); |
1057 | + if (pte & PTE_SPECIAL) |
1058 | + fprintf(fp, "%sSPECIAL", others++ ? "|" : ""); |
1059 | + } else { |
1060 | + fprintf(fp, "no mapping"); |
1061 | + } |
1062 | + |
1063 | + fprintf(fp, ")\n"); |
1064 | + |
1065 | + return (page_present); |
1066 | +} |
1067 | + |
1068 | +static ulong |
1069 | +arm64_vmalloc_start(void) |
1070 | +{ |
1071 | + return ARM64_VMALLOC_START; |
1072 | +} |
1073 | + |
1074 | +/* |
1075 | + * Not so accurate since thread_info introduction. |
1076 | + */ |
1077 | +static int |
1078 | +arm64_is_task_addr(ulong task) |
1079 | +{ |
1080 | + if (tt->flags & THREAD_INFO) |
1081 | + return IS_KVADDR(task); |
1082 | + else |
1083 | + return (IS_KVADDR(task) && (ALIGNED_STACK_OFFSET(task) == 0)); |
1084 | +} |
1085 | + |
1086 | +/* |
1087 | + * Filter dissassembly output if the output radix is not gdb's default 10 |
1088 | + */ |
1089 | +static int |
1090 | +arm64_dis_filter(ulong vaddr, char *inbuf, unsigned int output_radix) |
1091 | +{ |
1092 | + char buf1[BUFSIZE]; |
1093 | + char buf2[BUFSIZE]; |
1094 | + char *colon, *p1; |
1095 | + int argc; |
1096 | + char *argv[MAXARGS]; |
1097 | + ulong value; |
1098 | + |
1099 | + if (!inbuf) |
1100 | + return TRUE; |
1101 | + |
1102 | + console("IN: %s", inbuf); |
1103 | + |
1104 | + colon = strstr(inbuf, ":"); |
1105 | + |
1106 | + if (colon) { |
1107 | + sprintf(buf1, "0x%lx <%s>", vaddr, |
1108 | + value_to_symstr(vaddr, buf2, output_radix)); |
1109 | + sprintf(buf2, "%s%s", buf1, colon); |
1110 | + strcpy(inbuf, buf2); |
1111 | + } |
1112 | + |
1113 | + strcpy(buf1, inbuf); |
1114 | + argc = parse_line(buf1, argv); |
1115 | + |
1116 | + if ((FIRSTCHAR(argv[argc-1]) == '<') && |
1117 | + (LASTCHAR(argv[argc-1]) == '>')) { |
1118 | + p1 = rindex(inbuf, '<'); |
1119 | + while ((p1 > inbuf) && !STRNEQ(p1, " 0x")) |
1120 | + p1--; |
1121 | + |
1122 | + if (!STRNEQ(p1, " 0x")) |
1123 | + return FALSE; |
1124 | + p1++; |
1125 | + |
1126 | + if (!extract_hex(p1, &value, NULLCHAR, TRUE)) |
1127 | + return FALSE; |
1128 | + |
1129 | + sprintf(buf1, "0x%lx <%s>\n", value, |
1130 | + value_to_symstr(value, buf2, output_radix)); |
1131 | + |
1132 | + sprintf(p1, "%s", buf1); |
1133 | + } |
1134 | + |
1135 | + console(" %s", inbuf); |
1136 | + |
1137 | + return TRUE; |
1138 | +} |
1139 | + |
1140 | +/* |
1141 | + * Machine dependent command. |
1142 | + */ |
1143 | +static void |
1144 | +arm64_cmd_mach(void) |
1145 | +{ |
1146 | + int c; |
1147 | + |
1148 | + while ((c = getopt(argcnt, args, "cm")) != -1) { |
1149 | + switch (c) { |
1150 | + case 'c': |
1151 | + case 'm': |
1152 | + option_not_supported(c); |
1153 | + break; |
1154 | + |
1155 | + default: |
1156 | + argerrs++; |
1157 | + break; |
1158 | + } |
1159 | + } |
1160 | + |
1161 | + if (argerrs) |
1162 | + cmd_usage(pc->curcmd, SYNOPSIS); |
1163 | + |
1164 | + arm64_display_machine_stats(); |
1165 | +} |
1166 | + |
1167 | +static void |
1168 | +arm64_display_machine_stats(void) |
1169 | +{ |
1170 | + struct new_utsname *uts; |
1171 | + char buf[BUFSIZE]; |
1172 | + ulong mhz; |
1173 | + |
1174 | + uts = &kt->utsname; |
1175 | + |
1176 | + fprintf(fp, " MACHINE TYPE: %s\n", uts->machine); |
1177 | + fprintf(fp, " MEMORY SIZE: %s\n", get_memory_size(buf)); |
1178 | + fprintf(fp, " CPUS: %d\n", get_cpus_to_display()); |
1179 | + if ((mhz = machdep->processor_speed())) |
1180 | + fprintf(fp, " PROCESSOR SPEED: %ld Mhz\n", mhz); |
1181 | + fprintf(fp, " HZ: %d\n", machdep->hz); |
1182 | + fprintf(fp, " PAGE SIZE: %d\n", PAGESIZE()); |
1183 | + fprintf(fp, "KERNEL VIRTUAL BASE: %lx\n", ARM64_PAGE_OFFSET); |
1184 | + fprintf(fp, "KERNEL VMALLOC BASE: %lx\n", ARM64_VMALLOC_START); |
1185 | + fprintf(fp, "KERNEL MODULES BASE: %lx\n", ARM64_MODULES_VADDR); |
1186 | + fprintf(fp, " KERNEL STACK SIZE: %ld\n", STACKSIZE()); |
1187 | +} |
1188 | + |
1189 | +static int |
1190 | +arm64_get_smp_cpus(void) |
1191 | +{ |
1192 | + return MAX(get_cpus_online(), get_highest_cpu_online()+1); |
1193 | +} |
1194 | + |
1195 | + |
1196 | +/* |
1197 | + * Retrieve task registers for the time of the crash. |
1198 | + */ |
1199 | +static int |
1200 | +arm64_get_crash_notes(void) |
1201 | +{ |
1202 | + struct machine_specific *ms = machdep->machspec; |
1203 | + ulong crash_notes; |
1204 | + Elf64_Nhdr *note; |
1205 | + ulong offset; |
1206 | + char *buf, *p; |
1207 | + ulong *notes_ptrs; |
1208 | + ulong i; |
1209 | + |
1210 | + if (!symbol_exists("crash_notes")) |
1211 | + return FALSE; |
1212 | + |
1213 | + crash_notes = symbol_value("crash_notes"); |
1214 | + |
1215 | + notes_ptrs = (ulong *)GETBUF(kt->cpus*sizeof(notes_ptrs[0])); |
1216 | + |
1217 | + /* |
1218 | + * Read crash_notes for the first CPU. crash_notes are in standard ELF |
1219 | + * note format. |
1220 | + */ |
1221 | + if (!readmem(crash_notes, KVADDR, ¬es_ptrs[kt->cpus-1], |
1222 | + sizeof(notes_ptrs[kt->cpus-1]), "crash_notes", RETURN_ON_ERROR)) { |
1223 | + error(WARNING, "cannot read crash_notes\n"); |
1224 | + FREEBUF(notes_ptrs); |
1225 | + return FALSE; |
1226 | + } |
1227 | + |
1228 | + if (symbol_exists("__per_cpu_offset")) { |
1229 | + /* |
1230 | + * Add __per_cpu_offset for each cpu to form the notes pointer. |
1231 | + */ |
1232 | + for (i = 0; i<kt->cpus; i++) |
1233 | + notes_ptrs[i] = notes_ptrs[kt->cpus-1] + kt->__per_cpu_offset[i]; |
1234 | + } |
1235 | + |
1236 | + buf = GETBUF(SIZE(note_buf)); |
1237 | + |
1238 | + if (!(ms->panic_task_regs = malloc(kt->cpus * sizeof(struct arm64_pt_regs)))) |
1239 | + error(FATAL, "cannot malloc panic_task_regs space\n"); |
1240 | + |
1241 | + for (i = 0; i < kt->cpus; i++) { |
1242 | + |
1243 | + if (!readmem(notes_ptrs[i], KVADDR, buf, SIZE(note_buf), |
1244 | + "note_buf_t", RETURN_ON_ERROR)) { |
1245 | + error(WARNING, "failed to read note_buf_t\n"); |
1246 | + goto fail; |
1247 | + } |
1248 | + |
1249 | + /* |
1250 | + * Do some sanity checks for this note before reading registers from it. |
1251 | + */ |
1252 | + note = (Elf64_Nhdr *)buf; |
1253 | + p = buf + sizeof(Elf64_Nhdr); |
1254 | + |
1255 | + if (note->n_type != NT_PRSTATUS) { |
1256 | + error(WARNING, "invalid note (n_type != NT_PRSTATUS)\n"); |
1257 | + goto fail; |
1258 | + } |
1259 | + if (p[0] != 'C' || p[1] != 'O' || p[2] != 'R' || p[3] != 'E') { |
1260 | + error(WARNING, "invalid note (name != \"CORE\"\n"); |
1261 | + goto fail; |
1262 | + } |
1263 | + |
1264 | + /* |
1265 | + * Find correct location of note data. This contains elf_prstatus |
1266 | + * structure which has registers etc. for the crashed task. |
1267 | + */ |
1268 | + offset = sizeof(Elf64_Nhdr); |
1269 | + offset = roundup(offset + note->n_namesz, 4); |
1270 | + p = buf + offset; /* start of elf_prstatus */ |
1271 | + |
1272 | + BCOPY(p + OFFSET(elf_prstatus_pr_reg), &ms->panic_task_regs[i], |
1273 | + sizeof(struct arm64_pt_regs)); |
1274 | + } |
1275 | + |
1276 | + FREEBUF(buf); |
1277 | + FREEBUF(notes_ptrs); |
1278 | + return TRUE; |
1279 | + |
1280 | +fail: |
1281 | + FREEBUF(buf); |
1282 | + FREEBUF(notes_ptrs); |
1283 | + free(ms->panic_task_regs); |
1284 | + ms->panic_task_regs = NULL; |
1285 | + return FALSE; |
1286 | +} |
1287 | + |
1288 | +static void |
1289 | +arm64_clear_machdep_cache(void) { |
1290 | + /* |
1291 | + * TBD: probably not necessary... |
1292 | + */ |
1293 | + return; |
1294 | +} |
1295 | + |
1296 | +static int |
1297 | +arm64_in_alternate_stack(int cpu, ulong stkptr) |
1298 | +{ |
1299 | + NOT_IMPLEMENTED(INFO); |
1300 | + return FALSE; |
1301 | +} |
1302 | + |
1303 | + |
1304 | +static int |
1305 | +compare_kvaddr(const void *v1, const void *v2) |
1306 | +{ |
1307 | + struct vaddr_range *r1, *r2; |
1308 | + |
1309 | + r1 = (struct vaddr_range *)v1; |
1310 | + r2 = (struct vaddr_range *)v2; |
1311 | + |
1312 | + return (r1->start < r2->start ? -1 : |
1313 | + r1->start == r2->start ? 0 : 1); |
1314 | +} |
1315 | + |
1316 | +static int |
1317 | +arm64_get_kvaddr_ranges(struct vaddr_range *vrp) |
1318 | +{ |
1319 | + int cnt; |
1320 | + |
1321 | + cnt = 0; |
1322 | + |
1323 | + vrp[cnt].type = KVADDR_UNITY_MAP; |
1324 | + vrp[cnt].start = machdep->machspec->page_offset; |
1325 | + vrp[cnt++].end = vt->high_memory; |
1326 | + |
1327 | + vrp[cnt].type = KVADDR_VMALLOC; |
1328 | + vrp[cnt].start = machdep->machspec->vmalloc_start_addr; |
1329 | + vrp[cnt++].end = last_vmalloc_address(); |
1330 | + |
1331 | + if (st->mods_installed) { |
1332 | + vrp[cnt].type = KVADDR_MODULES; |
1333 | + vrp[cnt].start = lowest_module_address(); |
1334 | + vrp[cnt++].end = roundup(highest_module_address(), |
1335 | + PAGESIZE()); |
1336 | + } |
1337 | + |
1338 | + if (machdep->flags & VMEMMAP) { |
1339 | + vrp[cnt].type = KVADDR_VMEMMAP; |
1340 | + vrp[cnt].start = machdep->machspec->vmemmap_vaddr; |
1341 | + vrp[cnt++].end = vt->node_table[vt->numnodes-1].mem_map + |
1342 | + (vt->node_table[vt->numnodes-1].size * SIZE(page)); |
1343 | + } |
1344 | + |
1345 | + qsort(vrp, cnt, sizeof(struct vaddr_range), compare_kvaddr); |
1346 | + |
1347 | + return cnt; |
1348 | +} |
1349 | + |
1350 | +/* |
1351 | + * Include both vmalloc'd, module and vmemmap address space as VMALLOC space. |
1352 | + */ |
1353 | +int |
1354 | +arm64_IS_VMALLOC_ADDR(ulong vaddr) |
1355 | +{ |
1356 | + return ((vaddr >= ARM64_VMALLOC_START && vaddr <= ARM64_VMALLOC_END) || |
1357 | + ((machdep->flags & VMEMMAP) && |
1358 | + (vaddr >= ARM64_VMEMMAP_VADDR && vaddr <= ARM64_VMEMMAP_END)) || |
1359 | + (vaddr >= ARM64_MODULES_VADDR && vaddr <= ARM64_MODULES_END)); |
1360 | +} |
1361 | + |
1362 | +#endif /* ARM64 */ |
1363 | + |
1364 | |
1365 | === added file '.pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/defs.h' |
1366 | --- .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/defs.h 1970-01-01 00:00:00 +0000 |
1367 | +++ .pc/Updated-the-ARM64-implementation-to-support-Linux-3..patch/defs.h 2014-09-09 15:21:10 +0000 |
1368 | @@ -0,0 +1,5946 @@ |
1369 | +/* defs.h - core analysis suite |
1370 | + * |
1371 | + * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. |
1372 | + * Copyright (C) 2002-2013 David Anderson |
1373 | + * Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved. |
1374 | + * Copyright (C) 2002 Silicon Graphics, Inc. |
1375 | + * |
1376 | + * This program is free software; you can redistribute it and/or modify |
1377 | + * it under the terms of the GNU General Public License as published by |
1378 | + * the Free Software Foundation; either version 2 of the License, or |
1379 | + * (at your option) any later version. |
1380 | + * |
1381 | + * This program is distributed in the hope that it will be useful, |
1382 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1383 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1384 | + * GNU General Public License for more details. |
1385 | + */ |
1386 | + |
1387 | +#ifndef GDB_COMMON |
1388 | + |
1389 | +#include <stdio.h> |
1390 | +#include <stdarg.h> |
1391 | +#include <stdint.h> |
1392 | +#include <termios.h> |
1393 | +#include <unistd.h> |
1394 | +#include <sys/mman.h> |
1395 | +#include <setjmp.h> |
1396 | +#undef basename |
1397 | +#if !defined(__USE_GNU) |
1398 | +#define __USE_GNU |
1399 | +#include <string.h> |
1400 | +#undef __USE_GNU |
1401 | +#else |
1402 | +#include <string.h> |
1403 | +#endif |
1404 | +#include <fcntl.h> |
1405 | +#include <stdlib.h> |
1406 | +#include <signal.h> |
1407 | +#include <assert.h> |
1408 | +#include <errno.h> |
1409 | +#include <dirent.h> |
1410 | +#include <time.h> |
1411 | +#include <zlib.h> |
1412 | +#include <sys/types.h> |
1413 | +#include <sys/stat.h> |
1414 | +#include <sys/param.h> |
1415 | +#include <sys/wait.h> |
1416 | +#include <sys/time.h> |
1417 | +#include <execinfo.h> /* backtrace() */ |
1418 | +#include <regex.h> |
1419 | +#ifdef LZO |
1420 | +#include <lzo/lzo1x.h> |
1421 | +#endif |
1422 | +#ifdef SNAPPY |
1423 | +#include <snappy-c.h> |
1424 | +#endif |
1425 | + |
1426 | +#ifndef ATTRIBUTE_UNUSED |
1427 | +#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) |
1428 | +#endif |
1429 | + |
1430 | +#define BASELEVEL_REVISION "7.0.3" |
1431 | + |
1432 | +#undef TRUE |
1433 | +#undef FALSE |
1434 | + |
1435 | +#define TRUE (1) |
1436 | +#define FALSE (0) |
1437 | +#define STR(x) #x |
1438 | +#ifndef offsetof |
1439 | +# define offsetof(TYPE, MEMBER) ((ulong)&((TYPE *)0)->MEMBER) |
1440 | +#endif |
1441 | + |
1442 | +#if !defined(X86) && !defined(X86_64) && !defined(ALPHA) && !defined(PPC) && \ |
1443 | + !defined(IA64) && !defined(PPC64) && !defined(S390) && !defined(S390X) && \ |
1444 | + !defined(ARM) && !defined(ARM64) |
1445 | +#ifdef __alpha__ |
1446 | +#define ALPHA |
1447 | +#endif |
1448 | +#ifdef __i386__ |
1449 | +#define X86 |
1450 | +#endif |
1451 | +#ifdef __powerpc__ |
1452 | +#define PPC |
1453 | +#endif |
1454 | +#ifdef __ia64__ |
1455 | +#define IA64 |
1456 | +#endif |
1457 | +#ifdef __s390__ |
1458 | +#define S390 |
1459 | +#endif |
1460 | +#ifdef __s390x__ |
1461 | +#define S390X |
1462 | +#endif |
1463 | +#ifdef __powerpc64__ |
1464 | +#define PPC64 |
1465 | +#endif |
1466 | +#ifdef __x86_64__ |
1467 | +#define X86_64 |
1468 | +#endif |
1469 | +#ifdef __arm__ |
1470 | +#define ARM |
1471 | +#endif |
1472 | +#ifdef __aarch64__ |
1473 | +#define ARM64 |
1474 | +#endif |
1475 | +#endif |
1476 | + |
1477 | +#ifdef X86 |
1478 | +#define NR_CPUS (256) |
1479 | +#endif |
1480 | +#ifdef X86_64 |
1481 | +#define NR_CPUS (5120) |
1482 | +#endif |
1483 | +#ifdef ALPHA |
1484 | +#define NR_CPUS (64) |
1485 | +#endif |
1486 | +#ifdef PPC |
1487 | +#define NR_CPUS (32) |
1488 | +#endif |
1489 | +#ifdef IA64 |
1490 | +#define NR_CPUS (4096) |
1491 | +#endif |
1492 | +#ifdef PPC64 |
1493 | +#define NR_CPUS (2048) |
1494 | +#endif |
1495 | +#ifdef S390 |
1496 | +#define NR_CPUS (64) |
1497 | +#endif |
1498 | +#ifdef S390X |
1499 | +#define NR_CPUS (64) |
1500 | +#endif |
1501 | +#ifdef ARM |
1502 | +#define NR_CPUS (4) |
1503 | +#endif |
1504 | +#ifdef ARM64 |
1505 | +#define NR_CPUS (4096) /* TBD */ |
1506 | +#endif |
1507 | + |
1508 | +#define BUFSIZE (1500) |
1509 | +#define NULLCHAR ('\0') |
1510 | + |
1511 | +#define MAXARGS (100) /* max number of arguments to one function */ |
1512 | +#define MAXARGLEN (40) /* max length of argument */ |
1513 | + |
1514 | +#define HIST_BLKSIZE (4096) |
1515 | + |
1516 | +static inline int string_exists(char *s) { return (s ? TRUE : FALSE); } |
1517 | +#define STREQ(A, B) (string_exists((char *)A) && string_exists((char *)B) && \ |
1518 | + (strcmp((char *)(A), (char *)(B)) == 0)) |
1519 | +#define STRNEQ(A, B) (string_exists((char *)A) && string_exists((char *)B) && \ |
1520 | + (strncmp((char *)(A), (char *)(B), strlen((char *)(B))) == 0)) |
1521 | +#define BZERO(S, N) (memset(S, NULLCHAR, N)) |
1522 | +#define BCOPY(S, D, C) (memcpy(D, S, C)) |
1523 | +#define BNEG(S, N) (memset(S, 0xff, N)) |
1524 | +#define BEEP() fprintf(stderr, "%c", 0x7) |
1525 | +#define LASTCHAR(s) (s[strlen(s)-1]) |
1526 | +#define FIRSTCHAR(s) (s[0]) |
1527 | +#define QUOTED_STRING(s) ((FIRSTCHAR(s) == '"') && (LASTCHAR(s) == '"')) |
1528 | +#define SINGLE_QUOTED_STRING(s) ((FIRSTCHAR(s) == '\'') && (LASTCHAR(s) == '\'')) |
1529 | +#define PATHEQ(A, B) ((A) && (B) && (pathcmp((char *)(A), (char *)(B)) == 0)) |
1530 | + |
1531 | +#ifdef roundup |
1532 | +#undef roundup |
1533 | +#endif |
1534 | +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) |
1535 | + |
1536 | +typedef uint64_t physaddr_t; |
1537 | + |
1538 | +#define PADDR_NOT_AVAILABLE (0x1ULL) |
1539 | + |
1540 | +typedef unsigned long long int ulonglong; |
1541 | +struct number_option { |
1542 | + ulong num; |
1543 | + ulonglong ll_num; |
1544 | + ulong retflags; |
1545 | +}; |
1546 | + |
1547 | +/* |
1548 | + * program_context flags |
1549 | + */ |
1550 | +#define LIVE_SYSTEM (0x1ULL) |
1551 | +#define TTY (0x2ULL) |
1552 | +#define RUNTIME (0x4ULL) |
1553 | +#define IN_FOREACH (0x8ULL) |
1554 | +#define MCLXCD (0x10ULL) |
1555 | +#define CMDLINE_IFILE (0x20ULL) |
1556 | +#define MFD_RDWR (0x40ULL) |
1557 | +#define KVMDUMP (0x80ULL) |
1558 | +#define SILENT (0x100ULL) |
1559 | +#define SADUMP (0x200ULL) |
1560 | +#define HASH (0x400ULL) |
1561 | +#define SCROLL (0x800ULL) |
1562 | +#define NO_CONSOLE (0x1000ULL) |
1563 | +#define RUNTIME_IFILE (0x2000ULL) |
1564 | +#define DROP_CORE (0x4000ULL) |
1565 | +#define LKCD (0x8000ULL) |
1566 | +#define GDB_INIT (0x10000ULL) |
1567 | +#define IN_GDB (0x20000ULL) |
1568 | +#define RCLOCAL_IFILE (0x40000ULL) |
1569 | +#define RCHOME_IFILE (0x80000ULL) |
1570 | +#define GET_TIMESTAMP (0x100000ULL) |
1571 | +#define READLINE (0x200000ULL) |
1572 | +#define _SIGINT_ (0x400000ULL) |
1573 | +#define IN_RESTART (0x800000ULL) |
1574 | +#define KERNEL_DEBUG_QUERY (0x1000000ULL) |
1575 | +#define DEVMEM (0x2000000ULL) |
1576 | +#define REM_LIVE_SYSTEM (0x4000000ULL) |
1577 | +#define NAMELIST_LOCAL (0x8000000ULL) |
1578 | +#define MEMSRC_LOCAL (0x10000000ULL) |
1579 | +#define NAMELIST_SAVED (0x20000000ULL) |
1580 | +#define DUMPFILE_SAVED (0x40000000ULL) |
1581 | +#define UNLINK_NAMELIST (0x80000000ULL) |
1582 | +#define NAMELIST_UNLINKED (0x100000000ULL) |
1583 | +#define REM_MCLXCD (0x200000000ULL) |
1584 | +#define REM_LKCD (0x400000000ULL) |
1585 | +#define NAMELIST_NO_GZIP (0x800000000ULL) |
1586 | +#define UNLINK_MODULES (0x1000000000ULL) |
1587 | +#define S390D (0x2000000000ULL) |
1588 | +#define REM_S390D (0x4000000000ULL) |
1589 | +#define SYSRQ (0x8000000000ULL) |
1590 | +#define KDUMP (0x10000000000ULL) |
1591 | +#define NETDUMP (0x20000000000ULL) |
1592 | +#define REM_NETDUMP (0x40000000000ULL) |
1593 | +#define SYSMAP (0x80000000000ULL) |
1594 | +#define SYSMAP_ARG (0x100000000000ULL) |
1595 | +#define MEMMOD (0x200000000000ULL) |
1596 | +#define MODPRELOAD (0x400000000000ULL) |
1597 | +#define DISKDUMP (0x800000000000ULL) |
1598 | +#define DATADEBUG (0x1000000000000ULL) |
1599 | +#define FINDKERNEL (0x2000000000000ULL) |
1600 | +#define VERSION_QUERY (0x4000000000000ULL) |
1601 | +#define READNOW (0x8000000000000ULL) |
1602 | +#define NOCRASHRC (0x10000000000000ULL) |
1603 | +#define INIT_IFILE (0x20000000000000ULL) |
1604 | +#define XENDUMP (0x40000000000000ULL) |
1605 | +#define XEN_HYPER (0x80000000000000ULL) |
1606 | +#define XEN_CORE (0x100000000000000ULL) |
1607 | +#define PLEASE_WAIT (0x200000000000000ULL) |
1608 | +#define IFILE_ERROR (0x400000000000000ULL) |
1609 | +#define KERNTYPES (0x800000000000000ULL) |
1610 | +#define MINIMAL_MODE (0x1000000000000000ULL) |
1611 | +#define CRASHBUILTIN (0x2000000000000000ULL) |
1612 | +#define PRELOAD_EXTENSIONS \ |
1613 | + (0x4000000000000000ULL) |
1614 | +#define PROC_KCORE (0x8000000000000000ULL) |
1615 | + |
1616 | +#define ACTIVE() (pc->flags & LIVE_SYSTEM) |
1617 | +#define DUMPFILE() (!(pc->flags & LIVE_SYSTEM)) |
1618 | +#define LIVE() (pc->flags2 & LIVE_DUMP || pc->flags & LIVE_SYSTEM) |
1619 | +#define MEMORY_SOURCES (NETDUMP|KDUMP|MCLXCD|LKCD|DEVMEM|S390D|MEMMOD|DISKDUMP|XENDUMP|CRASHBUILTIN|KVMDUMP|PROC_KCORE|SADUMP) |
1620 | +#define DUMPFILE_TYPES (DISKDUMP|NETDUMP|KDUMP|MCLXCD|LKCD|S390D|XENDUMP|KVMDUMP|SADUMP) |
1621 | +#define REMOTE() (pc->flags2 & REMOTE_DAEMON) |
1622 | +#define REMOTE_ACTIVE() (pc->flags & REM_LIVE_SYSTEM) |
1623 | +#define REMOTE_DUMPFILE() \ |
1624 | + (pc->flags & (REM_NETDUMP|REM_MCLXCD|REM_LKCD|REM_S390D)) |
1625 | +#define REMOTE_MEMSRC() (REMOTE_ACTIVE() || REMOTE_DUMPFILE()) |
1626 | +#define LKCD_DUMPFILE() (pc->flags & (LKCD|REM_LKCD)) |
1627 | +#define NETDUMP_DUMPFILE() (pc->flags & (NETDUMP|REM_NETDUMP)) |
1628 | +#define DISKDUMP_DUMPFILE() (pc->flags & DISKDUMP) |
1629 | +#define KDUMP_DUMPFILE() (pc->flags & KDUMP) |
1630 | +#define XENDUMP_DUMPFILE() (pc->flags & XENDUMP) |
1631 | +#define XEN_HYPER_MODE() (pc->flags & XEN_HYPER) |
1632 | +#define SYSRQ_TASK(X) ((pc->flags & SYSRQ) && is_task_active(X)) |
1633 | +#define XEN_CORE_DUMPFILE() (pc->flags & XEN_CORE) |
1634 | +#define LKCD_KERNTYPES() (pc->flags & KERNTYPES) |
1635 | +#define KVMDUMP_DUMPFILE() (pc->flags & KVMDUMP) |
1636 | +#define SADUMP_DUMPFILE() (pc->flags & SADUMP) |
1637 | + |
1638 | +#define NETDUMP_LOCAL (0x1) /* netdump_data flags */ |
1639 | +#define NETDUMP_REMOTE (0x2) |
1640 | +#define VMCORE_VALID() (nd->flags & (NETDUMP_LOCAL|NETDUMP_REMOTE|KDUMP_LOCAL)) |
1641 | +#define NETDUMP_ELF32 (0x4) |
1642 | +#define NETDUMP_ELF64 (0x8) |
1643 | +#define PARTIAL_DUMP (0x10) /* netdump or diskdump */ |
1644 | +#define KDUMP_ELF32 (0x20) |
1645 | +#define KDUMP_ELF64 (0x40) |
1646 | +#define KDUMP_LOCAL (0x80) |
1647 | +#define KCORE_LOCAL (0x100) |
1648 | +#define KCORE_ELF32 (0x200) |
1649 | +#define KCORE_ELF64 (0x400) |
1650 | +#define QEMU_MEM_DUMP_KDUMP_BACKUP \ |
1651 | + (0x800) |
1652 | +#define KVMDUMP_LOCAL (0x1) |
1653 | +#define KVMDUMP_VALID() (kvm->flags & (KVMDUMP_LOCAL)) |
1654 | + |
1655 | +#define DUMPFILE_FORMAT(flags) ((flags) & \ |
1656 | + (NETDUMP_ELF32|NETDUMP_ELF64|KDUMP_ELF32|KDUMP_ELF64)) |
1657 | + |
1658 | +#define DISKDUMP_LOCAL (0x1) |
1659 | +#define KDUMP_CMPRS_LOCAL (0x2) |
1660 | +#define ERROR_EXCLUDED (0x4) |
1661 | +#define ZERO_EXCLUDED (0x8) |
1662 | +#define DUMPFILE_SPLIT (0x10) |
1663 | +#define NO_ELF_NOTES (0x20) |
1664 | +#define LZO_SUPPORTED (0x40) |
1665 | +#define SNAPPY_SUPPORTED (0x80) |
1666 | +#define DISKDUMP_VALID() (dd->flags & DISKDUMP_LOCAL) |
1667 | +#define KDUMP_CMPRS_VALID() (dd->flags & KDUMP_CMPRS_LOCAL) |
1668 | +#define KDUMP_SPLIT() (dd->flags & DUMPFILE_SPLIT) |
1669 | + |
1670 | +#define XENDUMP_LOCAL (0x1) |
1671 | +#define XENDUMP_VALID() (xd->flags & XENDUMP_LOCAL) |
1672 | + |
1673 | +#define SADUMP_LOCAL (0x1) |
1674 | +#define SADUMP_DISKSET (0x2) |
1675 | +#define SADUMP_MEDIA (0x4) |
1676 | +#define SADUMP_ZERO_EXCLUDED (0x8) |
1677 | +#define SADUMP_KDUMP_BACKUP (0x10) |
1678 | +#define SADUMP_VALID() (sd->flags & SADUMP_LOCAL) |
1679 | + |
1680 | +#define CRASHDEBUG(x) (pc->debug >= (x)) |
1681 | + |
1682 | +#define CRASHDEBUG_SUSPEND(X) { pc->debug_save = pc->debug; pc->debug = X; } |
1683 | +#define CRASHDEBUG_RESTORE() { pc->debug = pc->debug_save; } |
1684 | + |
1685 | +#define VERBOSE (0x1) |
1686 | +#define ADDRESS_SPECIFIED (0x2) |
1687 | + |
1688 | +#define FAULT_ON_ERROR (0x1) |
1689 | +#define RETURN_ON_ERROR (0x2) |
1690 | +#define QUIET (0x4) |
1691 | +#define HEX_BIAS (0x8) |
1692 | +#define LONG_LONG (0x10) |
1693 | +#define RETURN_PARTIAL (0x20) |
1694 | + |
1695 | +#define SEEK_ERROR (-1) |
1696 | +#define READ_ERROR (-2) |
1697 | +#define WRITE_ERROR (-3) |
1698 | +#define PAGE_EXCLUDED (-4) |
1699 | + |
1700 | +#define RESTART() (longjmp(pc->main_loop_env, 1)) |
1701 | +#define RESUME_FOREACH() (longjmp(pc->foreach_loop_env, 1)) |
1702 | + |
1703 | +#define INFO (1) |
1704 | +#define FATAL (2) |
1705 | +#define FATAL_RESTART (3) |
1706 | +#define WARNING (4) |
1707 | +#define NOTE (5) |
1708 | +#define CONT (6) |
1709 | +#define FATAL_ERROR(x) (((x) == FATAL) || ((x) == FATAL_RESTART)) |
1710 | + |
1711 | +#define CONSOLE_OFF(x) ((x) = console_off()) |
1712 | +#define CONSOLE_ON(x) (console_on(x)) |
1713 | + |
1714 | +#define RADIX(X) (X) |
1715 | + |
1716 | +#define NUM_HEX (0x1) |
1717 | +#define NUM_DEC (0x2) |
1718 | +#define NUM_EXPR (0x4) |
1719 | +#define NUM_ANY (NUM_HEX|NUM_DEC|NUM_EXPR) |
1720 | + |
1721 | +/* |
1722 | + * program context redirect flags |
1723 | + */ |
1724 | +#define FROM_COMMAND_LINE (0x1) |
1725 | +#define FROM_INPUT_FILE (0x2) |
1726 | +#define REDIRECT_NOT_DONE (0x4) |
1727 | +#define REDIRECT_TO_PIPE (0x8) |
1728 | +#define REDIRECT_TO_STDPIPE (0x10) |
1729 | +#define REDIRECT_TO_FILE (0x20) |
1730 | +#define REDIRECT_FAILURE (0x40) |
1731 | +#define REDIRECT_SHELL_ESCAPE (0x80) |
1732 | +#define REDIRECT_SHELL_COMMAND (0x100) |
1733 | +#define REDIRECT_PID_KNOWN (0x200) |
1734 | +#define REDIRECT_MULTI_PIPE (0x400) |
1735 | + |
1736 | +#define PIPE_OPTIONS (FROM_COMMAND_LINE | FROM_INPUT_FILE | REDIRECT_TO_PIPE | \ |
1737 | + REDIRECT_TO_STDPIPE | REDIRECT_TO_FILE) |
1738 | + |
1739 | +#define DEFAULT_REDHAT_DEBUG_LOCATION "/usr/lib/debug/lib/modules" |
1740 | + |
1741 | +#define MEMORY_DRIVER_MODULE "crash" |
1742 | +#define MEMORY_DRIVER_DEVICE "/dev/crash" |
1743 | +#define MEMORY_DRIVER_DEVICE_MODE (S_IFCHR|S_IRUSR) |
1744 | + |
1745 | +/* |
1746 | + * structure definitions |
1747 | + */ |
1748 | +struct program_context { |
1749 | + char *program_name; /* this program's name */ |
1750 | + char *program_path; /* unadulterated argv[0] */ |
1751 | + char *program_version; /* this program's version */ |
1752 | + char *gdb_version; /* embedded gdb version */ |
1753 | + char *prompt; /* this program's prompt */ |
1754 | + unsigned long long flags; /* flags from above */ |
1755 | + char *namelist; /* linux namelist */ |
1756 | + char *dumpfile; /* dumpfile or /dev/kmem */ |
1757 | + char *live_memsrc; /* live memory driver */ |
1758 | + char *system_map; /* get symbol values from System.map */ |
1759 | + char *namelist_debug; /* namelist containing debug data */ |
1760 | + char *debuginfo_file; /* separate debuginfo file */ |
1761 | + char *memory_module; /* alternative to mem.c driver */ |
1762 | + char *memory_device; /* alternative to /dev/[k]mem device */ |
1763 | + char *machine_type; /* machine's processor type */ |
1764 | + char *editing_mode; /* readline vi or emacs */ |
1765 | + char *server; /* network daemon */ |
1766 | + char *server_memsrc; /* memory source on server */ |
1767 | + char *server_namelist; /* kernel namelist on server */ |
1768 | + int nfd; /* linux namelist fd */ |
1769 | + int mfd; /* /dev/mem fd */ |
1770 | + int kfd; /* /dev/kmem fd */ |
1771 | + int dfd; /* dumpfile fd */ |
1772 | + int confd; /* console fd */ |
1773 | + int sockfd; /* network daemon socket */ |
1774 | + ushort port; /* network daemon port */ |
1775 | + int rmfd; /* remote server memory source fd */ |
1776 | + int rkfd; /* remote server /dev/kmem fd */ |
1777 | + ulong program_pid; /* program pid */ |
1778 | + ulong server_pid; /* server pid */ |
1779 | + ulong rcvbufsize; /* client-side receive buffer size */ |
1780 | + char *home; /* user's home directory */ |
1781 | + char command_line[BUFSIZE]; /* possibly parsed input command line */ |
1782 | + char orig_line[BUFSIZE]; /* original input line */ |
1783 | + char *readline; /* pointer to last readline() return */ |
1784 | + char my_tty[10]; /* real tty name (shown by ps -ef) */ |
1785 | + ulong debug; /* level of debug */ |
1786 | + ulong debug_save; /* saved level for debug-suspend */ |
1787 | + char *console; /* current debug console device */ |
1788 | + char *redhat_debug_loc; /* location of matching debug objects */ |
1789 | + int pipefd[2]; /* output pipe file descriptors */ |
1790 | + FILE *nullfp; /* bitbucket */ |
1791 | + FILE *stdpipe; /* standard pipe for output */ |
1792 | + FILE *pipe; /* command line specified pipe */ |
1793 | + FILE *ofile; /* command line specified output file */ |
1794 | + FILE *ifile; /* command line specified input file */ |
1795 | + FILE *ifile_pipe; /* output pipe specified from file */ |
1796 | + FILE *ifile_ofile; /* output file specified from file */ |
1797 | + FILE *symfile; /* symbol table data file */ |
1798 | + FILE *symfile2; /* alternate access to above */ |
1799 | + FILE *tmpfile; /* tmpfile for selective data output */ |
1800 | + FILE *saved_fp; /* for printing while parsing tmpfile */ |
1801 | + FILE *tmp_fp; /* stored tmpfile pointer */ |
1802 | + char *input_file; /* input file specified at invocation */ |
1803 | + FILE *tmpfile2; /* tmpfile2 does not use save_fp! */ |
1804 | + int eoc_index; /* end of redirected command index */ |
1805 | + int scroll_command; /* default scroll command for output */ |
1806 | +#define SCROLL_NONE 0 |
1807 | +#define SCROLL_LESS 1 |
1808 | +#define SCROLL_MORE 2 |
1809 | +#define SCROLL_CRASHPAGER 3 |
1810 | + ulong redirect; /* per-cmd origin and output flags */ |
1811 | + pid_t stdpipe_pid; /* per-cmd standard output pipe's pid */ |
1812 | + pid_t pipe_pid; /* per-cmd output pipe's pid */ |
1813 | + pid_t pipe_shell_pid; /* per-cmd output pipe's shell pid */ |
1814 | + char pipe_command[BUFSIZE]; /* pipe command line */ |
1815 | + struct command_table_entry *cmd_table; /* linux/xen command table */ |
1816 | + char *curcmd; /* currently-executing command */ |
1817 | + char *lastcmd; /* previously-executed command */ |
1818 | + ulong cmdgencur; /* current command generation number */ |
1819 | + ulong curcmd_flags; /* general purpose per-command flag */ |
1820 | +#define XEN_MACHINE_ADDR (0x1) |
1821 | +#define REPEAT (0x2) |
1822 | +#define IDLE_TASK_SHOWN (0x4) |
1823 | +#define TASK_SPECIFIED (0x8) |
1824 | +#define MEMTYPE_UVADDR (0x10) |
1825 | +#define MEMTYPE_FILEADDR (0x20) |
1826 | +#define HEADER_PRINTED (0x40) |
1827 | +#define BAD_INSTRUCTION (0x80) |
1828 | +#define UD2A_INSTRUCTION (0x100) |
1829 | +#define IRQ_IN_USE (0x200) |
1830 | +#define NO_MODIFY (0x400) |
1831 | +#define IGNORE_ERRORS (0x800) |
1832 | +#define FROM_RCFILE (0x1000) |
1833 | +#define MEMTYPE_KVADDR (0x2000) |
1834 | +#define MOD_SECTIONS (0x4000) |
1835 | +#define MOD_READNOW (0x8000) |
1836 | + ulonglong curcmd_private; /* general purpose per-command info */ |
1837 | + int cur_gdb_cmd; /* current gdb command */ |
1838 | + int last_gdb_cmd; /* previously-executed gdb command */ |
1839 | + int sigint_cnt; /* number of ignored SIGINTs */ |
1840 | + struct gnu_request *cur_req; /* current gdb gnu_request */ |
1841 | + struct sigaction sigaction; /* general usage sigaction. */ |
1842 | + struct sigaction gdb_sigaction; /* gdb's SIGINT sigaction. */ |
1843 | + jmp_buf main_loop_env; /* longjmp target default */ |
1844 | + jmp_buf foreach_loop_env; /* longjmp target within foreach */ |
1845 | + jmp_buf gdb_interface_env; /* longjmp target for gdb error catch */ |
1846 | + struct termios termios_orig; /* non-raw settings */ |
1847 | + struct termios termios_raw; /* while gathering command input */ |
1848 | + int ncmds; /* number of commands in menu */ |
1849 | + char **cmdlist; /* current list of available commands */ |
1850 | + int cmdlistsz; /* space available in cmdlist */ |
1851 | + unsigned output_radix; /* current gdb output_radix */ |
1852 | + void *sbrk; /* current sbrk value */ |
1853 | + struct extension_table *curext; /* extension being loaded */ |
1854 | + int (*readmem)(int, void *, int, ulong, physaddr_t); /* memory access */ |
1855 | + int (*writemem)(int, void *, int, ulong, physaddr_t);/* memory access */ |
1856 | + ulong ifile_in_progress; /* original xxx_IFILE flags */ |
1857 | + off_t ifile_offset; /* current offset into input file */ |
1858 | + char *runtime_ifile_cmd; /* runtime command using input file */ |
1859 | + char *kvmdump_mapfile; /* storage of physical to file offsets */ |
1860 | + ulonglong flags2; /* flags overrun */ |
1861 | +#define FLAT (0x01ULL) |
1862 | +#define ELF_NOTES (0x02ULL) |
1863 | +#define GET_OSRELEASE (0x04ULL) |
1864 | +#define REMOTE_DAEMON (0x08ULL) |
1865 | +#define ERASEINFO_DATA (0x10ULL) |
1866 | +#define GDB_CMD_MODE (0x20ULL) |
1867 | +#define LIVE_DUMP (0x40ULL) |
1868 | +#define FLAT_FORMAT() (pc->flags2 & FLAT) |
1869 | +#define ELF_NOTES_VALID() (pc->flags2 & ELF_NOTES) |
1870 | +#define RADIX_OVERRIDE (0x80ULL) |
1871 | +#define QEMU_MEM_DUMP (0x100ULL) |
1872 | +#define GET_LOG (0x200ULL) |
1873 | +#define VMCOREINFO (0x400ULL) |
1874 | +#define ALLOW_FP (0x800ULL) |
1875 | + char *cleanup; |
1876 | + char *namelist_orig; |
1877 | + char *namelist_debug_orig; |
1878 | + FILE *args_ifile; /* per-command args input file */ |
1879 | + void (*cmd_cleanup)(void *); /* per-command cleanup function */ |
1880 | + void *cmd_cleanup_arg; /* optional cleanup function argument */ |
1881 | + ulong scope; /* optional text context address */ |
1882 | +}; |
1883 | + |
1884 | +#define READMEM pc->readmem |
1885 | + |
1886 | +typedef void (*cmd_func_t)(void); |
1887 | + |
1888 | +struct command_table_entry { /* one for each command in menu */ |
1889 | + char *name; |
1890 | + cmd_func_t func; |
1891 | + char **help_data; |
1892 | + ulong flags; |
1893 | +}; |
1894 | + |
1895 | +struct args_input_file { |
1896 | + int index; |
1897 | + int args_used; |
1898 | + int is_gdb_cmd; |
1899 | + int in_expression; |
1900 | + int start; |
1901 | + int resume; |
1902 | + char *fileptr; |
1903 | +}; |
1904 | + |
1905 | +#define REFRESH_TASK_TABLE (0x1) /* command_table_entry flags */ |
1906 | +#define HIDDEN_COMMAND (0x2) |
1907 | +#define CLEANUP (0x4) /* for extensions only */ |
1908 | +#define MINIMAL (0x8) |
1909 | + |
1910 | +/* |
1911 | + * A linked list of extension table structures keeps track of the current |
1912 | + * set of shared library extensions. |
1913 | + */ |
1914 | +struct extension_table { |
1915 | + void *handle; /* handle from dlopen() */ |
1916 | + char *filename; /* name of shared library */ |
1917 | + struct command_table_entry *command_table; /* list of commands */ |
1918 | + ulong flags; /* registration flags */ |
1919 | + struct extension_table *next, *prev; /* bookkeeping */ |
1920 | +}; |
1921 | + |
1922 | +#define REGISTERED (0x1) /* extension_table flags */ |
1923 | +#define DUPLICATE_COMMAND_NAME (0x2) |
1924 | +#define NO_MINIMAL_COMMANDS (0x4) |
1925 | + |
1926 | +struct new_utsname { |
1927 | + char sysname[65]; |
1928 | + char nodename[65]; |
1929 | + char release[65]; |
1930 | + char version[65]; |
1931 | + char machine[65]; |
1932 | + char domainname[65]; |
1933 | +}; |
1934 | + |
1935 | +#define NO_MODULE_ACCESS (0x1) |
1936 | +#define TVEC_BASES_V1 (0x2) |
1937 | +#define GCC_3_2 (0x4) |
1938 | +#define GCC_3_2_3 (0x8) |
1939 | +#define GCC_2_96 (0x10) |
1940 | +#define RA_SEEK (0x20) |
1941 | +#define NO_RA_SEEK (0x40) |
1942 | +#define KALLSYMS_V1 (0x80) |
1943 | +#define NO_KALLSYMS (0x100) |
1944 | +#define PER_CPU_OFF (0x200) |
1945 | +#define SMP (0x400) |
1946 | +#define GCC_3_3_2 (0x800) |
1947 | +#define KMOD_V1 (0x1000) |
1948 | +#define KMOD_V2 (0x2000) |
1949 | +#define KALLSYMS_V2 (0x2000) |
1950 | +#define TVEC_BASES_V2 (0x4000) |
1951 | +#define GCC_3_3_3 (0x8000) |
1952 | +#define USE_OLD_BT (0x10000) |
1953 | +#define ARCH_XEN (0x20000) |
1954 | +#define NO_IKCONFIG (0x40000) |
1955 | +#define DWARF_UNWIND (0x80000) |
1956 | +#define NO_DWARF_UNWIND (0x100000) |
1957 | +#define DWARF_UNWIND_MEMORY (0x200000) |
1958 | +#define DWARF_UNWIND_EH_FRAME (0x400000) |
1959 | +#define DWARF_UNWIND_CAPABLE (DWARF_UNWIND_MEMORY|DWARF_UNWIND_EH_FRAME) |
1960 | +#define DWARF_UNWIND_MODULES (0x800000) |
1961 | +#define BUGVERBOSE_OFF (0x1000000) |
1962 | +#define RELOC_SET (0x2000000) |
1963 | +#define RELOC_FORCE (0x4000000) |
1964 | +#define ARCH_OPENVZ (0x8000000) |
1965 | +#define ARCH_PVOPS (0x10000000) |
1966 | +#define PRE_KERNEL_INIT (0x20000000) |
1967 | +#define ARCH_PVOPS_XEN (0x40000000) |
1968 | +#define IRQ_DESC_TREE (0x80000000) |
1969 | + |
1970 | +#define GCC_VERSION_DEPRECATED (GCC_3_2|GCC_3_2_3|GCC_2_96|GCC_3_3_2|GCC_3_3_3) |
1971 | + |
1972 | +#define XEN() (kt->flags & ARCH_XEN) |
1973 | +#define OPENVZ() (kt->flags & ARCH_OPENVZ) |
1974 | +#define PVOPS() (kt->flags & ARCH_PVOPS) |
1975 | +#define PVOPS_XEN() (kt->flags & ARCH_PVOPS_XEN) |
1976 | + |
1977 | +#define XEN_MACHINE_TO_MFN(m) ((ulonglong)(m) >> PAGESHIFT()) |
1978 | +#define XEN_PFN_TO_PSEUDO(p) ((ulonglong)(p) << PAGESHIFT()) |
1979 | + |
1980 | +#define XEN_MFN_NOT_FOUND (~0UL) |
1981 | +#define XEN_PFNS_PER_PAGE (PAGESIZE()/sizeof(ulong)) |
1982 | +#define XEN_FOREIGN_FRAME (1UL << (BITS()-1)) |
1983 | + |
1984 | +#define XEN_MACHADDR_NOT_FOUND (~0ULL) |
1985 | + |
1986 | +#define XEN_P2M_PER_PAGE (PAGESIZE() / sizeof(unsigned long)) |
1987 | +#define XEN_P2M_MID_PER_PAGE (PAGESIZE() / sizeof(unsigned long *)) |
1988 | +#define XEN_P2M_TOP_PER_PAGE (PAGESIZE() / sizeof(unsigned long **)) |
1989 | + |
1990 | +struct kernel_table { /* kernel data */ |
1991 | + ulong flags; |
1992 | + ulong stext; |
1993 | + ulong etext; |
1994 | + ulong stext_init; |
1995 | + ulong etext_init; |
1996 | + ulong init_begin; |
1997 | + ulong init_end; |
1998 | + ulong end; |
1999 | + int cpus; |
2000 | + char *cpus_override; |
2001 | + void (*display_bh)(void); |
2002 | + ulong module_list; |
2003 | + ulong kernel_module; |
2004 | + int mods_installed; |
2005 | + struct timespec date; |
2006 | + char proc_version[BUFSIZE]; |
2007 | + struct new_utsname utsname; |
2008 | + uint kernel_version[3]; |
2009 | + uint gcc_version[3]; |
2010 | + int runq_siblings; |
2011 | + int kernel_NR_CPUS; |
2012 | + long __per_cpu_offset[NR_CPUS]; |
2013 | + long *__rq_idx; |
2014 | + long *__cpu_idx; |
2015 | + ulong *cpu_flags; |
2016 | +#define POSSIBLE (0x1) |
2017 | +#define PRESENT (0x2) |
2018 | +#define ONLINE (0x4) |
2019 | +#define NMI (0x8) |
2020 | + int BUG_bytes; |
2021 | + ulong xen_flags; |
2022 | +#define WRITABLE_PAGE_TABLES (0x1) |
2023 | +#define SHADOW_PAGE_TABLES (0x2) |
2024 | +#define CANONICAL_PAGE_TABLES (0x4) |
2025 | +#define XEN_SUSPEND (0x8) |
2026 | + char *m2p_page; |
2027 | + ulong phys_to_machine_mapping; |
2028 | + ulong p2m_table_size; |
2029 | +#define P2M_MAPPING_CACHE (512) |
2030 | + struct p2m_mapping_cache { |
2031 | + ulong mapping; |
2032 | + ulong pfn; |
2033 | + ulong start; |
2034 | + ulong end; |
2035 | + } p2m_mapping_cache[P2M_MAPPING_CACHE]; |
2036 | +#define P2M_MAPPING_PAGE_PFN(c) \ |
2037 | + (PVOPS_XEN() ? kt->p2m_mapping_cache[c].pfn : \ |
2038 | + (((kt->p2m_mapping_cache[c].mapping - kt->phys_to_machine_mapping)/PAGESIZE()) \ |
2039 | + * XEN_PFNS_PER_PAGE)) |
2040 | + ulong last_mapping_read; |
2041 | + ulong p2m_cache_index; |
2042 | + ulong p2m_pages_searched; |
2043 | + ulong p2m_mfn_cache_hits; |
2044 | + ulong p2m_page_cache_hits; |
2045 | + ulong relocate; |
2046 | + char *module_tree; |
2047 | + struct pvops_xen_info { |
2048 | + int p2m_top_entries; |
2049 | + ulong p2m_top; |
2050 | + ulong p2m_mid_missing; |
2051 | + ulong p2m_missing; |
2052 | + } pvops_xen; |
2053 | + int highest_irq; |
2054 | +#define IKCONFIG_AVAIL 0x1 /* kernel contains ikconfig data */ |
2055 | +#define IKCONFIG_LOADED 0x2 /* ikconfig data is currently loaded */ |
2056 | + int ikconfig_flags; |
2057 | + int ikconfig_ents; |
2058 | + char *hypervisor; |
2059 | + struct vmcoreinfo_data { |
2060 | + ulong log_buf_SYMBOL; |
2061 | + ulong log_end_SYMBOL; |
2062 | + ulong log_buf_len_SYMBOL; |
2063 | + ulong logged_chars_SYMBOL; |
2064 | + ulong log_first_idx_SYMBOL; |
2065 | + ulong log_next_idx_SYMBOL; |
2066 | + long log_SIZE; |
2067 | + long log_ts_nsec_OFFSET; |
2068 | + long log_len_OFFSET; |
2069 | + long log_text_len_OFFSET; |
2070 | + long log_dict_len_OFFSET; |
2071 | + ulong phys_base_SYMBOL; |
2072 | + ulong _stext_SYMBOL; |
2073 | + } vmcoreinfo; |
2074 | +}; |
2075 | + |
2076 | +/* |
2077 | + * Aid for the two versions of the kernel's module list linkage. |
2078 | + */ |
2079 | +#define NEXT_MODULE(next_module, modbuf) \ |
2080 | +{ \ |
2081 | + switch (kt->flags & (KMOD_V1|KMOD_V2)) \ |
2082 | + { \ |
2083 | + case KMOD_V1: \ |
2084 | + next_module = ULONG(modbuf + OFFSET(module_next)); \ |
2085 | + break; \ |
2086 | + case KMOD_V2: \ |
2087 | + next_module = ULONG(modbuf + OFFSET(module_list)); \ |
2088 | + if (next_module != kt->kernel_module) \ |
2089 | + next_module -= OFFSET(module_list); \ |
2090 | + break; \ |
2091 | + } \ |
2092 | +} |
2093 | + |
2094 | +#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 16) + \ |
2095 | + (kt->kernel_version[1] << 8) + \ |
2096 | + (kt->kernel_version[2])) |
2097 | +#define LINUX(x,y,z) (((uint)(x) << 16) + ((uint)(y) << 8) + (uint)(z)) |
2098 | + |
2099 | +#define THIS_GCC_VERSION ((kt->gcc_version[0] << 16) + \ |
2100 | + (kt->gcc_version[1] << 8) + \ |
2101 | + (kt->gcc_version[2])) |
2102 | +#define GCC(x,y,z) (((uint)(x) << 16) + ((uint)(y) << 8) + (uint)(z)) |
2103 | + |
2104 | +#define IS_KERNEL_STATIC_TEXT(x) (((ulong)(x) >= kt->stext) && \ |
2105 | + ((ulong)(x) < kt->etext)) |
2106 | + |
2107 | +#define TASK_COMM_LEN 16 /* task command name length including NULL */ |
2108 | + |
2109 | +struct task_context { /* context stored for each task */ |
2110 | + ulong task; |
2111 | + ulong thread_info; |
2112 | + ulong pid; |
2113 | + char comm[TASK_COMM_LEN+1]; |
2114 | + int processor; |
2115 | + ulong ptask; |
2116 | + ulong mm_struct; |
2117 | + struct task_context *tc_next; |
2118 | +}; |
2119 | + |
2120 | +struct task_table { /* kernel/local task table data */ |
2121 | + struct task_context *current; |
2122 | + struct task_context *context_array; |
2123 | + void (*refresh_task_table)(void); |
2124 | + ulong flags; |
2125 | + ulong task_start; |
2126 | + ulong task_end; |
2127 | + void *task_local; |
2128 | + int max_tasks; |
2129 | + int nr_threads; |
2130 | + ulong running_tasks; |
2131 | + ulong retries; |
2132 | + ulong panicmsg; |
2133 | + int panic_processor; |
2134 | + ulong *idle_threads; |
2135 | + ulong *panic_threads; |
2136 | + ulong *active_set; |
2137 | + ulong *panic_ksp; |
2138 | + ulong *hardirq_ctx; |
2139 | + ulong *hardirq_tasks; |
2140 | + ulong *softirq_ctx; |
2141 | + ulong *softirq_tasks; |
2142 | + ulong panic_task; |
2143 | + ulong this_task; |
2144 | + int pidhash_len; |
2145 | + ulong pidhash_addr; |
2146 | + ulong last_task_read; |
2147 | + ulong last_thread_info_read; |
2148 | + ulong last_mm_read; |
2149 | + char *task_struct; |
2150 | + char *thread_info; |
2151 | + char *mm_struct; |
2152 | + ulong init_pid_ns; |
2153 | +}; |
2154 | + |
2155 | +#define TASK_INIT_DONE (0x1) |
2156 | +#define TASK_ARRAY_EXISTS (0x2) |
2157 | +#define PANIC_TASK_NOT_FOUND (0x4) |
2158 | +#define TASK_REFRESH (0x8) |
2159 | +#define TASK_REFRESH_OFF (0x10) |
2160 | +#define PANIC_KSP (0x20) |
2161 | +#define ACTIVE_SET (0x40) |
2162 | +#define POPULATE_PANIC (0x80) |
2163 | +#define PIDHASH (0x100) |
2164 | +#define PID_HASH (0x200) |
2165 | +#define THREAD_INFO (0x400) |
2166 | +#define IRQSTACKS (0x800) |
2167 | +#define TIMESPEC (0x1000) |
2168 | +#define NO_TIMESPEC (0x2000) |
2169 | +#define ACTIVE_ONLY (0x4000) |
2170 | + |
2171 | +#define TASK_SLUSH (20) |
2172 | + |
2173 | +#define NO_PROC_ID 0xFF /* No processor magic marker (from kernel) */ |
2174 | + |
2175 | +/* |
2176 | + * Global "tt" points to task_table |
2177 | + */ |
2178 | +#define CURRENT_CONTEXT() (tt->current) |
2179 | +#define CURRENT_TASK() (tt->current->task) |
2180 | +#define CURRENT_PID() (tt->current->pid) |
2181 | +#define CURRENT_COMM() (tt->current->comm) |
2182 | +#define RUNNING_TASKS() (tt->running_tasks) |
2183 | +#define FIRST_CONTEXT() (tt->context_array) |
2184 | + |
2185 | +#define NO_PID ((ulong)-1) |
2186 | +#define NO_TASK (0) |
2187 | + |
2188 | +#define IS_TASK_ADDR(X) (machdep->is_task_addr(X)) |
2189 | +#define GET_STACKBASE(X) (machdep->get_stackbase(X)) |
2190 | +#define GET_STACKTOP(X) (machdep->get_stacktop(X)) |
2191 | +#define STACKSIZE() (machdep->stacksize) |
2192 | +#define LONGS_PER_STACK (machdep->stacksize/sizeof(ulong)) |
2193 | + |
2194 | +#define INSTACK(X,BT) \ |
2195 | + (((ulong)(X) >= (BT)->stackbase) && ((ulong)(X) < (BT)->stacktop)) |
2196 | + |
2197 | +#define ALIGNED_STACK_OFFSET(task) ((ulong)(task) & (STACKSIZE()-1)) |
2198 | + |
2199 | +#define BITS() (machdep->bits) |
2200 | +#define BITS32() (machdep->bits == 32) |
2201 | +#define BITS64() (machdep->bits == 64) |
2202 | +#define IS_KVADDR(X) (machdep->is_kvaddr(X)) |
2203 | +#define IS_UVADDR(X,C) (machdep->is_uvaddr(X,C)) |
2204 | + |
2205 | +#define PID_ALIVE(x) (kill(x, 0) == 0) |
2206 | + |
2207 | +struct kernel_list_head { |
2208 | + struct kernel_list_head *next, *prev; |
2209 | +}; |
2210 | + |
2211 | +struct stack_hook { |
2212 | + ulong esp; |
2213 | + ulong eip; |
2214 | +}; |
2215 | + |
2216 | +struct bt_info { |
2217 | + ulong task; |
2218 | + ulonglong flags; |
2219 | + ulong instptr; |
2220 | + ulong stkptr; |
2221 | + ulong bptr; |
2222 | + ulong stackbase; |
2223 | + ulong stacktop; |
2224 | + char *stackbuf; |
2225 | + struct task_context *tc; |
2226 | + struct stack_hook *hp; |
2227 | + struct stack_hook *textlist; |
2228 | + struct reference *ref; |
2229 | + ulong frameptr; |
2230 | + char *call_target; |
2231 | + void *machdep; |
2232 | + ulong debug; |
2233 | + ulong eframe_ip; |
2234 | + ulong radix; |
2235 | +}; |
2236 | + |
2237 | +#define STACK_OFFSET_TYPE(OFF) \ |
2238 | + (((ulong)(OFF) > STACKSIZE()) ? \ |
2239 | + (ulong)((ulong)(OFF) - (ulong)(bt->stackbase)) : (ulong)(OFF)) |
2240 | + |
2241 | +#define GET_STACK_ULONG(OFF) \ |
2242 | + *((ulong *)((char *)(&bt->stackbuf[(ulong)(STACK_OFFSET_TYPE(OFF))]))) |
2243 | + |
2244 | +#define GET_STACK_DATA(OFF, LOC, SZ) memcpy((void *)(LOC), \ |
2245 | + (void *)(&bt->stackbuf[(ulong)STACK_OFFSET_TYPE(OFF)]), (size_t)(SZ)) |
2246 | + |
2247 | +struct machine_specific; /* uniquely defined below each machine's area */ |
2248 | +struct xendump_data; |
2249 | +struct xen_kdump_data; |
2250 | + |
2251 | +struct vaddr_range { |
2252 | + ulong start; |
2253 | + ulong end; |
2254 | + ulong type; |
2255 | +#define KVADDR_UNITY_MAP (1) |
2256 | +#define KVADDR_VMALLOC (2) |
2257 | +#define KVADDR_VMEMMAP (3) |
2258 | +#define KVADDR_START_MAP (4) |
2259 | +#define KVADDR_MODULES (5) |
2260 | +#define MAX_KVADDR_RANGES KVADDR_MODULES |
2261 | +}; |
2262 | + |
2263 | +#define MAX_MACHDEP_ARGS 5 /* for --machdep/-m machine-specific args */ |
2264 | + |
2265 | +struct machdep_table { |
2266 | + ulong flags; |
2267 | + ulong kvbase; |
2268 | + ulong identity_map_base; |
2269 | + uint pagesize; |
2270 | + uint pageshift; |
2271 | + ulonglong pagemask; |
2272 | + ulong pageoffset; |
2273 | + ulong stacksize; |
2274 | + uint hz; |
2275 | + ulong mhz; |
2276 | + int bits; |
2277 | + int nr_irqs; |
2278 | + uint64_t memsize; |
2279 | + int (*eframe_search)(struct bt_info *); |
2280 | + void (*back_trace)(struct bt_info *); |
2281 | + ulong (*processor_speed)(void); |
2282 | + int (*uvtop)(struct task_context *, ulong, physaddr_t *, int); |
2283 | + int (*kvtop)(struct task_context *, ulong, physaddr_t *, int); |
2284 | + ulong (*get_task_pgd)(ulong); |
2285 | + void (*dump_irq)(int); |
2286 | + void (*get_stack_frame)(struct bt_info *, ulong *, ulong *); |
2287 | + ulong (*get_stackbase)(ulong); |
2288 | + ulong (*get_stacktop)(ulong); |
2289 | + int (*translate_pte)(ulong, void *, ulonglong); |
2290 | + uint64_t (*memory_size)(void); |
2291 | + ulong (*vmalloc_start)(void); |
2292 | + int (*is_task_addr)(ulong); |
2293 | + int (*verify_symbol)(const char *, ulong, char); |
2294 | + int (*dis_filter)(ulong, char *, unsigned int); |
2295 | + int (*get_smp_cpus)(void); |
2296 | + int (*is_kvaddr)(ulong); |
2297 | + int (*is_uvaddr)(ulong, struct task_context *); |
2298 | + int (*verify_paddr)(uint64_t); |
2299 | + void (*cmd_mach)(void); |
2300 | + void (*init_kernel_pgd)(void); |
2301 | + struct syment *(*value_to_symbol)(ulong, ulong *); |
2302 | + struct line_number_hook { |
2303 | + char *func; |
2304 | + char **file; |
2305 | + } *line_number_hooks; |
2306 | + ulong last_pgd_read; |
2307 | + ulong last_pud_read; |
2308 | + ulong last_pmd_read; |
2309 | + ulong last_ptbl_read; |
2310 | + char *pgd; |
2311 | + char *pud; |
2312 | + char *pmd; |
2313 | + char *ptbl; |
2314 | + int ptrs_per_pgd; |
2315 | + char *cmdline_args[MAX_MACHDEP_ARGS]; |
2316 | + struct machine_specific *machspec; |
2317 | + ulong section_size_bits; |
2318 | + ulong max_physmem_bits; |
2319 | + ulong sections_per_root; |
2320 | + int (*xendump_p2m_create)(struct xendump_data *); |
2321 | + ulong (*xendump_panic_task)(struct xendump_data *); |
2322 | + void (*get_xendump_regs)(struct xendump_data *, struct bt_info *, ulong *, ulong *); |
2323 | + void (*clear_machdep_cache)(void); |
2324 | + int (*xen_kdump_p2m_create)(struct xen_kdump_data *); |
2325 | + int (*in_alternate_stack)(int, ulong); |
2326 | + void (*dumpfile_init)(int, void *); |
2327 | + void (*process_elf_notes)(void *, unsigned long); |
2328 | + int (*get_kvaddr_ranges)(struct vaddr_range *); |
2329 | + int (*verify_line_number)(ulong, ulong, ulong); |
2330 | + void (*get_irq_affinity)(int); |
2331 | + void (*show_interrupts)(int, ulong *); |
2332 | +}; |
2333 | + |
2334 | +/* |
2335 | + * Processor-common flags; processor-specific flags use the lower bits |
2336 | + * as defined in their processor-specific files below. (see KSYMS_START defs). |
2337 | + */ |
2338 | +#define HWRESET (0x80000000) |
2339 | +#define OMIT_FRAME_PTR (0x40000000) |
2340 | +#define FRAMESIZE_DEBUG (0x20000000) |
2341 | +#define MACHDEP_BT_TEXT (0x10000000) |
2342 | +#define DEVMEMRD (0x8000000) |
2343 | +#define INIT (0x4000000) |
2344 | +#define VM_4_LEVEL (0x2000000) |
2345 | +#define MCA (0x1000000) |
2346 | +#define PAE (0x800000) |
2347 | +#define VMEMMAP (0x400000) |
2348 | + |
2349 | +extern struct machdep_table *machdep; |
2350 | + |
2351 | +#ifndef HZ |
2352 | +#define HZ sysconf(_SC_CLK_TCK) |
2353 | +#endif |
2354 | + |
2355 | +#define IS_LAST_PGD_READ(pgd) ((ulong)(pgd) == machdep->last_pgd_read) |
2356 | +#define IS_LAST_PMD_READ(pmd) ((ulong)(pmd) == machdep->last_pmd_read) |
2357 | +#define IS_LAST_PTBL_READ(ptbl) ((ulong)(ptbl) == machdep->last_ptbl_read) |
2358 | +#define IS_LAST_PUD_READ(pud) ((ulong)(pud) == machdep->last_pud_read) |
2359 | + |
2360 | +#define FILL_PGD(PGD, TYPE, SIZE) \ |
2361 | + if (!IS_LAST_PGD_READ(PGD)) { \ |
2362 | + readmem((ulonglong)((ulong)(PGD)), TYPE, machdep->pgd, \ |
2363 | + SIZE, "pgd page", FAULT_ON_ERROR); \ |
2364 | + machdep->last_pgd_read = (ulong)(PGD); \ |
2365 | + } |
2366 | + |
2367 | +#define FILL_PUD(PUD, TYPE, SIZE) \ |
2368 | + if (!IS_LAST_PUD_READ(PUD)) { \ |
2369 | + readmem((ulonglong)((ulong)(PUD)), TYPE, machdep->pud, \ |
2370 | + SIZE, "pud page", FAULT_ON_ERROR); \ |
2371 | + machdep->last_pud_read = (ulong)(PUD); \ |
2372 | + } |
2373 | + |
2374 | +#define FILL_PMD(PMD, TYPE, SIZE) \ |
2375 | + if (!IS_LAST_PMD_READ(PMD)) { \ |
2376 | + readmem((ulonglong)(PMD), TYPE, machdep->pmd, \ |
2377 | + SIZE, "pmd page", FAULT_ON_ERROR); \ |
2378 | + machdep->last_pmd_read = (ulong)(PMD); \ |
2379 | + } |
2380 | + |
2381 | +#define FILL_PTBL(PTBL, TYPE, SIZE) \ |
2382 | + if (!IS_LAST_PTBL_READ(PTBL)) { \ |
2383 | + readmem((ulonglong)(PTBL), TYPE, machdep->ptbl, \ |
2384 | + SIZE, "page table", FAULT_ON_ERROR); \ |
2385 | + machdep->last_ptbl_read = (ulong)(PTBL); \ |
2386 | + } |
2387 | + |
2388 | +#define SETUP_ENV (0) |
2389 | +#define PRE_SYMTAB (1) |
2390 | +#define PRE_GDB (2) |
2391 | +#define POST_GDB (3) |
2392 | +#define POST_INIT (4) |
2393 | +#define POST_VM (5) |
2394 | +#define LOG_ONLY (6) |
2395 | + |
2396 | +#define FOREACH_BT (1) |
2397 | +#define FOREACH_VM (2) |
2398 | +#define FOREACH_TASK (3) |
2399 | +#define FOREACH_SET (4) |
2400 | +#define FOREACH_FILES (5) |
2401 | +#define FOREACH_NET (6) |
2402 | +#define FOREACH_TEST (7) |
2403 | +#define FOREACH_VTOP (8) |
2404 | +#define FOREACH_SIG (9) |
2405 | +#define FOREACH_PS (10) |
2406 | + |
2407 | +#define MAX_FOREACH_KEYWORDS (10) |
2408 | +#define MAX_FOREACH_TASKS (50) |
2409 | +#define MAX_FOREACH_PIDS (50) |
2410 | +#define MAX_FOREACH_COMMS (50) |
2411 | +#define MAX_FOREACH_ARGS (50) |
2412 | +#define MAX_REGEX_ARGS (10) |
2413 | + |
2414 | +#define FOREACH_CMD (0x1) |
2415 | +#define FOREACH_r_FLAG (0x2) |
2416 | +#define FOREACH_s_FLAG (0x4) |
2417 | +#define FOREACH_S_FLAG (0x8) |
2418 | +#define FOREACH_i_FLAG (0x10) |
2419 | +#define FOREACH_e_FLAG (0x20) |
2420 | +#define FOREACH_g_FLAG (0x40) |
2421 | +#define FOREACH_l_FLAG (0x80) |
2422 | +#define FOREACH_p_FLAG (0x100) |
2423 | +#define FOREACH_t_FLAG (0x200) |
2424 | +#define FOREACH_u_FLAG (0x400) |
2425 | +#define FOREACH_m_FLAG (0x800) |
2426 | +#define FOREACH_v_FLAG (0x1000) |
2427 | +#define FOREACH_KERNEL (0x2000) |
2428 | +#define FOREACH_USER (0x4000) |
2429 | +#define FOREACH_SPECIFIED (0x8000) |
2430 | +#define FOREACH_ACTIVE (0x10000) |
2431 | +#define FOREACH_k_FLAG (0x20000) |
2432 | +#define FOREACH_c_FLAG (0x40000) |
2433 | +#define FOREACH_f_FLAG (0x80000) |
2434 | +#define FOREACH_o_FLAG (0x100000) |
2435 | +#define FOREACH_T_FLAG (0x200000) |
2436 | +#define FOREACH_F_FLAG (0x400000) |
2437 | +#define FOREACH_x_FLAG (0x800000) |
2438 | +#define FOREACH_d_FLAG (0x1000000) |
2439 | +#define FOREACH_STATE (0x2000000) |
2440 | +#define FOREACH_a_FLAG (0x4000000) |
2441 | +#define FOREACH_G_FLAG (0x8000000) |
2442 | + |
2443 | +#define FOREACH_PS_EXCLUSIVE \ |
2444 | + (FOREACH_g_FLAG|FOREACH_a_FLAG|FOREACH_t_FLAG|FOREACH_c_FLAG|FOREACH_p_FLAG|FOREACH_l_FLAG|FOREACH_r_FLAG) |
2445 | + |
2446 | +struct foreach_data { |
2447 | + ulong flags; |
2448 | + int keyword_array[MAX_FOREACH_KEYWORDS]; |
2449 | + ulong task_array[MAX_FOREACH_TASKS]; |
2450 | + char *comm_array[MAX_FOREACH_COMMS]; |
2451 | + ulong pid_array[MAX_FOREACH_PIDS]; |
2452 | + ulong arg_array[MAX_FOREACH_ARGS]; |
2453 | + struct regex_info { |
2454 | + char *pattern; |
2455 | + regex_t regex; |
2456 | + } regex_info[MAX_REGEX_ARGS]; |
2457 | + ulong state; |
2458 | + char *reference; |
2459 | + int keys; |
2460 | + int pids; |
2461 | + int tasks; |
2462 | + int comms; |
2463 | + int args; |
2464 | + int regexs; |
2465 | +}; |
2466 | + |
2467 | +struct reference { |
2468 | + char *str; |
2469 | + ulong cmdflags; |
2470 | + ulong hexval; |
2471 | + ulong decval; |
2472 | + ulong ref1; |
2473 | + ulong ref2; |
2474 | + void *refp; |
2475 | +}; |
2476 | + |
2477 | +struct offset_table { /* stash of commonly-used offsets */ |
2478 | + long list_head_next; /* add new entries to end of table */ |
2479 | + long list_head_prev; |
2480 | + long task_struct_pid; |
2481 | + long task_struct_state; |
2482 | + long task_struct_comm; |
2483 | + long task_struct_mm; |
2484 | + long task_struct_tss; |
2485 | + long task_struct_thread; |
2486 | + long task_struct_active_mm; |
2487 | + long task_struct_tss_eip; |
2488 | + long task_struct_tss_esp; |
2489 | + long task_struct_tss_ksp; |
2490 | + long task_struct_processor; |
2491 | + long task_struct_p_pptr; |
2492 | + long task_struct_parent; |
2493 | + long task_struct_has_cpu; |
2494 | + long task_struct_cpus_runnable; |
2495 | + long task_struct_thread_eip; |
2496 | + long task_struct_thread_esp; |
2497 | + long task_struct_thread_ksp; |
2498 | + long task_struct_next_task; |
2499 | + long task_struct_files; |
2500 | + long task_struct_fs; |
2501 | + long task_struct_pidhash_next; |
2502 | + long task_struct_next_run; |
2503 | + long task_struct_flags; |
2504 | + long task_struct_sig; |
2505 | + long task_struct_signal; |
2506 | + long task_struct_blocked; |
2507 | + long task_struct_sigpending; |
2508 | + long task_struct_pending; |
2509 | + long task_struct_sigqueue; |
2510 | + long task_struct_sighand; |
2511 | + long task_struct_start_time; |
2512 | + long task_struct_times; |
2513 | + long task_struct_utime; |
2514 | + long task_struct_stime; |
2515 | + long task_struct_cpu; |
2516 | + long task_struct_run_list; |
2517 | + long task_struct_pgrp; |
2518 | + long task_struct_tgid; |
2519 | + long task_struct_namespace; |
2520 | + long task_struct_pids; |
2521 | + long task_struct_last_run; |
2522 | + long task_struct_timestamp; |
2523 | + long task_struct_thread_info; |
2524 | + long task_struct_nsproxy; |
2525 | + long task_struct_rlim; |
2526 | + long thread_info_task; |
2527 | + long thread_info_cpu; |
2528 | + long thread_info_previous_esp; |
2529 | + long thread_info_flags; |
2530 | + long nsproxy_mnt_ns; |
2531 | + long mnt_namespace_root; |
2532 | + long mnt_namespace_list; |
2533 | + long pid_link_pid; |
2534 | + long pid_hash_chain; |
2535 | + long hlist_node_next; |
2536 | + long hlist_node_pprev; |
2537 | + long pid_pid_chain; |
2538 | + long thread_struct_eip; |
2539 | + long thread_struct_esp; |
2540 | + long thread_struct_ksp; |
2541 | + long thread_struct_fph; |
2542 | + long thread_struct_rip; |
2543 | + long thread_struct_rsp; |
2544 | + long thread_struct_rsp0; |
2545 | + long tms_tms_utime; |
2546 | + long tms_tms_stime; |
2547 | + long signal_struct_count; |
2548 | + long signal_struct_action; |
2549 | + long signal_struct_shared_pending; |
2550 | + long signal_struct_rlim; |
2551 | + long k_sigaction_sa; |
2552 | + long sigaction_sa_handler; |
2553 | + long sigaction_sa_flags; |
2554 | + long sigaction_sa_mask; |
2555 | + long sigpending_head; |
2556 | + long sigpending_list; |
2557 | + long sigpending_signal; |
2558 | + long signal_queue_next; |
2559 | + long signal_queue_info; |
2560 | + long sigqueue_next; |
2561 | + long sigqueue_list; |
2562 | + long sigqueue_info; |
2563 | + long sighand_struct_action; |
2564 | + long siginfo_si_signo; |
2565 | + long thread_struct_cr3; |
2566 | + long thread_struct_ptbr; |
2567 | + long thread_struct_pg_tables; |
2568 | + long switch_stack_r26; |
2569 | + long switch_stack_b0; |
2570 | + long switch_stack_ar_bspstore; |
2571 | + long switch_stack_ar_pfs; |
2572 | + long switch_stack_ar_rnat; |
2573 | + long switch_stack_pr; |
2574 | + long cpuinfo_ia64_proc_freq; |
2575 | + long cpuinfo_ia64_unimpl_va_mask; |
2576 | + long cpuinfo_ia64_unimpl_pa_mask; |
2577 | + long device_node_type; |
2578 | + long device_node_allnext; |
2579 | + long device_node_properties; |
2580 | + long property_name; |
2581 | + long property_value; |
2582 | + long property_next; |
2583 | + long machdep_calls_setup_residual; |
2584 | + long RESIDUAL_VitalProductData; |
2585 | + long VPD_ProcessorHz; |
2586 | + long bd_info_bi_intfreq; |
2587 | + long hwrpb_struct_cycle_freq; |
2588 | + long hwrpb_struct_processor_offset; |
2589 | + long hwrpb_struct_processor_size; |
2590 | + long percpu_struct_halt_PC; |
2591 | + long percpu_struct_halt_ra; |
2592 | + long percpu_struct_halt_pv; |
2593 | + long mm_struct_mmap; |
2594 | + long mm_struct_pgd; |
2595 | + long mm_struct_rss; |
2596 | + long mm_struct_anon_rss; |
2597 | + long mm_struct_file_rss; |
2598 | + long mm_struct_total_vm; |
2599 | + long mm_struct_start_code; |
2600 | + long mm_struct_arg_start; |
2601 | + long mm_struct_arg_end; |
2602 | + long mm_struct_env_start; |
2603 | + long mm_struct_env_end; |
2604 | + long vm_area_struct_vm_mm; |
2605 | + long vm_area_struct_vm_next; |
2606 | + long vm_area_struct_vm_end; |
2607 | + long vm_area_struct_vm_start; |
2608 | + long vm_area_struct_vm_flags; |
2609 | + long vm_area_struct_vm_file; |
2610 | + long vm_area_struct_vm_offset; |
2611 | + long vm_area_struct_vm_pgoff; |
2612 | + long vm_struct_addr; |
2613 | + long vm_struct_size; |
2614 | + long vm_struct_next; |
2615 | + long module_size_of_struct; |
2616 | + long module_next; |
2617 | + long module_size; |
2618 | + long module_name; |
2619 | + long module_nsyms; |
2620 | + long module_syms; |
2621 | + long module_flags; |
2622 | + long module_num_syms; |
2623 | + long module_list; |
2624 | + long module_gpl_syms; |
2625 | + long module_num_gpl_syms; |
2626 | + long module_module_core; |
2627 | + long module_core_size; |
2628 | + long module_core_text_size; |
2629 | + long module_num_symtab; |
2630 | + long module_symtab; |
2631 | + long module_strtab; |
2632 | + |
2633 | + long module_kallsyms_start; |
2634 | + long kallsyms_header_sections; |
2635 | + long kallsyms_header_section_off; |
2636 | + long kallsyms_header_symbols; |
2637 | + long kallsyms_header_symbol_off; |
2638 | + long kallsyms_header_string_off; |
2639 | + long kallsyms_symbol_section_off; |
2640 | + long kallsyms_symbol_symbol_addr; |
2641 | + long kallsyms_symbol_name_off; |
2642 | + long kallsyms_section_start; |
2643 | + long kallsyms_section_size; |
2644 | + long kallsyms_section_name_off; |
2645 | + |
2646 | + long page_next; |
2647 | + long page_prev; |
2648 | + long page_next_hash; |
2649 | + long page_list; |
2650 | + long page_list_next; |
2651 | + long page_list_prev; |
2652 | + long page_inode; |
2653 | + long page_offset; |
2654 | + long page_count; |
2655 | + long page_flags; |
2656 | + long page_mapping; |
2657 | + long page_index; |
2658 | + long page_buffers; |
2659 | + long page_lru; |
2660 | + long page_pte; |
2661 | + long swap_info_struct_swap_file; |
2662 | + long swap_info_struct_swap_vfsmnt; |
2663 | + long swap_info_struct_flags; |
2664 | + long swap_info_struct_swap_map; |
2665 | + long swap_info_struct_swap_device; |
2666 | + long swap_info_struct_prio; |
2667 | + long swap_info_struct_max; |
2668 | + long swap_info_struct_pages; |
2669 | + long swap_info_struct_old_block_size; |
2670 | + long block_device_bd_inode; |
2671 | + long block_device_bd_list; |
2672 | + long block_device_bd_disk; |
2673 | + long irq_desc_t_status; |
2674 | + long irq_desc_t_handler; |
2675 | + long irq_desc_t_chip; |
2676 | + long irq_desc_t_action; |
2677 | + long irq_desc_t_depth; |
2678 | + long irqdesc_action; |
2679 | + long irqdesc_ctl; |
2680 | + long irqdesc_level; |
2681 | + long irqaction_handler; |
2682 | + long irqaction_flags; |
2683 | + long irqaction_mask; |
2684 | + long irqaction_name; |
2685 | + long irqaction_dev_id; |
2686 | + long irqaction_next; |
2687 | + long hw_interrupt_type_typename; |
2688 | + long hw_interrupt_type_startup; |
2689 | + long hw_interrupt_type_shutdown; |
2690 | + long hw_interrupt_type_handle; |
2691 | + long hw_interrupt_type_enable; |
2692 | + long hw_interrupt_type_disable; |
2693 | + long hw_interrupt_type_ack; |
2694 | + long hw_interrupt_type_end; |
2695 | + long hw_interrupt_type_set_affinity; |
2696 | + long irq_chip_typename; |
2697 | + long irq_chip_startup; |
2698 | + long irq_chip_shutdown; |
2699 | + long irq_chip_enable; |
2700 | + long irq_chip_disable; |
2701 | + long irq_chip_ack; |
2702 | + long irq_chip_end; |
2703 | + long irq_chip_set_affinity; |
2704 | + long irq_chip_mask; |
2705 | + long irq_chip_mask_ack; |
2706 | + long irq_chip_unmask; |
2707 | + long irq_chip_eoi; |
2708 | + long irq_chip_retrigger; |
2709 | + long irq_chip_set_type; |
2710 | + long irq_chip_set_wake; |
2711 | + long irq_cpustat_t___softirq_active; |
2712 | + long irq_cpustat_t___softirq_mask; |
2713 | + long fdtable_max_fds; |
2714 | + long fdtable_max_fdset; |
2715 | + long fdtable_open_fds; |
2716 | + long fdtable_fd; |
2717 | + long files_struct_fdt; |
2718 | + long files_struct_max_fds; |
2719 | + long files_struct_max_fdset; |
2720 | + long files_struct_open_fds; |
2721 | + long files_struct_fd; |
2722 | + long files_struct_open_fds_init; |
2723 | + long file_f_dentry; |
2724 | + long file_f_vfsmnt; |
2725 | + long file_f_count; |
2726 | + long file_f_path; |
2727 | + long path_mnt; |
2728 | + long path_dentry; |
2729 | + long fs_struct_root; |
2730 | + long fs_struct_pwd; |
2731 | + long fs_struct_rootmnt; |
2732 | + long fs_struct_pwdmnt; |
2733 | + long dentry_d_inode; |
2734 | + long dentry_d_parent; |
2735 | + long dentry_d_name; |
2736 | + long dentry_d_covers; |
2737 | + long dentry_d_iname; |
2738 | + long qstr_len; |
2739 | + long qstr_name; |
2740 | + long inode_i_mode; |
2741 | + long inode_i_op; |
2742 | + long inode_i_sb; |
2743 | + long inode_u; |
2744 | + long inode_i_flock; |
2745 | + long inode_i_fop; |
2746 | + long inode_i_mapping; |
2747 | + long address_space_nrpages; |
2748 | + long vfsmount_mnt_next; |
2749 | + long vfsmount_mnt_devname; |
2750 | + long vfsmount_mnt_dirname; |
2751 | + long vfsmount_mnt_sb; |
2752 | + long vfsmount_mnt_list; |
2753 | + long vfsmount_mnt_mountpoint; |
2754 | + long vfsmount_mnt_parent; |
2755 | + long namespace_root; |
2756 | + long namespace_list; |
2757 | + long super_block_s_dirty; |
2758 | + long super_block_s_type; |
2759 | + long super_block_s_files; |
2760 | + long file_system_type_name; |
2761 | + long nlm_file_f_file; |
2762 | + long file_lock_fl_owner; |
2763 | + long nlm_host_h_exportent; |
2764 | + long svc_client_cl_ident; |
2765 | + long kmem_cache_s_c_nextp; |
2766 | + long kmem_cache_s_c_name; |
2767 | + long kmem_cache_s_c_num; |
2768 | + long kmem_cache_s_c_org_size; |
2769 | + long kmem_cache_s_c_flags; |
2770 | + long kmem_cache_s_c_offset; |
2771 | + long kmem_cache_s_c_firstp; |
2772 | + long kmem_cache_s_c_gfporder; |
2773 | + long kmem_cache_s_c_magic; |
2774 | + long kmem_cache_s_num; |
2775 | + long kmem_cache_s_next; |
2776 | + long kmem_cache_s_name; |
2777 | + long kmem_cache_s_objsize; |
2778 | + long kmem_cache_s_flags; |
2779 | + long kmem_cache_s_gfporder; |
2780 | + long kmem_cache_s_slabs; |
2781 | + long kmem_cache_s_slabs_full; |
2782 | + long kmem_cache_s_slabs_partial; |
2783 | + long kmem_cache_s_slabs_free; |
2784 | + long kmem_cache_s_cpudata; |
2785 | + long kmem_cache_s_c_align; |
2786 | + long kmem_cache_s_colour_off; |
2787 | + long cpucache_s_avail; |
2788 | + long cpucache_s_limit; |
2789 | + long kmem_cache_s_array; |
2790 | + long array_cache_avail; |
2791 | + long array_cache_limit; |
2792 | + long kmem_cache_s_lists; |
2793 | + long kmem_list3_slabs_partial; |
2794 | + long kmem_list3_slabs_full; |
2795 | + long kmem_list3_slabs_free; |
2796 | + long kmem_list3_free_objects; |
2797 | + long kmem_list3_shared; |
2798 | + long kmem_slab_s_s_nextp; |
2799 | + long kmem_slab_s_s_freep; |
2800 | + long kmem_slab_s_s_inuse; |
2801 | + long kmem_slab_s_s_mem; |
2802 | + long kmem_slab_s_s_index; |
2803 | + long kmem_slab_s_s_offset; |
2804 | + long kmem_slab_s_s_magic; |
2805 | + long slab_s_list; |
2806 | + long slab_s_s_mem; |
2807 | + long slab_s_inuse; |
2808 | + long slab_s_free; |
2809 | + long slab_list; |
2810 | + long slab_s_mem; |
2811 | + long slab_inuse; |
2812 | + long slab_free; |
2813 | + long net_device_next; |
2814 | + long net_device_name; |
2815 | + long net_device_type; |
2816 | + long net_device_addr_len; |
2817 | + long net_device_ip_ptr; |
2818 | + long net_device_dev_list; |
2819 | + long net_dev_base_head; |
2820 | + long device_next; |
2821 | + long device_name; |
2822 | + long device_type; |
2823 | + long device_ip_ptr; |
2824 | + long device_addr_len; |
2825 | + long socket_sk; |
2826 | + long sock_daddr; |
2827 | + long sock_rcv_saddr; |
2828 | + long sock_dport; |
2829 | + long sock_sport; |
2830 | + long sock_num; |
2831 | + long sock_type; |
2832 | + long sock_family; |
2833 | + long sock_common_skc_family; |
2834 | + long sock_sk_type; |
2835 | + long inet_sock_inet; |
2836 | + long inet_opt_daddr; |
2837 | + long inet_opt_rcv_saddr; |
2838 | + long inet_opt_dport; |
2839 | + long inet_opt_sport; |
2840 | + long inet_opt_num; |
2841 | + long ipv6_pinfo_rcv_saddr; |
2842 | + long ipv6_pinfo_daddr; |
2843 | + long timer_list_list; |
2844 | + long timer_list_next; |
2845 | + long timer_list_entry; |
2846 | + long timer_list_expires; |
2847 | + long timer_list_function; |
2848 | + long timer_vec_root_vec; |
2849 | + long timer_vec_vec; |
2850 | + long tvec_root_s_vec; |
2851 | + long tvec_s_vec; |
2852 | + long tvec_t_base_s_tv1; |
2853 | + long wait_queue_task; |
2854 | + long wait_queue_next; |
2855 | + long __wait_queue_task; |
2856 | + long __wait_queue_head_task_list; |
2857 | + long __wait_queue_task_list; |
2858 | + long pglist_data_node_zones; |
2859 | + long pglist_data_node_mem_map; |
2860 | + long pglist_data_node_start_paddr; |
2861 | + long pglist_data_node_start_mapnr; |
2862 | + long pglist_data_node_size; |
2863 | + long pglist_data_node_id; |
2864 | + long pglist_data_node_next; |
2865 | + long pglist_data_nr_zones; |
2866 | + long pglist_data_node_start_pfn; |
2867 | + long pglist_data_pgdat_next; |
2868 | + long pglist_data_node_present_pages; |
2869 | + long pglist_data_node_spanned_pages; |
2870 | + long pglist_data_bdata; |
2871 | + long page_cache_bucket_chain; |
2872 | + long zone_struct_free_pages; |
2873 | + long zone_struct_free_area; |
2874 | + long zone_struct_zone_pgdat; |
2875 | + long zone_struct_name; |
2876 | + long zone_struct_size; |
2877 | + long zone_struct_memsize; |
2878 | + long zone_struct_zone_start_pfn; |
2879 | + long zone_struct_zone_start_paddr; |
2880 | + long zone_struct_zone_start_mapnr; |
2881 | + long zone_struct_zone_mem_map; |
2882 | + long zone_struct_inactive_clean_pages; |
2883 | + long zone_struct_inactive_clean_list; |
2884 | + long zone_struct_inactive_dirty_pages; |
2885 | + long zone_struct_active_pages; |
2886 | + long zone_struct_pages_min; |
2887 | + long zone_struct_pages_low; |
2888 | + long zone_struct_pages_high; |
2889 | + long zone_free_pages; |
2890 | + long zone_free_area; |
2891 | + long zone_zone_pgdat; |
2892 | + long zone_zone_mem_map; |
2893 | + long zone_name; |
2894 | + long zone_spanned_pages; |
2895 | + long zone_zone_start_pfn; |
2896 | + long zone_pages_min; |
2897 | + long zone_pages_low; |
2898 | + long zone_pages_high; |
2899 | + long zone_vm_stat; |
2900 | + long neighbour_next; |
2901 | + long neighbour_primary_key; |
2902 | + long neighbour_ha; |
2903 | + long neighbour_dev; |
2904 | + long neighbour_nud_state; |
2905 | + long neigh_table_hash_buckets; |
2906 | + long neigh_table_key_len; |
2907 | + long in_device_ifa_list; |
2908 | + long in_ifaddr_ifa_next; |
2909 | + long in_ifaddr_ifa_address; |
2910 | + long pci_dev_global_list; |
2911 | + long pci_dev_next; |
2912 | + long pci_dev_bus; |
2913 | + long pci_dev_devfn; |
2914 | + long pci_dev_class; |
2915 | + long pci_dev_device; |
2916 | + long pci_dev_vendor; |
2917 | + long pci_bus_number; |
2918 | + long resource_entry_t_from; |
2919 | + long resource_entry_t_num; |
2920 | + long resource_entry_t_name; |
2921 | + long resource_entry_t_next; |
2922 | + long resource_name; |
2923 | + long resource_start; |
2924 | + long resource_end; |
2925 | + long resource_sibling; |
2926 | + long resource_child; |
2927 | + long runqueue_curr; |
2928 | + long runqueue_idle; |
2929 | + long runqueue_active; |
2930 | + long runqueue_expired; |
2931 | + long runqueue_arrays; |
2932 | + long runqueue_cpu; |
2933 | + long cpu_s_idle; |
2934 | + long cpu_s_curr; |
2935 | + long prio_array_nr_active; |
2936 | + long prio_array_queue; |
2937 | + long user_regs_struct_ebp; |
2938 | + long user_regs_struct_esp; |
2939 | + long user_regs_struct_rip; |
2940 | + long user_regs_struct_cs; |
2941 | + long user_regs_struct_eflags; |
2942 | + long user_regs_struct_rsp; |
2943 | + long user_regs_struct_ss; |
2944 | + long e820map_nr_map; |
2945 | + long e820entry_addr; |
2946 | + long e820entry_size; |
2947 | + long e820entry_type; |
2948 | + long char_device_struct_next; |
2949 | + long char_device_struct_name; |
2950 | + long char_device_struct_fops; |
2951 | + long char_device_struct_major; |
2952 | + long gendisk_major; |
2953 | + long gendisk_disk_name; |
2954 | + long gendisk_fops; |
2955 | + long blk_major_name_next; |
2956 | + long blk_major_name_major; |
2957 | + long blk_major_name_name; |
2958 | + long radix_tree_root_height; |
2959 | + long radix_tree_root_rnode; |
2960 | + long x8664_pda_pcurrent; |
2961 | + long x8664_pda_data_offset; |
2962 | + long x8664_pda_kernelstack; |
2963 | + long x8664_pda_irqrsp; |
2964 | + long x8664_pda_irqstackptr; |
2965 | + long x8664_pda_level4_pgt; |
2966 | + long x8664_pda_cpunumber; |
2967 | + long x8664_pda_me; |
2968 | + long tss_struct_ist; |
2969 | + long mem_section_section_mem_map; |
2970 | + long vcpu_guest_context_user_regs; |
2971 | + long cpu_user_regs_eip; |
2972 | + long cpu_user_regs_esp; |
2973 | + long cpu_user_regs_rip; |
2974 | + long cpu_user_regs_rsp; |
2975 | + long unwind_table_core; |
2976 | + long unwind_table_init; |
2977 | + long unwind_table_address; |
2978 | + long unwind_table_size; |
2979 | + long unwind_table_link; |
2980 | + long unwind_table_name; |
2981 | + long rq_cfs; |
2982 | + long rq_rt; |
2983 | + long rq_nr_running; |
2984 | + long cfs_rq_rb_leftmost; |
2985 | + long cfs_rq_nr_running; |
2986 | + long cfs_rq_tasks_timeline; |
2987 | + long task_struct_se; |
2988 | + long sched_entity_run_node; |
2989 | + long rt_rq_active; |
2990 | + long kmem_cache_size; |
2991 | + long kmem_cache_objsize; |
2992 | + long kmem_cache_offset; |
2993 | + long kmem_cache_order; |
2994 | + long kmem_cache_local_node; |
2995 | + long kmem_cache_objects; |
2996 | + long kmem_cache_inuse; |
2997 | + long kmem_cache_align; |
2998 | + long kmem_cache_name; |
2999 | + long kmem_cache_list; |
3000 | + long kmem_cache_node; |
3001 | + long kmem_cache_cpu_slab; |
3002 | + long page_inuse; |
3003 | +/* long page_offset; use "old" page->offset */ |
3004 | + long page_slab; |
3005 | + long page_first_page; |
3006 | + long page_freelist; |
3007 | + long kmem_cache_node_nr_partial; |
3008 | + long kmem_cache_node_nr_slabs; |
3009 | + long kmem_cache_node_partial; |
3010 | + long kmem_cache_node_full; |
3011 | + long pid_numbers; |
3012 | + long upid_nr; |
3013 | + long upid_ns; |
3014 | + long upid_pid_chain; |
3015 | + long pid_tasks; |
3016 | + long kmem_cache_cpu_freelist; |
3017 | + long kmem_cache_cpu_page; |
3018 | + long kmem_cache_cpu_node; |
3019 | + long kmem_cache_flags; |
3020 | + long zone_nr_active; |
3021 | + long zone_nr_inactive; |
3022 | + long zone_all_unreclaimable; |
3023 | + long zone_present_pages; |
3024 | + long zone_flags; |
3025 | + long zone_pages_scanned; |
3026 | + long pcpu_info_vcpu; |
3027 | + long pcpu_info_idle; |
3028 | + long vcpu_struct_rq; |
3029 | + long task_struct_sched_info; |
3030 | + long sched_info_last_arrival; |
3031 | + long page_objects; |
3032 | + long kmem_cache_oo; |
3033 | + long char_device_struct_cdev; |
3034 | + long char_device_struct_baseminor; |
3035 | + long cdev_ops; |
3036 | + long probe_next; |
3037 | + long probe_dev; |
3038 | + long probe_data; |
3039 | + long kobj_map_probes; |
3040 | + long task_struct_prio; |
3041 | + long zone_watermark; |
3042 | + long module_sect_attrs; |
3043 | + long module_sect_attrs_attrs; |
3044 | + long module_sect_attrs_nsections; |
3045 | + long module_sect_attr_mattr; |
3046 | + long module_sect_attr_name; |
3047 | + long module_sect_attr_address; |
3048 | + long module_attribute_attr; |
3049 | + long attribute_owner; |
3050 | + long module_sect_attr_attr; |
3051 | + long module_sections_attrs; |
3052 | + long swap_info_struct_inuse_pages; |
3053 | + long s390_lowcore_psw_save_area; |
3054 | + long mm_struct_rss_stat; |
3055 | + long mm_rss_stat_count; |
3056 | + long module_module_init; |
3057 | + long module_init_text_size; |
3058 | + long cpu_context_save_fp; |
3059 | + long cpu_context_save_sp; |
3060 | + long cpu_context_save_pc; |
3061 | + long elf_prstatus_pr_pid; |
3062 | + long elf_prstatus_pr_reg; |
3063 | + long irq_desc_t_name; |
3064 | + long thread_info_cpu_context; |
3065 | + long unwind_table_list; |
3066 | + long unwind_table_start; |
3067 | + long unwind_table_stop; |
3068 | + long unwind_table_begin_addr; |
3069 | + long unwind_table_end_addr; |
3070 | + long unwind_idx_addr; |
3071 | + long unwind_idx_insn; |
3072 | + long signal_struct_nr_threads; |
3073 | + long module_init_size; |
3074 | + long module_percpu; |
3075 | + long radix_tree_node_slots; |
3076 | + long s390_stack_frame_back_chain; |
3077 | + long s390_stack_frame_r14; |
3078 | + long user_regs_struct_eip; |
3079 | + long user_regs_struct_rax; |
3080 | + long user_regs_struct_eax; |
3081 | + long user_regs_struct_rbx; |
3082 | + long user_regs_struct_ebx; |
3083 | + long user_regs_struct_rcx; |
3084 | + long user_regs_struct_ecx; |
3085 | + long user_regs_struct_rdx; |
3086 | + long user_regs_struct_edx; |
3087 | + long user_regs_struct_rsi; |
3088 | + long user_regs_struct_esi; |
3089 | + long user_regs_struct_rdi; |
3090 | + long user_regs_struct_edi; |
3091 | + long user_regs_struct_ds; |
3092 | + long user_regs_struct_es; |
3093 | + long user_regs_struct_fs; |
3094 | + long user_regs_struct_gs; |
3095 | + long user_regs_struct_rbp; |
3096 | + long user_regs_struct_r8; |
3097 | + long user_regs_struct_r9; |
3098 | + long user_regs_struct_r10; |
3099 | + long user_regs_struct_r11; |
3100 | + long user_regs_struct_r12; |
3101 | + long user_regs_struct_r13; |
3102 | + long user_regs_struct_r14; |
3103 | + long user_regs_struct_r15; |
3104 | + long sched_entity_cfs_rq; |
3105 | + long sched_entity_my_q; |
3106 | + long sched_entity_on_rq; |
3107 | + long task_struct_on_rq; |
3108 | + long cfs_rq_curr; |
3109 | + long irq_desc_t_irq_data; |
3110 | + long irq_desc_t_kstat_irqs; |
3111 | + long irq_desc_t_affinity; |
3112 | + long irq_data_chip; |
3113 | + long irq_data_affinity; |
3114 | + long kernel_stat_irqs; |
3115 | + long socket_alloc_vfs_inode; |
3116 | + long class_devices; |
3117 | + long class_p; |
3118 | + long class_private_devices; |
3119 | + long device_knode_class; |
3120 | + long device_node; |
3121 | + long gendisk_dev; |
3122 | + long gendisk_kobj; |
3123 | + long gendisk_part0; |
3124 | + long gendisk_queue; |
3125 | + long hd_struct_dev; |
3126 | + long klist_k_list; |
3127 | + long klist_node_n_klist; |
3128 | + long klist_node_n_node; |
3129 | + long kobject_entry; |
3130 | + long kset_list; |
3131 | + long request_list_count; |
3132 | + long request_queue_in_flight; |
3133 | + long request_queue_rq; |
3134 | + long subsys_private_klist_devices; |
3135 | + long subsystem_kset; |
3136 | + long mount_mnt_parent; |
3137 | + long mount_mnt_mountpoint; |
3138 | + long mount_mnt_list; |
3139 | + long mount_mnt_devname; |
3140 | + long mount_mnt; |
3141 | + long task_struct_exit_state; |
3142 | + long timekeeper_xtime; |
3143 | + long file_f_op; |
3144 | + long file_private_data; |
3145 | + long hstate_order; |
3146 | + long hugetlbfs_sb_info_hstate; |
3147 | + long idr_layer_ary; |
3148 | + long idr_layer_layer; |
3149 | + long idr_layers; |
3150 | + long idr_top; |
3151 | + long ipc_id_ary_p; |
3152 | + long ipc_ids_entries; |
3153 | + long ipc_ids_max_id; |
3154 | + long ipc_ids_ipcs_idr; |
3155 | + long ipc_ids_in_use; |
3156 | + long ipc_namespace_ids; |
3157 | + long kern_ipc_perm_deleted; |
3158 | + long kern_ipc_perm_key; |
3159 | + long kern_ipc_perm_mode; |
3160 | + long kern_ipc_perm_uid; |
3161 | + long kern_ipc_perm_id; |
3162 | + long kern_ipc_perm_seq; |
3163 | + long nsproxy_ipc_ns; |
3164 | + long shmem_inode_info_swapped; |
3165 | + long shmem_inode_info_vfs_inode; |
3166 | + long shm_file_data_file; |
3167 | + long shmid_kernel_shm_file; |
3168 | + long shmid_kernel_shm_nattch; |
3169 | + long shmid_kernel_shm_perm; |
3170 | + long shmid_kernel_shm_segsz; |
3171 | + long shmid_kernel_id; |
3172 | + long sem_array_sem_perm; |
3173 | + long sem_array_sem_id; |
3174 | + long sem_array_sem_nsems; |
3175 | + long msg_queue_q_perm; |
3176 | + long msg_queue_q_id; |
3177 | + long msg_queue_q_cbytes; |
3178 | + long msg_queue_q_qnum; |
3179 | + long super_block_s_fs_info; |
3180 | + long rq_timestamp; |
3181 | + long radix_tree_node_height; |
3182 | + long rb_root_rb_node; |
3183 | + long rb_node_rb_left; |
3184 | + long rb_node_rb_right; |
3185 | + long rt_prio_array_queue; |
3186 | + long task_struct_rt; |
3187 | + long sched_rt_entity_run_list; |
3188 | + long log_ts_nsec; |
3189 | + long log_len; |
3190 | + long log_text_len; |
3191 | + long log_dict_len; |
3192 | + long log_level; |
3193 | + long log_flags_level; |
3194 | + long timekeeper_xtime_sec; |
3195 | + long neigh_table_hash_mask; |
3196 | + long sched_rt_entity_my_q; |
3197 | + long neigh_table_hash_shift; |
3198 | + long neigh_table_nht_ptr; |
3199 | + long task_group_parent; |
3200 | + long task_group_css; |
3201 | + long cgroup_subsys_state_cgroup; |
3202 | + long cgroup_dentry; |
3203 | + long task_group_rt_rq; |
3204 | + long rt_rq_tg; |
3205 | + long task_group_cfs_rq; |
3206 | + long cfs_rq_tg; |
3207 | + long task_group_siblings; |
3208 | + long task_group_children; |
3209 | + long task_group_cfs_bandwidth; |
3210 | + long cfs_rq_throttled; |
3211 | + long task_group_rt_bandwidth; |
3212 | + long rt_rq_rt_throttled; |
3213 | + long rt_rq_highest_prio; |
3214 | + long rt_rq_rt_nr_running; |
3215 | + long vmap_area_va_start; |
3216 | + long vmap_area_va_end; |
3217 | + long vmap_area_list; |
3218 | + long vmap_area_flags; |
3219 | + long vmap_area_vm; |
3220 | + long hrtimer_cpu_base_clock_base; |
3221 | + long hrtimer_clock_base_offset; |
3222 | + long hrtimer_clock_base_active; |
3223 | + long hrtimer_clock_base_first; |
3224 | + long hrtimer_clock_base_get_time; |
3225 | + long hrtimer_base_first; |
3226 | + long hrtimer_base_pending; |
3227 | + long hrtimer_base_get_time; |
3228 | + long hrtimer_node; |
3229 | + long hrtimer_list; |
3230 | + long hrtimer_softexpires; |
3231 | + long hrtimer_expires; |
3232 | + long hrtimer_function; |
3233 | + long timerqueue_head_next; |
3234 | + long timerqueue_node_expires; |
3235 | + long timerqueue_node_node; |
3236 | + long ktime_t_tv64; |
3237 | + long ktime_t_sec; |
3238 | + long ktime_t_nsec; |
3239 | + long module_taints; |
3240 | + long module_gpgsig_ok; |
3241 | + long module_license_gplok; |
3242 | + long tnt_bit; |
3243 | + long tnt_true; |
3244 | + long tnt_false; |
3245 | + long task_struct_thread_context_fp; |
3246 | + long task_struct_thread_context_sp; |
3247 | + long task_struct_thread_context_pc; |
3248 | + long page_slab_page; |
3249 | + long trace_print_flags_mask; |
3250 | + long trace_print_flags_name; |
3251 | +}; |
3252 | + |
3253 | +struct size_table { /* stash of commonly-used sizes */ |
3254 | + long page; |
3255 | + long free_area_struct; |
3256 | + long zone_struct; |
3257 | + long free_area; |
3258 | + long zone; |
3259 | + long kmem_slab_s; |
3260 | + long kmem_cache_s; |
3261 | + long kmem_bufctl_t; |
3262 | + long slab_s; |
3263 | + long slab; |
3264 | + long cpucache_s; |
3265 | + long array_cache; |
3266 | + long swap_info_struct; |
3267 | + long mm_struct; |
3268 | + long vm_area_struct; |
3269 | + long pglist_data; |
3270 | + long page_cache_bucket; |
3271 | + long pt_regs; |
3272 | + long task_struct; |
3273 | + long thread_info; |
3274 | + long softirq_state; |
3275 | + long desc_struct; |
3276 | + long umode_t; |
3277 | + long dentry; |
3278 | + long files_struct; |
3279 | + long fdtable; |
3280 | + long fs_struct; |
3281 | + long file; |
3282 | + long inode; |
3283 | + long vfsmount; |
3284 | + long super_block; |
3285 | + long irqdesc; |
3286 | + long module; |
3287 | + long list_head; |
3288 | + long hlist_node; |
3289 | + long hlist_head; |
3290 | + long irq_cpustat_t; |
3291 | + long cpuinfo_x86; |
3292 | + long cpuinfo_ia64; |
3293 | + long timer_list; |
3294 | + long timer_vec_root; |
3295 | + long timer_vec; |
3296 | + long tvec_root_s; |
3297 | + long tvec_s; |
3298 | + long tvec_t_base_s; |
3299 | + long wait_queue; |
3300 | + long __wait_queue; |
3301 | + long device; |
3302 | + long net_device; |
3303 | + long sock; |
3304 | + long signal_struct; |
3305 | + long sigpending_signal; |
3306 | + long signal_queue; |
3307 | + long sighand_struct; |
3308 | + long sigqueue; |
3309 | + long k_sigaction; |
3310 | + long resource_entry_t; |
3311 | + long resource; |
3312 | + long runqueue; |
3313 | + long irq_desc_t; |
3314 | + long task_union; |
3315 | + long thread_union; |
3316 | + long prio_array; |
3317 | + long user_regs_struct; |
3318 | + long switch_stack; |
3319 | + long vm_area_struct_vm_flags; |
3320 | + long e820map; |
3321 | + long e820entry; |
3322 | + long cpu_s; |
3323 | + long pgd_t; |
3324 | + long kallsyms_header; |
3325 | + long kallsyms_symbol; |
3326 | + long kallsyms_section; |
3327 | + long irq_ctx; |
3328 | + long block_device; |
3329 | + long blk_major_name; |
3330 | + long gendisk; |
3331 | + long address_space; |
3332 | + long char_device_struct; |
3333 | + long inet_sock; |
3334 | + long in6_addr; |
3335 | + long socket; |
3336 | + long spinlock_t; |
3337 | + long radix_tree_root; |
3338 | + long radix_tree_node; |
3339 | + long x8664_pda; |
3340 | + long ppc64_paca; |
3341 | + long gate_struct; |
3342 | + long tss_struct; |
3343 | + long task_struct_start_time; |
3344 | + long cputime_t; |
3345 | + long mem_section; |
3346 | + long pid_link; |
3347 | + long unwind_table; |
3348 | + long rlimit; |
3349 | + long kmem_cache; |
3350 | + long kmem_cache_node; |
3351 | + long upid; |
3352 | + long kmem_cache_cpu; |
3353 | + long cfs_rq; |
3354 | + long pcpu_info; |
3355 | + long vcpu_struct; |
3356 | + long cdev; |
3357 | + long probe; |
3358 | + long kobj_map; |
3359 | + long page_flags; |
3360 | + long module_sect_attr; |
3361 | + long task_struct_utime; |
3362 | + long task_struct_stime; |
3363 | + long cpu_context_save; |
3364 | + long elf_prstatus; |
3365 | + long note_buf; |
3366 | + long unwind_idx; |
3367 | + long softirq_action; |
3368 | + long irq_data; |
3369 | + long s390_stack_frame; |
3370 | + long percpu_data; |
3371 | + long sched_entity; |
3372 | + long kernel_stat; |
3373 | + long subsystem; |
3374 | + long class_private; |
3375 | + long rq_in_flight; |
3376 | + long class_private_devices; |
3377 | + long mount; |
3378 | + long hstate; |
3379 | + long ipc_ids; |
3380 | + long shmid_kernel; |
3381 | + long sem_array; |
3382 | + long msg_queue; |
3383 | + long log; |
3384 | + long log_level; |
3385 | + long rt_rq; |
3386 | + long task_group; |
3387 | + long vmap_area; |
3388 | + long hrtimer_clock_base; |
3389 | + long hrtimer_base; |
3390 | + long tnt; |
3391 | + long trace_print_flags; |
3392 | +}; |
3393 | + |
3394 | +struct array_table { |
3395 | + int kmem_cache_s_name; |
3396 | + int kmem_cache_s_c_name; |
3397 | + int kmem_cache_s_array; |
3398 | + int kmem_cache_s_cpudata; |
3399 | + int irq_desc; |
3400 | + int irq_action; |
3401 | + int log_buf; |
3402 | + int timer_vec_vec; |
3403 | + int timer_vec_root_vec; |
3404 | + int tvec_s_vec; |
3405 | + int tvec_root_s_vec; |
3406 | + int page_hash_table; |
3407 | + int net_device_name; |
3408 | + int neigh_table_hash_buckets; |
3409 | + int neighbour_ha; |
3410 | + int swap_info; |
3411 | + int pglist_data_node_zones; |
3412 | + int zone_struct_free_area; |
3413 | + int zone_free_area; |
3414 | + int free_area; |
3415 | + int free_area_DIMENSION; |
3416 | + int prio_array_queue; |
3417 | + int height_to_maxindex; |
3418 | + int pid_hash; |
3419 | + int kmem_cache_node; |
3420 | + int kmem_cache_cpu_slab; |
3421 | + int rt_prio_array_queue; |
3422 | +}; |
3423 | + |
3424 | +/* |
3425 | + * The following set of macros use gdb to determine structure, union, |
3426 | + * or member sizes/offsets. They should be used only during initialization |
3427 | + * of the offset_table or size_table, or with data structures whose names |
3428 | + * or members are only known/specified during runtime. |
3429 | + */ |
3430 | +#define MEMBER_SIZE_REQUEST ((struct datatype_member *)(-1)) |
3431 | +#define ANON_MEMBER_OFFSET_REQUEST ((struct datatype_member *)(-2)) |
3432 | +#define MEMBER_TYPE_REQUEST ((struct datatype_member *)(-3)) |
3433 | +#define STRUCT_SIZE_REQUEST ((struct datatype_member *)(-4)) |
3434 | + |
3435 | +#define STRUCT_SIZE(X) datatype_info((X), NULL, STRUCT_SIZE_REQUEST) |
3436 | +#define UNION_SIZE(X) datatype_info((X), NULL, STRUCT_SIZE_REQUEST) |
3437 | +#define STRUCT_EXISTS(X) (datatype_info((X), NULL, STRUCT_SIZE_REQUEST) >= 0) |
3438 | +#define DATATYPE_SIZE(X) datatype_info((X)->name, NULL, (X)) |
3439 | +#define MEMBER_OFFSET(X,Y) datatype_info((X), (Y), NULL) |
3440 | +#define MEMBER_EXISTS(X,Y) (datatype_info((X), (Y), NULL) >= 0) |
3441 | +#define MEMBER_SIZE(X,Y) datatype_info((X), (Y), MEMBER_SIZE_REQUEST) |
3442 | +#define MEMBER_TYPE(X,Y) datatype_info((X), (Y), MEMBER_TYPE_REQUEST) |
3443 | +#define ANON_MEMBER_OFFSET(X,Y) datatype_info((X), (Y), ANON_MEMBER_OFFSET_REQUEST) |
3444 | + |
3445 | +/* |
3446 | + * The following set of macros can only be used with pre-intialized fields |
3447 | + * in the offset table, size table or array_table. |
3448 | + */ |
3449 | +#define OFFSET(X) (OFFSET_verify(offset_table.X, (char *)__FUNCTION__, __FILE__, __LINE__, #X)) |
3450 | +#define SIZE(X) (SIZE_verify(size_table.X, (char *)__FUNCTION__, __FILE__, __LINE__, #X)) |
3451 | +#define INVALID_OFFSET (-1) |
3452 | +#define INVALID_MEMBER(X) (offset_table.X == INVALID_OFFSET) |
3453 | +#define INVALID_SIZE(X) (size_table.X == -1) |
3454 | +#define VALID_SIZE(X) (size_table.X >= 0) |
3455 | +#define VALID_STRUCT(X) (size_table.X >= 0) |
3456 | +#define VALID_MEMBER(X) (offset_table.X >= 0) |
3457 | +#define ARRAY_LENGTH(X) (array_table.X) |
3458 | +#define ASSIGN_OFFSET(X) (offset_table.X) |
3459 | +#define ASSIGN_SIZE(X) (size_table.X) |
3460 | +#define OFFSET_OPTION(X,Y) (OFFSET_option(offset_table.X, offset_table.Y, (char *)__FUNCTION__, __FILE__, __LINE__, #X, #Y)) |
3461 | +#define SIZE_OPTION(X,Y) (SIZE_option(size_table.X, size_table.Y, (char *)__FUNCTION__, __FILE__, __LINE__, #X, #Y)) |
3462 | + |
3463 | +#define MEMBER_OFFSET_INIT(X, Y, Z) (ASSIGN_OFFSET(X) = MEMBER_OFFSET(Y, Z)) |
3464 | +#define STRUCT_SIZE_INIT(X, Y) (ASSIGN_SIZE(X) = STRUCT_SIZE(Y)) |
3465 | +#define ARRAY_LENGTH_INIT(A, B, C, D, E) ((A) = get_array_length(C, D, E)) |
3466 | +#define ARRAY_LENGTH_INIT_ALT(A, B, C, D, E) ((A) = get_array_length_alt(B, C, D, E)) |
3467 | +#define MEMBER_SIZE_INIT(X, Y, Z) (ASSIGN_SIZE(X) = MEMBER_SIZE(Y, Z)) |
3468 | +#define ANON_MEMBER_OFFSET_INIT(X, Y, Z) (ASSIGN_OFFSET(X) = ANON_MEMBER_OFFSET(Y, Z)) |
3469 | + |
3470 | +/* |
3471 | + * For use with non-debug kernels. |
3472 | + */ |
3473 | +struct builtin_debug_table { |
3474 | + char *release; |
3475 | + char *machine_type; |
3476 | + struct offset_table *offset_table; |
3477 | + struct size_table *size_table; |
3478 | + struct array_table *array_table; |
3479 | +}; |
3480 | + |
3481 | +/* |
3482 | + * Facilitators for pulling correctly-sized data out of a buffer at a |
3483 | + * known address. |
3484 | + */ |
3485 | +#define INT(ADDR) *((int *)((char *)(ADDR))) |
3486 | +#define UINT(ADDR) *((uint *)((char *)(ADDR))) |
3487 | +#define LONG(ADDR) *((long *)((char *)(ADDR))) |
3488 | +#define ULONG(ADDR) *((ulong *)((char *)(ADDR))) |
3489 | +#define ULONGLONG(ADDR) *((ulonglong *)((char *)(ADDR))) |
3490 | +#define ULONG_PTR(ADDR) *((ulong **)((char *)(ADDR))) |
3491 | +#define USHORT(ADDR) *((ushort *)((char *)(ADDR))) |
3492 | +#define SHORT(ADDR) *((short *)((char *)(ADDR))) |
3493 | +#define UCHAR(ADDR) *((unsigned char *)((char *)(ADDR))) |
3494 | +#define VOID_PTR(ADDR) *((void **)((char *)(ADDR))) |
3495 | + |
3496 | +struct node_table { |
3497 | + int node_id; |
3498 | + ulong pgdat; |
3499 | + ulong mem_map; |
3500 | + ulong size; |
3501 | + ulong present; |
3502 | + ulonglong start_paddr; |
3503 | + ulong start_mapnr; |
3504 | +}; |
3505 | + |
3506 | +struct meminfo; |
3507 | +struct slab_data; |
3508 | + |
3509 | +#define VMA_CACHE (20) |
3510 | + |
3511 | +struct vm_table { /* kernel VM-related data */ |
3512 | + ulong flags; |
3513 | + ulong kernel_pgd[NR_CPUS]; |
3514 | + ulong high_memory; |
3515 | + ulong vmalloc_start; |
3516 | + ulong mem_map; |
3517 | + long total_pages; |
3518 | + ulong totalram_pages; |
3519 | + ulong totalhigh_pages; |
3520 | + ulong num_physpages; |
3521 | + ulong max_mapnr; |
3522 | + ulong kmem_max_c_num; |
3523 | + ulong kmem_max_limit; |
3524 | + ulong kmem_max_cpus; |
3525 | + ulong kmem_cache_count; |
3526 | + ulong kmem_cache_len_nodes; |
3527 | + ulong PG_reserved; |
3528 | + ulong PG_slab; |
3529 | + ulong PG_head_tail_mask; |
3530 | + int kmem_cache_namelen; |
3531 | + ulong page_hash_table; |
3532 | + int page_hash_table_len; |
3533 | + int paddr_prlen; |
3534 | + int numnodes; |
3535 | + int nr_zones; |
3536 | + int nr_free_areas; |
3537 | + struct node_table *node_table; |
3538 | + void (*dump_free_pages)(struct meminfo *); |
3539 | + void (*dump_kmem_cache)(struct meminfo *); |
3540 | + struct slab_data *slab_data; |
3541 | + uint nr_swapfiles; |
3542 | + ulong last_swap_read; |
3543 | + char *swap_info_struct; |
3544 | + char *vma_cache; |
3545 | + ulong cached_vma[VMA_CACHE]; |
3546 | + ulong cached_vma_hits[VMA_CACHE]; |
3547 | + int vma_cache_index; |
3548 | + ulong vma_cache_fills; |
3549 | + void *mem_sec; |
3550 | + char *mem_section; |
3551 | + int ZONE_HIGHMEM; |
3552 | + ulong *node_online_map; |
3553 | + int node_online_map_len; |
3554 | + int nr_vm_stat_items; |
3555 | + char **vm_stat_items; |
3556 | + int cpu_slab_type; |
3557 | + int nr_vm_event_items; |
3558 | + char **vm_event_items; |
3559 | + int nr_bad_slab_caches; |
3560 | + ulong *bad_slab_caches; |
3561 | + int nr_pageflags; |
3562 | + struct pageflags_data { |
3563 | + ulong mask; |
3564 | + char *name; |
3565 | + } *pageflags_data; |
3566 | +}; |
3567 | + |
3568 | +#define NODES (0x1) |
3569 | +#define ZONES (0x2) |
3570 | +#define PERCPU_KMALLOC_V1 (0x4) |
3571 | +#define COMMON_VADDR (0x8) |
3572 | +#define KMEM_CACHE_INIT (0x10) |
3573 | +#define V_MEM_MAP (0x20) |
3574 | +#define PERCPU_KMALLOC_V2 (0x40) |
3575 | +#define KMEM_CACHE_UNAVAIL (0x80) |
3576 | +#define FLATMEM (0x100) |
3577 | +#define DISCONTIGMEM (0x200) |
3578 | +#define SPARSEMEM (0x400) |
3579 | +#define SPARSEMEM_EX (0x800) |
3580 | +#define PERCPU_KMALLOC_V2_NODES (0x1000) |
3581 | +#define KMEM_CACHE_DELAY (0x2000) |
3582 | +#define NODES_ONLINE (0x4000) |
3583 | +#define VM_STAT (0x8000) |
3584 | +#define KMALLOC_SLUB (0x10000) |
3585 | +#define CONFIG_NUMA (0x20000) |
3586 | +#define VM_EVENT (0x40000) |
3587 | +#define PGCNT_ADJ (0x80000) |
3588 | +#define VM_INIT (0x100000) |
3589 | +#define SWAPINFO_V1 (0x200000) |
3590 | +#define SWAPINFO_V2 (0x400000) |
3591 | +#define NODELISTS_IS_PTR (0x800000) |
3592 | +#define KMALLOC_COMMON (0x1000000) |
3593 | +#define USE_VMAP_AREA (0x2000000) |
3594 | +#define PAGEFLAGS (0x4000000) |
3595 | + |
3596 | +#define IS_FLATMEM() (vt->flags & FLATMEM) |
3597 | +#define IS_DISCONTIGMEM() (vt->flags & DISCONTIGMEM) |
3598 | +#define IS_SPARSEMEM() (vt->flags & SPARSEMEM) |
3599 | +#define IS_SPARSEMEM_EX() (vt->flags & SPARSEMEM_EX) |
3600 | + |
3601 | +#define COMMON_VADDR_SPACE() (vt->flags & COMMON_VADDR) |
3602 | +#define PADDR_PRLEN (vt->paddr_prlen) |
3603 | + |
3604 | +struct datatype_member { /* minimal definition of a structure/union */ |
3605 | + char *name; /* and possibly a member within it */ |
3606 | + char *member; |
3607 | + ulong type; |
3608 | + long size; |
3609 | + long member_offset; |
3610 | + long member_size; |
3611 | + int member_typecode; |
3612 | + ulong flags; |
3613 | + char *tagname; /* tagname and value for enums */ |
3614 | + long value; |
3615 | + ulong vaddr; |
3616 | +}; |
3617 | + |
3618 | +#define union_name struct_name |
3619 | + |
3620 | +struct list_data { /* generic structure used by do_list() to walk */ |
3621 | + ulong flags; /* through linked lists in the kernel */ |
3622 | + ulong start; |
3623 | + long member_offset; |
3624 | + long list_head_offset; |
3625 | + ulong end; |
3626 | + ulong searchfor; |
3627 | + char **structname; |
3628 | + int structname_args; |
3629 | + char *header; |
3630 | +}; |
3631 | +#define LIST_OFFSET_ENTERED (VERBOSE << 1) |
3632 | +#define LIST_START_ENTERED (VERBOSE << 2) |
3633 | +#define LIST_HEAD_FORMAT (VERBOSE << 3) |
3634 | +#define LIST_HEAD_POINTER (VERBOSE << 4) |
3635 | +#define RETURN_ON_DUPLICATE (VERBOSE << 5) |
3636 | +#define RETURN_ON_LIST_ERROR (VERBOSE << 6) |
3637 | +#define LIST_STRUCT_RADIX_10 (VERBOSE << 7) |
3638 | +#define LIST_STRUCT_RADIX_16 (VERBOSE << 8) |
3639 | +#define LIST_HEAD_REVERSE (VERBOSE << 9) |
3640 | + |
3641 | +struct tree_data { |
3642 | + ulong flags; |
3643 | + ulong start; |
3644 | + long node_member_offset; |
3645 | + char **structname; |
3646 | + int structname_args; |
3647 | + int count; |
3648 | +}; |
3649 | + |
3650 | +#define TREE_ROOT_OFFSET_ENTERED (VERBOSE << 1) |
3651 | +#define TREE_NODE_OFFSET_ENTERED (VERBOSE << 2) |
3652 | +#define TREE_NODE_POINTER (VERBOSE << 3) |
3653 | +#define TREE_POSITION_DISPLAY (VERBOSE << 4) |
3654 | +#define TREE_STRUCT_RADIX_10 (VERBOSE << 5) |
3655 | +#define TREE_STRUCT_RADIX_16 (VERBOSE << 6) |
3656 | + |
3657 | +#define ALIAS_RUNTIME (1) |
3658 | +#define ALIAS_RCLOCAL (2) |
3659 | +#define ALIAS_RCHOME (3) |
3660 | +#define ALIAS_BUILTIN (4) |
3661 | + |
3662 | +struct alias_data { /* command alias storage */ |
3663 | + struct alias_data *next; |
3664 | + char *alias; |
3665 | + int argcnt; |
3666 | + int size; |
3667 | + int origin; |
3668 | + char *args[MAXARGS]; |
3669 | + char argbuf[1]; |
3670 | +}; |
3671 | + |
3672 | +struct rb_node |
3673 | +{ |
3674 | + unsigned long rb_parent_color; |
3675 | +#define RB_RED 0 |
3676 | +#define RB_BLACK 1 |
3677 | + struct rb_node *rb_right; |
3678 | + struct rb_node *rb_left; |
3679 | +}; |
3680 | + |
3681 | +struct rb_root |
3682 | +{ |
3683 | + struct rb_node *rb_node; |
3684 | +}; |
3685 | + |
3686 | +#define NUMBER_STACKFRAMES 4 |
3687 | + |
3688 | +#define SAVE_RETURN_ADDRESS(retaddr) \ |
3689 | +{ \ |
3690 | + int i; \ |
3691 | + int saved_stacks; \ |
3692 | + \ |
3693 | + saved_stacks = backtrace((void **)retaddr, NUMBER_STACKFRAMES); \ |
3694 | + \ |
3695 | + /* explicitely zero out the invalid addresses */ \ |
3696 | + for (i = saved_stacks; i < NUMBER_STACKFRAMES; i++) \ |
3697 | + retaddr[i] = 0; \ |
3698 | +} |
3699 | + |
3700 | +#endif /* !GDB_COMMON */ |
3701 | + |
3702 | + |
3703 | +#define SYMBOL_NAME_USED (0x1) |
3704 | +#define MODULE_SYMBOL (0x2) |
3705 | +#define IS_MODULE_SYMBOL(SYM) ((SYM)->flags & MODULE_SYMBOL) |
3706 | + |
3707 | +struct syment { |
3708 | + ulong value; |
3709 | + char *name; |
3710 | + struct syment *val_hash_next; |
3711 | + struct syment *name_hash_next; |
3712 | + char type; |
3713 | + unsigned char cnt; |
3714 | + unsigned char flags; |
3715 | + unsigned char pad2; |
3716 | +}; |
3717 | + |
3718 | +#define NAMESPACE_INIT (1) |
3719 | +#define NAMESPACE_REUSE (2) |
3720 | +#define NAMESPACE_FREE (3) |
3721 | +#define NAMESPACE_INSTALL (4) |
3722 | +#define NAMESPACE_COMPLETE (5) |
3723 | + |
3724 | +struct symbol_namespace { |
3725 | + char *address; |
3726 | + size_t size; |
3727 | + long index; |
3728 | + long cnt; |
3729 | +}; |
3730 | + |
3731 | +#define SYMVAL_HASH (512) |
3732 | +#define SYMVAL_HASH_INDEX(vaddr) \ |
3733 | + (((vaddr) >> machdep->pageshift) % SYMVAL_HASH) |
3734 | + |
3735 | +#define SYMNAME_HASH (512) |
3736 | +#define SYMNAME_HASH_INDEX(name) \ |
3737 | + ((name[0] ^ (name[strlen(name)-1] * name[strlen(name)/2])) % SYMNAME_HASH) |
3738 | + |
3739 | +#define PATCH_KERNEL_SYMBOLS_START ((char *)(1)) |
3740 | +#define PATCH_KERNEL_SYMBOLS_STOP ((char *)(2)) |
3741 | + |
3742 | +#ifndef GDB_COMMON |
3743 | + |
3744 | +struct symbol_table_data { |
3745 | + ulong flags; |
3746 | +#ifdef GDB_5_3 |
3747 | + struct _bfd *bfd; |
3748 | +#else |
3749 | + struct bfd *bfd; |
3750 | +#endif |
3751 | + struct sec *sections; |
3752 | + struct syment *symtable; |
3753 | + struct syment *symend; |
3754 | + long symcnt; |
3755 | + ulong syment_size; |
3756 | + struct symval_hash_chain { |
3757 | + struct syment *val_hash_head; |
3758 | + struct syment *val_hash_last; |
3759 | + } symval_hash[SYMVAL_HASH]; |
3760 | + double val_hash_searches; |
3761 | + double val_hash_iterations; |
3762 | + struct syment *symname_hash[SYMNAME_HASH]; |
3763 | + struct symbol_namespace kernel_namespace; |
3764 | + struct syment *ext_module_symtable; |
3765 | + struct syment *ext_module_symend; |
3766 | + long ext_module_symcnt; |
3767 | + struct symbol_namespace ext_module_namespace; |
3768 | + int mods_installed; |
3769 | + struct load_module *current; |
3770 | + struct load_module *load_modules; |
3771 | + off_t dwarf_eh_frame_file_offset; |
3772 | + ulong dwarf_eh_frame_size; |
3773 | + ulong first_ksymbol; |
3774 | + ulong __per_cpu_start; |
3775 | + ulong __per_cpu_end; |
3776 | + off_t dwarf_debug_frame_file_offset; |
3777 | + ulong dwarf_debug_frame_size; |
3778 | +}; |
3779 | + |
3780 | +/* flags for st */ |
3781 | +#define KERNEL_SYMS (0x1) |
3782 | +#define MODULE_SYMS (0x2) |
3783 | +#define LOAD_MODULE_SYMS (0x4) |
3784 | +#define INSMOD_BUILTIN (0x8) |
3785 | +#define GDB_SYMS_PATCHED (0x10) |
3786 | +#define GDB_PATCHED() (st->flags & GDB_SYMS_PATCHED) |
3787 | +#define NO_SEC_LOAD (0x20) |
3788 | +#define NO_SEC_CONTENTS (0x40) |
3789 | +#define FORCE_DEBUGINFO (0x80) |
3790 | +#define CRC_MATCHES (0x100) |
3791 | +#define ADD_SYMBOL_FILE (0x200) |
3792 | +#define USE_OLD_ADD_SYM (0x400) |
3793 | +#define PERCPU_SYMS (0x800) |
3794 | +#define MODSECT_UNKNOWN (0x1000) |
3795 | +#define MODSECT_V1 (0x2000) |
3796 | +#define MODSECT_V2 (0x4000) |
3797 | +#define MODSECT_V3 (0x8000) |
3798 | +#define MODSECT_VMASK (MODSECT_V1|MODSECT_V2|MODSECT_V3) |
3799 | +#define NO_STRIP (0x10000) |
3800 | + |
3801 | +#endif /* !GDB_COMMON */ |
3802 | + |
3803 | +#define ALL_MODULES (0) |
3804 | + |
3805 | +#define MAX_MOD_NAMELIST (256) |
3806 | +#define MAX_MOD_NAME (64) |
3807 | +#define MAX_MOD_SEC_NAME (64) |
3808 | + |
3809 | +#define MOD_EXT_SYMS (0x1) |
3810 | +#define MOD_LOAD_SYMS (0x2) |
3811 | +#define MOD_REMOTE (0x4) |
3812 | +#define MOD_KALLSYMS (0x8) |
3813 | +#define MOD_INITRD (0x10) |
3814 | +#define MOD_NOPATCH (0x20) |
3815 | +#define MOD_INIT (0x40) |
3816 | +#define MOD_DO_READNOW (0x80) |
3817 | + |
3818 | +#define SEC_FOUND (0x10000) |
3819 | + |
3820 | +struct mod_section_data { |
3821 | +#if defined(GDB_5_3) || defined(GDB_6_0) |
3822 | + struct sec *section; |
3823 | +#else |
3824 | + struct bfd_section *section; |
3825 | +#endif |
3826 | + char name[MAX_MOD_SEC_NAME]; |
3827 | + ulong offset; |
3828 | + ulong size; |
3829 | + int priority; |
3830 | + int flags; |
3831 | +}; |
3832 | + |
3833 | +struct load_module { |
3834 | + ulong mod_base; |
3835 | + ulong module_struct; |
3836 | + long mod_size; |
3837 | + char mod_namelist[MAX_MOD_NAMELIST]; |
3838 | + char mod_name[MAX_MOD_NAME]; |
3839 | + ulong mod_flags; |
3840 | + struct syment *mod_symtable; |
3841 | + struct syment *mod_symend; |
3842 | + long mod_ext_symcnt; |
3843 | + struct syment *mod_ext_symtable; |
3844 | + struct syment *mod_ext_symend; |
3845 | + long mod_load_symcnt; |
3846 | + struct syment *mod_load_symtable; |
3847 | + struct syment *mod_load_symend; |
3848 | + long mod_symalloc; |
3849 | + struct symbol_namespace mod_load_namespace; |
3850 | + ulong mod_size_of_struct; |
3851 | + ulong mod_text_start; |
3852 | + ulong mod_etext_guess; |
3853 | + ulong mod_rodata_start; |
3854 | + ulong mod_data_start; |
3855 | + ulong mod_bss_start; |
3856 | + int mod_sections; |
3857 | + struct mod_section_data *mod_section_data; |
3858 | + ulong mod_init_text_size; |
3859 | + ulong mod_init_module_ptr; |
3860 | + ulong mod_init_size; |
3861 | + struct syment *mod_init_symtable; |
3862 | + struct syment *mod_init_symend; |
3863 | + ulong mod_percpu; |
3864 | + ulong mod_percpu_size; |
3865 | +}; |
3866 | + |
3867 | +#define IN_MODULE(A,L) \ |
3868 | + (((ulong)(A) >= (L)->mod_base) && ((ulong)(A) < ((L)->mod_base+(L)->mod_size))) |
3869 | + |
3870 | +#define IN_MODULE_INIT(A,L) \ |
3871 | + (((ulong)(A) >= (L)->mod_init_module_ptr) && ((ulong)(A) < ((L)->mod_init_module_ptr+(L)->mod_init_size))) |
3872 | + |
3873 | +#define IN_MODULE_PERCPU(A,L) \ |
3874 | + (((ulong)(A) >= (L)->mod_percpu) && ((ulong)(A) < ((L)->mod_percpu+(L)->mod_percpu_size))) |
3875 | + |
3876 | +#define MODULE_PERCPU_SYMS_LOADED(L) ((L)->mod_percpu && (L)->mod_percpu_size) |
3877 | + |
3878 | +#ifndef GDB_COMMON |
3879 | + |
3880 | +#define KVADDR (0x1) |
3881 | +#define UVADDR (0x2) |
3882 | +#define PHYSADDR (0x4) |
3883 | +#define XENMACHADDR (0x8) |
3884 | +#define FILEADDR (0x10) |
3885 | +#define AMBIGUOUS (~0) |
3886 | + |
3887 | +#define USE_USER_PGD (UVADDR << 2) |
3888 | + |
3889 | +#define VERIFY_ADDR (0x8) /* vm_area_dump() flags -- must follow */ |
3890 | +#define PRINT_INODES (0x10) /* KVADDR, UVADDR, and PHYSADDR */ |
3891 | +#define PRINT_MM_STRUCT (0x20) |
3892 | +#define PRINT_VMA_STRUCTS (0x40) |
3893 | +#define PRINT_SINGLE_VMA (0x80) |
3894 | +#define PRINT_RADIX_10 (0x100) |
3895 | +#define PRINT_RADIX_16 (0x200) |
3896 | + |
3897 | +#define MIN_PAGE_SIZE (4096) |
3898 | + |
3899 | +#define PTOB(X) ((ulonglong)(X) << machdep->pageshift) |
3900 | +#define BTOP(X) ((ulonglong)(X) >> machdep->pageshift) |
3901 | + |
3902 | +#define PAGESIZE() (machdep->pagesize) |
3903 | +#define PAGESHIFT() (machdep->pageshift) |
3904 | + |
3905 | +#define PAGEOFFSET(X) (((ulong)(X)) & machdep->pageoffset) |
3906 | +#define VIRTPAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
3907 | +#define PHYSPAGEBASE(X) (((physaddr_t)(X)) & (physaddr_t)machdep->pagemask) |
3908 | + |
3909 | +/* |
3910 | + * Sparse memory stuff |
3911 | + * These must follow the definitions in the kernel mmzone.h |
3912 | + */ |
3913 | +#define SECTION_SIZE_BITS() (machdep->section_size_bits) |
3914 | +#define MAX_PHYSMEM_BITS() (machdep->max_physmem_bits) |
3915 | +#define SECTIONS_SHIFT() (MAX_PHYSMEM_BITS() - SECTION_SIZE_BITS()) |
3916 | +#define PA_SECTION_SHIFT() (SECTION_SIZE_BITS()) |
3917 | +#define PFN_SECTION_SHIFT() (SECTION_SIZE_BITS() - PAGESHIFT()) |
3918 | +#define NR_MEM_SECTIONS() (1UL << SECTIONS_SHIFT()) |
3919 | +#define PAGES_PER_SECTION() (1UL << PFN_SECTION_SHIFT()) |
3920 | +#define PAGE_SECTION_MASK() (~(PAGES_PER_SECTION()-1)) |
3921 | + |
3922 | +#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT()) |
3923 | +#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT()) |
3924 | + |
3925 | +#define SECTIONS_PER_ROOT() (machdep->sections_per_root) |
3926 | + |
3927 | +/* CONFIG_SPARSEMEM_EXTREME */ |
3928 | +#define _SECTIONS_PER_ROOT_EXTREME() (PAGESIZE() / SIZE(mem_section)) |
3929 | +/* !CONFIG_SPARSEMEM_EXTREME */ |
3930 | +#define _SECTIONS_PER_ROOT() (1) |
3931 | + |
3932 | +#define SECTION_NR_TO_ROOT(sec) ((sec) / SECTIONS_PER_ROOT()) |
3933 | +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) |
3934 | +#define NR_SECTION_ROOTS() (DIV_ROUND_UP(NR_MEM_SECTIONS(), SECTIONS_PER_ROOT())) |
3935 | +#define SECTION_ROOT_MASK() (SECTIONS_PER_ROOT() - 1) |
3936 | + |
3937 | +/* |
3938 | + * Machine specific stuff |
3939 | + */ |
3940 | + |
3941 | +#ifdef ARM |
3942 | +#define _32BIT_ |
3943 | +#define MACHINE_TYPE "ARM" |
3944 | + |
3945 | +#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
3946 | + |
3947 | +#define PTOV(X) \ |
3948 | + ((unsigned long)(X)-(machdep->machspec->phys_base)+(machdep->kvbase)) |
3949 | +#define VTOP(X) \ |
3950 | + ((unsigned long)(X)-(machdep->kvbase)+(machdep->machspec->phys_base)) |
3951 | + |
3952 | +#define IS_VMALLOC_ADDR(X) arm_is_vmalloc_addr((ulong)(X)) |
3953 | + |
3954 | +#define DEFAULT_MODULES_VADDR (machdep->kvbase - 16 * 1024 * 1024) |
3955 | +#define MODULES_VADDR (machdep->machspec->modules_vaddr) |
3956 | +#define MODULES_END (machdep->machspec->modules_end) |
3957 | +#define VMALLOC_START (machdep->machspec->vmalloc_start_addr) |
3958 | +#define VMALLOC_END (machdep->machspec->vmalloc_end) |
3959 | + |
3960 | +#define PGDIR_SHIFT (21) |
3961 | +#define PTRS_PER_PTE (512) |
3962 | +#define PTRS_PER_PGD (2048) |
3963 | + |
3964 | +#define PGD_OFFSET(vaddr) ((vaddr) >> PGDIR_SHIFT) |
3965 | +#define PTE_OFFSET(vaddr) (((vaddr) >> PAGESHIFT()) & (PTRS_PER_PTE - 1)) |
3966 | + |
3967 | +#define __SWP_TYPE_SHIFT 3 |
3968 | +#define __SWP_TYPE_BITS 6 |
3969 | +#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
3970 | +#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
3971 | + |
3972 | +#define SWP_TYPE(entry) (((entry) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) |
3973 | +#define SWP_OFFSET(entry) ((entry) >> __SWP_OFFSET_SHIFT) |
3974 | + |
3975 | +#define __swp_type(entry) SWP_TYPE(entry) |
3976 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
3977 | + |
3978 | +#define TIF_SIGPENDING (2) |
3979 | + |
3980 | +#define _SECTION_SIZE_BITS 28 |
3981 | +#define _MAX_PHYSMEM_BITS 32 |
3982 | + |
3983 | +#endif /* ARM */ |
3984 | + |
3985 | +#ifndef EM_AARCH64 |
3986 | +#define EM_AARCH64 183 |
3987 | +#endif |
3988 | + |
3989 | +#ifdef ARM64 |
3990 | +#define _64BIT_ |
3991 | +#define MACHINE_TYPE "ARM64" |
3992 | + |
3993 | +#define PTOV(X) \ |
3994 | + ((unsigned long)(X)-(machdep->machspec->phys_offset)+(machdep->kvbase)) |
3995 | +#define VTOP(X) \ |
3996 | + ((unsigned long)(X)-(machdep->kvbase)+(machdep->machspec->phys_offset)) |
3997 | + |
3998 | +#define USERSPACE_TOP (machdep->machspec->userspace_top) |
3999 | +#define PAGE_OFFSET (machdep->machspec->page_offset) |
4000 | +#define VMALLOC_START (machdep->machspec->vmalloc_start_addr) |
4001 | +#define VMALLOC_END (machdep->machspec->vmalloc_end) |
4002 | +#define VMEMMAP_VADDR (machdep->machspec->vmemmap_vaddr) |
4003 | +#define VMEMMAP_END (machdep->machspec->vmemmap_end) |
4004 | +#define MODULES_VADDR (machdep->machspec->modules_vaddr) |
4005 | +#define MODULES_END (machdep->machspec->modules_end) |
4006 | + |
4007 | +#define IS_VMALLOC_ADDR(X) arm64_IS_VMALLOC_ADDR((ulong)(X)) |
4008 | + |
4009 | +#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
4010 | + |
4011 | +/* |
4012 | + * 40-bit physical address supported. (512GB) |
4013 | + */ |
4014 | +#define PHYS_MASK_SHIFT (40) |
4015 | +#define PHYS_MASK (((1UL) << PHYS_MASK_SHIFT) - 1) |
4016 | + |
4017 | +typedef signed int s32; |
4018 | + |
4019 | +/* |
4020 | + * 3-levels / 4K pages |
4021 | + */ |
4022 | +#define PTRS_PER_PGD_L3_4K (512) |
4023 | +#define PTRS_PER_PMD_L3_4K (512) |
4024 | +#define PTRS_PER_PTE_L3_4K (512) |
4025 | +#define PGDIR_SHIFT_L3_4K (30) |
4026 | +#define PGDIR_SIZE_L3_4K ((1UL) << PGDIR_SHIFT_L3_4K) |
4027 | +#define PGDIR_MASK_L3 4K (~(PGDIR_SIZE_L3_4K-1)) |
4028 | +#define PMD_SHIFT_L3_4K (21) |
4029 | +#define PMD_SIZE_L3_4K (1UL << PMD_SHIFT_4K) |
4030 | +#define PMD_MASK_L3 4K (~(PMD_SIZE_4K-1)) |
4031 | + |
4032 | +/* |
4033 | + * 2-levels / 64K pages |
4034 | + */ |
4035 | +#define PTRS_PER_PGD_L2_64K (1024) |
4036 | +#define PTRS_PER_PTE_L2_64K (8192) |
4037 | +#define PGDIR_SHIFT_L2_64K (29) |
4038 | +#define PGDIR_SIZE_L2_64K ((1UL) << PGDIR_SHIFT_L2_64K) |
4039 | +#define PGDIR_MASK_L2_64K (~(PGDIR_SIZE_L2_64K-1)) |
4040 | + |
4041 | +/* |
4042 | + * Software defined PTE bits definition. |
4043 | + * (arch/arm64/include/asm/pgtable.h) |
4044 | + */ |
4045 | +#define PTE_VALID (1UL << 0) |
4046 | +#define PTE_PROT_NONE (1UL << 1) /* only when !PTE_VALID */ |
4047 | +#define PTE_FILE (1UL << 2) /* only when !pte_present() */ |
4048 | +#define PTE_DIRTY (1UL << 55) |
4049 | +#define PTE_SPECIAL (1UL << 56) |
4050 | + |
4051 | +/* |
4052 | + * HugeTLB/THP 3.10 support proposal swaps PTE_PROT_NONE |
4053 | + * and PTE_FILE bit positions: |
4054 | + */ |
4055 | +#define PTE_FILE_3_10 (1UL << 1) |
4056 | +#define PTE_PROT_NONE_3_10 (1UL << 2) |
4057 | + |
4058 | +/* |
4059 | + * Level 3 descriptor (PTE). |
4060 | + * (arch/arm64/include/asm/pgtable-hwdef.h) |
4061 | + */ |
4062 | +#define PTE_TYPE_MASK (3UL << 0) |
4063 | +#define PTE_TYPE_FAULT (0UL << 0) |
4064 | +#define PTE_TYPE_PAGE (3UL << 0) |
4065 | +#define PTE_USER (1UL << 6) /* AP[1] */ |
4066 | +#define PTE_RDONLY (1UL << 7) /* AP[2] */ |
4067 | +#define PTE_SHARED (3UL << 8) /* SH[1:0], inner shareable */ |
4068 | +#define PTE_AF (1UL << 10) /* Access Flag */ |
4069 | +#define PTE_NG (1UL << 11) /* nG */ |
4070 | +#define PTE_PXN (1UL << 53) /* Privileged XN */ |
4071 | +#define PTE_UXN (1UL << 54) /* User XN */ |
4072 | + |
4073 | +/* |
4074 | + * swap entry: |
4075 | + * bits 0-1: present (must be zero) |
4076 | + * bit 2: PTE_FILE |
4077 | + * bits 3-8: swap type |
4078 | + * bits 9-63: swap offset |
4079 | + * |
4080 | + * HugeTLB/THP 3.10 support proposal swaps PTE_PROT_NONE |
4081 | + * and PTE_FILE bit positions: |
4082 | + * |
4083 | + * bits 0, 2: present (must both be zero) |
4084 | + * bit 1: PTE_FILE |
4085 | + * bits 3-8: swap type |
4086 | + * bits 9-63: swap offset |
4087 | + */ |
4088 | +#define __SWP_TYPE_SHIFT 3 |
4089 | +#define __SWP_TYPE_BITS 6 |
4090 | +#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
4091 | +#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
4092 | + |
4093 | +#define __swp_type(x) (((x) >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) |
4094 | +#define __swp_offset(x) ((x) >> __SWP_OFFSET_SHIFT) |
4095 | +#define SWP_TYPE(x) __swp_type(x) |
4096 | +#define SWP_OFFSET(x) __swp_offset(x) |
4097 | + |
4098 | +#define KSYMS_START (0x1) |
4099 | +#define PHYS_OFFSET (0x2) |
4100 | +#define VM_L2_64K (0x4) |
4101 | +#define VM_L3_4K (0x8) |
4102 | + |
4103 | +/* |
4104 | + * source: Documentation/arm64/memory.txt |
4105 | + */ |
4106 | +#define ARM64_USERSPACE_TOP (0x0000007fffffffffUL) |
4107 | +#define ARM64_VMALLOC_START (0xffffff8000000000UL) |
4108 | +#define ARM64_VMALLOC_END (0xffffffbbfffeffffUL) |
4109 | +#define ARM64_VMEMMAP_VADDR (0xffffffbc00000000UL) |
4110 | +#define ARM64_VMEMMAP_END (0xffffffbffbbfffffUL) |
4111 | +#define ARM64_MODULES_VADDR (0xffffffbffc000000UL) |
4112 | +#define ARM64_MODULES_END (0xffffffbfffffffffUL) |
4113 | +#define ARM64_PAGE_OFFSET (0xffffffc000000000UL) |
4114 | + |
4115 | +#define ARM64_STACK_SIZE (8192) |
4116 | + |
4117 | +#define _SECTION_SIZE_BITS 30 |
4118 | +#define _MAX_PHYSMEM_BITS 40 |
4119 | + |
4120 | +typedef unsigned long long __u64; |
4121 | +typedef unsigned long long u64; |
4122 | + |
4123 | +struct arm64_user_pt_regs { |
4124 | + __u64 regs[31]; |
4125 | + __u64 sp; |
4126 | + __u64 pc; |
4127 | + __u64 pstate; |
4128 | +}; |
4129 | + |
4130 | +struct arm64_pt_regs { |
4131 | + union { |
4132 | + struct arm64_user_pt_regs user_regs; |
4133 | + struct { |
4134 | + u64 regs[31]; |
4135 | + u64 sp; |
4136 | + u64 pc; |
4137 | + u64 pstate; |
4138 | + }; |
4139 | + }; |
4140 | + u64 orig_x0; |
4141 | + u64 syscallno; |
4142 | +}; |
4143 | + |
4144 | +#define TIF_SIGPENDING (0) |
4145 | +#define display_idt_table() \ |
4146 | + error(FATAL, "-d option is not applicable to ARM64 architecture\n") |
4147 | + |
4148 | +struct machine_specific { |
4149 | + ulong flags; |
4150 | + ulong userspace_top; |
4151 | + ulong page_offset; |
4152 | + ulong vmalloc_start_addr; |
4153 | + ulong vmalloc_end; |
4154 | + ulong vmemmap_vaddr; |
4155 | + ulong vmemmap_end; |
4156 | + ulong modules_vaddr; |
4157 | + ulong modules_end; |
4158 | + ulong phys_offset; |
4159 | + ulong __exception_text_start; |
4160 | + ulong __exception_text_end; |
4161 | + struct arm64_pt_regs *panic_task_regs; |
4162 | + ulong pte_protnone; |
4163 | + ulong pte_file; |
4164 | +}; |
4165 | + |
4166 | +struct arm64_stackframe { |
4167 | + unsigned long fp; |
4168 | + unsigned long sp; |
4169 | + unsigned long pc; |
4170 | +}; |
4171 | + |
4172 | +#endif /* ARM64 */ |
4173 | + |
4174 | +#ifdef X86 |
4175 | +#define _32BIT_ |
4176 | +#define MACHINE_TYPE "X86" |
4177 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4178 | +#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase)) |
4179 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
4180 | +#define KVBASE_MASK (0x1ffffff) |
4181 | + |
4182 | +#define PGDIR_SHIFT_2LEVEL (22) |
4183 | +#define PTRS_PER_PTE_2LEVEL (1024) |
4184 | +#define PTRS_PER_PGD_2LEVEL (1024) |
4185 | + |
4186 | +#define PGDIR_SHIFT_3LEVEL (30) |
4187 | +#define PTRS_PER_PTE_3LEVEL (512) |
4188 | +#define PTRS_PER_PGD_3LEVEL (4) |
4189 | +#define PMD_SHIFT (21) /* only used by PAE translators */ |
4190 | +#define PTRS_PER_PMD (512) /* only used by PAE translators */ |
4191 | + |
4192 | +#define _PAGE_PRESENT 0x001 |
4193 | +#define _PAGE_RW 0x002 |
4194 | +#define _PAGE_USER 0x004 |
4195 | +#define _PAGE_PWT 0x008 |
4196 | +#define _PAGE_PCD 0x010 |
4197 | +#define _PAGE_ACCESSED 0x020 |
4198 | +#define _PAGE_DIRTY 0x040 |
4199 | +#define _PAGE_4M 0x080 /* 4 MB page, Pentium+, if present.. */ |
4200 | +#define _PAGE_PSE 0x080 /* 4 MB (or 2MB) page, Pentium+, if present.. */ |
4201 | +#define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */ |
4202 | +#define _PAGE_PROTNONE (machdep->machspec->page_protnone) |
4203 | +#define _PAGE_NX (0x8000000000000000ULL) |
4204 | + |
4205 | +#define NONPAE_PAGEBASE(X) (((unsigned long)(X)) & (unsigned long)machdep->pagemask) |
4206 | +#define NX_BIT_MASK (0x7fffffffffffffffULL) |
4207 | +#define PAE_PAGEBASE(X) (((unsigned long long)(X)) & ((unsigned long long)machdep->pagemask) & NX_BIT_MASK) |
4208 | + |
4209 | +#define SWP_TYPE(entry) (((entry) >> 1) & 0x3f) |
4210 | +#define SWP_OFFSET(entry) ((entry) >> 8) |
4211 | +#define __swp_type_PAE(entry) (((entry) >> 32) & 0x1f) |
4212 | +#define __swp_type_nonPAE(entry) (((entry) >> 1) & 0x1f) |
4213 | +#define __swp_offset_PAE(entry) (((entry) >> 32) >> 5) |
4214 | +#define __swp_offset_nonPAE(entry) ((entry) >> 8) |
4215 | +#define __swp_type(entry) (machdep->flags & PAE ? \ |
4216 | + __swp_type_PAE(entry) : __swp_type_nonPAE(entry)) |
4217 | +#define __swp_offset(entry) (machdep->flags & PAE ? \ |
4218 | + __swp_offset_PAE(entry) : __swp_offset_nonPAE(entry)) |
4219 | + |
4220 | +#define TIF_SIGPENDING (2) |
4221 | + |
4222 | +// CONFIG_X86_PAE |
4223 | +#define _SECTION_SIZE_BITS_PAE_ORIG 30 |
4224 | +#define _SECTION_SIZE_BITS_PAE_2_6_26 29 |
4225 | +#define _MAX_PHYSMEM_BITS_PAE 36 |
4226 | + |
4227 | +// !CONFIG_X86_PAE |
4228 | +#define _SECTION_SIZE_BITS 26 |
4229 | +#define _MAX_PHYSMEM_BITS 32 |
4230 | + |
4231 | +#define IS_LAST_PMD_READ_PAE(pmd) ((ulong)(pmd) == machdep->machspec->last_pmd_read_PAE) |
4232 | +#define IS_LAST_PTBL_READ_PAE(ptbl) ((ulong)(ptbl) == machdep->machspec->last_ptbl_read_PAE) |
4233 | + |
4234 | +#define FILL_PMD_PAE(PMD, TYPE, SIZE) \ |
4235 | + if (!IS_LAST_PMD_READ_PAE(PMD)) { \ |
4236 | + readmem((ulonglong)(PMD), TYPE, machdep->pmd, \ |
4237 | + SIZE, "pmd page", FAULT_ON_ERROR); \ |
4238 | + machdep->machspec->last_pmd_read_PAE = (ulonglong)(PMD); \ |
4239 | + } |
4240 | + |
4241 | +#define FILL_PTBL_PAE(PTBL, TYPE, SIZE) \ |
4242 | + if (!IS_LAST_PTBL_READ_PAE(PTBL)) { \ |
4243 | + readmem((ulonglong)(PTBL), TYPE, machdep->ptbl, \ |
4244 | + SIZE, "page table", FAULT_ON_ERROR); \ |
4245 | + machdep->machspec->last_ptbl_read_PAE = (ulonglong)(PTBL); \ |
4246 | + } |
4247 | + |
4248 | +#endif /* X86 */ |
4249 | + |
4250 | +#ifdef X86_64 |
4251 | +#define _64BIT_ |
4252 | +#define MACHINE_TYPE "X86_64" |
4253 | + |
4254 | +#define USERSPACE_TOP (machdep->machspec->userspace_top) |
4255 | +#define PAGE_OFFSET (machdep->machspec->page_offset) |
4256 | +#define VMALLOC_START (machdep->machspec->vmalloc_start_addr) |
4257 | +#define VMALLOC_END (machdep->machspec->vmalloc_end) |
4258 | +#define VMEMMAP_VADDR (machdep->machspec->vmemmap_vaddr) |
4259 | +#define VMEMMAP_END (machdep->machspec->vmemmap_end) |
4260 | +#define MODULES_VADDR (machdep->machspec->modules_vaddr) |
4261 | +#define MODULES_END (machdep->machspec->modules_end) |
4262 | + |
4263 | +#define __START_KERNEL_map 0xffffffff80000000UL |
4264 | +#define MODULES_LEN (MODULES_END - MODULES_VADDR) |
4265 | + |
4266 | +#define USERSPACE_TOP_ORIG 0x0000008000000000 |
4267 | +#define PAGE_OFFSET_ORIG 0x0000010000000000 |
4268 | +#define VMALLOC_START_ADDR_ORIG 0xffffff0000000000 |
4269 | +#define VMALLOC_END_ORIG 0xffffff7fffffffff |
4270 | +#define MODULES_VADDR_ORIG 0xffffffffa0000000 |
4271 | +#define MODULES_END_ORIG 0xffffffffafffffff |
4272 | + |
4273 | +#define USERSPACE_TOP_2_6_11 0x0000800000000000 |
4274 | +#define PAGE_OFFSET_2_6_11 0xffff810000000000 |
4275 | +#define VMALLOC_START_ADDR_2_6_11 0xffffc20000000000 |
4276 | +#define VMALLOC_END_2_6_11 0xffffe1ffffffffff |
4277 | +#define MODULES_VADDR_2_6_11 0xffffffff88000000 |
4278 | +#define MODULES_END_2_6_11 0xfffffffffff00000 |
4279 | + |
4280 | +#define VMEMMAP_VADDR_2_6_24 0xffffe20000000000 |
4281 | +#define VMEMMAP_END_2_6_24 0xffffe2ffffffffff |
4282 | + |
4283 | +#define MODULES_VADDR_2_6_26 0xffffffffa0000000 |
4284 | + |
4285 | +#define PAGE_OFFSET_2_6_27 0xffff880000000000 |
4286 | +#define MODULES_END_2_6_27 0xffffffffff000000 |
4287 | + |
4288 | +#define USERSPACE_TOP_XEN 0x0000800000000000 |
4289 | +#define PAGE_OFFSET_XEN 0xffff880000000000 |
4290 | +#define VMALLOC_START_ADDR_XEN 0xffffc20000000000 |
4291 | +#define VMALLOC_END_XEN 0xffffe1ffffffffff |
4292 | +#define MODULES_VADDR_XEN 0xffffffff88000000 |
4293 | +#define MODULES_END_XEN 0xfffffffffff00000 |
4294 | + |
4295 | +#define USERSPACE_TOP_XEN_RHEL4 0x0000008000000000 |
4296 | +#define PAGE_OFFSET_XEN_RHEL4 0xffffff8000000000 |
4297 | +#define VMALLOC_START_ADDR_XEN_RHEL4 0xffffff0000000000 |
4298 | +#define VMALLOC_END_XEN_RHEL4 0xffffff7fffffffff |
4299 | +#define MODULES_VADDR_XEN_RHEL4 0xffffffffa0000000 |
4300 | +#define MODULES_END_XEN_RHEL4 0xffffffffafffffff |
4301 | + |
4302 | +#define VMALLOC_START_ADDR_2_6_31 0xffffc90000000000 |
4303 | +#define VMALLOC_END_2_6_31 0xffffe8ffffffffff |
4304 | +#define VMEMMAP_VADDR_2_6_31 0xffffea0000000000 |
4305 | +#define VMEMMAP_END_2_6_31 0xffffeaffffffffff |
4306 | +#define MODULES_VADDR_2_6_31 0xffffffffa0000000 |
4307 | +#define MODULES_END_2_6_31 0xffffffffff000000 |
4308 | + |
4309 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4310 | +#define VTOP(X) x86_64_VTOP((ulong)(X)) |
4311 | +#define IS_VMALLOC_ADDR(X) x86_64_IS_VMALLOC_ADDR((ulong)(X)) |
4312 | + |
4313 | +#define PML4_SHIFT 39 |
4314 | +#define PTRS_PER_PML4 512 |
4315 | +#define PGDIR_SHIFT 30 |
4316 | +#define PTRS_PER_PGD 512 |
4317 | +#define PMD_SHIFT 21 |
4318 | +#define PTRS_PER_PMD 512 |
4319 | +#define PTRS_PER_PTE 512 |
4320 | + |
4321 | +#define pml4_index(address) (((address) >> PML4_SHIFT) & (PTRS_PER_PML4-1)) |
4322 | +#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |
4323 | +#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) |
4324 | +#define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) |
4325 | + |
4326 | +#define IS_LAST_PML4_READ(pml4) ((ulong)(pml4) == machdep->machspec->last_pml4_read) |
4327 | + |
4328 | +#define FILL_PML4() { \ |
4329 | + if (!(pc->flags & RUNTIME) || ACTIVE()) \ |
4330 | + if (!IS_LAST_PML4_READ(vt->kernel_pgd[0])) \ |
4331 | + readmem(vt->kernel_pgd[0], KVADDR, machdep->machspec->pml4, \ |
4332 | + PAGESIZE(), "init_level4_pgt", FAULT_ON_ERROR); \ |
4333 | + machdep->machspec->last_pml4_read = (ulong)(vt->kernel_pgd[0]); \ |
4334 | + } |
4335 | + |
4336 | +#define FILL_PML4_HYPER() { \ |
4337 | + if (!machdep->machspec->last_pml4_read) { \ |
4338 | + unsigned long idle_pg_table = \ |
4339 | + symbol_exists("idle_pg_table_4") ? symbol_value("idle_pg_table_4") : \ |
4340 | + symbol_value("idle_pg_table"); \ |
4341 | + readmem(idle_pg_table, KVADDR, \ |
4342 | + machdep->machspec->pml4, PAGESIZE(), "idle_pg_table", \ |
4343 | + FAULT_ON_ERROR); \ |
4344 | + machdep->machspec->last_pml4_read = idle_pg_table; \ |
4345 | + }\ |
4346 | +} |
4347 | + |
4348 | +#define IS_LAST_UPML_READ(pml) ((ulong)(pml) == machdep->machspec->last_upml_read) |
4349 | + |
4350 | +#define FILL_UPML(PML, TYPE, SIZE) \ |
4351 | + if (!IS_LAST_UPML_READ(PML)) { \ |
4352 | + readmem((ulonglong)((ulong)(PML)), TYPE, machdep->machspec->upml, \ |
4353 | + SIZE, "pml page", FAULT_ON_ERROR); \ |
4354 | + machdep->machspec->last_upml_read = (ulong)(PML); \ |
4355 | + } |
4356 | + |
4357 | +/* |
4358 | + * PHYSICAL_PAGE_MASK changed (enlarged) between 2.4 and 2.6, so |
4359 | + * for safety, use the 2.6 values to generate it. |
4360 | + */ |
4361 | +#define __PHYSICAL_MASK_SHIFT 40 |
4362 | +#define __PHYSICAL_MASK ((1UL << __PHYSICAL_MASK_SHIFT) - 1) |
4363 | +#define __VIRTUAL_MASK_SHIFT 48 |
4364 | +#define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) |
4365 | +#define PAGE_SHIFT 12 |
4366 | +#define PAGE_SIZE (1UL << PAGE_SHIFT) |
4367 | +#define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & (__PHYSICAL_MASK << PAGE_SHIFT)) |
4368 | + |
4369 | +#define _PAGE_BIT_NX 63 |
4370 | +#define _PAGE_PRESENT 0x001 |
4371 | +#define _PAGE_RW 0x002 |
4372 | +#define _PAGE_USER 0x004 |
4373 | +#define _PAGE_PWT 0x008 |
4374 | +#define _PAGE_PCD 0x010 |
4375 | +#define _PAGE_ACCESSED 0x020 |
4376 | +#define _PAGE_DIRTY 0x040 |
4377 | +#define _PAGE_PSE 0x080 /* 2MB page */ |
4378 | +#define _PAGE_FILE 0x040 /* set:pagecache, unset:swap */ |
4379 | +#define _PAGE_GLOBAL 0x100 /* Global TLB entry */ |
4380 | +#define _PAGE_PROTNONE (machdep->machspec->page_protnone) |
4381 | +#define _PAGE_NX (1UL<<_PAGE_BIT_NX) |
4382 | + |
4383 | +#define SWP_TYPE(entry) (((entry) >> 1) & 0x3f) |
4384 | +#define SWP_OFFSET(entry) ((entry) >> 8) |
4385 | +#define __swp_type(entry) SWP_TYPE(entry) |
4386 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4387 | + |
4388 | +#define TIF_SIGPENDING (2) |
4389 | + |
4390 | +#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
4391 | + |
4392 | +#define _CPU_PDA_READ2(CPU, BUFFER) \ |
4393 | + ((readmem(symbol_value("_cpu_pda"), \ |
4394 | + KVADDR, &cpu_pda_addr, sizeof(unsigned long), \ |
4395 | + "_cpu_pda addr", RETURN_ON_ERROR)) && \ |
4396 | + (readmem(cpu_pda_addr + ((CPU) * sizeof(void *)), \ |
4397 | + KVADDR, &cpu_pda_addr, sizeof(unsigned long), \ |
4398 | + "_cpu_pda addr", RETURN_ON_ERROR)) && \ |
4399 | + (cpu_pda_addr) && \ |
4400 | + (readmem(cpu_pda_addr, KVADDR, (BUFFER), SIZE(x8664_pda), \ |
4401 | + "cpu_pda entry", RETURN_ON_ERROR))) |
4402 | + |
4403 | +#define _CPU_PDA_READ(CPU, BUFFER) \ |
4404 | + ((STRNEQ("_cpu_pda", closest_symbol((symbol_value("_cpu_pda") + \ |
4405 | + ((CPU) * sizeof(unsigned long)))))) && \ |
4406 | + (readmem(symbol_value("_cpu_pda") + ((CPU) * sizeof(void *)), \ |
4407 | + KVADDR, &cpu_pda_addr, sizeof(unsigned long), \ |
4408 | + "_cpu_pda addr", RETURN_ON_ERROR)) && \ |
4409 | + (readmem(cpu_pda_addr, KVADDR, (BUFFER), SIZE(x8664_pda), \ |
4410 | + "cpu_pda entry", RETURN_ON_ERROR))) |
4411 | + |
4412 | +#define CPU_PDA_READ(CPU, BUFFER) \ |
4413 | + (STRNEQ("cpu_pda", closest_symbol((symbol_value("cpu_pda") + \ |
4414 | + ((CPU) * SIZE(x8664_pda))))) && \ |
4415 | + readmem(symbol_value("cpu_pda") + ((CPU) * SIZE(x8664_pda)), \ |
4416 | + KVADDR, (BUFFER), SIZE(x8664_pda), "cpu_pda entry", \ |
4417 | + RETURN_ON_ERROR)) |
4418 | + |
4419 | +#define VALID_LEVEL4_PGT_ADDR(X) \ |
4420 | + (((X) == VIRTPAGEBASE(X)) && IS_KVADDR(X) && !IS_VMALLOC_ADDR(X)) |
4421 | + |
4422 | +#define _SECTION_SIZE_BITS 27 |
4423 | +#define _MAX_PHYSMEM_BITS 40 |
4424 | +#define _MAX_PHYSMEM_BITS_2_6_26 44 |
4425 | +#define _MAX_PHYSMEM_BITS_2_6_31 46 |
4426 | + |
4427 | +#endif /* X86_64 */ |
4428 | + |
4429 | +#ifdef ALPHA |
4430 | +#define _64BIT_ |
4431 | +#define MACHINE_TYPE "ALPHA" |
4432 | + |
4433 | +#define PAGEBASE(X) (((unsigned long)(X)) & (unsigned long)machdep->pagemask) |
4434 | + |
4435 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4436 | +#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase)) |
4437 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
4438 | +#define KSEG_BASE_48_BIT (0xffff800000000000) |
4439 | +#define KSEG_BASE (0xfffffc0000000000) |
4440 | +#define _PFN_MASK (0xFFFFFFFF00000000) |
4441 | +#define VMALLOC_START (0xFFFFFE0000000000) |
4442 | +#define MIN_SYMBOL_VALUE (KSEG_BASE_48_BIT) |
4443 | + |
4444 | +#define PGDIR_SHIFT (PAGESHIFT() + 2*(PAGESHIFT()-3)) |
4445 | +#define PMD_SHIFT (PAGESHIFT() + (PAGESHIFT()-3)) |
4446 | +#define PTRS_PER_PAGE (1024) |
4447 | + |
4448 | +#define PTRS_PER_PGD (1UL << (PAGESHIFT()-3)) |
4449 | + |
4450 | +/* |
4451 | + * OSF/1 PAL-code-imposed page table bits |
4452 | + */ |
4453 | +#define _PAGE_VALID 0x0001 |
4454 | +#define _PAGE_FOR 0x0002 /* used for page protection (fault on read) */ |
4455 | +#define _PAGE_FOW 0x0004 /* used for page protection (fault on write) */ |
4456 | +#define _PAGE_FOE 0x0008 /* used for page protection (fault on exec) */ |
4457 | +#define _PAGE_ASM 0x0010 |
4458 | +#define _PAGE_KRE 0x0100 /* xxx - see below on the "accessed" bit */ |
4459 | +#define _PAGE_URE 0x0200 /* xxx */ |
4460 | +#define _PAGE_KWE 0x1000 /* used to do the dirty bit in software */ |
4461 | +#define _PAGE_UWE 0x2000 /* used to do the dirty bit in software */ |
4462 | + |
4463 | +/* .. and these are ours ... */ |
4464 | +#define _PAGE_DIRTY 0x20000 |
4465 | +#define _PAGE_ACCESSED 0x40000 |
4466 | + |
4467 | +#define SWP_TYPE(entry) (((entry) >> 32) & 0xff) |
4468 | +#define SWP_OFFSET(entry) ((entry) >> 40) |
4469 | +#define __swp_type(entry) SWP_TYPE(entry) |
4470 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4471 | + |
4472 | +#define TIF_SIGPENDING (2) |
4473 | + |
4474 | +#endif /* ALPHA */ |
4475 | + |
4476 | +#ifdef PPC |
4477 | +#define _32BIT_ |
4478 | +#define MACHINE_TYPE "PPC" |
4479 | + |
4480 | +#define PAGEBASE(X) ((X) & machdep->pagemask) |
4481 | + |
4482 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4483 | +#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase)) |
4484 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
4485 | + |
4486 | +/* Holds the platform specific info for page translation */ |
4487 | +struct machine_specific { |
4488 | + char *platform; |
4489 | + |
4490 | + /* page address translation bits */ |
4491 | + int pte_size; |
4492 | + int pte_rpn_shift; |
4493 | + |
4494 | + /* page flags */ |
4495 | + ulong _page_present; |
4496 | + ulong _page_user; |
4497 | + ulong _page_rw; |
4498 | + ulong _page_guarded; |
4499 | + ulong _page_coherent; |
4500 | + ulong _page_no_cache; |
4501 | + ulong _page_writethru; |
4502 | + ulong _page_dirty; |
4503 | + ulong _page_accessed; |
4504 | + ulong _page_hwwrite; |
4505 | + ulong _page_shared; |
4506 | + ulong _page_k_rw; |
4507 | + |
4508 | + /* platform special vtop */ |
4509 | + int (*vtop_special)(ulong vaddr, physaddr_t *paddr, int verbose); |
4510 | + void *mmu_special; |
4511 | +}; |
4512 | + |
4513 | +/* machdep flags for ppc32 specific */ |
4514 | +#define IS_PAE() (machdep->flags & PAE) |
4515 | +#define IS_BOOKE() (machdep->flags & CPU_BOOKE) |
4516 | +/* Page translation bits */ |
4517 | +#define PPC_PLATFORM (machdep->machspec->platform) |
4518 | +#define PTE_SIZE (machdep->machspec->pte_size) |
4519 | +#define PTE_RPN_SHIFT (machdep->machspec->pte_rpn_shift) |
4520 | +#define PAGE_SHIFT (12) |
4521 | +#define PTE_T_LOG2 (ffs(PTE_SIZE) - 1) |
4522 | +#define PTE_SHIFT (PAGE_SHIFT - PTE_T_LOG2) |
4523 | +#define PGDIR_SHIFT (PAGE_SHIFT + PTE_SHIFT) |
4524 | +#define PTRS_PER_PGD (1 << (32 - PGDIR_SHIFT)) |
4525 | +#define PTRS_PER_PTE (1 << PTE_SHIFT) |
4526 | +/* special vtop */ |
4527 | +#define VTOP_SPECIAL (machdep->machspec->vtop_special) |
4528 | +#define MMU_SPECIAL (machdep->machspec->mmu_special) |
4529 | + |
4530 | +/* PFN shifts */ |
4531 | +#define BOOKE3E_PTE_RPN_SHIFT (24) |
4532 | + |
4533 | +/* PAGE flags */ |
4534 | +#define _PAGE_PRESENT (machdep->machspec->_page_present) /* software: pte contains a translation */ |
4535 | +#define _PAGE_USER (machdep->machspec->_page_user) /* matches one of the PP bits */ |
4536 | +#define _PAGE_RW (machdep->machspec->_page_rw) /* software: user write access allowed */ |
4537 | +#define _PAGE_GUARDED (machdep->machspec->_page_guarded) |
4538 | +#define _PAGE_COHERENT (machdep->machspec->_page_coherent /* M: enforce memory coherence (SMP systems) */) |
4539 | +#define _PAGE_NO_CACHE (machdep->machspec->_page_no_cache) /* I: cache inhibit */ |
4540 | +#define _PAGE_WRITETHRU (machdep->machspec->_page_writethru) /* W: cache write-through */ |
4541 | +#define _PAGE_DIRTY (machdep->machspec->_page_dirty) /* C: page changed */ |
4542 | +#define _PAGE_ACCESSED (machdep->machspec->_page_accessed) /* R: page referenced */ |
4543 | +#define _PAGE_HWWRITE (machdep->machspec->_page_hwwrite) /* software: _PAGE_RW & _PAGE_DIRTY */ |
4544 | +#define _PAGE_SHARED (machdep->machspec->_page_shared) |
4545 | +#define _PAGE_K_RW (machdep->machspec->_page_k_rw) /* privilege only write access allowed */ |
4546 | + |
4547 | +/* Default values for PAGE flags */ |
4548 | +#define DEFAULT_PAGE_PRESENT 0x001 |
4549 | +#define DEFAULT_PAGE_USER 0x002 |
4550 | +#define DEFAULT_PAGE_RW 0x004 |
4551 | +#define DEFAULT_PAGE_GUARDED 0x008 |
4552 | +#define DEFAULT_PAGE_COHERENT 0x010 |
4553 | +#define DEFAULT_PAGE_NO_CACHE 0x020 |
4554 | +#define DEFAULT_PAGE_WRITETHRU 0x040 |
4555 | +#define DEFAULT_PAGE_DIRTY 0x080 |
4556 | +#define DEFAULT_PAGE_ACCESSED 0x100 |
4557 | +#define DEFAULT_PAGE_HWWRITE 0x200 |
4558 | +#define DEFAULT_PAGE_SHARED 0 |
4559 | + |
4560 | +/* PPC44x PAGE flags: Values from kernel asm/pte-44x.h */ |
4561 | +#define PPC44x_PAGE_PRESENT 0x001 |
4562 | +#define PPC44x_PAGE_RW 0x002 |
4563 | +#define PPC44x_PAGE_ACCESSED 0x008 |
4564 | +#define PPC44x_PAGE_DIRTY 0x010 |
4565 | +#define PPC44x_PAGE_USER 0x040 |
4566 | +#define PPC44x_PAGE_GUARDED 0x100 |
4567 | +#define PPC44x_PAGE_COHERENT 0x200 |
4568 | +#define PPC44x_PAGE_NO_CACHE 0x400 |
4569 | +#define PPC44x_PAGE_WRITETHRU 0x800 |
4570 | +#define PPC44x_PAGE_HWWRITE 0 |
4571 | +#define PPC44x_PAGE_SHARED 0 |
4572 | + |
4573 | +/* BOOK3E */ |
4574 | +#define BOOK3E_PAGE_PRESENT 0x000001 |
4575 | +#define BOOK3E_PAGE_BAP_SR 0x000004 |
4576 | +#define BOOK3E_PAGE_BAP_UR 0x000008 /* User Readable */ |
4577 | +#define BOOK3E_PAGE_BAP_SW 0x000010 |
4578 | +#define BOOK3E_PAGE_BAP_UW 0x000020 /* User Writable */ |
4579 | +#define BOOK3E_PAGE_DIRTY 0x001000 |
4580 | +#define BOOK3E_PAGE_ACCESSED 0x040000 |
4581 | +#define BOOK3E_PAGE_GUARDED 0x100000 |
4582 | +#define BOOK3E_PAGE_COHERENT 0x200000 |
4583 | +#define BOOK3E_PAGE_NO_CACHE 0x400000 |
4584 | +#define BOOK3E_PAGE_WRITETHRU 0x800000 |
4585 | +#define BOOK3E_PAGE_HWWRITE 0 |
4586 | +#define BOOK3E_PAGE_SHARED 0 |
4587 | +#define BOOK3E_PAGE_USER (BOOK3E_PAGE_BAP_SR | BOOK3E_PAGE_BAP_UR) |
4588 | +#define BOOK3E_PAGE_RW (BOOK3E_PAGE_BAP_SW | BOOK3E_PAGE_BAP_UW) |
4589 | +#define BOOK3E_PAGE_KERNEL_RW (BOOK3E_PAGE_BAP_SW | BOOK3E_PAGE_BAP_SR | BOOK3E_PAGE_DIRTY) |
4590 | + |
4591 | +/* FSL BOOKE */ |
4592 | +#define FSL_BOOKE_PAGE_PRESENT 0x00001 |
4593 | +#define FSL_BOOKE_PAGE_USER 0x00002 |
4594 | +#define FSL_BOOKE_PAGE_RW 0x00004 |
4595 | +#define FSL_BOOKE_PAGE_DIRTY 0x00008 |
4596 | +#define FSL_BOOKE_PAGE_ACCESSED 0x00020 |
4597 | +#define FSL_BOOKE_PAGE_GUARDED 0x00080 |
4598 | +#define FSL_BOOKE_PAGE_COHERENT 0x00100 |
4599 | +#define FSL_BOOKE_PAGE_NO_CACHE 0x00200 |
4600 | +#define FSL_BOOKE_PAGE_WRITETHRU 0x00400 |
4601 | +#define FSL_BOOKE_PAGE_HWWRITE 0 |
4602 | +#define FSL_BOOKE_PAGE_SHARED 0 |
4603 | + |
4604 | +#define SWP_TYPE(entry) (((entry) >> 1) & 0x7f) |
4605 | +#define SWP_OFFSET(entry) ((entry) >> 8) |
4606 | +#define __swp_type(entry) SWP_TYPE(entry) |
4607 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4608 | + |
4609 | +#define TIF_SIGPENDING (2) |
4610 | + |
4611 | +#define _SECTION_SIZE_BITS 24 |
4612 | +#define _MAX_PHYSMEM_BITS 44 |
4613 | + |
4614 | +#define STACK_FRAME_OVERHEAD 16 |
4615 | +#define STACK_FRAME_LR_SAVE (sizeof(ulong)) |
4616 | +#define STACK_FRAME_MARKER (2 * sizeof(ulong)) |
4617 | +#define STACK_FRAME_REGS_MARKER 0x72656773 |
4618 | +#define PPC_STACK_SIZE 8192 |
4619 | + |
4620 | +#endif /* PPC */ |
4621 | + |
4622 | +#ifdef IA64 |
4623 | +#define _64BIT_ |
4624 | +#define MACHINE_TYPE "IA64" |
4625 | + |
4626 | +#define PAGEBASE(X) (((unsigned long)(X)) & (unsigned long)machdep->pagemask) |
4627 | + |
4628 | +#define REGION_SHIFT (61) |
4629 | +#define VADDR_REGION(X) ((ulong)(X) >> REGION_SHIFT) |
4630 | + |
4631 | +#define KERNEL_CACHED_REGION (7) |
4632 | +#define KERNEL_UNCACHED_REGION (6) |
4633 | +#define KERNEL_VMALLOC_REGION (5) |
4634 | +#define USER_STACK_REGION (4) |
4635 | +#define USER_DATA_REGION (3) |
4636 | +#define USER_TEXT_REGION (2) |
4637 | +#define USER_SHMEM_REGION (1) |
4638 | +#define USER_IA32_EMUL_REGION (0) |
4639 | + |
4640 | +#define KERNEL_VMALLOC_BASE ((ulong)KERNEL_VMALLOC_REGION << REGION_SHIFT) |
4641 | +#define KERNEL_UNCACHED_BASE ((ulong)KERNEL_UNCACHED_REGION << REGION_SHIFT) |
4642 | +#define KERNEL_CACHED_BASE ((ulong)KERNEL_CACHED_REGION << REGION_SHIFT) |
4643 | + |
4644 | +#define _SECTION_SIZE_BITS 30 |
4645 | +#define _MAX_PHYSMEM_BITS 50 |
4646 | + |
4647 | +/* |
4648 | + * As of 2.6, these are no longer straight forward. |
4649 | + */ |
4650 | +#define PTOV(X) ia64_PTOV((ulong)(X)) |
4651 | +#define VTOP(X) ia64_VTOP((ulong)(X)) |
4652 | +#define IS_VMALLOC_ADDR(X) ia64_IS_VMALLOC_ADDR((ulong)(X)) |
4653 | + |
4654 | +#define SWITCH_STACK_ADDR(X) (ia64_get_switch_stack((ulong)(X))) |
4655 | + |
4656 | +#define __IA64_UL(x) ((unsigned long)(x)) |
4657 | +#define IA64_MAX_PHYS_BITS (50) /* max # of phys address bits (architected) */ |
4658 | + |
4659 | +/* |
4660 | + * How many pointers will a page table level hold expressed in shift |
4661 | + */ |
4662 | +#define PTRS_PER_PTD_SHIFT (PAGESHIFT()-3) |
4663 | + |
4664 | +/* |
4665 | + * Definitions for fourth level: |
4666 | + */ |
4667 | +#define PTRS_PER_PTE (__IA64_UL(1) << (PTRS_PER_PTD_SHIFT)) |
4668 | + |
4669 | +/* |
4670 | + * Definitions for third level: |
4671 | + * |
4672 | + * PMD_SHIFT determines the size of the area a third-level page table |
4673 | + * can map. |
4674 | + */ |
4675 | +#define PMD_SHIFT (PAGESHIFT() + (PTRS_PER_PTD_SHIFT)) |
4676 | +#define PMD_SIZE (1UL << PMD_SHIFT) |
4677 | +#define PMD_MASK (~(PMD_SIZE-1)) |
4678 | +#define PTRS_PER_PMD (1UL << (PTRS_PER_PTD_SHIFT)) |
4679 | + |
4680 | +/* |
4681 | + * PUD_SHIFT determines the size of the area a second-level page table |
4682 | + * can map |
4683 | + */ |
4684 | +#define PUD_SHIFT (PMD_SHIFT + (PTRS_PER_PTD_SHIFT)) |
4685 | +#define PUD_SIZE (1UL << PUD_SHIFT) |
4686 | +#define PUD_MASK (~(PUD_SIZE-1)) |
4687 | +#define PTRS_PER_PUD (1UL << (PTRS_PER_PTD_SHIFT)) |
4688 | + |
4689 | +/* |
4690 | + * Definitions for first level: |
4691 | + * |
4692 | + * PGDIR_SHIFT determines what a first-level page table entry can map. |
4693 | + */ |
4694 | + |
4695 | +#define PGDIR_SHIFT_4L (PUD_SHIFT + (PTRS_PER_PTD_SHIFT)) |
4696 | +#define PGDIR_SHIFT_3L (PMD_SHIFT + (PTRS_PER_PTD_SHIFT)) |
4697 | +/* Turns out 4L & 3L PGDIR_SHIFT are the same (for now) */ |
4698 | +#define PGDIR_SHIFT PGDIR_SHIFT_4L |
4699 | +#define PGDIR_SIZE (__IA64_UL(1) << PGDIR_SHIFT) |
4700 | +#define PGDIR_MASK (~(PGDIR_SIZE-1)) |
4701 | +#define PTRS_PER_PGD_SHIFT PTRS_PER_PTD_SHIFT |
4702 | +#define PTRS_PER_PGD (1UL << PTRS_PER_PGD_SHIFT) |
4703 | +#define USER_PTRS_PER_PGD (5*PTRS_PER_PGD/8) /* regions 0-4 are user regions */ |
4704 | +#define FIRST_USER_ADDRESS 0 |
4705 | + |
4706 | +/* |
4707 | + * First, define the various bits in a PTE. Note that the PTE format |
4708 | + * matches the VHPT short format, the firt doubleword of the VHPD long |
4709 | + * format, and the first doubleword of the TLB insertion format. |
4710 | + */ |
4711 | +#define _PAGE_P (1 << 0) /* page present bit */ |
4712 | +#define _PAGE_MA_WB (0x0 << 2) /* write back memory attribute */ |
4713 | +#define _PAGE_MA_UC (0x4 << 2) /* uncacheable memory attribute */ |
4714 | +#define _PAGE_MA_UCE (0x5 << 2) /* UC exported attribute */ |
4715 | +#define _PAGE_MA_WC (0x6 << 2) /* write coalescing memory attribute */ |
4716 | +#define _PAGE_MA_NAT (0x7 << 2) /* not-a-thing attribute */ |
4717 | +#define _PAGE_MA_MASK (0x7 << 2) |
4718 | +#define _PAGE_PL_0 (0 << 7) /* privilege level 0 (kernel) */ |
4719 | +#define _PAGE_PL_1 (1 << 7) /* privilege level 1 (unused) */ |
4720 | +#define _PAGE_PL_2 (2 << 7) /* privilege level 2 (unused) */ |
4721 | +#define _PAGE_PL_3 (3 << 7) /* privilege level 3 (user) */ |
4722 | +#define _PAGE_PL_MASK (3 << 7) |
4723 | +#define _PAGE_AR_R (0 << 9) /* read only */ |
4724 | +#define _PAGE_AR_RX (1 << 9) /* read & execute */ |
4725 | +#define _PAGE_AR_RW (2 << 9) /* read & write */ |
4726 | +#define _PAGE_AR_RWX (3 << 9) /* read, write & execute */ |
4727 | +#define _PAGE_AR_R_RW (4 << 9) /* read / read & write */ |
4728 | +#define _PAGE_AR_RX_RWX (5 << 9) /* read & exec / read, write & exec */ |
4729 | +#define _PAGE_AR_RWX_RW (6 << 9) /* read, write & exec / read & write */ |
4730 | +#define _PAGE_AR_X_RX (7 << 9) /* exec & promote / read & exec */ |
4731 | +#define _PAGE_AR_MASK (7 << 9) |
4732 | +#define _PAGE_AR_SHIFT 9 |
4733 | +#define _PAGE_A (1 << 5) /* page accessed bit */ |
4734 | +#define _PAGE_D (1 << 6) /* page dirty bit */ |
4735 | +#define _PAGE_PPN_MASK (((__IA64_UL(1) << IA64_MAX_PHYS_BITS) - 1) & ~0xfffUL) |
4736 | +#define _PAGE_ED (__IA64_UL(1) << 52) /* exception deferral */ |
4737 | +#define _PAGE_PROTNONE (__IA64_UL(1) << 63) |
4738 | + |
4739 | +#define _PFN_MASK _PAGE_PPN_MASK |
4740 | +#define _PAGE_CHG_MASK (_PFN_MASK | _PAGE_A | _PAGE_D) |
4741 | + |
4742 | +#define _PAGE_SIZE_4K 12 |
4743 | +#define _PAGE_SIZE_8K 13 |
4744 | +#define _PAGE_SIZE_16K 14 |
4745 | +#define _PAGE_SIZE_64K 16 |
4746 | +#define _PAGE_SIZE_256K 18 |
4747 | +#define _PAGE_SIZE_1M 20 |
4748 | +#define _PAGE_SIZE_4M 22 |
4749 | +#define _PAGE_SIZE_16M 24 |
4750 | +#define _PAGE_SIZE_64M 26 |
4751 | +#define _PAGE_SIZE_256M 28 |
4752 | + |
4753 | +#define __ACCESS_BITS _PAGE_ED | _PAGE_A | _PAGE_P | _PAGE_MA_WB |
4754 | +#define __DIRTY_BITS_NO_ED _PAGE_A | _PAGE_P | _PAGE_D | _PAGE_MA_WB |
4755 | +#define __DIRTY_BITS _PAGE_ED | __DIRTY_BITS_NO_ED |
4756 | + |
4757 | +#define EFI_PAGE_SHIFT (12) |
4758 | + |
4759 | +/* |
4760 | + * NOTE: #include'ing <asm/efi.h> creates too many compiler problems, so |
4761 | + * this stuff is hardwired here; it's probably etched in stone somewhere. |
4762 | + */ |
4763 | +struct efi_memory_desc_t { |
4764 | + uint32_t type; |
4765 | + uint32_t pad; |
4766 | + uint64_t phys_addr; |
4767 | + uint64_t virt_addr; |
4768 | + uint64_t num_pages; |
4769 | + uint64_t attribute; |
4770 | +} desc; |
4771 | + |
4772 | +/* Memory types: */ |
4773 | +#define EFI_RESERVED_TYPE 0 |
4774 | +#define EFI_LOADER_CODE 1 |
4775 | +#define EFI_LOADER_DATA 2 |
4776 | +#define EFI_BOOT_SERVICES_CODE 3 |
4777 | +#define EFI_BOOT_SERVICES_DATA 4 |
4778 | +#define EFI_RUNTIME_SERVICES_CODE 5 |
4779 | +#define EFI_RUNTIME_SERVICES_DATA 6 |
4780 | +#define EFI_CONVENTIONAL_MEMORY 7 |
4781 | +#define EFI_UNUSABLE_MEMORY 8 |
4782 | +#define EFI_ACPI_RECLAIM_MEMORY 9 |
4783 | +#define EFI_ACPI_MEMORY_NVS 10 |
4784 | +#define EFI_MEMORY_MAPPED_IO 11 |
4785 | +#define EFI_MEMORY_MAPPED_IO_PORT_SPACE 12 |
4786 | +#define EFI_PAL_CODE 13 |
4787 | +#define EFI_MAX_MEMORY_TYPE 14 |
4788 | + |
4789 | +/* Attribute values: */ |
4790 | +#define EFI_MEMORY_UC 0x0000000000000001 /* uncached */ |
4791 | +#define EFI_MEMORY_WC 0x0000000000000002 /* write-coalescing */ |
4792 | +#define EFI_MEMORY_WT 0x0000000000000004 /* write-through */ |
4793 | +#define EFI_MEMORY_WB 0x0000000000000008 /* write-back */ |
4794 | +#define EFI_MEMORY_WP 0x0000000000001000 /* write-protect */ |
4795 | +#define EFI_MEMORY_RP 0x0000000000002000 /* read-protect */ |
4796 | +#define EFI_MEMORY_XP 0x0000000000004000 /* execute-protect */ |
4797 | +#define EFI_MEMORY_RUNTIME 0x8000000000000000 /* range requires runtime mapping */ |
4798 | + |
4799 | +#define SWP_TYPE(entry) (((entry) >> 1) & 0xff) |
4800 | +#define SWP_OFFSET(entry) ((entry) >> 9) |
4801 | +#define __swp_type(entry) ((entry >> 2) & 0x7f) |
4802 | +#define __swp_offset(entry) ((entry << 1) >> 10) |
4803 | + |
4804 | +#define TIF_SIGPENDING (1) |
4805 | + |
4806 | +#define KERNEL_TR_PAGE_SIZE (1 << _PAGE_SIZE_64M) |
4807 | +#define KERNEL_TR_PAGE_MASK (~(KERNEL_TR_PAGE_SIZE - 1)) |
4808 | + |
4809 | +#define UNKNOWN_PHYS_START ((ulong)(-1)) |
4810 | +#define DEFAULT_PHYS_START (KERNEL_TR_PAGE_SIZE * 1) |
4811 | + |
4812 | +#define IA64_GET_STACK_ULONG(OFF) \ |
4813 | + ((INSTACK(OFF,bt)) ? (GET_STACK_ULONG(OFF)) : get_init_stack_ulong((unsigned long)OFF)) |
4814 | + |
4815 | +#endif /* IA64 */ |
4816 | + |
4817 | +#ifdef PPC64 |
4818 | +#define _64BIT_ |
4819 | +#define MACHINE_TYPE "PPC64" |
4820 | + |
4821 | +#define PPC64_64K_PAGE_SIZE 65536 |
4822 | +#define PPC64_STACK_SIZE 16384 |
4823 | + |
4824 | +#define PAGEBASE(X) (((ulong)(X)) & (ulong)machdep->pagemask) |
4825 | + |
4826 | +#define PTOV(X) ((unsigned long)(X)+(machdep->identity_map_base)) |
4827 | +#define VTOP(X) ((unsigned long)(X)-(machdep->identity_map_base)) |
4828 | +#define BOOK3E_VMBASE 0x8000000000000000 |
4829 | +#define IS_VMALLOC_ADDR(X) machdep->machspec->is_vmaddr(X) |
4830 | +#define KERNELBASE machdep->pageoffset |
4831 | + |
4832 | +#define PGDIR_SHIFT (machdep->pageshift + (machdep->pageshift -3) + (machdep->pageshift - 2)) |
4833 | +#define PMD_SHIFT (machdep->pageshift + (machdep->pageshift - 3)) |
4834 | + |
4835 | +#define PGD_MASK (~((1UL << PGDIR_SHIFT) - 1)) |
4836 | +#define PMD_MASK (~((1UL << PMD_SHIFT) - 1)) |
4837 | + |
4838 | +/* shift to put page number into pte */ |
4839 | +#define PTE_SHIFT 16 |
4840 | +#define PMD_TO_PTEPAGE_SHIFT 2 /* Used for 2.6 or later */ |
4841 | + |
4842 | +#define PTE_INDEX_SIZE 9 |
4843 | +#define PMD_INDEX_SIZE 10 |
4844 | +#define PGD_INDEX_SIZE 10 |
4845 | + |
4846 | +#define PTRS_PER_PTE (1 << PTE_INDEX_SIZE) |
4847 | +#define PTRS_PER_PMD (1 << PMD_INDEX_SIZE) |
4848 | +#define PTRS_PER_PGD (1 << PGD_INDEX_SIZE) |
4849 | + |
4850 | +#define PGD_OFFSET_24(vaddr) ((vaddr >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) |
4851 | +#define PGD_OFFSET(vaddr) ((vaddr >> PGDIR_SHIFT) & 0x7ff) |
4852 | +#define PMD_OFFSET(vaddr) ((vaddr >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) |
4853 | + |
4854 | +/* 4-level page table support */ |
4855 | + |
4856 | +/* 4K pagesize */ |
4857 | +#define PTE_INDEX_SIZE_L4_4K 9 |
4858 | +#define PMD_INDEX_SIZE_L4_4K 7 |
4859 | +#define PUD_INDEX_SIZE_L4_4K 7 |
4860 | +#define PGD_INDEX_SIZE_L4_4K 9 |
4861 | +#define PTE_SHIFT_L4_4K 17 |
4862 | +#define PMD_MASKED_BITS_4K 0 |
4863 | + |
4864 | +/* 64K pagesize */ |
4865 | +#define PTE_INDEX_SIZE_L4_64K 12 |
4866 | +#define PMD_INDEX_SIZE_L4_64K 12 |
4867 | +#define PUD_INDEX_SIZE_L4_64K 0 |
4868 | +#define PGD_INDEX_SIZE_L4_64K 4 |
4869 | +#define PTE_INDEX_SIZE_L4_64K_3_10 8 |
4870 | +#define PMD_INDEX_SIZE_L4_64K_3_10 10 |
4871 | +#define PGD_INDEX_SIZE_L4_64K_3_10 12 |
4872 | +#define PTE_SHIFT_L4_64K_V1 32 |
4873 | +#define PTE_SHIFT_L4_64K_V2 30 |
4874 | +#define PTE_SHIFT_L4_BOOK3E_64K 28 |
4875 | +#define PTE_SHIFT_L4_BOOK3E_4K 24 |
4876 | +#define PMD_MASKED_BITS_64K 0x1ff |
4877 | + |
4878 | +#define PD_HUGE 0x8000000000000000 |
4879 | +#define HUGE_PTE_MASK 0x03 |
4880 | +#define HUGEPD_SHIFT_MASK 0x3f |
4881 | +#define L4_MASK (THIS_KERNEL_VERSION >= LINUX(3,10,0) ? 0xfff : 0x1ff) |
4882 | +#define L4_OFFSET(vaddr) ((vaddr >> (machdep->machspec->l4_shift)) & L4_MASK) |
4883 | + |
4884 | +#define PGD_OFFSET_L4(vaddr) \ |
4885 | + ((vaddr >> (machdep->machspec->l3_shift)) & (machdep->machspec->ptrs_per_l3 - 1)) |
4886 | + |
4887 | +#define PMD_OFFSET_L4(vaddr) \ |
4888 | + ((vaddr >> (machdep->machspec->l2_shift)) & (machdep->machspec->ptrs_per_l2 - 1)) |
4889 | + |
4890 | +#define _PAGE_PRESENT (machdep->machspec->_page_present) /* software: pte contains a translation */ |
4891 | +#define _PAGE_USER (machdep->machspec->_page_user) /* matches one of the PP bits */ |
4892 | +#define _PAGE_RW (machdep->machspec->_page_rw) /* software: user write access allowed */ |
4893 | +#define _PAGE_GUARDED (machdep->machspec->_page_guarded) |
4894 | +#define _PAGE_COHERENT (machdep->machspec->_page_coherent /* M: enforce memory coherence (SMP systems) */) |
4895 | +#define _PAGE_NO_CACHE (machdep->machspec->_page_no_cache) /* I: cache inhibit */ |
4896 | +#define _PAGE_WRITETHRU (machdep->machspec->_page_writethru) /* W: cache write-through */ |
4897 | +#define _PAGE_DIRTY (machdep->machspec->_page_dirty) /* C: page changed */ |
4898 | +#define _PAGE_ACCESSED (machdep->machspec->_page_accessed) /* R: page referenced */ |
4899 | + |
4900 | +#define TIF_SIGPENDING (2) |
4901 | + |
4902 | +#define SWP_TYPE(entry) (((entry) >> 1) & 0x7f) |
4903 | +#define SWP_OFFSET(entry) ((entry) >> 8) |
4904 | +#define __swp_type(entry) SWP_TYPE(entry) |
4905 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4906 | + |
4907 | +#define MSR_PR_LG 14 /* Problem State / Privilege Level */ |
4908 | + /* Used to find the user or kernel-mode frame*/ |
4909 | + |
4910 | +#define STACK_FRAME_OVERHEAD 112 |
4911 | +#define EXCP_FRAME_MARKER 0x7265677368657265 |
4912 | + |
4913 | +#define _SECTION_SIZE_BITS 24 |
4914 | +#define _MAX_PHYSMEM_BITS 44 |
4915 | +#define _MAX_PHYSMEM_BITS_3_7 46 |
4916 | + |
4917 | +#endif /* PPC64 */ |
4918 | + |
4919 | +#ifdef S390 |
4920 | +#define _32BIT_ |
4921 | +#define MACHINE_TYPE "S390" |
4922 | + |
4923 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4924 | +#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase)) |
4925 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
4926 | + |
4927 | +#define PTRS_PER_PTE 1024 |
4928 | +#define PTRS_PER_PMD 1 |
4929 | +#define PTRS_PER_PGD 512 |
4930 | +#define SEGMENT_TABLE_SIZE ((sizeof(ulong)*4) * PTRS_PER_PGD) |
4931 | + |
4932 | +#define SWP_TYPE(entry) (((entry) >> 2) & 0x1f) |
4933 | +#define SWP_OFFSET(entry) ((((entry) >> 11) & 0xfffffffe) | \ |
4934 | + (((entry) >> 7) & 0x1)) |
4935 | +#define __swp_type(entry) SWP_TYPE(entry) |
4936 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4937 | + |
4938 | +#define TIF_SIGPENDING (2) |
4939 | + |
4940 | +#define _SECTION_SIZE_BITS 25 |
4941 | +#define _MAX_PHYSMEM_BITS 31 |
4942 | + |
4943 | +#endif /* S390 */ |
4944 | + |
4945 | +#ifdef S390X |
4946 | +#define _64BIT_ |
4947 | +#define MACHINE_TYPE "S390X" |
4948 | + |
4949 | +#define PTOV(X) ((unsigned long)(X)+(machdep->kvbase)) |
4950 | +#define VTOP(X) ((unsigned long)(X)-(machdep->kvbase)) |
4951 | +#define IS_VMALLOC_ADDR(X) (vt->vmalloc_start && (ulong)(X) >= vt->vmalloc_start) |
4952 | +#define PTRS_PER_PTE 512 |
4953 | +#define PTRS_PER_PMD 1024 |
4954 | +#define PTRS_PER_PGD 2048 |
4955 | +#define SEGMENT_TABLE_SIZE ((sizeof(ulong)*2) * PTRS_PER_PMD) |
4956 | + |
4957 | +#define SWP_TYPE(entry) (((entry) >> 2) & 0x1f) |
4958 | +#define SWP_OFFSET(entry) ((((entry) >> 11) & 0xfffffffffffffffe) | \ |
4959 | + (((entry) >> 7) & 0x1)) |
4960 | +#define __swp_type(entry) SWP_TYPE(entry) |
4961 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4962 | + |
4963 | +#define TIF_SIGPENDING (2) |
4964 | + |
4965 | +#define _SECTION_SIZE_BITS 28 |
4966 | +#define _MAX_PHYSMEM_BITS_OLD 42 |
4967 | +#define _MAX_PHYSMEM_BITS_NEW 46 |
4968 | + |
4969 | +#endif /* S390X */ |
4970 | + |
4971 | +#ifdef PLATFORM |
4972 | + |
4973 | +#define SWP_TYPE(entry) (error("PLATFORM_SWP_TYPE: TBD\n")) |
4974 | +#define SWP_OFFSET(entry) (error("PLATFORM_SWP_OFFSET: TBD\n")) |
4975 | +#define __swp_type(entry) SWP_TYPE(entry) |
4976 | +#define __swp_offset(entry) SWP_OFFSET(entry) |
4977 | + |
4978 | +#endif /* PLATFORM */ |
4979 | + |
4980 | +#define KILOBYTES(x) ((x) * (1024)) |
4981 | +#define MEGABYTES(x) ((x) * (1048576)) |
4982 | +#define GIGABYTES(x) ((x) * (1073741824)) |
4983 | + |
4984 | +#define MEGABYTE_MASK (MEGABYTES(1)-1) |
4985 | + |
4986 | +#define SIZEOF_64BIT (8) |
4987 | +#define SIZEOF_32BIT (4) |
4988 | +#define SIZEOF_16BIT (2) |
4989 | +#define SIZEOF_8BIT (1) |
4990 | + |
4991 | +#ifdef ARM |
4992 | +#define MAX_HEXADDR_STRLEN (8) |
4993 | +#define UVADDR_PRLEN (8) |
4994 | +#endif |
4995 | +#ifdef X86 |
4996 | +#define MAX_HEXADDR_STRLEN (8) |
4997 | +#define UVADDR_PRLEN (8) |
4998 | +#endif |
4999 | +#ifdef ALPHA |
5000 | +#define MAX_HEXADDR_STRLEN (16) |
The diff has been truncated for viewing.
Effectively merged by the 7.0.3-3ubuntu4 upload.