Subversion Repositories HelenOS-historic

Rev

Rev 1264 | Rev 1573 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1264 Rev 1474
1
/*
1
/*
2
 * Copyright (C) 2005 Jakub Jermar
2
 * Copyright (C) 2005 Jakub Jermar
3
 * All rights reserved.
3
 * All rights reserved.
4
 *
4
 *
5
 * Redistribution and use in source and binary forms, with or without
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
6
 * modification, are permitted provided that the following conditions
7
 * are met:
7
 * are met:
8
 *
8
 *
9
 * - Redistributions of source code must retain the above copyright
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
15
 *   derived from this software without specific prior written permission.
16
 *
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
/**
29
/**
30
 * @file    cmd.c
30
 * @file    cmd.c
31
 * @brief   Kernel console command wrappers.
31
 * @brief   Kernel console command wrappers.
32
 *
32
 *
33
 * This file is meant to contain all wrapper functions for
33
 * This file is meant to contain all wrapper functions for
34
 * all kconsole commands. The point is in separating
34
 * all kconsole commands. The point is in separating
35
 * kconsole specific wrappers from kconsole-unaware functions
35
 * kconsole specific wrappers from kconsole-unaware functions
36
 * from other subsystems.
36
 * from other subsystems.
37
 */
37
 */
38
 
38
 
39
#include <console/cmd.h>
39
#include <console/cmd.h>
-
 
40
#include <console/console.h>
40
#include <console/kconsole.h>
41
#include <console/kconsole.h>
41
#include <print.h>
42
#include <print.h>
42
#include <panic.h>
43
#include <panic.h>
43
#include <typedefs.h>
44
#include <typedefs.h>
44
#include <arch/types.h>
45
#include <arch/types.h>
45
#include <adt/list.h>
46
#include <adt/list.h>
46
#include <arch.h>
47
#include <arch.h>
47
#include <func.h>
48
#include <func.h>
48
#include <macros.h>
49
#include <macros.h>
49
#include <debug.h>
50
#include <debug.h>
50
#include <symtab.h>
51
#include <symtab.h>
51
#include <cpu.h>
52
#include <cpu.h>
52
#include <mm/tlb.h>
53
#include <mm/tlb.h>
53
#include <arch/mm/tlb.h>
54
#include <arch/mm/tlb.h>
54
#include <mm/frame.h>
55
#include <mm/frame.h>
55
#include <main/version.h>
56
#include <main/version.h>
56
#include <mm/slab.h>
57
#include <mm/slab.h>
57
#include <proc/scheduler.h>
58
#include <proc/scheduler.h>
58
#include <proc/thread.h>
59
#include <proc/thread.h>
59
#include <proc/task.h>
60
#include <proc/task.h>
60
 
61
 
61
/** Data and methods for 'help' command. */
62
/** Data and methods for 'help' command. */
62
static int cmd_help(cmd_arg_t *argv);
63
static int cmd_help(cmd_arg_t *argv);
63
static cmd_info_t help_info = {
64
static cmd_info_t help_info = {
64
    .name = "help",
65
    .name = "help",
65
    .description = "List of supported commands.",
66
    .description = "List of supported commands.",
66
    .func = cmd_help,
67
    .func = cmd_help,
67
    .argc = 0
68
    .argc = 0
68
};
69
};
69
 
70
 
70
static cmd_info_t exit_info = {
71
static cmd_info_t exit_info = {
71
    .name = "exit",
72
    .name = "exit",
72
    .description ="Exit kconsole",
73
    .description ="Exit kconsole",
73
    .argc = 0
74
    .argc = 0
74
};
75
};
75
 
76
 
-
 
77
static int cmd_continue(cmd_arg_t *argv);
-
 
78
static cmd_info_t continue_info = {
-
 
79
    .name = "continue",
-
 
80
    .description ="Return console back to userspace",
-
 
81
    .func = cmd_continue,
-
 
82
    .argc = 0
-
 
83
};
-
 
84
 
76
/** Data and methods for 'description' command. */
85
/** Data and methods for 'description' command. */
77
static int cmd_desc(cmd_arg_t *argv);
86
static int cmd_desc(cmd_arg_t *argv);
78
static void desc_help(void);
87
static void desc_help(void);
79
static char desc_buf[MAX_CMDLINE+1];
88
static char desc_buf[MAX_CMDLINE+1];
80
static cmd_arg_t desc_argv = {
89
static cmd_arg_t desc_argv = {
81
    .type = ARG_TYPE_STRING,
90
    .type = ARG_TYPE_STRING,
82
    .buffer = desc_buf,
91
    .buffer = desc_buf,
83
    .len = sizeof(desc_buf)
92
    .len = sizeof(desc_buf)
84
};
93
};
85
static cmd_info_t desc_info = {
94
static cmd_info_t desc_info = {
86
    .name = "describe",
95
    .name = "describe",
87
    .description = "Describe specified command.",
96
    .description = "Describe specified command.",
88
    .help = desc_help,
97
    .help = desc_help,
89
    .func = cmd_desc,
98
    .func = cmd_desc,
90
    .argc = 1,
99
    .argc = 1,
91
    .argv = &desc_argv
100
    .argv = &desc_argv
92
};
101
};
93
 
102
 
