9os

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

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:
Msrc/romfw/dlang.c | 48+++++++++++++++++++++++++++++-------------------
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); } }