commit 18672fc30cb5efc4a3755bf6a8afb11649f1880a
parent e00b157a98df92ea8aa8ada11f8ca9e17e399668
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Thu, 8 Nov 2018 23:19:56 +0000
Rename debuglang to dlang
Easier to pronounce.
Change-Id: I2e6798554aac4d0771ed93949a7b6b4071c8fd26
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
15 files changed, 480 insertions(+), 481 deletions(-)
diff --git a/arch/amd64/Makefile b/arch/amd64/Makefile
@@ -2,8 +2,8 @@
PROJECTDIR = ../..
include $(PROJECTDIR)/scripts/rules.mk
-ROMOBJS = crt-$(SYS).o arch.o rom.o $(DEBUGLANG) $(SRCDIR)/romfw/builtin.o
-RAMOBJS = crt-$(SYS).o arch.o rom.o $(DEBUGLANG) $(SRCDIR)/ramfw/builtin.o
+ROMOBJS = crt-$(SYS).o arch.o rom.o $(DLANG) $(SRCDIR)/romfw/builtin.o
+RAMOBJS = crt-$(SYS).o arch.o rom.o $(DLANG) $(SRCDIR)/ramfw/builtin.o
TARGET = $(BINDIR)/romfw.elf $(BINDIR)/ramfw.elf
LIBS = -lhdl -lrmu -lk -lc
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
@@ -9,14 +9,14 @@ MORECFLAGS = -DUARTBASE=0x1c0c0000 \
ROMOBJS = rom-crt-$(SYS).o \
rom-$(SYS).o \
arch.o \
- $(DEBUGLANG) \
+ $(DLANG) \
$(DRVDIR)/uart.o \
$(SRCDIR)/romfw/builtin.o \
RAMOBJS = ram-crt-$(SYS).o \
ram-$(SYS).o \
arch.o \
- $(DEBUGLANG) \
+ $(DLANG) \
$(DRVDIR)/uart.o \
$(SRCDIR)/ramfw/builtin.o \
diff --git a/config/amd64-dragonfly.mk b/config/amd64-dragonfly.mk
@@ -6,4 +6,4 @@ ASM = as
LINKER = ld
SYS = dragonfly
CROSS_COMPILE =
-DEBUGLANG = $(SRCDIR)/debuglang/builtin.o
+DLANG = $(SRCDIR)/dlang/builtin.o
diff --git a/config/amd64-linux.mk b/config/amd64-linux.mk
@@ -6,4 +6,4 @@ ASM = as
LINKER = ld
SYS = linux
CROSS_COMPILE =
-DEBUGLANG = $(SRCDIR)/debuglang/builtin.o
+DLANG = $(SRCDIR)/dlang/builtin.o
diff --git a/config/amd64-netbsd.mk b/config/amd64-netbsd.mk
@@ -6,4 +6,4 @@ ASM = as
LINKER = ld
SYS = netbsd
CROSS_COMPILE =
-DEBUGLANG = $(SRCDIR)/debuglang/builtin.o
+DLANG = $(SRCDIR)/dlang/builtin.o
diff --git a/config/amd64-openbsd.mk b/config/amd64-openbsd.mk
@@ -6,4 +6,4 @@ ASM = as
LINKER = ld
SYS = openbsd
CROSS_COMPILE =
-DEBUGLANG = $(SRCDIR)/debuglang/builtin.o
+DLANG = $(SRCDIR)/dlang/builtin.o
diff --git a/scripts/gendebuglang.sh b/scripts/gendebuglang.sh
@@ -1,38 +0,0 @@
-#!/bin/sh
-
-set -e
-
-trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
-
-for i
-do
- case $1 in
- -o)
- out=$2
- shift 2
- ;;
- --)
- break
- ;;
- -*)
- echo usage: gendebuglang.sh -o out [file ...]
- exit 1
- ;;
- esac
-done
-
-out=${out-debuglang.h}
-
-cat $@ |
-tr 'A-Z' 'a-z' |
-sed 's/\./_/' |
-cat <<EOF >$$.tmp && mv $$.tmp $out
-#include <stddef.h>
-
-#include "debuglang.h"
-
-const struct rmudesc rmudescs[] = {
-$(awk 'NF == 4 {printf("\t{%d, %d, \"%s\"},\n", $1, $2, $3)}' "$@")
- {0, 0, NULL}
-};
-EOF
diff --git a/scripts/gendlang.sh b/scripts/gendlang.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+set -e
+
+trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
+
+for i
+do
+ case $1 in
+ -o)
+ out=$2
+ shift 2
+ ;;
+ --)
+ break
+ ;;
+ -*)
+ echo usage: gendlang.sh -o out [file ...]
+ exit 1
+ ;;
+ esac
+done
+
+out=${out-dlang.h}
+
+tr 'A-Z' 'a-z' $@ |
+sed 's/\./_/' |
+cat <<EOF >$$.tmp && mv $$.tmp $out
+#include <stddef.h>
+
+#include "dlang.h"
+
+const struct rmudesc rmudescs[] = {
+$(awk 'NF == 4 {printf("\t{%d, %d, \"%s\"},\n", $1, $2, $3)}' "$@")
+ {0, 0, NULL}
+};
+EOF
diff --git a/src/Makefile b/src/Makefile
@@ -4,10 +4,10 @@ include $(PROJECTDIR)/scripts/rules.mk
LIBS = libk libc librmu libtypes libhdl
IMGS = ramfw romfw
-DIRS = $(LIBS) $(IMGS) debuglang
+DIRS = $(LIBS) $(IMGS) dlang
OBJS = rmc.o ecstr.o
-all: $(IMGS)
+all: $(IMGS)
gen: FORCE
+@cd libtypes && $(MAKE) gen
@@ -15,7 +15,7 @@ gen: FORCE
ecstr.c: $(INCDIR)/rcode.h
$(SCRIPTDIR)/genecstr.sh $(INCDIR)/rcode.h
-$(IMGS): $(LIBS) $(OBJS) debuglang
+$(IMGS): $(LIBS) $(OBJS) dlang
$(DIRS): FORCE
+@cd $@ && $(MAKE)
diff --git a/src/debuglang/Makefile b/src/debuglang/Makefile
@@ -1,19 +0,0 @@
-.POSIX:
-PROJECTDIR=../..
-include $(PROJECTDIR)/scripts/rules.mk
-
-OBJS = debuglang.o \
- rmu.o \
-
-TARGET = builtin.o
-
-all: $(TARGET)
-
-builtin.o: $(OBJS)
- $(LD) $(RCODE_LDFLAGS) -r -o $@ $(OBJS)
-
-rmu.c: $(SCRIPTDIR)/rmu.cmd
- $(SCRIPTDIR)/gendebuglang.sh -o $@ $(SCRIPTDIR)/rmu.cmd
-
-clean:
- rm -f rmu.c
diff --git a/src/debuglang/debuglang.c b/src/debuglang/debuglang.c
@@ -1,413 +0,0 @@
-#include <ctype.h>
-#include <errno.h>
-#include <setjmp.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <rcode.h>
-
-#include "debuglang.h"
-
-#define PREFIX "> "
-#define NR_ARGC_MAX 16
-#define toascii(c) ((c) & 0x7f)
-
-struct args {
- char *argv[NR_ARGC_MAX];
- int argc;
- int status;
-};
-
-struct cmd {
- char *name;
- int (*eval)(const struct cmd *cmd, struct args *args);
- char *helpmsg;
-};
-
-struct named_reg {
- char *name;
- size_t offset;
-};
-
-static const struct named_reg named_regs[];
-static const struct cmd cmds[];
-
-static void
-error(char *fmt, ...)
-{
- va_list va;
-
- va_start(va, fmt);
- fputs(PREFIX "ERR ", stdout);
- vprintf(fmt, va);
- fputc('\n', stdout);
- longjmp(bss->dbgrecover, 1);
-}
-
-static void
-ready(void)
-{
- puts(PREFIX "READY");
-}
-
-static void
-print_tf(struct trapframe *fp)
-{
- printf(PREFIX "x0=0x%llx\tx1=0x%llx\tx2=0x%llx\tx3=0x%llx\n"
- PREFIX "x4=0x%llx\tx5=0x%llx\tx6=0x%llx\tx7=0x%llx\n"
- PREFIX "x8=0x%llx\tx9=0x%llx\tx10=0x%llx\tx11=0x%llx\n"
- PREFIX "x12=0x%llx\tx13=0x%llx\tx14=0x%llx\tx15=0x%llx\n"
- PREFIX "x16=0x%llx\tx17=0x%llx\tx18=0x%llx\tx19=0x%llx\n"
- PREFIX "x20=0x%llx\tx21=0x%llx\tx22=0x%llx\tx23=0x%llx\n"
- PREFIX "x24=0x%llx\tx25=0x%llx\tx26=0x%llx\tx27=0x%llx\n"
- PREFIX "x28=0x%llx\tx29=0x%llx\tx30=0x%llx\telr=%p\n"
- PREFIX "spsr=0x%llx\tesr=0x%llx\tfar=0x%llx\n"
- PREFIX "sp=0x%p\n",
- fp->x0, fp->x1, fp->x2, fp->x3,
- fp->x4, fp->x5, fp->x6, fp->x7,
- fp->x8, fp->x9, fp->x10, fp->x11,
- fp->x12, fp->x13, fp->x14, fp->x15,
- fp->x16, fp->x17, fp->x18, fp->x19,
- fp->x20, fp->x21, fp->x22, fp->x23,
- fp->x24, fp->x25, fp->x26, fp->x27,
- fp->x28, fp->x29, fp->x30, fp->elr,
- fp->spsr, fp->esr, fp->far, fp->sp);
-}
-
-/* Read a value in a given base between 2 and 16 0 means default base;
- * 10, unless the string begins with "0x" or "0b"
- */
-static unsigned long long
-estrtoull(char *str, int base)
-{
- unsigned long long val;
- char *endptr;
-
- errno = 0;
- val = strtoull(str, &endptr, base);
- if (*str == '\0' || *endptr != '\0')
- error("estrtoull: %s: not an integer", str);
- if (errno)
- error("estrtoull: %s: %s", strerror(errno));
- return val;
-}
-
-/* Get reg struct for named reg */
-static unsigned long long *
-get_named_reg(char *name)
-{
- char *regptr;
- const struct named_reg *rp;
-
- regptr = NULL;
- for (rp = named_regs; rp->name; ++rp) {
- if (strcmp(name, rp->name) == 0) {
- regptr = (char *) bss->fp;
- regptr += rp->offset;
- }
- }
- return (unsigned long long *) regptr;
-}
-
-/* Get rmudesc struct for named rmu descriptor */
-static const struct rmudesc *
-get_rmudesc(char *name)
-{
- const struct rmudesc *rmudesc;
-
- for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
- if (strcmp(rmudesc->name, name) == 0)
- return rmudesc;
- return NULL;
-}
-
-/* Get cmd struct for named cmd */
-static const struct cmd *
-get_cmd(char *name)
-{
- const struct cmd *cmd;
-
- for (cmd = cmds; cmd->name; cmd++)
- if (strcmp(name, cmd->name) == 0)
- return cmd;
- return NULL;
-}
-
-static int
-do_set(const struct cmd *cmd, struct args *args)
-{
- unsigned long long *reg = NULL;
- unsigned long long setval = 0;
-
- if (args->argc != 3)
- error(cmd->helpmsg);
-
- reg = get_named_reg(args->argv[1]);
- if (reg == NULL)
- error("Register '%s' not found", args->argv[1]);
-
- setval = estrtoull(args->argv[2], 0);
- *reg = setval;
- return 0;
-}
-
-static int
-do_get(const struct cmd *cmd, struct args *args)
-{
- unsigned long long *reg = NULL;
-
- if (args->argc != 2)
- error(cmd->helpmsg);
-
- reg = get_named_reg(args->argv[1]);
- if (reg == NULL)
- error("Register '%s' not found", args->argv[1]);
-
- printf("%llx\n", *reg);
- return 0;
-}
-
-static int
-do_dump(const struct cmd *cmd, struct args *args)
-{
- print_tf(bss->fp);
- return 0;
-}
-
-static int
-do_trap(const struct cmd *cmd, struct args *args)
-{
- trap(bss->fp);
- return 0;
-}
-
-static int
-do_rmc(const struct cmd *cmd, struct args *args)
-{
- unsigned char class;
- unsigned char func;
-
- if (args->argc != 3)
- error(cmd->helpmsg);
-
- class = estrtoull(args->argv[1], 0);
- func = estrtoull(args->argv[2], 0);
-
- bss->fp->esr = (unsigned long long) RMC << 26;
- bss->fp->esr |= class;
- bss->fp->esr |= (func << 8);
- trap(bss->fp);
- return 0;
-}
-
-static int
-do_rmu(const struct cmd *cmd, struct args *args)
-{
- const struct rmudesc *rmudesc;
-
- if (args->argc != 2)
- error(cmd->helpmsg);
-
- if (args->argv[1][0] == '?') {
- for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
- puts(rmudesc->name);
- return 0;
- }
-
- rmudesc = get_rmudesc(args->argv[1]);
- if (rmudesc == NULL)
- error("rmu: %s not found", args->argv[1]);
-
- bss->fp->esr = (unsigned long long) RMC << 26;
- bss->fp->esr |= rmudesc->class;
- bss->fp->esr |= (rmudesc->func << 8);
- trap(bss->fp);
- return 0;
-}
-
-static int
-do_exit(const struct cmd *cmd, struct args *args)
-{
- switch (args->argc) {
- case 2:
- args->status = estrtoull(args->argv[1], 0);
- break;
- case 1:
- args->status = 0;
- break;
- default:
- error(cmd->helpmsg);
- }
- return -1;
-}
-
-static int
-do_help(const struct cmd *cmd, struct args *args)
-{
- for (cmd = cmds; cmd->name; cmd++)
- printf(PREFIX "%s\n", cmd->helpmsg);
- return 0;
-}
-
-static const struct cmd *
-parse_cmd(char *buf, struct args *args)
-{
- char *p;
- const struct cmd *cmd;
-
- while (isspace(toascii(*buf)))
- ++buf;
-
- args->argc = 0;
- for (p = strtok(buf, " \t\r"); p; p = strtok(NULL, " \t\r")) {
- if (args->argc == NR_ARGC_MAX)
- error("too many parameters");
- args->argv[args->argc++] = p;
- }
-
- if (args->argc == 0)
- return NULL;
-
- if ((cmd = get_cmd(args->argv[0])) == NULL)
- error("cmd '%s' not found", args->argv[0]);
-
- return cmd;
-}
-
-static int
-run(struct args *args)
-{
- const struct cmd *cmd;
- size_t len;
- char buffer[BUFSIZ];
-
- if (getln(buffer, sizeof(buffer)) == NULL) {
- args->status = 1;
- return -1;
- }
-
- if ((len = strlen(buffer)) != 0) {
- if (buffer[len-1] != '\n')
- error("line too long");
- buffer[len-1] = '\0';
- cmd = parse_cmd(buffer, args);
- if (cmd)
- return cmd->eval(cmd, args);
- }
-
- args->status = 1;
- return -1;
-}
-
-int
-debug(void)
-{
- struct args args;
-
- bss->in_debug = 1;
-
- setvbuf(stdout, NULL, _IOLBF, 0);
- printf("begin debug language interface\n");
-
- setjmp(bss->dbgrecover);
- for (ready(); !run(&args); ready())
- ;
-
- if (ferror(stdout))
- puts("debug language interface: error writing in stdout");
- if (ferror(stdin))
- puts("debug language interface: error reading from stdin");
- printf("end debug language interface\n");
- return args.status;
-}
-
-/*
- * definition of arrays
- */
-static const struct cmd cmds[] = {
- {
- .name = "set",
- .eval = do_set,
- .helpmsg = "Set a register: set <reg> <value>",
- },
- {
- .name = "get",
- .eval = do_get,
- .helpmsg = "Get a register: get <reg>",
- },
- {
- .name = "dump",
- .eval = do_dump,
- .helpmsg = "Dump trapframe: dump",
- },
- {
- .name = "trap",
- .eval = do_trap,
- .helpmsg = "Call trap handler: trap",
- },
- {
- .name = "rmc",
- .eval = do_rmc,
- .helpmsg = "Call RMC handler: rmc imm1 imm2",
- },
- {
- .name = "rmu",
- .eval = do_rmu,
- .helpmsg = "Call RMU handler: rmu rmucmd",
- },
- {
- .name = "exit",
- .eval = do_exit,
- .helpmsg = "Exit debug environment: exit",
- },
- {
- .name = "help",
- .eval = do_help,
- .helpmsg = "Print this help menu: help",
- },
- {
- .name = NULL
- }
-};
-
-static const struct named_reg named_regs[]={
- {"x0", offsetof(struct trapframe, x0)},
- {"x1", offsetof(struct trapframe, x1)},
- {"x2", offsetof(struct trapframe, x2)},
- {"x3", offsetof(struct trapframe, x3)},
- {"x4", offsetof(struct trapframe, x4)},
- {"x5", offsetof(struct trapframe, x5)},
- {"x6", offsetof(struct trapframe, x6)},
- {"x7", offsetof(struct trapframe, x7)},
- {"x8", offsetof(struct trapframe, x8)},
- {"x9", offsetof(struct trapframe, x9)},
- {"x10", offsetof(struct trapframe, x10)},
- {"x11", offsetof(struct trapframe, x11)},
- {"x12", offsetof(struct trapframe, x12)},
- {"x13", offsetof(struct trapframe, x13)},
- {"x14", offsetof(struct trapframe, x14)},
- {"x15", offsetof(struct trapframe, x15)},
- {"x16", offsetof(struct trapframe, x16)},
- {"x17", offsetof(struct trapframe, x17)},
- {"x18", offsetof(struct trapframe, x18)},
- {"x19", offsetof(struct trapframe, x19)},
- {"x20", offsetof(struct trapframe, x20)},
- {"x21", offsetof(struct trapframe, x21)},
- {"x22", offsetof(struct trapframe, x22)},
- {"x23", offsetof(struct trapframe, x23)},
- {"x24", offsetof(struct trapframe, x24)},
- {"x25", offsetof(struct trapframe, x25)},
- {"x26", offsetof(struct trapframe, x26)},
- {"x27", offsetof(struct trapframe, x27)},
- {"x28", offsetof(struct trapframe, x28)},
- {"x29", offsetof(struct trapframe, x29)},
- {"x30", offsetof(struct trapframe, x30)},
- {"sp", offsetof(struct trapframe, sp)},
- {"far", offsetof(struct trapframe, far)},
- {"esr", offsetof(struct trapframe, esr)},
- {"spsr", offsetof(struct trapframe, spsr)},
- {"elr", offsetof(struct trapframe, elr)},
- {NULL},
-};
diff --git a/src/debuglang/.gitignore b/src/dlang/.gitignore
diff --git a/src/dlang/Makefile b/src/dlang/Makefile
@@ -0,0 +1,19 @@
+.POSIX:
+PROJECTDIR=../..
+include $(PROJECTDIR)/scripts/rules.mk
+
+OBJS = dlang.o \
+ rmu.o \
+
+TARGET = builtin.o
+
+all: $(TARGET)
+
+builtin.o: $(OBJS)
+ $(LD) $(RCODE_LDFLAGS) -r -o $@ $(OBJS)
+
+rmu.c: $(SCRIPTDIR)/rmu.cmd
+ $(SCRIPTDIR)/gendlang.sh -o $@ $(SCRIPTDIR)/rmu.cmd
+
+clean:
+ rm -f rmu.c
diff --git a/src/dlang/dlang.c b/src/dlang/dlang.c
@@ -0,0 +1,413 @@
+#include <ctype.h>
+#include <errno.h>
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <rcode.h>
+
+#include "dlang.h"
+
+#define PREFIX "> "
+#define NR_ARGC_MAX 16
+#define toascii(c) ((c) & 0x7f)
+
+struct args {
+ char *argv[NR_ARGC_MAX];
+ int argc;
+ int status;
+};
+
+struct cmd {
+ char *name;
+ int (*eval)(const struct cmd *cmd, struct args *args);
+ char *helpmsg;
+};
+
+struct named_reg {
+ char *name;
+ size_t offset;
+};
+
+static const struct named_reg named_regs[];
+static const struct cmd cmds[];
+
+static void
+error(char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ fputs(PREFIX "ERR ", stdout);
+ vprintf(fmt, va);
+ fputc('\n', stdout);
+ longjmp(bss->dbgrecover, 1);
+}
+
+static void
+ready(void)
+{
+ puts(PREFIX "READY");
+}
+
+static void
+print_tf(struct trapframe *fp)
+{
+ printf(PREFIX "x0=0x%llx\tx1=0x%llx\tx2=0x%llx\tx3=0x%llx\n"
+ PREFIX "x4=0x%llx\tx5=0x%llx\tx6=0x%llx\tx7=0x%llx\n"
+ PREFIX "x8=0x%llx\tx9=0x%llx\tx10=0x%llx\tx11=0x%llx\n"
+ PREFIX "x12=0x%llx\tx13=0x%llx\tx14=0x%llx\tx15=0x%llx\n"
+ PREFIX "x16=0x%llx\tx17=0x%llx\tx18=0x%llx\tx19=0x%llx\n"
+ PREFIX "x20=0x%llx\tx21=0x%llx\tx22=0x%llx\tx23=0x%llx\n"
+ PREFIX "x24=0x%llx\tx25=0x%llx\tx26=0x%llx\tx27=0x%llx\n"
+ PREFIX "x28=0x%llx\tx29=0x%llx\tx30=0x%llx\telr=%p\n"
+ PREFIX "spsr=0x%llx\tesr=0x%llx\tfar=0x%llx\n"
+ PREFIX "sp=0x%p\n",
+ fp->x0, fp->x1, fp->x2, fp->x3,
+ fp->x4, fp->x5, fp->x6, fp->x7,
+ fp->x8, fp->x9, fp->x10, fp->x11,
+ fp->x12, fp->x13, fp->x14, fp->x15,
+ fp->x16, fp->x17, fp->x18, fp->x19,
+ fp->x20, fp->x21, fp->x22, fp->x23,
+ fp->x24, fp->x25, fp->x26, fp->x27,
+ fp->x28, fp->x29, fp->x30, fp->elr,
+ fp->spsr, fp->esr, fp->far, fp->sp);
+}
+
+/* Read a value in a given base between 2 and 16 0 means default base;
+ * 10, unless the string begins with "0x" or "0b"
+ */
+static unsigned long long
+estrtoull(char *str, int base)
+{
+ unsigned long long val;
+ char *endptr;
+
+ errno = 0;
+ val = strtoull(str, &endptr, base);
+ if (*str == '\0' || *endptr != '\0')
+ error("estrtoull: %s: not an integer", str);
+ if (errno)
+ error("estrtoull: %s: %s", strerror(errno));
+ return val;
+}
+
+/* Get reg struct for named reg */
+static unsigned long long *
+get_named_reg(char *name)
+{
+ char *regptr;
+ const struct named_reg *rp;
+
+ regptr = NULL;
+ for (rp = named_regs; rp->name; ++rp) {
+ if (strcmp(name, rp->name) == 0) {
+ regptr = (char *) bss->fp;
+ regptr += rp->offset;
+ }
+ }
+ return (unsigned long long *) regptr;
+}
+
+/* Get rmudesc struct for named rmu descriptor */
+static const struct rmudesc *
+get_rmudesc(char *name)
+{
+ const struct rmudesc *rmudesc;
+
+ for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
+ if (strcmp(rmudesc->name, name) == 0)
+ return rmudesc;
+ return NULL;
+}
+
+/* Get cmd struct for named cmd */
+static const struct cmd *
+get_cmd(char *name)
+{
+ const struct cmd *cmd;
+
+ for (cmd = cmds; cmd->name; cmd++)
+ if (strcmp(name, cmd->name) == 0)
+ return cmd;
+ return NULL;
+}
+
+static int
+do_set(const struct cmd *cmd, struct args *args)
+{
+ unsigned long long *reg = NULL;
+ unsigned long long setval = 0;
+
+ if (args->argc != 3)
+ error(cmd->helpmsg);
+
+ reg = get_named_reg(args->argv[1]);
+ if (reg == NULL)
+ error("Register '%s' not found", args->argv[1]);
+
+ setval = estrtoull(args->argv[2], 0);
+ *reg = setval;
+ return 0;
+}
+
+static int
+do_get(const struct cmd *cmd, struct args *args)
+{
+ unsigned long long *reg = NULL;
+
+ if (args->argc != 2)
+ error(cmd->helpmsg);
+
+ reg = get_named_reg(args->argv[1]);
+ if (reg == NULL)
+ error("Register '%s' not found", args->argv[1]);
+
+ printf("%llx\n", *reg);
+ return 0;
+}
+
+static int
+do_dump(const struct cmd *cmd, struct args *args)
+{
+ print_tf(bss->fp);
+ return 0;
+}
+
+static int
+do_trap(const struct cmd *cmd, struct args *args)
+{
+ trap(bss->fp);
+ return 0;
+}
+
+static int
+do_rmc(const struct cmd *cmd, struct args *args)
+{
+ unsigned char class;
+ unsigned char func;
+
+ if (args->argc != 3)
+ error(cmd->helpmsg);
+
+ class = estrtoull(args->argv[1], 0);
+ func = estrtoull(args->argv[2], 0);
+
+ bss->fp->esr = (unsigned long long) RMC << 26;
+ bss->fp->esr |= class;
+ bss->fp->esr |= (func << 8);
+ trap(bss->fp);
+ return 0;
+}
+
+static int
+do_rmu(const struct cmd *cmd, struct args *args)
+{
+ const struct rmudesc *rmudesc;
+
+ if (args->argc != 2)
+ error(cmd->helpmsg);
+
+ if (args->argv[1][0] == '?') {
+ for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
+ puts(rmudesc->name);
+ return 0;
+ }
+
+ rmudesc = get_rmudesc(args->argv[1]);
+ if (rmudesc == NULL)
+ error("rmu: %s not found", args->argv[1]);
+
+ bss->fp->esr = (unsigned long long) RMC << 26;
+ bss->fp->esr |= rmudesc->class;
+ bss->fp->esr |= (rmudesc->func << 8);
+ trap(bss->fp);
+ return 0;
+}
+
+static int
+do_exit(const struct cmd *cmd, struct args *args)
+{
+ switch (args->argc) {
+ case 2:
+ args->status = estrtoull(args->argv[1], 0);
+ break;
+ case 1:
+ args->status = 0;
+ break;
+ default:
+ error(cmd->helpmsg);
+ }
+ return -1;
+}
+
+static int
+do_help(const struct cmd *cmd, struct args *args)
+{
+ for (cmd = cmds; cmd->name; cmd++)
+ printf(PREFIX "%s\n", cmd->helpmsg);
+ return 0;
+}
+
+static const struct cmd *
+parse_cmd(char *buf, struct args *args)
+{
+ char *p;
+ const struct cmd *cmd;
+
+ while (isspace(toascii(*buf)))
+ ++buf;
+
+ args->argc = 0;
+ for (p = strtok(buf, " \t\r"); p; p = strtok(NULL, " \t\r")) {
+ if (args->argc == NR_ARGC_MAX)
+ error("too many parameters");
+ args->argv[args->argc++] = p;
+ }
+
+ if (args->argc == 0)
+ return NULL;
+
+ if ((cmd = get_cmd(args->argv[0])) == NULL)
+ error("cmd '%s' not found", args->argv[0]);
+
+ return cmd;
+}
+
+static int
+run(struct args *args)
+{
+ const struct cmd *cmd;
+ size_t len;
+ char buffer[BUFSIZ];
+
+ if (getln(buffer, sizeof(buffer)) == NULL) {
+ args->status = 1;
+ return -1;
+ }
+
+ if ((len = strlen(buffer)) != 0) {
+ if (buffer[len-1] != '\n')
+ error("line too long");
+ buffer[len-1] = '\0';
+ cmd = parse_cmd(buffer, args);
+ if (cmd)
+ return cmd->eval(cmd, args);
+ }
+
+ args->status = 1;
+ return -1;
+}
+
+int
+debug(void)
+{
+ struct args args;
+
+ bss->in_debug = 1;
+
+ setvbuf(stdout, NULL, _IOLBF, 0);
+ printf("begin debug language interface\n");
+
+ setjmp(bss->dbgrecover);
+ for (ready(); !run(&args); ready())
+ ;
+
+ if (ferror(stdout))
+ puts("debug language interface: error writing in stdout");
+ if (ferror(stdin))
+ puts("debug language interface: error reading from stdin");
+ printf("end debug language interface\n");
+ return args.status;
+}
+
+/*
+ * definition of arrays
+ */
+static const struct cmd cmds[] = {
+ {
+ .name = "set",
+ .eval = do_set,
+ .helpmsg = "Set a register: set <reg> <value>",
+ },
+ {
+ .name = "get",
+ .eval = do_get,
+ .helpmsg = "Get a register: get <reg>",
+ },
+ {
+ .name = "dump",
+ .eval = do_dump,
+ .helpmsg = "Dump trapframe: dump",
+ },
+ {
+ .name = "trap",
+ .eval = do_trap,
+ .helpmsg = "Call trap handler: trap",
+ },
+ {
+ .name = "rmc",
+ .eval = do_rmc,
+ .helpmsg = "Call RMC handler: rmc imm1 imm2",
+ },
+ {
+ .name = "rmu",
+ .eval = do_rmu,
+ .helpmsg = "Call RMU handler: rmu rmucmd",
+ },
+ {
+ .name = "exit",
+ .eval = do_exit,
+ .helpmsg = "Exit debug environment: exit",
+ },
+ {
+ .name = "help",
+ .eval = do_help,
+ .helpmsg = "Print this help menu: help",
+ },
+ {
+ .name = NULL
+ }
+};
+
+static const struct named_reg named_regs[]={
+ {"x0", offsetof(struct trapframe, x0)},
+ {"x1", offsetof(struct trapframe, x1)},
+ {"x2", offsetof(struct trapframe, x2)},
+ {"x3", offsetof(struct trapframe, x3)},
+ {"x4", offsetof(struct trapframe, x4)},
+ {"x5", offsetof(struct trapframe, x5)},
+ {"x6", offsetof(struct trapframe, x6)},
+ {"x7", offsetof(struct trapframe, x7)},
+ {"x8", offsetof(struct trapframe, x8)},
+ {"x9", offsetof(struct trapframe, x9)},
+ {"x10", offsetof(struct trapframe, x10)},
+ {"x11", offsetof(struct trapframe, x11)},
+ {"x12", offsetof(struct trapframe, x12)},
+ {"x13", offsetof(struct trapframe, x13)},
+ {"x14", offsetof(struct trapframe, x14)},
+ {"x15", offsetof(struct trapframe, x15)},
+ {"x16", offsetof(struct trapframe, x16)},
+ {"x17", offsetof(struct trapframe, x17)},
+ {"x18", offsetof(struct trapframe, x18)},
+ {"x19", offsetof(struct trapframe, x19)},
+ {"x20", offsetof(struct trapframe, x20)},
+ {"x21", offsetof(struct trapframe, x21)},
+ {"x22", offsetof(struct trapframe, x22)},
+ {"x23", offsetof(struct trapframe, x23)},
+ {"x24", offsetof(struct trapframe, x24)},
+ {"x25", offsetof(struct trapframe, x25)},
+ {"x26", offsetof(struct trapframe, x26)},
+ {"x27", offsetof(struct trapframe, x27)},
+ {"x28", offsetof(struct trapframe, x28)},
+ {"x29", offsetof(struct trapframe, x29)},
+ {"x30", offsetof(struct trapframe, x30)},
+ {"sp", offsetof(struct trapframe, sp)},
+ {"far", offsetof(struct trapframe, far)},
+ {"esr", offsetof(struct trapframe, esr)},
+ {"spsr", offsetof(struct trapframe, spsr)},
+ {"elr", offsetof(struct trapframe, elr)},
+ {NULL},
+};
diff --git a/src/debuglang/debuglang.h b/src/dlang/dlang.h