94
/** Data and methods for 'symaddr' command. */
103
/** Data and methods for 'symaddr' command. */
95
static int cmd_symaddr(cmd_arg_t *argv);
104
static int cmd_symaddr(cmd_arg_t *argv);
96
static char symaddr_buf[MAX_CMDLINE+1];
105
static char symaddr_buf[MAX_CMDLINE+1];
97
static cmd_arg_t symaddr_argv = {
106
static cmd_arg_t symaddr_argv = {
98
    .type = ARG_TYPE_STRING,
107
    .type = ARG_TYPE_STRING,
99
    .buffer = symaddr_buf,
108
    .buffer = symaddr_buf,
100
    .len = sizeof(symaddr_buf)
109
    .len = sizeof(symaddr_buf)
101
};
110
};
102
static cmd_info_t symaddr_info = {
111
static cmd_info_t symaddr_info = {
103
    .name = "symaddr",
112
    .name = "symaddr",
104
    .description = "Return symbol address.",
113
    .description = "Return symbol address.",
105
    .func = cmd_symaddr,
114
    .func = cmd_symaddr,
106
    .argc = 1,
115
    .argc = 1,
107
    .argv = &symaddr_argv
116
    .argv = &symaddr_argv
108
};
117
};
109
 
118
 
110
static char set_buf[MAX_CMDLINE+1];
119
static char set_buf[MAX_CMDLINE+1];
111
static int cmd_set4(cmd_arg_t *argv);
120
static int cmd_set4(cmd_arg_t *argv);
112
static cmd_arg_t set4_argv[] = {
121
static cmd_arg_t set4_argv[] = {
113
    {
122
    {
114
        .type = ARG_TYPE_STRING,
123
        .type = ARG_TYPE_STRING,
115
        .buffer = set_buf,
124
        .buffer = set_buf,
116
        .len = sizeof(set_buf)
125
        .len = sizeof(set_buf)
117
    },
126
    },
118
    {
127
    {
119
        .type = ARG_TYPE_INT
128
        .type = ARG_TYPE_INT
120
    }
129
    }
121
};
130
};
122
static cmd_info_t set4_info = {
131
static cmd_info_t set4_info = {
123
    .name = "set4",
132
    .name = "set4",
124
    .description = "set <dest_addr> <value> - 4byte version",
133
    .description = "set <dest_addr> <value> - 4byte version",
125
    .func = cmd_set4,
134
    .func = cmd_set4,
126
    .argc = 2,
135
    .argc = 2,
127
    .argv = set4_argv
136
    .argv = set4_argv
128
};
137
};
129
 
138
 
130
/** Data and methods for 'call0' command. */
139
/** Data and methods for 'call0' command. */
131
static char call0_buf[MAX_CMDLINE+1];
140
static char call0_buf[MAX_CMDLINE+1];
132
static char carg1_buf[MAX_CMDLINE+1];
141
static char carg1_buf[MAX_CMDLINE+1];
133
static char carg2_buf[MAX_CMDLINE+1];
142
static char carg2_buf[MAX_CMDLINE+1];
134
static char carg3_buf[MAX_CMDLINE+1];
143
static char carg3_buf[MAX_CMDLINE+1];
135
 
144
 
136
static int cmd_call0(cmd_arg_t *argv);
145
static int cmd_call0(cmd_arg_t *argv);
137
static cmd_arg_t call0_argv = {
146
static cmd_arg_t call0_argv = {
138
    .type = ARG_TYPE_STRING,
147
    .type = ARG_TYPE_STRING,
139
    .buffer = call0_buf,
148
    .buffer = call0_buf,
140
    .len = sizeof(call0_buf)
149
    .len = sizeof(call0_buf)
141
};
150
};
142
static cmd_info_t call0_info = {
151
static cmd_info_t call0_info = {
143
    .name = "call0",
152
    .name = "call0",
144
    .description = "call0 <function> -> call function().",
153
    .description = "call0 <function> -> call function().",
145
    .func = cmd_call0,
154
    .func = cmd_call0,
146
    .argc = 1,
155
    .argc = 1,
147
    .argv = &call0_argv
156
    .argv = &call0_argv
148
};
157
};
149
 
158
 
150
/** Data and methods for 'call1' command. */
159
/** Data and methods for 'call1' command. */
151
static int cmd_call1(cmd_arg_t *argv);
160
static int cmd_call1(cmd_arg_t *argv);
152
static cmd_arg_t call1_argv[] = {
161
static cmd_arg_t call1_argv[] = {
153
    {
162
    {
154
        .type = ARG_TYPE_STRING,
163
        .type = ARG_TYPE_STRING,
155
        .buffer = call0_buf,
164
        .buffer = call0_buf,
156
        .len = sizeof(call0_buf)
165
        .len = sizeof(call0_buf)
157
    },
166
    },
158
    {
167
    {
159
        .type = ARG_TYPE_VAR,
168
        .type = ARG_TYPE_VAR,
160
        .buffer = carg1_buf,
169
        .buffer = carg1_buf,
161
        .len = sizeof(carg1_buf)
170
        .len = sizeof(carg1_buf)
162
    }
171
    }
163
};
172
};
164
static cmd_info_t call1_info = {
173
static cmd_info_t call1_info = {
165
    .name = "call1",
174
    .name = "call1",
166
    .description = "call1 <function> <arg1> -> call function(arg1).",
175
    .description = "call1 <function> <arg1> -> call function(arg1).",
167
    .func = cmd_call1,
176
    .func = cmd_call1,
168
    .argc = 2,
177
    .argc = 2,
169
    .argv = call1_argv
178
    .argv = call1_argv
170
};
179
};
171
 
180
 
