Merge commit '973c11b9c3cdde88fe6ca0ef2c5af56a8c49e014' into amd64
authorJordan Gordeev <jgordeev@dir.bg>
Mon, 6 Jul 2009 14:54:20 +0000 (17:54 +0300)
committerJordan Gordeev <jgordeev@dir.bg>
Mon, 6 Jul 2009 14:54:20 +0000 (17:54 +0300)
1  2 
sys/platform/pc64/amd64/trap.c
sys/platform/pc64/amd64/vm_machdep.c

@@@ -75,7 -75,6 +75,7 @@@
  #include <vm/vm_param.h>
  #include <machine/cpu.h>
  #include <machine/pcb.h>
 +#include <machine/smp.h>
  #include <machine/thread.h>
  #include <machine/vmparam.h>
  #include <machine/md_var.h>
  #endif
  
  extern void trap(struct trapframe *frame);
- extern void syscall2(struct trapframe *frame);
  
  static int trap_pfault(struct trapframe *, int);
  static void trap_fatal(struct trapframe *, vm_offset_t);
  void dblfault_handler(struct trapframe *frame);
  
 -#define PCPU_GET(member) ((mycpu)->gd_##member)
 -#define PCPU_INC(member) ((mycpu)->gd_##member)++
 -
  #define MAX_TRAP_MSG          30
  static char *trap_msg[] = {
        "",                                     /*  0 unused */
@@@ -275,7 -276,7 +274,7 @@@ static __inline voi
  userexit(struct lwp *lp)
  {
        struct thread *td = lp->lwp_thread;
-       globaldata_t gd = td->td_gd;
+ /*    globaldata_t gd = td->td_gd;*/
  
        /*
         * Handle stop requests at kernel priority.  Any requests queued
@@@ -356,7 -357,7 +355,7 @@@ trap(struct trapframe *frame
  
        p = td->td_proc;
  
 -#ifndef JG
 +#ifdef JG
        kprintf0("TRAP ");
        kprintf0("\"%s\" type=%ld\n",
                trap_msg[frame->tf_trapno], frame->tf_trapno);
                        MAKEMPSAFE(have_mplock);
                        i = trap_pfault(frame, TRUE);
                        if (frame->tf_rip == 0)
-                               kprintf("T_PAGEFLT: Warning %rip == 0!\n");
+                               kprintf("T_PAGEFLT: Warning %%rip == 0!\n");
                        if (i == -1)
                                goto out;
                        if (i == 0)
                         * selectors and pointers when the user changes
                         * them.
                         */
 -                      kprintf0("trap.c line %d\n", __LINE__);
 +                      kprintf("trap.c line %d\n", __LINE__);
                        if (mycpu->gd_intr_nesting_level == 0) {
                                if (td->td_pcb->pcb_onfault) {
                                        frame->tf_rip = (register_t)
@@@ -876,9 -877,8 +875,9 @@@ nogo
         * NOTE: on amd64 we have a tf_addr field in the trapframe, no
         * kludge is needed to pass the fault address to signal handlers.
         */
 -      kprintf("seg-fault accessing address %p ip=%p\n",
 -              (void *)va, (void *)frame->tf_rip);
 +      struct proc *p = td->td_proc;
 +      kprintf("seg-fault accessing address %p rip=%p pid=%d p_comm=%s\n",
-               va, frame->tf_rip, p->p_pid, p->p_comm);
++              (void *)va, (void *)frame->tf_rip, p->p_pid, p->p_comm);
        /* Debugger("seg-fault"); */
  
        return((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV);
@@@ -904,10 -904,9 +903,10 @@@ trap_fatal(struct trapframe *frame, vm_
        kprintf("\n\nFatal trap %d: %s while in %s mode\n", type, msg,
            ISPL(frame->tf_cs) == SEL_UPL ? "user" : "kernel");
  #ifdef SMP
 -      /* two separate prints in case of a trap on an unmapped page */
 -      kprintf("cpuid = %d; ", PCPU_GET(cpuid));
 -      kprintf("apic id = %02x\n", PCPU_GET(apic_id));
 +      /* three separate prints in case of a trap on an unmapped page */
 +      kprintf("mp_lock = %08x; ", mp_lock);
 +      kprintf("cpuid = %d; ", mycpu->gd_cpuid);
 +      kprintf("lapic->id = %08x\n", lapic->id);
  #endif
        if (type == T_PAGEFLT) {
                kprintf("fault virtual address  = 0x%lx\n", eva);
@@@ -981,10 -980,9 +980,10 @@@ dblfault_handler(struct trapframe *fram
        kprintf("rsp = 0x%lx\n", frame->tf_rsp);
        kprintf("rbp = 0x%lx\n", frame->tf_rbp);
  #ifdef SMP
 -      /* two separate prints in case of a trap on an unmapped page */
 -      kprintf("cpuid = %d; ", PCPU_GET(cpuid));
 -      kprintf("apic id = %02x\n", PCPU_GET(apic_id));
 +      /* three separate prints in case of a trap on an unmapped page */
 +      kprintf("mp_lock = %08x; ", mp_lock);
 +      kprintf("cpuid = %d; ", mycpu->gd_cpuid);
 +      kprintf("lapic->id = %08x\n", lapic->id);
  #endif
        panic("double fault");
  }
@@@ -1026,9 -1024,11 +1025,9 @@@ syscall2(struct trapframe *frame
        int reg, regcnt;
        union sysunion args;
        register_t *argsdst;
 -      kprintf0("SYSCALL rip = %016llx\n", frame->tf_rip);
  
 -      PCPU_INC(cnt.v_syscall);
 +      mycpu->gd_cnt.v_syscall++;
  
 -      kprintf0("\033[31mSYSCALL %ld\033[39m\n", frame->tf_rax);
  #ifdef DIAGNOSTIC
        if (ISPL(frame->tf_cs) != SEL_UPL) {
                get_mplock();
                frame->tf_eax);
  
  #ifdef SMP
 -      KASSERT(td->td_mpcount == 0, ("badmpcount syscall2 from %p", (void *)frame->tf_eip));
 +      KASSERT(td->td_mpcount == 0, ("badmpcount syscall2 from %p", (void *)frame->tf_rip));
        if (syscall_mpsafe == 0)
                MAKEMPSAFE(have_mplock);
  #endif
@@@ -1183,6 -1183,7 +1182,6 @@@ out
                lp = curthread->td_lwp;
                frame->tf_rax = args.sysmsg_fds[0];
                frame->tf_rdx = args.sysmsg_fds[1];
 -              kprintf0("RESULT %lld %lld\n", frame->tf_rax, frame->tf_rdx);
                frame->tf_rflags &= ~PSL_C;
                break;
        case ERESTART:
                 */
                frame->tf_rip -= frame->tf_err;
                frame->tf_r10 = frame->tf_rcx;
 -              td->td_pcb->pcb_flags |= PCB_FULLCTX;
                break;
        case EJUSTRETURN:
                break;
@@@ -1207,6 -1209,7 +1206,6 @@@ bad
                        else
                                error = p->p_sysent->sv_errtbl[error];
                }
 -              kprintf0("ERROR %d\n", error);
                frame->tf_rax = error;
                frame->tf_rflags |= PSL_C;
                break;
         * Release the MP lock if we had to get it
         */
        KASSERT(td->td_mpcount == have_mplock, 
 -              ("badmpcount syscall2/end from %p", (void *)frame->tf_eip));
 +              ("badmpcount syscall2/end from %p", (void *)frame->tf_rip));
        if (have_mplock)
                rel_mplock();
  #endif
  void
  fork_return(struct lwp *lp, struct trapframe *frame)
  {
 -      kprintf0("fork return\n");
        frame->tf_rax = 0;              /* Child returns zero */
        frame->tf_rflags &= ~PSL_C;     /* success */
        frame->tf_rdx = 1;
  void
  generic_lwp_return(struct lwp *lp, struct trapframe *frame)
  {
 -      kprintf0("generic_lwp_return\n");
        struct proc *p = lp->lwp_proc;
  
        /*
@@@ -203,7 -203,7 +203,7 @@@ cpu_prepare_lwp(struct lwp *lp, struct 
        regs->tf_rip = (long)params->func;
        regs->tf_rsp = (long)params->stack;
        /* Set up argument for function call */
-       regs->tf_rdi = params->arg; /* JG Can this be in userspace addresses? */
 -      regs->tf_rdi = (long)params->arg;
++      regs->tf_rdi = (long)params->arg; /* JG Can this be in userspace addresses? */
        /*
         * Set up fake return address.  As the lwp function may never return,
         * we simply copy out a NULL pointer and force the lwp to receive