aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2004-03-28 18:01:15 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2004-03-28 18:01:15 +0000
commit1d559da4d174cfff726ba2dd509f7e06d394a535 (patch)
tree14636410e94cc8037ff331405880b7f9c80ca2d9 /tools
parent56dc72c3b610642d959131220730ed9aff9d5698 (diff)
Notes
Diffstat (limited to 'tools')
-rw-r--r--tools/tools/README4
-rw-r--r--tools/tools/gdb_regofs/Makefile5
-rw-r--r--tools/tools/gdb_regofs/ia64.c213
3 files changed, 222 insertions, 0 deletions
diff --git a/tools/tools/README b/tools/tools/README
index 9428508bb9096..9498253838ba0 100644
--- a/tools/tools/README
+++ b/tools/tools/README
@@ -19,6 +19,10 @@ diffburst OBSOLETE: equivalent functionality is available via split -p.
editing Editor modes and the like to help editing FreeBSD code.
epfe Extract printing filter examples from printing.sgml.
find-sb Scan a disk for possible filesystem superblocks.
+gdb_regofs A simple tool that prints out a register offset table
+ for mapping gdb(1) register numbers to struct reg and
+ struct fpreg offsets. The tool is useful on selected
+ platforms only.
hcomp Compress header files by removing comments and whitespace.
html-mv Rename HTML generated filenames to human readable filenames.
ifinfo Uses the interface MIB to print out all the information
diff --git a/tools/tools/gdb_regofs/Makefile b/tools/tools/gdb_regofs/Makefile
new file mode 100644
index 0000000000000..28b62a6ec76e0
--- /dev/null
+++ b/tools/tools/gdb_regofs/Makefile
@@ -0,0 +1,5 @@
+# $FreeBSD$
+PROG=gdb_regofs
+SRCS=${MACHINE_ARCH}.c
+NOMAN=yes
+.include <bsd.prog.mk>
diff --git a/tools/tools/gdb_regofs/ia64.c b/tools/tools/gdb_regofs/ia64.c
new file mode 100644
index 0000000000000..59e0055253b60
--- /dev/null
+++ b/tools/tools/gdb_regofs/ia64.c
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2004 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stddef.h>
+#include <machine/reg.h>
+
+#define PRESERVED(x) offsetof(struct reg, r_preserved) \
+ + offsetof(struct _callee_saved, x)
+#define SCRATCH(x) offsetof(struct reg, r_scratch) \
+ + offsetof(struct _caller_saved, x)
+#define SPECIAL(x) offsetof(struct reg, r_special) \
+ + offsetof(struct _special, x)
+
+#define HIGH_FP(x) offsetof(struct fpreg, fpr_high) \
+ + offsetof(struct _high_fp, x)
+#define PRESERVED_FP(x) offsetof(struct fpreg, fpr_preserved) \
+ + offsetof(struct _callee_saved_fp, x)
+#define SCRATCH_FP(x) offsetof(struct fpreg, fpr_scratch) \
+ + offsetof(struct _caller_saved_fp, x)
+
+static int regofs[] = {
+ /*
+ * General registers (0-127)
+ */
+ -1, /* gr0 */
+ SPECIAL(gp),
+ SCRATCH(gr2), SCRATCH(gr3),
+ PRESERVED(gr4), PRESERVED(gr5), PRESERVED(gr6), PRESERVED(gr7),
+ SCRATCH(gr8), SCRATCH(gr9), SCRATCH(gr10), SCRATCH(gr11),
+ SPECIAL(sp), SPECIAL(tp),
+ SCRATCH(gr14), SCRATCH(gr15), SCRATCH(gr16), SCRATCH(gr17),
+ SCRATCH(gr18), SCRATCH(gr19), SCRATCH(gr20), SCRATCH(gr21),
+ SCRATCH(gr22), SCRATCH(gr23), SCRATCH(gr24), SCRATCH(gr25),
+ SCRATCH(gr26), SCRATCH(gr27), SCRATCH(gr28), SCRATCH(gr29),
+ SCRATCH(gr30), SCRATCH(gr31),
+ /*
+ * gr32 through gr127 are not directly available as they are
+ * stacked registers.
+ */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr32-gr39 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr40-gr47 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr48-gr55 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr56-gr63 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr64-gr71 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr72-gr79 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr80-gr87 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr88-gr95 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr96-gr103 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr104-gr111 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr112-gr119 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* gr120-gr127 */
+ /*
+ * Floating-point registers (128-255)
+ */
+ -1, /* fr0: constant 0.0 */
+ -1, /* fr1: constant 1.0 */
+ PRESERVED_FP(fr2), PRESERVED_FP(fr3),
+ PRESERVED_FP(fr4), PRESERVED_FP(fr5),
+ SCRATCH_FP(fr6), SCRATCH_FP(fr7),
+ SCRATCH_FP(fr8), SCRATCH_FP(fr9),
+ SCRATCH_FP(fr10), SCRATCH_FP(fr11),
+ SCRATCH_FP(fr12), SCRATCH_FP(fr13),
+ SCRATCH_FP(fr14), SCRATCH_FP(fr15),
+ PRESERVED_FP(fr16), PRESERVED_FP(fr17),
+ PRESERVED_FP(fr18), PRESERVED_FP(fr19),
+ PRESERVED_FP(fr20), PRESERVED_FP(fr21),
+ PRESERVED_FP(fr22), PRESERVED_FP(fr23),
+ PRESERVED_FP(fr24), PRESERVED_FP(fr25),
+ PRESERVED_FP(fr26), PRESERVED_FP(fr27),
+ PRESERVED_FP(fr28), PRESERVED_FP(fr29),
+ PRESERVED_FP(fr30), PRESERVED_FP(fr31),
+ HIGH_FP(fr32), HIGH_FP(fr33), HIGH_FP(fr34), HIGH_FP(fr35),
+ HIGH_FP(fr36), HIGH_FP(fr37), HIGH_FP(fr38), HIGH_FP(fr39),
+ HIGH_FP(fr40), HIGH_FP(fr41), HIGH_FP(fr42), HIGH_FP(fr43),
+ HIGH_FP(fr44), HIGH_FP(fr45), HIGH_FP(fr46), HIGH_FP(fr47),
+ HIGH_FP(fr48), HIGH_FP(fr49), HIGH_FP(fr50), HIGH_FP(fr51),
+ HIGH_FP(fr52), HIGH_FP(fr53), HIGH_FP(fr54), HIGH_FP(fr55),
+ HIGH_FP(fr56), HIGH_FP(fr57), HIGH_FP(fr58), HIGH_FP(fr59),
+ HIGH_FP(fr60), HIGH_FP(fr61), HIGH_FP(fr62), HIGH_FP(fr63),
+ HIGH_FP(fr64), HIGH_FP(fr65), HIGH_FP(fr66), HIGH_FP(fr67),
+ HIGH_FP(fr68), HIGH_FP(fr69), HIGH_FP(fr70), HIGH_FP(fr71),
+ HIGH_FP(fr72), HIGH_FP(fr73), HIGH_FP(fr74), HIGH_FP(fr75),
+ HIGH_FP(fr76), HIGH_FP(fr77), HIGH_FP(fr78), HIGH_FP(fr79),
+ HIGH_FP(fr80), HIGH_FP(fr81), HIGH_FP(fr82), HIGH_FP(fr83),
+ HIGH_FP(fr84), HIGH_FP(fr85), HIGH_FP(fr86), HIGH_FP(fr87),
+ HIGH_FP(fr88), HIGH_FP(fr89), HIGH_FP(fr90), HIGH_FP(fr91),
+ HIGH_FP(fr92), HIGH_FP(fr93), HIGH_FP(fr94), HIGH_FP(fr95),
+ HIGH_FP(fr96), HIGH_FP(fr97), HIGH_FP(fr98), HIGH_FP(fr99),
+ HIGH_FP(fr100), HIGH_FP(fr101), HIGH_FP(fr102), HIGH_FP(fr103),
+ HIGH_FP(fr104), HIGH_FP(fr105), HIGH_FP(fr106), HIGH_FP(fr107),
+ HIGH_FP(fr108), HIGH_FP(fr109), HIGH_FP(fr110), HIGH_FP(fr111),
+ HIGH_FP(fr112), HIGH_FP(fr113), HIGH_FP(fr114), HIGH_FP(fr115),
+ HIGH_FP(fr116), HIGH_FP(fr117), HIGH_FP(fr118), HIGH_FP(fr119),
+ HIGH_FP(fr120), HIGH_FP(fr121), HIGH_FP(fr122), HIGH_FP(fr123),
+ HIGH_FP(fr124), HIGH_FP(fr125), HIGH_FP(fr126), HIGH_FP(fr127),
+ /*
+ * Predicate registers (256-319)
+ * These are not individually available. Predicates are
+ * in the pr register.
+ */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr0-pr7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr8-pr15 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr16-pr23 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr24-pr31 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr32-pr39 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr40-pr47 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr48-pr55 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* pr56-pr63 */
+ /*
+ * Branch registers (320-327)
+ */
+ SPECIAL(rp),
+ PRESERVED(br1), PRESERVED(br2), PRESERVED(br3), PRESERVED(br4),
+ PRESERVED(br5),
+ SCRATCH(br6), SCRATCH(br7),
+ /*
+ * Misc other registers (328-333)
+ */
+ -1, -1,
+ SPECIAL(pr),
+ SPECIAL(iip),
+ SPECIAL(psr),
+ SPECIAL(cfm),
+ /*
+ * Application registers (334-461)
+ */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar.k0-ar.k7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar8-ar15 (reserved) */
+ SPECIAL(rsc), /* ar.rsc */
+ SPECIAL(ndirty), /* ar.bsp !!YEDI!! */
+ SPECIAL(bspstore), /* ar.bspstore */
+ SPECIAL(rnat), /* ar.rnat */
+ -1, /* ar20 (reserved) */
+ -1, /* ar.fcr */
+ -1, -1, /* ar22-ar23 (reserved) */
+ -1, /* ar.eflag */
+ SCRATCH(csd), /* ar.csd */
+ SCRATCH(ssd), /* ar.ssd */
+ -1, /* ar.cflg */
+ -1, /* ar.fsr */
+ -1, /* ar.fir */
+ -1, /* ar.fdr */
+ -1, /* ar31 (reserved) */
+ SCRATCH(ccv), /* ar.ccv */
+ -1, -1, -1, /* ar33-ar35 (reserved) */
+ SPECIAL(unat), /* ar.unat */
+ -1, -1, -1, /* ar37-ar39 (reserved) */
+ SPECIAL(fpsr), /* ar.fpsr */
+ -1, -1, -1, /* ar41-ar43 (reserved) */
+ -1, /* ar.itc */
+ -1, -1, -1, /* ar45-ar47 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar48-ar55 (ignored) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar56-ar63 (ignored) */
+ SPECIAL(pfs), /* ar.pfs */
+ PRESERVED(lc), /* ar.lc */
+ -1, /* ar.ec */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar67-ar74 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar75-ar82 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar83-ar90 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar91-ar98 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar99-ar106 (reserved) */
+ -1, -1, -1, -1, -1, /* ar107-ar111 (reserved) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar112-ar119 (ignored) */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* ar120-ar127 (ignored) */
+};
+
+int
+main()
+{
+ int elem, nelems;
+
+ nelems = sizeof(regofs)/sizeof(regofs[0]);
+ printf("static int reg_offset[%d] = {", nelems);
+ for (elem = 0; elem < nelems; elem++) {
+ if ((elem & 7) == 0)
+ printf("\n ");
+ printf("%4d", regofs[elem]);
+ if (elem < nelems - 1)
+ putchar(',');
+ if ((elem & 7) != 7)
+ putchar(' ');
+ else
+ printf("\t/* Regs %d-%d. */", elem - 7, elem);
+ }
+ printf("\n};");
+ return (0);
+}