172
/** Data and methods for 'call2' command. */
181
/** Data and methods for 'call2' command. */
173
static int cmd_call2(cmd_arg_t *argv);
182
static int cmd_call2(cmd_arg_t *argv);
174
static cmd_arg_t call2_argv[] = {
183
static cmd_arg_t call2_argv[] = {
175
    {
184
    {
176
        .type = ARG_TYPE_STRING,
185
        .type = ARG_TYPE_STRING,
177
        .buffer = call0_buf,
186
        .buffer = call0_buf,
178
        .len = sizeof(call0_buf)
187
        .len = sizeof(call0_buf)
179
    },
188
    },
180
    {
189
    {
181
        .type = ARG_TYPE_VAR,
190
        .type = ARG_TYPE_VAR,
182
        .buffer = carg1_buf,
191
        .buffer = carg1_buf,
183
        .len = sizeof(carg1_buf)
192
        .len = sizeof(carg1_buf)
184
    },
193
    },
185
    {
194
    {
186
        .type = ARG_TYPE_VAR,
195
        .type = ARG_TYPE_VAR,
187
        .buffer = carg2_buf,
196
        .buffer = carg2_buf,
188
        .len = sizeof(carg2_buf)
197
        .len = sizeof(carg2_buf)
189
    }
198
    }
190
};
199
};
191
static cmd_info_t call2_info = {
200
static cmd_info_t call2_info = {
192
    .name = "call2",
201
    .name = "call2",
193
    .description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).",
202
    .description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).",
194
    .func = cmd_call2,
203
    .func = cmd_call2,
195
    .argc = 3,
204
    .argc = 3,
196
    .argv = call2_argv
205
    .argv = call2_argv
197
};
206
};
198
 
207
 
199
/** Data and methods for 'call3' command. */
208
/** Data and methods for 'call3' command. */
200
static int cmd_call3(cmd_arg_t *argv);
209
static int cmd_call3(cmd_arg_t *argv);
201
static cmd_arg_t call3_argv[] = {
210
static cmd_arg_t call3_argv[] = {
202
    {
211
    {
203
        .type = ARG_TYPE_STRING,
212
        .type = ARG_TYPE_STRING,
204
        .buffer = call0_buf,
213
        .buffer = call0_buf,
205
        .len = sizeof(call0_buf)
214
        .len = sizeof(call0_buf)
206
    },
215
    },
207
    {
216
    {
208
        .type = ARG_TYPE_VAR,
217
        .type = ARG_TYPE_VAR,
209
        .buffer = carg1_buf,
218
        .buffer = carg1_buf,
210
        .len = sizeof(carg1_buf)
219
        .len = sizeof(carg1_buf)
211
    },
220
    },
212
    {
221
    {
213
        .type = ARG_TYPE_VAR,
222
        .type = ARG_TYPE_VAR,
214
        .buffer = carg2_buf,
223
        .buffer = carg2_buf,
215
        .len = sizeof(carg2_buf)
224
        .len = sizeof(carg2_buf)
216
    },
225
    },
217
    {
226
    {
218
        .type = ARG_TYPE_VAR,
227
        .type = ARG_TYPE_VAR,
219
        .buffer = carg3_buf,
228
        .buffer = carg3_buf,
220
        .len = sizeof(carg3_buf)
229
        .len = sizeof(carg3_buf)
221
    }
230
    }
222
 
231
 
223
};
232
};
224
static cmd_info_t call3_info = {
233
static cmd_info_t call3_info = {
225
    .name = "call3",
234
    .name = "call3",
226
    .description = "call3 <function> <arg1> <arg2> <arg3> -> call function(arg1,arg2,arg3).",
235
    .description = "call3 <function> <arg1> <arg2> <arg3> -> call function(arg1,arg2,arg3).",
227
    .func = cmd_call3,
236
    .func = cmd_call3,
228
    .argc = 4,
237
    .argc = 4,
229
    .argv = call3_argv
238
    .argv = call3_argv
230
};
239
};
231
 
240
 
232
/** Data and methods for 'halt' command. */
241
/** Data and methods for 'halt' command. */
233
static int cmd_halt(cmd_arg_t *argv);
242
static int cmd_halt(cmd_arg_t *argv);
234
static cmd_info_t halt_info = {
243
static cmd_info_t halt_info = {
235
    .name = "halt",
244
    .name = "halt",
236
    .description = "Halt the kernel.",
245
    .description = "Halt the kernel.",
237
    .func = cmd_halt,
246
    .func = cmd_halt,
238
    .argc = 0
247
    .argc = 0
239
};
248
};
240
 
249
 
241
/** Data and methods for 'tlb' command. */
250
/** Data and methods for 'tlb' command. */
242
static int cmd_tlb(cmd_arg_t *argv);
251
static int cmd_tlb(cmd_arg_t *argv);
243
cmd_info_t tlb_info = {
252
cmd_info_t tlb_info = {
244
    .name = "tlb",
253
    .name = "tlb",
245
    .description = "Print TLB of current processor.",
254
    .description = "Print TLB of current processor.",
246
    .help = NULL,
255
    .help = NULL,
247
    .func = cmd_tlb,
256
    .func = cmd_tlb,
248
    .argc = 0,
257
    .argc = 0,
249
    .argv = NULL
258
    .argv = NULL
250
};
259
};
251
 
260
 
252
static int cmd_threads(cmd_arg_t *argv);
261
static int cmd_threads(cmd_arg_t *argv);
253
static cmd_info_t threads_info = {
262
static cmd_info_t threads_info = {
254
    .name = "threads",
263
    .name = "threads",
255
    .description = "List all threads",
264
    .description = "List all threads",
256
    .func = cmd_threads,
265
    .func = cmd_threads,
257
    .argc = 0
266
    .argc = 0
258
};
267
};
259
 
268
 
