Sharyathi Nagesh wrote:
Dave
I have done the suggested modifications, have a look
This one looks pretty good. I made a couple minor tweaks for the unhandled
command entry error-handling, the minimal commands message, and for a clean
compile. Other than that, it's queued for the next release.
Thanks,
Dave
>
> I haven't walked through all the restricted command list code paths to
> verify that they can work properly for all architectures without, say,
> kernel_init(), the 3 machdep_init() calls, vm_init() etc. having run.
> Certainly trying to rd or dis vmalloc addresses would display garbage
> data or just fail, but that's to be expected.
>
> I quickly tried this on a x86 and x86_64 -- but have you tried this on
> an ia64 or ppc64?
I tested on ppc64 and on corrupted dump and it worked fine
>
> The only thing I'm not excited about is all the re-tinkering with the
> help screen output. Why bother? I'd prefer to keep things simple.
> During initialization, display a WARNING message that lists the supported
> commands just prior to the first prompt. And then just leave the help
> screen alone, and let your command-restriction mechanism display the
> per-command message:
>
> error(INFO, "command: %s not available in minimal mode\n", args[0]);
> ...and then perhaps followed up immediately with the acceptable command
> list again.
I have done this code change
>
> Another minor suggestion -- I think you can put the "eval" command in
> the supported list. I use it all the time, and in this minimal
> environment
> it may come in very handy. (There may be others, but they're probably
> not
> worth having...)
allowed eval to be executed in minimal mode
Thanks
Yeehaw
------------------------------------------------------------------------
Signed-off-by: Sharyathi Nagesh <sharyath(a)in.ibm.com>
Signed-off-by: Sachin P Sant <sachinp(a)in.ibm.com>
---
diff -Naurp crash-old/cmdline.c crash-new/cmdline.c
--- crash-old/cmdline.c 2008-03-31 22:58:31.000000000 +0530
+++ crash-new/cmdline.c 2008-08-18 09:25:21.000000000 +0530
@@ -2137,3 +2137,11 @@ wait_for_children(ulong waitflag)
stall(1000);
}
}
+
+int minimal_functions(char *name)
+{
+ return STREQ("log", name) || STREQ("help",name) || \
+ STREQ("dis", name) || STREQ("q", name) || \
+ STREQ("sym", name) || STREQ("exit", name)|| \
+ STREQ("rd", name) || STREQ("eval", name) ;
+}
diff -Naurp crash-old/defs.h crash-new/defs.h
--- crash-old/defs.h 2008-03-31 22:58:31.000000000 +0530
+++ crash-new/defs.h 2008-08-04 13:36:23.000000000 +0530
@@ -183,6 +183,7 @@ struct number_option {
#define PLEASE_WAIT (0x200000000000000ULL)
#define IFILE_ERROR (0x400000000000000ULL)
#define KERNTYPES (0x800000000000000ULL)
+#define MINIMAL_MODE (0x1000000000000000ULL)
#define ACTIVE() (pc->flags & LIVE_SYSTEM)
#define DUMPFILE() (!(pc->flags & LIVE_SYSTEM))
@@ -3129,6 +3130,7 @@ int received_SIGINT(void);
void debug_redirect(char *);
int CRASHPAGER_valid(void);
char *setup_scroll_command(void);
+int minimal_functions(char *);
/*
* tools.c
diff -Naurp crash-old/main.c crash-new/main.c
--- crash-old/main.c 2008-08-18 11:50:38.000000000 +0530
+++ crash-new/main.c 2008-08-18 11:54:31.000000000 +0530
@@ -56,6 +56,7 @@ static struct option long_options[] = {
{"no_scroll", 0, 0, 0},
{"reloc", required_argument, 0, 0},
{"active", 0, 0, 0},
+ {"minimal", 0, 0, 0},
{0, 0, 0, 0}
};
@@ -197,6 +198,9 @@ main(int argc, char **argv)
kt->flags |= RELOC_SET;
}
+ else if (STREQ(long_options[option_index].name, "minimal"))
+ pc->flags |= MINIMAL_MODE;
+
else {
error(INFO, "internal error: option %s unhandled\n",
long_options[option_index].name);
@@ -492,7 +496,7 @@ main_loop(void)
#else
error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
#endif
- } else {
+ } else if(!(pc->flags & MINIMAL_MODE)){
read_in_kernel_config(IKCFG_INIT);
kernel_init();
machdep_init(POST_GDB);
@@ -520,7 +524,7 @@ main_loop(void)
#else
error(FATAL, XEN_HYPERVISOR_NOT_SUPPORTED);
#endif
- } else {
+ } else if(!(pc->flags & MINIMAL_MODE)){
display_sys_stats();
show_context(CURRENT_CONTEXT());
}
@@ -528,6 +532,11 @@ main_loop(void)
}
pc->flags |= RUNTIME;
+
+ if(pc->flags & MINIMAL_MODE){
+ error(WARNING, "In minimal mode you have access to only these \n \
+ commands: 'log', 'dis', 'rd','sym', 'eval' and
'exit' \n");
+ }
/*
* Return here if a non-recoverable error occurs
@@ -610,7 +619,14 @@ reattempt:
return;
pc->curcmd = pc->program_name;
- error(INFO, "command not found: %s\n", args[0]);
+ if (!(pc->flags & MINIMAL_MODE))
+ error(INFO, "command not found: %s\n", args[0]);
+ else{
+ error(INFO,
+ "command: %s not available in minimal mode\n", args[0]);
+ error(INFO,
+ "supported commands:'log', 'dis', 'rd', 'sym',
'eval', 'exit' \n");
+ }
if (pc->curcmd_flags & REPEAT)
pc->curcmd_flags &= ~REPEAT;
@@ -625,6 +641,9 @@ get_command_table_entry(char *name)
{
struct command_table_entry *cp;
struct extension_table *ext;
+
+ if ((pc->flags & MINIMAL_MODE) && !minimal_functions(name))
+ return NULL;
for (cp = pc->cmd_table; cp->name; cp++) {
if (STREQ(cp->name, name))