commit 2e8cafe017f2df90a2f777eb65242bc841da9e66
parent e5862fb2701b3f726e52d8f0026cf016dbc5dbeb
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Thu, 6 Dec 2018 09:47:06 +0000
dlang: Start doing some relocations in preparation for rmode support
- Decrease buffer size for line input to make some more room on the
stack.
- Set max number of arguments to 4 instead of 16 to save some space.
Change-Id: Iec970329ec97956a7cb947fe9fb3c3dbb18bad6c
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
1 file changed, 29 insertions(+), 19 deletions(-)
diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c
@@ -14,7 +14,7 @@
#include "dlang.h"
#define PREFIX "> "
-#define NR_ARGC_MAX 16
+#define NR_ARGC_MAX 4
struct args {
char *argv[NR_ARGC_MAX];
@@ -119,11 +119,11 @@ get_named_reg(char *name)
static const struct rmudesc *
get_rmudesc(char *name)
{
- const struct rmudesc *rmudesc;
+ const struct rmudesc *desc;
- for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
- if (strcmp(rmudesc->name, name) == 0)
- return rmudesc;
+ for (desc = rmudescs; desc->name; desc++)
+ if (strcmp(reloc(desc->name), name) == 0)
+ return desc;
return NULL;
}
@@ -133,9 +133,10 @@ get_cmd(char *name)
{
const struct cmd *cmd;
- for (cmd = cmds; cmd->name; cmd++)
- if (strcmp(name, cmd->name) == 0)
+ for (cmd = cmds; cmd->name; cmd++) {
+ if (strcmp(reloc(cmd->name), name) == 0)
return cmd;
+ }
return NULL;
}
@@ -200,21 +201,23 @@ do_rmc(const struct cmd *cmd, struct args *args)
static int
do_rmu(const struct cmd *cmd, struct args *args)
{
- const struct rmudesc *rmudesc;
+ const struct rmudesc *desc;
if (args->argv[1][0] == '?') {
- for (rmudesc = rmudescs; rmudesc->name; rmudesc++)
- kprint("%s\n", rmudesc->name);
+ for (desc = rmudescs; desc->name; desc++) {
+ char *s = reloc(desc->name);
+ kprint("%s\n", s);
+ }
return 0;
}
- rmudesc = get_rmudesc(args->argv[1]);
- if (rmudesc == NULL)
+ desc = get_rmudesc(args->argv[1]);
+ if (desc == 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);
+ bss->fp->esr |= desc->class;
+ bss->fp->esr |= (desc->func << 8);
trap(bss->fp);
return 0;
}
@@ -231,8 +234,10 @@ do_exit(const struct cmd *cmd, struct args *args)
static int
do_help(const struct cmd *cmd, struct args *args)
{
- for (cmd = cmds; cmd->name; cmd++)
- kprint(PREFIX "%s\n", cmd->helpmsg);
+ for (cmd = cmds; cmd->name; cmd++) {
+ char *s = reloc(cmd->helpmsg);
+ kprint(PREFIX "%s\n", s);
+ }
return 0;
}
@@ -311,7 +316,7 @@ run(struct args *args)
{
const struct cmd *cmd;
size_t len;
- char buffer[BUFSIZ];
+ char buffer[128];
if (kgets(buffer, sizeof(buffer)) == NULL) {
args->status = 1;
@@ -324,9 +329,14 @@ run(struct args *args)
buffer[len-1] = '\0';
cmd = parse_cmd(buffer, args);
if (cmd) {
+ int (*fn)(const struct cmd *, struct args *);
+ void *bp;
+
if (args->argc < cmd->min || args->argc > cmd->max)
- error(cmd->helpmsg);
- return cmd->eval(cmd, args);
+ error(reloc(cmd->helpmsg));
+ bp = reloc(cmd->eval);
+ fn = (int (*)(const struct cmd *, struct args *)) bp;
+ return (*fn)(cmd, args);
}
}