From owner-p4-projects@FreeBSD.ORG Fri Feb 22 02:37:22 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4413616A481; Fri, 22 Feb 2008 02:37:22 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CC4E416A4A1 for ; Fri, 22 Feb 2008 02:37:21 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BACB013C4CC for ; Fri, 22 Feb 2008 02:37:21 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m1M2bLtb026616 for ; Fri, 22 Feb 2008 02:37:21 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m1M2bL1j026613 for perforce@freebsd.org; Fri, 22 Feb 2008 02:37:21 GMT (envelope-from marcel@freebsd.org) Date: Fri, 22 Feb 2008 02:37:21 GMT Message-Id: <200802220237.m1M2bL1j026613@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 135935 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Feb 2008 02:37:22 -0000 http://perforce.freebsd.org/chv.cgi?CH=135935 Change 135935 by marcel@marcel_jnpr on 2008/02/22 02:36:54 Unify In this case the difference between Book E and AIM is just the name of the DAR/DEAR and DSISR/ESR registers. One can argue that this can be eliminated by using structure fields that match neither, but imply either. Euh... right... However, it's valuable to keep the fields the same as the register names, so in this case a simple union is enough to eliminate the #ifdefs. Affected files ... .. //depot/projects/e500/sys/powerpc/aim/machdep.c#8 edit .. //depot/projects/e500/sys/powerpc/aim/trap.c#7 edit .. //depot/projects/e500/sys/powerpc/aim/trap_subr.S#4 edit .. //depot/projects/e500/sys/powerpc/booke/interrupt.c#4 edit .. //depot/projects/e500/sys/powerpc/booke/machdep.c#10 edit .. //depot/projects/e500/sys/powerpc/booke/trap.c#4 edit .. //depot/projects/e500/sys/powerpc/booke/trap_subr.S#4 edit .. //depot/projects/e500/sys/powerpc/include/frame.h#3 edit .. //depot/projects/e500/sys/powerpc/powerpc/db_trace.c#4 edit .. //depot/projects/e500/sys/powerpc/powerpc/genassym.c#4 edit Differences ... ==== //depot/projects/e500/sys/powerpc/aim/machdep.c#8 (text+ko) ==== @@ -519,13 +519,13 @@ */ sf.sf_si = ksi->ksi_info; sf.sf_si.si_signo = sig; - sf.sf_si.si_addr = (void *) ((tf->exc == EXC_DSI) ? - tf->dar : tf->srr0); + sf.sf_si.si_addr = (void *)((tf->exc == EXC_DSI) ? + tf->cpu.aim.dar : tf->srr0); } else { /* Old FreeBSD-style arguments. */ tf->fixreg[FIRSTARG+1] = code; tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? - tf->dar : tf->srr0; + tf->cpu.aim.dar : tf->srr0; } mtx_unlock(&psp->ps_mtx); PROC_UNLOCK(p); ==== //depot/projects/e500/sys/powerpc/aim/trap.c#7 (text+ko) ==== @@ -292,7 +292,7 @@ trapname(vector)); switch (vector) { case EXC_DSI: - printf(" virtual address = 0x%x\n", frame->dar); + printf(" virtual address = 0x%x\n", frame->cpu.aim.dar); break; case EXC_ISI: printf(" virtual address = 0x%x\n", frame->srr0); @@ -510,8 +510,8 @@ eva = frame->srr0; ftype = VM_PROT_READ | VM_PROT_EXECUTE; } else { - eva = frame->dar; - if (frame->dsisr & DSISR_STORE) + eva = frame->cpu.aim.dar; + if (frame->cpu.aim.dsisr & DSISR_STORE) ftype = VM_PROT_WRITE; else ftype = VM_PROT_READ; @@ -643,12 +643,12 @@ int indicator, reg; double *fpr; - indicator = EXC_ALI_OPCODE_INDICATOR(frame->dsisr); + indicator = EXC_ALI_OPCODE_INDICATOR(frame->cpu.aim.dsisr); switch (indicator) { case EXC_ALI_LFD: case EXC_ALI_STFD: - reg = EXC_ALI_RST(frame->dsisr); + reg = EXC_ALI_RST(frame->cpu.aim.dsisr); fpr = &td->td_pcb->pcb_fpu.fpr[reg]; fputhread = PCPU_GET(fputhread); @@ -664,12 +664,12 @@ save_fpu(td); if (indicator == EXC_ALI_LFD) { - if (copyin((void *)frame->dar, fpr, + if (copyin((void *)frame->cpu.aim.dar, fpr, sizeof(double)) != 0) return -1; enable_fpu(td); } else { - if (copyout(fpr, (void *)frame->dar, + if (copyout(fpr, (void *)frame->cpu.aim.dar, sizeof(double)) != 0) return -1; } ==== //depot/projects/e500/sys/powerpc/aim/trap_subr.S#4 (text+ko) ==== @@ -151,8 +151,8 @@ stw %r3, FRAME_XER+8(1); /* save xer/ctr/exc */ \ stw %r4, FRAME_CTR+8(1); \ stw %r5, FRAME_EXC+8(1); \ - stw %r28,FRAME_DAR+8(1); \ - stw %r29,FRAME_DSISR+8(1); /* save dsisr/srr0/srr1 */ \ + stw %r28,FRAME_AIM_DAR+8(1); \ + stw %r29,FRAME_AIM_DSISR+8(1); /* save dsisr/srr0/srr1 */ \ stw %r30,FRAME_SRR0+8(1); \ stw %r31,FRAME_SRR1+8(1) ==== //depot/projects/e500/sys/powerpc/booke/interrupt.c#4 (text+ko) ==== @@ -82,8 +82,8 @@ printf(" exc = 0x%x\n", frame->exc); printf(" srr0 = 0x%08x\n", frame->srr0); printf(" srr1 = 0x%08x\n", frame->srr1); - printf(" dear = 0x%08x\n", frame->dear); - printf(" esr = 0x%08x\n", frame->esr); + printf(" dear = 0x%08x\n", frame->cpu.booke.dear); + printf(" esr = 0x%08x\n", frame->cpu.booke.esr); printf(" lr = 0x%08x\n", frame->lr); printf(" cr = 0x%08x\n", frame->cr); printf(" sp = 0x%08x\n", frame->fixreg[1]); ==== //depot/projects/e500/sys/powerpc/booke/machdep.c#10 (text+ko) ==== @@ -871,12 +871,12 @@ sf.sf_si = ksi->ksi_info; sf.sf_si.si_signo = sig; sf.sf_si.si_addr = (void *) ((tf->exc == EXC_DSI) ? - tf->dear : tf->srr0); + tf->cpu.booke.dear : tf->srr0); } else { /* Old FreeBSD-style arguments. */ tf->fixreg[FIRSTARG+1] = code; tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? - tf->dear : tf->srr0; + tf->cpu.booke.dear : tf->srr0; } mtx_unlock(&psp->ps_mtx); PROC_UNLOCK(p); ==== //depot/projects/e500/sys/powerpc/booke/trap.c#4 (text+ko) ==== @@ -222,7 +222,7 @@ break; #ifdef KDB case EXC_PGM: - if (frame->esr & ESR_PTR) + if (frame->cpu.booke.esr & ESR_PTR) kdb_trap(EXC_PGM, 0, frame); return; #endif @@ -274,7 +274,7 @@ switch (vector) { case EXC_DTMISS: case EXC_DSI: - va = frame->dear; + va = frame->cpu.booke.dear; break; case EXC_ITMISS: @@ -499,8 +499,8 @@ ftype = VM_PROT_READ | VM_PROT_EXECUTE; } else { - eva = frame->dear; - if (frame->esr & ESR_ST) + eva = frame->cpu.booke.dear; + if (frame->cpu.booke.esr & ESR_ST) ftype = VM_PROT_WRITE; else ftype = VM_PROT_READ; ==== //depot/projects/e500/sys/powerpc/booke/trap_subr.S#4 (text+ko) ==== @@ -198,8 +198,8 @@ /* save DEAR, ESR */ \ lwz %r28, (savearea+CPUSAVE_DEAR)(%r2); \ lwz %r29, (savearea+CPUSAVE_ESR)(%r2); \ - stw %r28, FRAME_DEAR+8(1); \ - stw %r29, FRAME_ESR+8(1); \ + stw %r28, FRAME_BOOKE_DEAR+8(1); \ + stw %r29, FRAME_BOOKE_ESR+8(1); \ /* save XER, CTR, exc number */ \ mfxer %r3; \ mfctr %r4; \ ==== //depot/projects/e500/sys/powerpc/include/frame.h#3 (text+ko) ==== @@ -50,20 +50,25 @@ struct trapframe { register_t fixreg[32]; register_t lr; - int cr; - int xer; + int cr; + int xer; register_t ctr; register_t srr0; register_t srr1; -#if defined(AIM) - register_t dar; /* dar & dsisr are only filled on a DSI trap */ - int dsisr; -#elif defined(E500) - register_t dear; - register_t esr; -#endif - int exc; + int exc; + union { + struct { + /* dar & dsisr are only filled on a DSI trap */ + register_t dar; + int dsisr; + } aim; + struct { + register_t dear; + register_t esr; + } booke; + } cpu; }; + /* * This is to ensure alignment of the stackpointer */ ==== //depot/projects/e500/sys/powerpc/powerpc/db_trace.c#4 (text+ko) ==== @@ -92,12 +92,13 @@ { "ctr", DB_OFFSET(ctr), db_frame }, { "cr", DB_OFFSET(cr), db_frame }, { "xer", DB_OFFSET(xer), db_frame }, +#ifdef AIM + { "dar", DB_OFFSET(cpu.aim.dar), db_frame }, + { "dsisr", DB_OFFSET(cpu.aim.dsisr), db_frame }, +#endif #ifdef E500 - { "dear", DB_OFFSET(dear), db_frame }, - { "esr", DB_OFFSET(esr), db_frame }, -#else - { "dar", DB_OFFSET(dar), db_frame }, - { "dsisr", DB_OFFSET(dsisr), db_frame }, + { "dear", DB_OFFSET(cpu.booke.dear), db_frame }, + { "esr", DB_OFFSET(cpu.booke.esr), db_frame }, #endif }; struct db_variable *db_eregs = db_regs + sizeof (db_regs)/sizeof (db_regs[0]); @@ -199,24 +200,15 @@ db_printf("%s ", tf->srr1 & PSL_PR ? "user" : "kernel"); switch (tf->exc) { case EXC_DSI: -#ifdef E500 + /* XXX take advantage of the union. */ db_printf("DSI %s trap @ %#x by ", - tf->esr & DSISR_STORE ? "write" : "read", - tf->dear); -#else - db_printf("DSI %s trap @ %#x by ", - tf->dsisr & DSISR_STORE ? "write" : "read", - tf->dar); -#endif + (tf->cpu.aim.dsisr & DSISR_STORE) ? "write" + : "read", tf->cpu.aim.dar); goto print_trap; case EXC_ALI: -#ifdef E500 - db_printf("ALI trap @ %#x (ESR %#x) ", - tf->dear, tf->esr); -#else - db_printf("ALI trap @ %#x (DSISR %#x) ", - tf->dar, tf->dsisr); -#endif + /* XXX take advantage of the union. */ + db_printf("ALI trap @ %#x (xSR %#x) ", + tf->cpu.aim.dar, tf->cpu.aim.dsisr); goto print_trap; case EXC_ISI: trapstr = "ISI"; break; case EXC_PGM: trapstr = "PGM"; break; @@ -257,13 +249,8 @@ } db_printf("%-10s r1=%#x cr=%#x xer=%#x ctr=%#x", "", tf->fixreg[1], tf->cr, tf->xer, tf->ctr); -#ifdef E500 if (tf->exc == EXC_DSI) - db_printf(" esr=%#x", tf->esr); -#else - if (tf->exc == EXC_DSI) - db_printf(" dsisr=%#x", tf->dsisr); -#endif + db_printf(" sr=%#x", tf->cpu.aim.dsisr); db_printf("\n"); stackframe = (db_addr_t) tf->fixreg[1]; if (kernel_only && (tf->srr1 & PSL_PR)) ==== //depot/projects/e500/sys/powerpc/powerpc/genassym.c#4 (text+ko) ==== @@ -160,14 +160,11 @@ ASSYM(FRAME_XER, offsetof(struct trapframe, xer)); ASSYM(FRAME_SRR0, offsetof(struct trapframe, srr0)); ASSYM(FRAME_SRR1, offsetof(struct trapframe, srr1)); -#if defined(AIM) -ASSYM(FRAME_DAR, offsetof(struct trapframe, dar)); -ASSYM(FRAME_DSISR, offsetof(struct trapframe, dsisr)); -#elif defined(E500) -ASSYM(FRAME_DEAR, offsetof(struct trapframe, dear)); -ASSYM(FRAME_ESR, offsetof(struct trapframe, esr)); -#endif ASSYM(FRAME_EXC, offsetof(struct trapframe, exc)); +ASSYM(FRAME_AIM_DAR, offsetof(struct trapframe, cpu.aim.dar)); +ASSYM(FRAME_AIM_DSISR, offsetof(struct trapframe, cpu.aim.dsisr)); +ASSYM(FRAME_BOOKE_DEAR, offsetof(struct trapframe, cpu.booke.dear)); +ASSYM(FRAME_BOOKE_ESR, offsetof(struct trapframe, cpu.booke.esr)); ASSYM(CF_FUNC, offsetof(struct callframe, cf_func)); ASSYM(CF_ARG0, offsetof(struct callframe, cf_arg0));