260
static int cmd_tasks(cmd_arg_t *argv);
269
static int cmd_tasks(cmd_arg_t *argv);
261
static cmd_info_t tasks_info = {
270
static cmd_info_t tasks_info = {
262
    .name = "tasks",
271
    .name = "tasks",
263
    .description = "List all tasks",
272
    .description = "List all tasks",
264
    .func = cmd_tasks,
273
    .func = cmd_tasks,
265
    .argc = 0
274
    .argc = 0
266
};
275
};
267
 
276
 
268
 
277
 
269
static int cmd_sched(cmd_arg_t *argv);
278
static int cmd_sched(cmd_arg_t *argv);
270
static cmd_info_t sched_info = {
279
static cmd_info_t sched_info = {
271
    .name = "scheduler",
280
    .name = "scheduler",
272
    .description = "List all scheduler information",
281
    .description = "List all scheduler information",
273
    .func = cmd_sched,
282
    .func = cmd_sched,
274
    .argc = 0
283
    .argc = 0
275
};
284
};
276
 
285
 
277
static int cmd_slabs(cmd_arg_t *argv);
286
static int cmd_slabs(cmd_arg_t *argv);
278
static cmd_info_t slabs_info = {
287
static cmd_info_t slabs_info = {
279
    .name = "slabs",
288
    .name = "slabs",
280
    .description = "List SLAB caches.",
289
    .description = "List SLAB caches.",
281
    .func = cmd_slabs,
290
    .func = cmd_slabs,
282
    .argc = 0
291
    .argc = 0
283
};
292
};
284
 
293
 
285
/** Data and methods for 'zones' command */
294
/** Data and methods for 'zones' command */
286
static int cmd_zones(cmd_arg_t *argv);
295
static int cmd_zones(cmd_arg_t *argv);
287
static cmd_info_t zones_info = {
296
static cmd_info_t zones_info = {
288
    .name = "zones",
297
    .name = "zones",
289
    .description = "List of memory zones.",
298
    .description = "List of memory zones.",
290
    .func = cmd_zones,
299
    .func = cmd_zones,
291
    .argc = 0
300
    .argc = 0
292
};
301
};
293
 
302
 
294
/** Data and methods for 'zone' command */
303
/** Data and methods for 'zone' command */
295
static int cmd_zone(cmd_arg_t *argv);
304
static int cmd_zone(cmd_arg_t *argv);
296
static cmd_arg_t zone_argv = {
305
static cmd_arg_t zone_argv = {
297
    .type = ARG_TYPE_INT,
306
    .type = ARG_TYPE_INT,
298
};
307
};
299
 
308
 
300
static cmd_info_t zone_info = {
309
static cmd_info_t zone_info = {
301
    .name = "zone",
310
    .name = "zone",
302
    .description = "Show memory zone structure.",
311
    .description = "Show memory zone structure.",
303
    .func = cmd_zone,
312
    .func = cmd_zone,
304
    .argc = 1,
313
    .argc = 1,
305
    .argv = &zone_argv
314
    .argv = &zone_argv
306
};
315
};
307
 
316
 
308
/** Data and methods for 'cpus' command. */
317
/** Data and methods for 'cpus' command. */
309
static int cmd_cpus(cmd_arg_t *argv);
318
static int cmd_cpus(cmd_arg_t *argv);
310
cmd_info_t cpus_info = {
319
cmd_info_t cpus_info = {
311
    .name = "cpus",
320
    .name = "cpus",
312
    .description = "List all processors.",
321
    .description = "List all processors.",
313
    .help = NULL,
322
    .help = NULL,
314
    .func = cmd_cpus,
323
    .func = cmd_cpus,
315
    .argc = 0,
324
    .argc = 0,
316
    .argv = NULL
325
    .argv = NULL
317
};
326
};
318
 
327
 
319
/** Data and methods for 'version' command. */
328
/** Data and methods for 'version' command. */
320
static int cmd_version(cmd_arg_t *argv);
329
static int cmd_version(cmd_arg_t *argv);
321
cmd_info_t version_info = {
330
cmd_info_t version_info = {
322
    .name = "version",
331
    .name = "version",
323
    .description = "Print version information.",
332
    .description = "Print version information.",
324
    .help = NULL,
333
    .help = NULL,
325
    .func = cmd_version,
334
    .func = cmd_version,
326
    .argc = 0,
335
    .argc = 0,
327
    .argv = NULL
336
    .argv = NULL
328
};
337
};
329
 
338
 
330
static cmd_info_t *basic_commands[] = {
339
static cmd_info_t *basic_commands[] = {
331
    &call0_info,
340
    &call0_info,
332
    &call1_info,
341
    &call1_info,
333
    &call2_info,
342
    &call2_info,
334
    &call3_info,
343
    &call3_info,
-
 
344
    &continue_info,
335
    &cpus_info,
345
    &cpus_info,
336
    &desc_info,
346
    &desc_info,
337
    &exit_info,
347
    &exit_info,
338
    &halt_info,
348
    &halt_info,
339
    &help_info,
349
    &help_info,
340
    &set4_info,
350
    &set4_info,
341
    &slabs_info,
351
    &slabs_info,
342
    &symaddr_info,
352
    &symaddr_info,
343
    &sched_info,
353
    &sched_info,
344
    &threads_info,
354
    &threads_info,
345
    &tasks_info,
355
    &tasks_info,
346
    &tlb_info,
356
    &tlb_info,
347
    &version_info,
357
    &version_info,
348
    &zones_info,
358
    &zones_info,
349
    &zone_info,
359
    &zone_info,
350
    NULL
360
    NULL
351
};
361
};
352
 
362
 
353
 
363
 
354
/** Initialize command info structure.
364
/** Initialize command info structure.
355
 *
365
 *
356
 * @param cmd Command info structure.
366
 * @param cmd Command info structure.
357
 *
367
 *
358
 */
368
 */
359
void cmd_initialize(cmd_info_t *cmd)
369
void cmd_initialize(cmd_info_t *cmd)
360
{
370
{
361
    spinlock_initialize(&cmd->lock, "cmd");
371
    spinlock_initialize(&cmd->lock, "cmd");
362
    link_initialize(&cmd->link);
372
    link_initialize(&cmd->link);
363
}
373
}
364
 
374
 
365
/** Initialize and register commands. */
375
/** Initialize and register commands. */
366
void cmd_init(void)
376
void cmd_init(void)
367
{
377
{
368
    int i;
378
    int i;
369
 
379
 
370
    for (i=0;basic_commands[i]; i++) {
380
    for (i=0;basic_commands[i]; i++) {
371
        cmd_initialize(basic_commands[i]);
381
        cmd_initialize(basic_commands[i]);
372
        if (!cmd_register(basic_commands[i]))
382
        if (!cmd_register(basic_commands[i]))
373
            panic("could not register command %s\n",
383
            panic("could not register command %s\n",
374
                  basic_commands[i]->name);
384
                  basic_commands[i]->name);
375
    }
385
    }
376
}
386
}
377
 
387
 
378
 
388
 
379
/** List supported commands.
389
/** List supported commands.
380
 *
390
 *
381
 * @param argv Argument vector.
391
 * @param argv Argument vector.
382
 *
392
 *
383
 * @return 0 on failure, 1 on success.
393
 * @return 0 on failure, 1 on success.
384
 */
394
 */
385
int cmd_help(cmd_arg_t *argv)
395
int cmd_help(cmd_arg_t *argv)
386
{
396
{
387
    link_t *cur;
397
    link_t *cur;
388
 
398
 
389
    spinlock_lock(&cmd_lock);
399
    spinlock_lock(&cmd_lock);
390
   
400
   
391
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
401
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
392
        cmd_info_t *hlp;
402
        cmd_info_t *hlp;
393
       
403
       
394
        hlp = list_get_instance(cur, cmd_info_t, link);
404
        hlp = list_get_instance(cur, cmd_info_t, link);
395
        spinlock_lock(&hlp->lock);
405
        spinlock_lock(&hlp->lock);
396
       
406
       
397
        printf("%s - %s\n", hlp->name, hlp->description);
407
        printf("%s - %s\n", hlp->name, hlp->description);
398
 
408
 
399
        spinlock_unlock(&hlp->lock);
409
        spinlock_unlock(&hlp->lock);
400
    }
410
    }
401
   
411
   
402
    spinlock_unlock(&cmd_lock);
412
    spinlock_unlock(&cmd_lock);
403
 
413
 
404
    return 1;
414
    return 1;
405
}
415
}
406
 
416
 
407
/** Describe specified command.
417
/** Describe specified command.
408
 *
418
 *
409
 * @param argv Argument vector.
419
 * @param argv Argument vector.
410
 *
420
 *
411
 * @return 0 on failure, 1 on success.
421
 * @return 0 on failure, 1 on success.
412
 */
422
 */
413
int cmd_desc(cmd_arg_t *argv)
423
int cmd_desc(cmd_arg_t *argv)
414
{
424
{
415
    link_t *cur;
425
    link_t *cur;
416
 
426
 
417
    spinlock_lock(&cmd_lock);
427
    spinlock_lock(&cmd_lock);
418
   
428
   
419
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
429
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
420
        cmd_info_t *hlp;
430
        cmd_info_t *hlp;
421
       
431
       
422
        hlp = list_get_instance(cur, cmd_info_t, link);
432
        hlp = list_get_instance(cur, cmd_info_t, link);
423
        spinlock_lock(&hlp->lock);
433
        spinlock_lock(&hlp->lock);
424
 
434
 
425
        if (strncmp(hlp->name, (const char *) argv->buffer, strlen(hlp->name)) == 0) {
435
        if (strncmp(hlp->name, (const char *) argv->buffer, strlen(hlp->name)) == 0) {
426
            printf("%s - %s\n", hlp->name, hlp->description);
436
            printf("%s - %s\n", hlp->name, hlp->description);
427
            if (hlp->help)
437
            if (hlp->help)
428
                hlp->help();
438
                hlp->help();
429
            spinlock_unlock(&hlp->lock);
439
            spinlock_unlock(&hlp->lock);
430
            break;
440
            break;
431
        }
441
        }
432
 
442
 
433
        spinlock_unlock(&hlp->lock);
443
        spinlock_unlock(&hlp->lock);
434
    }
444
    }
435
   
445
   
436
    spinlock_unlock(&cmd_lock);
446
    spinlock_unlock(&cmd_lock);
437
 
447
 
438
    return 1;
448
    return 1;
439
}
449
}
440
 
450
 
441
/** Search symbol table */
451
/** Search symbol table */
442
int cmd_symaddr(cmd_arg_t *argv)
452
int cmd_symaddr(cmd_arg_t *argv)
443
{
453
{
444
    symtab_print_search(argv->buffer);
454
    symtab_print_search(argv->buffer);
445
   
455
   
446
    return 1;
456
    return 1;
447
}
457
}
448
 
458
 
449
/** Call function with zero parameters */
459
/** Call function with zero parameters */
450
int cmd_call0(cmd_arg_t *argv)
460
int cmd_call0(cmd_arg_t *argv)
451
{
461
{
452
    __address symaddr;
462
    __address symaddr;
453
    char *symbol;
463
    char *symbol;
454
    __native (*f)(void);
464
    __native (*f)(void);
455
 
465
 
456
    symaddr = get_symbol_addr(argv->buffer);
466
    symaddr = get_symbol_addr(argv->buffer);
457
    if (!symaddr)
467
    if (!symaddr)
458
        printf("Symbol %s not found.\n", argv->buffer);
468
        printf("Symbol %s not found.\n", argv->buffer);
459
    else if (symaddr == (__address) -1) {
469
    else if (symaddr == (__address) -1) {
460
        symtab_print_search(argv->buffer);
470
        symtab_print_search(argv->buffer);
461
        printf("Duplicate symbol, be more specific.\n");
471
        printf("Duplicate symbol, be more specific.\n");
462
    } else {
472
    } else {
463
        symbol = get_symtab_entry(symaddr);
473
        symbol = get_symtab_entry(symaddr);
464
        printf("Calling f(): %.*p: %s\n", sizeof(__address) * 2, symaddr, symbol);
474
        printf("Calling f(): %.*p: %s\n", sizeof(__address) * 2, symaddr, symbol);
465
        f =  (__native (*)(void)) symaddr;
475
        f =  (__native (*)(void)) symaddr;
466
        printf("Result: %#zx\n", f());
476
        printf("Result: %#zx\n", f());
467
    }
477
    }
468
   
478
   
469
    return 1;
479
    return 1;
470
}
480
}
471
 
481
 
472
/** Call function with one parameter */
482
/** Call function with one parameter */
473
int cmd_call1(cmd_arg_t *argv)
483
int cmd_call1(cmd_arg_t *argv)
474
{
484
{
475
    __address symaddr;
485
    __address symaddr;
476
    char *symbol;
486
    char *symbol;
477
    __native (*f)(__native,...);
487
    __native (*f)(__native,...);
478
    __native arg1 = argv[1].intval;
488
    __native arg1 = argv[1].intval;
479
 
489
 
480
    symaddr = get_symbol_addr(argv->buffer);
490
    symaddr = get_symbol_addr(argv->buffer);
481
    if (!symaddr)
491
    if (!symaddr)
482
        printf("Symbol %s not found.\n", argv->buffer);
492
        printf("Symbol %s not found.\n", argv->buffer);
483
    else if (symaddr == (__address) -1) {
493
    else if (symaddr == (__address) -1) {
484
        symtab_print_search(argv->buffer);
494
        symtab_print_search(argv->buffer);
485
        printf("Duplicate symbol, be more specific.\n");
495
        printf("Duplicate symbol, be more specific.\n");
486
    } else {
496
    } else {
487
        symbol = get_symtab_entry(symaddr);
497
        symbol = get_symtab_entry(symaddr);
488
        printf("Calling f(0x%zX): %.*p: %s\n", arg1, sizeof(__address) * 2, symaddr, symbol);
498
        printf("Calling f(0x%zX): %.*p: %s\n", arg1, sizeof(__address) * 2, symaddr, symbol);
489
        f =  (__native (*)(__native,...)) symaddr;
499
        f =  (__native (*)(__native,...)) symaddr;
490
        printf("Result: %#zx\n", f(arg1));
500
        printf("Result: %#zx\n", f(arg1));
491
    }
501
    }
492
   
502
   
493
    return 1;
503
    return 1;
494
}
504
}
495
 
505
 
496
/** Call function with two parameters */
506
/** Call function with two parameters */
497
int cmd_call2(cmd_arg_t *argv)
507
int cmd_call2(cmd_arg_t *argv)
498
{
508
{
499
    __address symaddr;
509
    __address symaddr;
500
    char *symbol;
510
    char *symbol;
501
    __native (*f)(__native,__native,...);
511
    __native (*f)(__native,__native,...);
502
    __native arg1 = argv[1].intval;
512
    __native arg1 = argv[1].intval;
503
    __native arg2 = argv[2].intval;
513
    __native arg2 = argv[2].intval;
504
 
514
 
505
    symaddr = get_symbol_addr(argv->buffer);
515
    symaddr = get_symbol_addr(argv->buffer);
506
    if (!symaddr)
516
    if (!symaddr)
507
        printf("Symbol %s not found.\n", argv->buffer);
517
        printf("Symbol %s not found.\n", argv->buffer);
508
    else if (symaddr == (__address) -1) {
518
    else if (symaddr == (__address) -1) {
509
        symtab_print_search(argv->buffer);
519
        symtab_print_search(argv->buffer);
510
        printf("Duplicate symbol, be more specific.\n");
520
        printf("Duplicate symbol, be more specific.\n");
511
    } else {
521
    } else {
512
        symbol = get_symtab_entry(symaddr);
522
        symbol = get_symtab_entry(symaddr);
513
        printf("Calling f(0x%zx,0x%zx): %.*p: %s\n",
523
        printf("Calling f(0x%zx,0x%zx): %.*p: %s\n",
514
               arg1, arg2, sizeof(__address) * 2, symaddr, symbol);
524
               arg1, arg2, sizeof(__address) * 2, symaddr, symbol);
515
        f =  (__native (*)(__native,__native,...)) symaddr;
525
        f =  (__native (*)(__native,__native,...)) symaddr;
516
        printf("Result: %#zx\n", f(arg1, arg2));
526
        printf("Result: %#zx\n", f(arg1, arg2));
517
    }
527
    }
518
   
528
   
519
    return 1;
529
    return 1;
520
}
530
}
521
 
