#include "fs.h"
#include "fsdata.h"
#include "fsdata.c"
+#include <io.h>
+#include <minilib.h>
+#include <paging.h>
+#include <output.h>
/*-----------------------------------------------------------------------------------*/
-void fill_regs(struct fs_file *file)
+void handle_regs(struct fs_file *file)
{
static unsigned char buf[2048];
file->data = buf;
- file->len = strlen(buf);
+ file->len = strlen(buf)-1;
+}
+
+void handle_backtrace(struct fs_file *file)
+{
+ static unsigned char buf[2048];
+ static unsigned char buf2[64];
+ int i = 10;
+ unsigned long *pebp, *peip;
+ unsigned long ebp;
+ unsigned long cr3;
+
+ strcpy(buf, "<html><head><title>Backtrace</title></head><body><tt><pre>");
+ ebp = *(unsigned long *)0xAFFE4;
+ cr3 = *(unsigned long *)0xAFFF8;
+
+ sprintf(buf2, "0x%08x, from\n", *(unsigned long*)0xAFFF0);
+ strcat(buf, buf2);
+
+ /* I never thought I'd do this again. */
+ while ((peip = demap(cr3, ebp+4)) != 0x0 && i--)
+ {
+ sprintf(buf2, "0x%08x, from\n", *peip);
+ strcat(buf, buf2);
+ pebp = demap(cr3, ebp);
+ if (!pebp)
+ {
+ strcat(buf, "<unreadable %ebp>\n");
+ break;
+ }
+ if (ebp >= *pebp && *pebp)
+ {
+ strcat(buf, "<recursive %ebp>\n");
+ break;
+ }
+ ebp = *pebp;
+ }
+ if (i == -1)
+ strcat(buf, "...\n");
+ else
+ strcat(buf, "<root>");
+ strcat(buf, "</pre></tt></body></html>");
+
+ file->data = buf;
+ file->len = strlen(buf)-1;
+}
+
+void handle_reboot(struct fs_file *file)
+{
+ outb(0xCF9, 0x4);
+ file->data = "So long!";
+ file->len = 8;
}
/* /registers.html is CGI */
if (!strcmp(name, "/registers.html"))
{
- fill_regs(file);
+ handle_regs(file);
+ return 1;
+ }
+ if (!strcmp(name, "/backtrace.html"))
+ {
+ handle_backtrace(file);
+ return 1;
+ }
+ if (!strcmp(name, "/reboot"))
+ {
+ handle_reboot(file);
return 1;
}
f = f->next) {
if (!strcmp(name, (const char*)f->name)) {
file->data = f->data;
- file->len = f->len;
+ file->len = f->len-1;
return 1;
}
}