Enable backchain storing in the stack frames
[hvf.git] / cp / shell / cmds.c
blobd3a24d7ac534a80ac9e4163e518436f5ef330bb1
1 /*
2 * (C) Copyright 2007-2010 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
4 * This file is released under the GPLv2. See the COPYING file for more
5 * details.
6 */
8 #include <directory.h>
9 #include <vcpu.h>
10 #include <vdevice.h>
11 #include <dat.h>
12 #include <mm.h>
13 #include <sched.h>
14 #include <disassm.h>
15 #include <cpu.h>
16 #include <vsprintf.h>
17 #include <shell.h>
18 #include <guest.h>
19 #include <vcpu.h>
21 struct cpcmd {
22 const char name[SHELL_CMD_MAX_LEN];
24 /* handle function pointer */
25 int (*fnx)(struct virt_sys *sys, char *cmd, int len);
27 /* sub-command handler table */
28 struct cpcmd *sub;
32 * Map a device type to a nice to display name
34 static char* type2name(u16 type)
36 switch (type) {
37 case 0x1403: return "PRT";
38 case 0x1732: return "OSA";
39 case 0x3088: return "CTCA";
40 case 0x3215: return "CONS";
41 case 0x3278: return "GRAF";
42 case 0x3505: return "RDR";
43 case 0x3525: return "PUN";
45 /* various dasds */
46 case 0x3390:
47 case 0x9336: return "DASD";
49 /* various tape drives */
50 case 0x3480:
51 case 0x3490:
52 case 0x3590: return "TAPE";
54 default: return "????";
59 * We use includes here to avoid namespace polution with all the sub-command
60 * handler functions
62 #include "cmd_helpers.c"
64 #include "cmd_beginstop.c"
65 #include "cmd_display.c"
66 #include "cmd_enable.c"
67 #include "cmd_logon.c"
68 #include "cmd_query.c"
69 #include "cmd_set.c"
70 #include "cmd_store.c"
71 #include "cmd_system.c"
73 static struct cpcmd commands[] = {
74 {"BEGIN", cmd_begin, NULL},
75 {"BEGI", cmd_begin, NULL},
76 {"BEG", cmd_begin, NULL},
77 {"BE", cmd_begin, NULL},
79 {"DISPLAY", NULL, cmd_tbl_display},
80 {"DISPLA", NULL, cmd_tbl_display},
81 {"DISPL", NULL, cmd_tbl_display},
82 {"DISP", NULL, cmd_tbl_display},
83 {"DIS", NULL, cmd_tbl_display},
84 {"DI", NULL, cmd_tbl_display},
85 {"D", NULL, cmd_tbl_display},
87 {"ENABLE", cmd_enable, NULL},
88 {"ENABL", cmd_enable, NULL},
89 {"ENAB", cmd_enable, NULL},
90 {"ENA", cmd_enable, NULL},
92 {"IPL", cmd_ipl, NULL},
93 {"IP", cmd_ipl, NULL},
94 {"I", cmd_ipl, NULL},
96 {"LOGIN", cmd_logon_fail, NULL},
97 {"LOGON", cmd_logon_fail, NULL},
98 {"LOGO", cmd_logon_fail, NULL},
99 {"LOGI", cmd_logon_fail, NULL},
100 {"LOG", cmd_logon_fail, NULL},
101 {"LO", cmd_logon_fail, NULL},
102 {"L", cmd_logon_fail, NULL},
104 {"QUERY", NULL, cmd_tbl_query},
105 {"QUER", NULL, cmd_tbl_query},
106 {"QUE", NULL, cmd_tbl_query},
107 {"QU", NULL, cmd_tbl_query},
108 {"Q", NULL, cmd_tbl_query},
110 {"SET", NULL, cmd_tbl_set},
112 {"STOP", cmd_stop, NULL},
114 {"STORE", NULL, cmd_tbl_store},
115 {"STOR", NULL, cmd_tbl_store},
116 {"STO", NULL, cmd_tbl_store},
118 {"SYSTEM", cmd_system, NULL},
119 {"SYSTE", cmd_system, NULL},
120 {"SYST", cmd_system, NULL},
121 {"SYS", cmd_system, NULL},
122 {"", NULL, NULL},
125 static int __invoke_shell_cmd(struct cpcmd *t, struct virt_sys *sys, char *cmd, int len)
127 char *orig = cmd;
128 int i, ret;
129 char *tok;
131 tok = strmsep(&cmd, " ");
132 if (!tok)
133 return -ENOENT;
135 for(i=0; t[i].name[0]; i++) {
136 if (strcasecmp(t[i].name, tok))
137 continue;
139 len -= cmd - orig;
141 if (!t[i].sub)
142 return t[i].fnx(sys, cmd, len);
144 ret = __invoke_shell_cmd(t[i].sub, sys, cmd, len);
145 return (ret == -ENOENT) ? -ESUBENOENT : ret;
148 return -ENOENT;
151 int invoke_shell_cmd(struct virt_sys *sys, char *cmd, int len)
153 return __invoke_shell_cmd(commands, sys, cmd, len);