From owner-p4-projects@FreeBSD.ORG Wed Apr 26 05:43:41 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B4C8916A4D3; Wed, 26 Apr 2006 05:43:41 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1C24C16A494 for ; Wed, 26 Apr 2006 05:43:40 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id A7AC743D4C for ; Wed, 26 Apr 2006 05:43:39 +0000 (GMT) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id k3Q5hcc5082145 for ; Wed, 26 Apr 2006 05:43:38 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id k3Q5hcLi082124 for perforce@freebsd.org; Wed, 26 Apr 2006 05:43:38 GMT (envelope-from kmacy@freebsd.org) Date: Wed, 26 Apr 2006 05:43:38 GMT Message-Id: <200604260543.k3Q5hcLi082124@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 96139 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: Wed, 26 Apr 2006 05:43:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=96139 Change 96139 by kmacy@kmacy_storage:sun4v_rwbuf on 2006/04/26 05:42:52 cleanup enable fp on trap context switch fp registers set pil according to saved_pil critical_enter -> spinlock_enter, to avoid nested interrupts for now don't set kernel flag on interrupts check trap type register for demap explicitly reload pcpu register when returning from kernel trap to avoid value for another cpu Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#42 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#42 (text+ko) ==== @@ -64,10 +64,7 @@ #define PCB_REG %g6 - - - /* * Atomically set the reference bit in a tte. */ @@ -241,12 +238,7 @@ .macro tl1_split -#if 0 - rdpr %wstate, %g1 - wrpr %g1, WSTATE_NESTED, %wstate - save %sp, -(CCFSZ + TF_SIZEOF), %sp -#endif - MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT + call kdb_backtrace .endm .macro tl1_setup type @@ -510,13 +502,11 @@ .endm .macro spill_mixed - MAGIC_TRAP_ON MAGIC_EXIT .align 128 .endm .macro fill_mixed - MAGIC_TRAP_ON MAGIC_EXIT .align 128 .endm @@ -528,11 +518,11 @@ .macro tl0_pil_entry level, mask #if 1 - wrpr %g0, 1, %tl wrpr %g0, 1, %gl set \mask, %g1 clr %g2 clr %g3 + wr %g1, 0, %clear_softint ba %xcc, tl0_intr mov \level, %g4 #else @@ -597,6 +587,12 @@ nop .align 32 .endm + + .macro tl0_fp_enable + wr %g0, FPRS_FEF, %fprs + retry + .align 32 + .endm ENTRY(tl0_fp_restore) GET_PCB(PCB_REG) @@ -642,7 +638,7 @@ tl0_gen T_PRIVILEGED_OPCODE ! 0x11 tl0_reserved 14 ! 0x12-0x1f tl0_fp_disabled: - tl0_gen T_FP_DISABLED ! 0x20 + tl0_fp_enable ! 0x20 tl0_fp_ieee: tl0_gen T_FP_EXCEPTION_IEEE_754 ! 0x21 tl0_fp_other: @@ -924,18 +920,16 @@ wrpr %g0, PSTATE_KERNEL, %pstate ! enable ints brnz %o1, common_utrap - nop - call critical_enter + nop + call spinlock_enter nop - wrpr %g0, 0, %pil jmpl %l3, %o7 ! call trap handler mov %l7, %o0 - call critical_exit + call spinlock_exit nop b user_rtt nop common_utrap: - wrpr %g0, 0, %pil jmpl %l3, %o7 ! call trap handler mov %l7, %o0 @@ -947,15 +941,16 @@ GET_PCPU_SCRATCH ! pil handling needs to be re-visited wrpr %g0, PIL_TICK, %pil - ldx [PCPU(CURTHREAD)], %l0 - lduw [%l0 + TD_FLAGS], %l1 + ldx [PCPU(CURTHREAD)], %l4 + lduw [%l4 + TD_FLAGS], %l1 + ldx [%l4 + TD_MD + MD_SAVED_PIL], %l0 set TDF_ASTPENDING | TDF_NEEDRESCHED, %l2 and %l1, %l2, %l1 brz,a,pt %l1, 1f nop ! handle AST and retry return - wrpr %g0, 0, %pil + wrpr %g0, %l0, %pil call ast mov %l7, %o0 ba,a,pt %xcc, user_rtt @@ -966,7 +961,7 @@ ldx [%g6 + PCB_NSAVED], %l1 brz,a,pt %l1, 2f nop - wrpr %g0, 0, %pil + wrpr %g0, %l0, %pil mov T_SPILL, %o1 call trap mov %l7, %o0 @@ -996,14 +991,22 @@ ! ! setup trap regs ! + ldx [%l7 + TF_TPC], %g1 ldx [%l7 + TF_TNPC], %g2 ldx [%l7 + TF_TSTATE], %l0 - andn %l0, TSTATE_CWP_MASK, %g6 + ldx [%l7 + TF_FPRS], %l1 wrpr %g1, %tpc wrpr %g2, %tnpc - ! + andn %l0, TSTATE_CWP_MASK, %g6 + + wr %g0, FPRS_FEF, %fprs + ldx [%l7 + TF_FSR], %fsr + wr %l1, 0, %fprs + + + ! ! switch "other" windows back to "normal" windows and ! restore to window we originally trapped in ! @@ -1095,11 +1098,11 @@ brnz %o1, common_ktrap nop - call critical_enter + call spinlock_enter nop jmpl %l3, %o7 ! call trap handler mov %l7, %o0 - call critical_exit + call spinlock_exit nop b common_rtt nop @@ -1117,7 +1120,8 @@ RESTORE_GLOBALS(%l7) - + GET_PCPU_SCRATCH ! we may have changed cpus + ! switch to global set 1 wrpr %g0, 1, %gl RESTORE_OUTS(%l7) @@ -1142,12 +1146,20 @@ ! wrpr %g0, 1, %tl + ldx [%l7 + TF_TSTATE], %l0 ldx [%l7 + TF_TPC], %g1 ldx [%l7 + TF_TNPC], %g2 - ldx [%l7 + TF_TSTATE], %l0 + ldx [%l7 + TF_FPRS], %l1 + andn %l0, TSTATE_CWP_MASK, %g6 wrpr %g1, %tpc wrpr %g2, %tnpc + + + wr %g0, FPRS_FEF, %fprs + ldx [%l7 + TF_FSR], %fsr + wr %l1, 0, %fprs + rdpr %canrestore, %g1 brnz %g1, 3f nop ! can use restore directly @@ -1167,17 +1179,19 @@ retry END(krtt) END(ktl0) - - ! temporaries: %g3-%g5 - ! - ! + + + ENTRY(tl0_ktrap) GET_PCPU_SCRATCH set ktl0, %g6 + save %sp, -(CCFSZ + TF_SIZEOF), %sp - + + brz %g2, 2f + nop or %g2, T_KERNEL, %g2 - +2: ! if the kwbuf is full we need to save to the stack now ld [PCPU_REG + PC_KWBUF_FULL], %o0 brz,pt %o0, 1f @@ -1195,12 +1209,11 @@ ! %g2=level %g1=mask ENTRY(tl0_intr) - wr %g1, 0, %clear_softint SET(intr_handlers, %g7, %g6) sllx %g4, IH_SHIFT, %g7 ldx [%g6 + %g7], %g1 ! pointer to interrupt handler - rdpr %pil, %g5 ! interrupted pil - wrpr %g4, 0, %pil + rdpr %pil, %g5 +! wrpr %g4, 0, %pil mov %g5, %g4 ! %g1 pc of trap handler @@ -1223,7 +1236,6 @@ be,pn %xcc, tl1_trap nop -! MAGIC_TRAP_OFF rdpr %tstate, %g5 btst TSTATE_PRIV, %g5 and %g5, TSTATE_CWP_MASK, %g6 @@ -1273,8 +1285,18 @@ rdpr %tnpc, %l1 rdpr %tstate, %l2 stx %l0, [%l7 + TF_TPC] + rd %fprs, %l0 stx %l1, [%l7 + TF_TNPC] stx %l2, [%l7 + TF_TSTATE] + stx %l0, [%l7 + TF_FPRS] + + /* + * According to the sparc64 port fp must me enabled + * before reading %fsr + */ + wr %g0, FPRS_FEF, %fprs + stx %fsr, [%l7 + TF_FSR] + wr %g0, 0, %fprs ! ! setup pil ! @@ -1285,8 +1307,7 @@ cmp %g4, %l0 bge,pt %xcc, 0f nop - MAGIC_TRAP_ON - MAGIC_TRAP_ON + call panic MAGIC_EXIT 0: #endif @@ -1294,7 +1315,6 @@ wrpr %g0, %g4, %pil 1: wrpr %g0, %g6, %tnpc - MAGIC_TRAP_OFF rdpr %cwp, %l0 set TSTATE_KERNEL, %l1 wrpr %l1, %l0, %tstate @@ -1383,6 +1403,7 @@ ! %g1 == abs index %g2 == THE pointer %g3 == flags ! %g4 <- tag %g5 <- data ! %g6 == search tag %g7 == fault addr + tsb_miss_lookup_0: ldda [%g2]%asi, %g4 cmp %g4, %g0 ! entry tag == 0 ? @@ -1425,15 +1446,7 @@ 5: ! not found ! we need to jump to tl0_trap to drop us back down to tl0 ! and take us to trap(...) to service the fault -#ifdef PMAP_DEBUG -#if 0 - srlx %g6, TTARGET_CTX_SHIFT, %g4 ! recover context - brnz %g4, 16f - nop - MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT -#endif -16: -#endif + srlx %g7, 13, %g7 ! slow painful way of masking off sllx %g7, 13, %g7 ! bottom bits without using a reg ! XXX FIXME @@ -1504,19 +1517,22 @@ cmp %g2, %g4 bne,pt %xcc, 10f nop + call kdb_backtrace MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing ! is storing same data 10: mov %g1, %g2 #endif + stxa %g0, [%g2 + %g7]ASI_REAL ! invalidate data stxa %g4, [%g2]ASI_REAL ! store tag stxa %g5, [%g2 + %g7]ASI_REAL ! store data ! XXX the following intstruction should be replaced with a ! retry on HVs that do auto-demap ontario_demap_errata_patch: - andcc %g5, VTD_W, %g0 ! if write-enabled we know it was a prot fault - bnz,pn %xcc, demap_begin + rdpr %tt, %g5 + cmp %g5, T_DATA_PROTECTION + beq,pn %xcc, demap_begin nop retry demap_begin: @@ -1555,7 +1571,8 @@ /* * Programming error */ -ENTRY(unsupported_fault_trap) +ENTRY(unsupported_fault_trap) + call kdb_backtrace MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT END(unsupported_fault_trap) @@ -1585,7 +1602,6 @@ #define TRAP_ENTRY_SHIFT 5 #define TRAP_ENTRY_MASK 0x1ff ENTRY(tl1_trap) - ! MAGIC_TRAP_ON ! assume no tl1 handler rdpr %tpc, %g7