Merge lp:~dannf/ubuntu/trusty/crash/lp1354349 into lp:ubuntu/trusty/crash

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
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+233948@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) wrote :

Effectively merged by the 7.0.3-3ubuntu4 upload.

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, &notes_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.

Subscribers

People subscribed via source and target branches

to all changes: