New debugging commands.
This commit is contained in:
parent
8af1edae0e
commit
e809face5f
@ -35,6 +35,8 @@
|
|||||||
#include <lib.h>
|
#include <lib.h>
|
||||||
#include <uio.h>
|
#include <uio.h>
|
||||||
#include <clock.h>
|
#include <clock.h>
|
||||||
|
#include <mainbus.h>
|
||||||
|
#include <synch.h>
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
#include <proc.h>
|
#include <proc.h>
|
||||||
#include <vfs.h>
|
#include <vfs.h>
|
||||||
@ -237,6 +239,21 @@ cmd_sync(int nargs, char **args)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command for dropping to the debugger.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
int
|
||||||
|
cmd_debug(int nargs, char **args)
|
||||||
|
{
|
||||||
|
(void)nargs;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
mainbus_debugger();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command for doing an intentional panic.
|
* Command for doing an intentional panic.
|
||||||
*/
|
*/
|
||||||
@ -251,6 +268,81 @@ cmd_panic(int nargs, char **args)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subthread for intentially deadlocking.
|
||||||
|
*/
|
||||||
|
struct deadlock {
|
||||||
|
struct lock *lock1;
|
||||||
|
struct lock *lock2;
|
||||||
|
};
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
cmd_deadlockthread(void *ptr, unsigned long num)
|
||||||
|
{
|
||||||
|
struct deadlock *dl = ptr;
|
||||||
|
|
||||||
|
(void)num;
|
||||||
|
|
||||||
|
/* If it doesn't wedge right away, keep trying... */
|
||||||
|
while (1) {
|
||||||
|
lock_acquire(dl->lock2);
|
||||||
|
lock_acquire(dl->lock1);
|
||||||
|
kprintf("+");
|
||||||
|
lock_release(dl->lock1);
|
||||||
|
lock_release(dl->lock2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Command for doing an intentional deadlock.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
int
|
||||||
|
cmd_deadlock(int nargs, char **args)
|
||||||
|
{
|
||||||
|
struct deadlock dl;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
(void)nargs;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
|
dl.lock1 = lock_create("deadlock1");
|
||||||
|
if (dl.lock1 == NULL) {
|
||||||
|
kprintf("lock_create failed\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
dl.lock2 = lock_create("deadlock2");
|
||||||
|
if (dl.lock2 == NULL) {
|
||||||
|
lock_destroy(dl.lock1);
|
||||||
|
kprintf("lock_create failed\n");
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = thread_fork(args[0] /* thread name */,
|
||||||
|
NULL /* kernel thread */,
|
||||||
|
cmd_deadlockthread /* thread function */,
|
||||||
|
&dl /* thread arg */, 0 /* thread arg */);
|
||||||
|
if (result) {
|
||||||
|
kprintf("thread_fork failed: %s\n", strerror(result));
|
||||||
|
lock_release(dl.lock1);
|
||||||
|
lock_destroy(dl.lock2);
|
||||||
|
lock_destroy(dl.lock1);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If it doesn't wedge right away, keep trying... */
|
||||||
|
while (1) {
|
||||||
|
lock_acquire(dl.lock1);
|
||||||
|
lock_acquire(dl.lock2);
|
||||||
|
kprintf(".");
|
||||||
|
lock_release(dl.lock2);
|
||||||
|
lock_release(dl.lock1);
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Command for shutting down.
|
* Command for shutting down.
|
||||||
*/
|
*/
|
||||||
@ -441,7 +533,9 @@ static const char *opsmenu[] = {
|
|||||||
"[cd] Change directory ",
|
"[cd] Change directory ",
|
||||||
"[pwd] Print current directory ",
|
"[pwd] Print current directory ",
|
||||||
"[sync] Sync filesystems ",
|
"[sync] Sync filesystems ",
|
||||||
|
"[debug] Drop to debugger ",
|
||||||
"[panic] Intentional panic ",
|
"[panic] Intentional panic ",
|
||||||
|
"[deadlock] Intentional deadlock ",
|
||||||
"[q] Quit and shut down ",
|
"[q] Quit and shut down ",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -547,7 +641,9 @@ static struct {
|
|||||||
{ "cd", cmd_chdir },
|
{ "cd", cmd_chdir },
|
||||||
{ "pwd", cmd_pwd },
|
{ "pwd", cmd_pwd },
|
||||||
{ "sync", cmd_sync },
|
{ "sync", cmd_sync },
|
||||||
|
{ "debug", cmd_debug },
|
||||||
{ "panic", cmd_panic },
|
{ "panic", cmd_panic },
|
||||||
|
{ "deadlock", cmd_deadlock },
|
||||||
{ "q", cmd_quit },
|
{ "q", cmd_quit },
|
||||||
{ "exit", cmd_quit },
|
{ "exit", cmd_quit },
|
||||||
{ "halt", cmd_quit },
|
{ "halt", cmd_quit },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user