9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
March/amd64/Makefile | 4++--
March/arm64/Makefile | 4++--
Mconfig/amd64-dragonfly.mk | 2+-
Mconfig/amd64-linux.mk | 2+-
Mconfig/amd64-netbsd.mk | 2+-
Mconfig/amd64-openbsd.mk | 2+-
Dscripts/gendebuglang.sh | 38--------------------------------------
Ascripts/gendlang.sh | 37+++++++++++++++++++++++++++++++++++++
Msrc/Makefile | 6+++---
Dsrc/debuglang/Makefile | 19-------------------
Dsrc/debuglang/debuglang.c | 413-------------------------------------------------------------------------------
Rsrc/debuglang/.gitignore -> src/dlang/.gitignore | 0
Asrc/dlang/Makefile | 19+++++++++++++++++++
Asrc/dlang/dlang.c | 413+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rsrc/debuglang/debuglang.h -> src/dlang/dlang.h | 0
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