diff --git a/src/sys/i386/trap.c b/src/sys/i386/trap.c index 048e82d..57f375a 100644 --- a/src/sys/i386/trap.c +++ b/src/sys/i386/trap.c @@ -32,6 +32,59 @@ #include #include +#define FIRST_TSS_ENTRY 6 +#define VM_MASK 0x00020000 + +#define store_TR(n) \ +__asm__("str %%ax\n\t" \ + "subl %2,%%eax\n\t" \ + "shrl $4,%%eax" \ + :"=a" (n) \ + :"0" (0),"i" (FIRST_TSS_ENTRY<<3)) + +#define get_seg_long(seg,addr) ({ \ +register unsigned long __res; \ +__asm__("push %%fs;mov %%ax,%%fs;movl %%fs:%2,%%eax;pop %%fs" \ + :"=a" (__res):"0" (seg),"m" (*(addr))); \ +__res;}) + +#define get_seg_byte(seg,addr) ({ \ +register char __res; \ +__asm__("push %%fs;mov %%ax,%%fs;movb %%fs:%2,%%al;pop %%fs" \ + :"=a" (__res):"0" (seg),"m" (*(addr))); \ +__res;}) + +void die_if_kernel(char *str, struct trapframe *regs, long err) { + int i; + unsigned long esp; + unsigned short ss; + + esp = (unsigned long) ®s->tf_esp; + //ss = KERNEL_DS; + ss = 0x10; + if ((regs->tf_eflags & VM_MASK) || (3 & regs->tf_cs) == 3) + return; + if (regs->tf_cs & 3) { + esp = regs->tf_esp; + ss = regs->tf_ss; + } + + kprintf("%s: %04lx\n", str, err & 0xffff); + kprintf("EIP: %04x:%08lx\nEFLAGS: %08lx\n", 0xffff & regs->tf_cs,regs->tf_eip,regs->tf_eflags); + kprintf("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n", regs->tf_eax, regs->tf_ebx, regs->tf_ecx, regs->tf_edx); + kprintf("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n", regs->tf_esi, regs->tf_edi, regs->tf_ebp, esp); + kprintf("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", regs->tf_ds, regs->tf_es, regs->tf_fs, regs->tf_gs, ss); + store_TR(i); + //kprintf("Pid: %d, process nr: %d (%s)\nStack: ", _current->id, 0xffff & i, _current->comm); + kprintf("Pid: %d, process nr: %d ()\nStack: ", _current->id, 0xffff & i); + for(i=0;i<5;i++) + kprintf("%08lx ", get_seg_long(ss,(i+(unsigned long *)esp))); + kprintf("\nCode: "); + for(i=0;i<20;i++) + kprintf("%02x ",0xff & get_seg_byte(regs->tf_cs,(i+(char *)regs->tf_eip))); + kprintf("\n"); +} + void trap( struct trapframe *frame ) { u_int trap_code; u_int cr2 = 0; @@ -41,10 +94,14 @@ trap_code = frame->tf_trapno; if ( (frame->tf_eflags & PSL_I) == 0 ) { - if (SEL_GET_PL(frame->tf_cs) == SEL_PL_USER || (frame->tf_eflags & PSL_VM)) + if (SEL_GET_PL(frame->tf_cs) == SEL_PL_USER || (frame->tf_eflags & PSL_VM)) { + die_if_kernel("TEST", frame, 0x100); kpanic( "INT OFF! USER" ); - else +} + else { + die_if_kernel("TEST", frame, 0x100); kpanic( "INT OFF! KERN[0x%X]", trap_code ); +} } kprintf("trap_code: %i(0x%X), EIP: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip); diff --git a/src/sys/include/sys/trap.h b/src/sys/include/sys/trap.h index 6e6bdb9..262fa7f 100644 --- a/src/sys/include/sys/trap.h +++ b/src/sys/include/sys/trap.h @@ -33,6 +33,7 @@ #include struct trapframe { + int tf_gs; int tf_fs; int tf_es; int tf_ds; diff --git a/src/sys/net/core/mem.c b/src/sys/net/core/mem.c index 353c9d7..7aa3eb9 100644 --- a/src/sys/net/core/mem.c +++ b/src/sys/net/core/mem.c @@ -627,6 +627,7 @@ } /* protect the heap from concurrent access */ +kprintf("SML: [0x%i]"); sys_mutex_lock(&mem_mutex); LWIP_MEM_ALLOC_PROTECT(); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT diff --git a/src/sys/net/net/sys_arch.c b/src/sys/net/net/sys_arch.c index 1f6606e..a5b148c 100644 --- a/src/sys/net/net/sys_arch.c +++ b/src/sys/net/net/sys_arch.c @@ -50,6 +50,7 @@ /* Signal semaphore */ void sys_sem_signal(sys_sem_t *sem) { + kprintf("L1"); ubthread_mutex_lock(&(sem->mutex)); sem->signaled++; @@ -63,6 +64,7 @@ uint32_t sys_arch_sem_wait(struct sys_sem *sem, uint32_t timeout) { uint32_t time = sys_now(); + kprintf("L2"); ubthread_mutex_lock(&(sem->mutex)); while (sem->signaled <= 0) { @@ -78,7 +80,9 @@ } } sem->signaled--; + kprintf("L3"); ubthread_mutex_lock(&(sem->mutex)); + kprintf("L3.1"); return (sys_now() - time); } @@ -103,6 +107,7 @@ } void sys_mutex_lock(sys_mutex_t *mutex) { + kprintf("L4"); ubthread_mutex_lock(&(mutex->mutex)) ; } @@ -138,6 +143,7 @@ void sys_mbox_post(sys_mbox_t * mbox, void *msg) { sys_arch_sem_wait(&(mbox->empty), 0); + kprintf("L5"); ubthread_mutex_lock(&mbox->lock); mbox->queue[mbox->head] = msg; @@ -156,6 +162,7 @@ if (res == ERR_NOT_READY) return ERR_TIMEOUT; + kprintf("L6"); ubthread_mutex_lock(&mbox->lock); mbox->queue[mbox->head] = msg; @@ -184,6 +191,7 @@ return SYS_ARCH_TIMEOUT; //timeout ? SYS_ARCH_TIMEOUT : 0; } + kprintf("L7"); ubthread_mutex_lock(&mbox->lock); *msg = mbox->queue[mbox->tail]; @@ -209,6 +217,7 @@ return SYS_MBOX_EMPTY; } + kprintf("L8"); ubthread_mutex_lock(&mbox->lock); *msg = mbox->queue[mbox->tail]; diff --git a/src/sys/vmm/page_fault.S b/src/sys/vmm/page_fault.S index 2c02c5a..8a7607d 100644 --- a/src/sys/vmm/page_fault.S +++ b/src/sys/vmm/page_fault.S @@ -72,6 +72,7 @@ push %ds push %es push %fs +push %gs mov $0x10,%eax mov %eax,%ds mov %eax,%es @@ -106,6 +107,7 @@ hlt _popFS: +pop %gs pop %fs pop %es pop %ds