aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2003-10-06 18:17:03 +0000
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2003-10-06 18:17:03 +0000
commitd5d4e6ed04a28dd9d7ba2b15f187214f2bd36ce1 (patch)
treec45cdbbf259a9ed92485613a455e1c3df6f6c545 /extras
parent550718896b662801261d4679543ce2d5a8fa2bfb (diff)
parent29efcc54240ec2669b950798c8fee1ecf65813d4 (diff)
downloadxen-d5d4e6ed04a28dd9d7ba2b15f187214f2bd36ce1.tar.gz
xen-d5d4e6ed04a28dd9d7ba2b15f187214f2bd36ce1.tar.bz2
xen-d5d4e6ed04a28dd9d7ba2b15f187214f2bd36ce1.zip
bitkeeper revision 1.485 (3f81b19fL5Y4lVlRaEpJI9r_IZlDcw)
Merge labyrinth.cl.cam.ac.uk:/auto/groups/xeno/users/rn212/xeno.mini into labyrinth.cl.cam.ac.uk:/auto/anfs/scratch/labyrinth/iap10/xeno-clone/xeno.bk
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/h/os.h4
-rw-r--r--extras/mini-os/kernel.c14
-rw-r--r--extras/mini-os/traps.c63
3 files changed, 61 insertions, 20 deletions
diff --git a/extras/mini-os/h/os.h b/extras/mini-os/h/os.h
index 2645bea954..9578b8f5b4 100644
--- a/extras/mini-os/h/os.h
+++ b/extras/mini-os/h/os.h
@@ -63,6 +63,10 @@ struct pt_regs {
int xss;
};
+/* some function prototypes */
+void trap_init(void);
+void dump_regs(struct pt_regs *regs);
+
/*
* STI/CLI equivalents. These basically set and clear the virtual
diff --git a/extras/mini-os/kernel.c b/extras/mini-os/kernel.c
index 6486fac119..196d8612c3 100644
--- a/extras/mini-os/kernel.c
+++ b/extras/mini-os/kernel.c
@@ -36,10 +36,10 @@ char stack[8192];
void hypervisor_callback(void);
void failsafe_callback(void);
-/* default exit event handler */
+/* default event handlers */
static void exit_handler(int ev, struct pt_regs *regs);
+static void debug_handler(int ev, struct pt_regs *regs);
-extern void trap_init(void);
/*
* INITIAL C ENTRY POINT.
@@ -100,6 +100,10 @@ void start_kernel(start_info_t *si)
enable_ev_action(EV_DIE);
enable_hypervisor_event(EV_DIE);
+ add_ev_action(EV_DEBUG, &debug_handler);
+ enable_ev_action(EV_DEBUG);
+ enable_hypervisor_event(EV_DEBUG);
+
/* init time and timers */
init_time();
@@ -124,3 +128,9 @@ static void exit_handler(int ev, struct pt_regs *regs) {
do_exit();
}
+/*
+ * a debug handler to print out some state from the guest
+ */
+static void debug_handler(int ev, struct pt_regs *regs) {
+ dump_regs(regs);
+}
diff --git a/extras/mini-os/traps.c b/extras/mini-os/traps.c
index 6352559c0f..8dec10c581 100644
--- a/extras/mini-os/traps.c
+++ b/extras/mini-os/traps.c
@@ -1,6 +1,7 @@
#include <os.h>
#include <hypervisor.h>
+#include <mm.h>
#include <lib.h>
/*
@@ -31,6 +32,7 @@ void machine_check(void);
extern void do_exit(void);
int kstack_depth_to_print = 24;
+#define THREAD_SIZE (2*PAGE_SIZE)
static inline int kernel_text_address(unsigned long addr)
{
@@ -57,24 +59,49 @@ void show_trace(unsigned long * stack)
printk("\n");
}
-void dump_regs(struct pt_regs *regs) {
- printk("Register dump:");
- printk("ebx: \t 0x%lx", regs->ebx);
- printk("ecx: \t 0x%lx", regs->ecx);
- printk("edx: \t 0x%lx", regs->edx);
- printk("esi: \t 0x%lx", regs->esi);
- printk("edi: \t 0x%lx", regs->edi);
- printk("ebp: \t 0x%lx", regs->ebp);
- printk("eax: \t 0x%lx", regs->eax);
- printk("xds: \t 0x%x", regs->xds);
- printk("xes: \t 0x%x", regs->xes);
- printk("orig_eax: \t 0x%lx", regs->orig_eax);
- printk("eip: \t 0x%lx", regs->eip);
- printk("xcs: \t 0x%x", regs->xcs);
- printk("eflags: \t 0x%lx", regs->eflags);
- printk("esp: \t 0x%lx", regs->esp);
- printk("xss: \t 0x%x", regs->xss);
-};
+void show_stack(unsigned long * esp)
+{
+ unsigned long *stack;
+ int i;
+
+ if(esp==NULL)
+ esp=(unsigned long*)&esp;
+
+ stack = esp;
+ for(i=0; i < kstack_depth_to_print; i++) {
+ if (((long) stack & (THREAD_SIZE-1)) == 0)
+ break;
+ printk("%08lx ", *stack++);
+ }
+ printk("\n");
+ show_trace(esp);
+}
+
+void dump_regs(struct pt_regs *regs)
+{
+ int in_kernel = 1;
+ unsigned long esp;
+ unsigned short ss;
+
+ esp = (unsigned long) (&regs->esp);
+ ss = __KERNEL_DS;
+ if (regs->xcs & 2) {
+ in_kernel = 0;
+ esp = regs->esp;
+ ss = regs->xss & 0xffff;
+ }
+ printf("EIP: %04x:[<%08lx>]\n",
+ 0xffff & regs->xcs, regs->eip);
+ printf("EFLAGS: %08lx\n",regs->eflags);
+ printf("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
+ regs->eax, regs->ebx, regs->ecx, regs->edx);
+ printf("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n",
+ regs->esi, regs->edi, regs->ebp, esp);
+ printf("ds: %04x es: %04x ss: %04x\n",
+ regs->xds & 0xffff, regs->xes & 0xffff, ss);
+ printf("\n");
+}
+
static inline void dump_code(unsigned eip)
{