531
 
522
/** Call function with three parameters */
532
/** Call function with three parameters */
523
int cmd_call3(cmd_arg_t *argv)
533
int cmd_call3(cmd_arg_t *argv)
524
{
534
{
525
    __address symaddr;
535
    __address symaddr;
526
    char *symbol;
536
    char *symbol;
527
    __native (*f)(__native,__native,__native,...);
537
    __native (*f)(__native,__native,__native,...);
528
    __native arg1 = argv[1].intval;
538
    __native arg1 = argv[1].intval;
529
    __native arg2 = argv[2].intval;
539
    __native arg2 = argv[2].intval;
530
    __native arg3 = argv[3].intval;
540
    __native arg3 = argv[3].intval;
531
 
541
 
532
    symaddr = get_symbol_addr(argv->buffer);
542
    symaddr = get_symbol_addr(argv->buffer);
533
    if (!symaddr)
543
    if (!symaddr)
534
        printf("Symbol %s not found.\n", argv->buffer);
544
        printf("Symbol %s not found.\n", argv->buffer);
535
    else if (symaddr == (__address) -1) {
545
    else if (symaddr == (__address) -1) {
536
        symtab_print_search(argv->buffer);
546
        symtab_print_search(argv->buffer);
537
        printf("Duplicate symbol, be more specific.\n");
547
        printf("Duplicate symbol, be more specific.\n");
538
    } else {
548
    } else {
539
        symbol = get_symtab_entry(symaddr);
549
        symbol = get_symtab_entry(symaddr);
540
        printf("Calling f(0x%zx,0x%zx, 0x%zx): %.*p: %s\n",
550
        printf("Calling f(0x%zx,0x%zx, 0x%zx): %.*p: %s\n",
541
               arg1, arg2, arg3, sizeof(__address) * 2, symaddr, symbol);
551
               arg1, arg2, arg3, sizeof(__address) * 2, symaddr, symbol);
542
        f =  (__native (*)(__native,__native,__native,...)) symaddr;
552
        f =  (__native (*)(__native,__native,__native,...)) symaddr;
543
        printf("Result: %#zx\n", f(arg1, arg2, arg3));
553
        printf("Result: %#zx\n", f(arg1, arg2, arg3));
544
    }
554
    }
545
   
555
   
546
    return 1;
556
    return 1;
547
}
557
}
548
 
558
 
549
 
559
 
550
/** Print detailed description of 'describe' command. */
560
/** Print detailed description of 'describe' command. */
551
void desc_help(void)
561
void desc_help(void)
552
{
562
{
553
    printf("Syntax: describe command_name\n");
563
    printf("Syntax: describe command_name\n");
554
}
564
}
555
 
565
 
556
/** Halt the kernel.
566
/** Halt the kernel.
557
 *
567
 *
558
 * @param argv Argument vector (ignored).
568
 * @param argv Argument vector (ignored).
559
 *
569
 *
560
 * @return 0 on failure, 1 on success (never returns).
570
 * @return 0 on failure, 1 on success (never returns).
561
 */
571
 */
562
int cmd_halt(cmd_arg_t *argv)
572
int cmd_halt(cmd_arg_t *argv)
563
{
573
{
564
    halt();
574
    halt();
565
    return 1;
575
    return 1;
566
}
576
}
567
 
577
 
568
/** Command for printing TLB contents.
578
/** Command for printing TLB contents.
569
 *
579
 *
570
 * @param argv Not used.
580
 * @param argv Not used.
571
 *
581
 *
572
 * @return Always returns 1.
582
 * @return Always returns 1.
573
 */
583
 */
574
int cmd_tlb(cmd_arg_t *argv)
584
int cmd_tlb(cmd_arg_t *argv)
575
{
585
{
576
    tlb_print();
586
    tlb_print();
577
    return 1;
587
    return 1;
578
}
588
}
579
 
589
 
580
/** Write 4 byte value to address */
590
/** Write 4 byte value to address */
581
int cmd_set4(cmd_arg_t *argv)
591
int cmd_set4(cmd_arg_t *argv)
582
{
592
{
583
    __u32 *addr ;
593
    __u32 *addr ;
584
    __u32 arg1 = argv[1].intval;
594
    __u32 arg1 = argv[1].intval;
585
    bool pointer = false;
595
    bool pointer = false;
586
 
596
 
587
    if (((char *)argv->buffer)[0] == '*') {
597
    if (((char *)argv->buffer)[0] == '*') {
588
        addr = (__u32 *) get_symbol_addr(argv->buffer+1);
598
        addr = (__u32 *) get_symbol_addr(argv->buffer+1);
589
        pointer = true;
599
        pointer = true;
590
    } else if (((char *)argv->buffer)[0] >= '0' &&
600
    } else if (((char *)argv->buffer)[0] >= '0' &&
591
           ((char *)argv->buffer)[0] <= '9')
601
           ((char *)argv->buffer)[0] <= '9')
592
        addr = (__u32 *)atoi((char *)argv->buffer);
602
        addr = (__u32 *)atoi((char *)argv->buffer);
593
    else
603
    else
594
        addr = (__u32 *)get_symbol_addr(argv->buffer);
604
        addr = (__u32 *)get_symbol_addr(argv->buffer);
595
 
605
 
596
    if (!addr)
606
    if (!addr)
597
        printf("Symbol %s not found.\n", argv->buffer);
607
        printf("Symbol %s not found.\n", argv->buffer);
598
    else if (addr == (__u32 *) -1) {
608
    else if (addr == (__u32 *) -1) {
599
        symtab_print_search(argv->buffer);
609
        symtab_print_search(argv->buffer);
600
        printf("Duplicate symbol, be more specific.\n");
610
        printf("Duplicate symbol, be more specific.\n");
601
    } else {
611
    } else {
602
        if (pointer)
612
        if (pointer)
603
            addr = (__u32 *)(*(__native *)addr);
613
            addr = (__u32 *)(*(__native *)addr);
604
        printf("Writing 0x%x -> %.*p\n", arg1, sizeof(__address) * 2, addr);
614
        printf("Writing 0x%x -> %.*p\n", arg1, sizeof(__address) * 2, addr);
605
        *addr = arg1;
615
        *addr = arg1;
606
       
616
       
607
    }
617
    }
608
   
618
   
609
    return 1;
619
    return 1;
610
}
620
}
611
 
621
 
612
/** Command for listings SLAB caches
622
/** Command for listings SLAB caches
613
 *
623
 *
614
 * @param argv Ignores
624
 * @param argv Ignores
615
 *
625
 *
616
 * @return Always 1
626
 * @return Always 1
617
 */
627
 */
618
int cmd_slabs(cmd_arg_t * argv) {
628
int cmd_slabs(cmd_arg_t * argv) {
619
    slab_print_list();
629
    slab_print_list();
620
    return 1;
630
    return 1;
621
}
631
}
622
 
632
 
623
 
633
 
624
/** Command for listings Thread information
634
/** Command for listings Thread information
625
 *
635
 *
626
 * @param argv Ignores
636
 * @param argv Ignores
627
 *
637
 *
628
 * @return Always 1
638
 * @return Always 1
629
 */
639
 */
630
int cmd_threads(cmd_arg_t * argv) {
640
int cmd_threads(cmd_arg_t * argv) {
631
    thread_print_list();
641
    thread_print_list();
632
    return 1;
642
    return 1;
633
}
643
}
634
 
644
 
635
/** Command for listings Task information
645
/** Command for listings Task information
636
 *
646
 *
637
 * @param argv Ignores
647
 * @param argv Ignores
638
 *
648
 *
639
 * @return Always 1
649
 * @return Always 1
640
 */
650
 */
641
int cmd_tasks(cmd_arg_t * argv) {
651
int cmd_tasks(cmd_arg_t * argv) {
642
    task_print_list();
652
    task_print_list();
643
    return 1;
653
    return 1;
644
}
654
}
645
 
655
 
646
/** Command for listings Thread information
656
/** Command for listings Thread information
647
 *
657
 *
648
 * @param argv Ignores
658
 * @param argv Ignores
649
 *
659
 *
650
 * @return Always 1
660
 * @return Always 1
651
 */
661
 */
652
int cmd_sched(cmd_arg_t * argv) {
662
int cmd_sched(cmd_arg_t * argv) {
653
    sched_print_list();
663
    sched_print_list();
654
    return 1;
664
    return 1;
655
}
665
}
656
 
666
 
657
/** Command for listing memory zones
667
/** Command for listing memory zones
658
 *
668
 *
659
 * @param argv Ignored
669
 * @param argv Ignored
660
 *
670
 *
661
 * return Always 1
671
 * return Always 1
662
 */
672
 */
663
int cmd_zones(cmd_arg_t * argv) {
673
int cmd_zones(cmd_arg_t * argv) {
664
    zone_print_list();
674
    zone_print_list();
665
    return 1;
675
    return 1;
666
}
676
}
667
 
677
 
668
/** Command for memory zone details
678
/** Command for memory zone details
669
 *
679
 *
670
 * @param argv Integer argument from cmdline expected
680
 * @param argv Integer argument from cmdline expected
671
 *
681
 *
672
 * return Always 1
682
 * return Always 1
673
 */
683
 */
674
int cmd_zone(cmd_arg_t * argv) {
684
int cmd_zone(cmd_arg_t * argv) {
675
    zone_print_one(argv[0].intval);
685
    zone_print_one(argv[0].intval);
676
    return 1;
686
    return 1;
677
}
687
}
678
 
688
 
679
/** Command for listing processors.
689
/** Command for listing processors.
680
 *
690
 *
681
 * @param argv Ignored.
691
 * @param argv Ignored.
682
 *
692
 *
683
 * return Always 1.
693
 * return Always 1.
684
 */
694
 */
685
int cmd_cpus(cmd_arg_t *argv)
695
int cmd_cpus(cmd_arg_t *argv)
686
{
696
{
687
    cpu_list();
697
    cpu_list();
688
    return 1;
698
    return 1;
689
}
699
}
690
 
700
 
691
/** Command for printing kernel version.
701
/** Command for printing kernel version.
692
 *
702
 *
693
 * @param argv Ignored.
703
 * @param argv Ignored.
694
 *
704
 *
695
 * return Always 1.
705
 * return Always 1.
696
 */
706
 */
697
int cmd_version(cmd_arg_t *argv)
707
int cmd_version(cmd_arg_t *argv)
698
{
708
{
699
    version_print();
709
    version_print();
700
    return 1;
710
    return 1;
-
 
711
}
-
 
712
 
-
 
713
/** Command for returning console back to userspace.
-
 
714
 *
-
 
715
 * @param argv Ignored.
-
 
716
 *
-
 
717
 * return Always 1.
-
 
718
 */
-
 
719
int cmd_continue(cmd_arg_t *argv)
-
 
720
{
-
 
721
    arch_release_console();
-
 
722
    return 1;
701
}
723
}
702
 
724