From owner-p4-projects@FreeBSD.ORG Fri Mar 17 07:32:45 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 5DE6316A423; Fri, 17 Mar 2006 07:32:45 +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 37EC116A41F for ; Fri, 17 Mar 2006 07:32:45 +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 E7F3E43D46 for ; Fri, 17 Mar 2006 07:32:44 +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 k2H7WiMg049390 for ; Fri, 17 Mar 2006 07:32:44 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id k2H7Wi3H049387 for perforce@freebsd.org; Fri, 17 Mar 2006 07:32:44 GMT (envelope-from kmacy@freebsd.org) Date: Fri, 17 Mar 2006 07:32:44 GMT Message-Id: <200603170732.k2H7Wi3H049387@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 93438 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, 17 Mar 2006 07:32:45 -0000 http://perforce.freebsd.org/chv.cgi?CH=93438 Change 93438 by kmacy@kmacy_storage:sun4v_work on 2006/03/17 07:32:12 switch TSB miss handler over to using real addresses for TL > 1 Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 edit .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#33 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#8 (text+ko) ==== @@ -135,14 +135,32 @@ mov SCRATCH_REG_PCPU, PCPU_REG; \ ldxa [%g0 + PCPU_REG]ASI_SCRATCHPAD, PCPU_REG; -#define GET_HASH_SCRATCH_USER(reg) \ +#define GET_HASH_SCRATCH_USER(reg) \ mov SCRATCH_REG_HASH_USER, reg; \ ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; -#define GET_HASH_SCRATCH_KERNEL(reg) \ +#define GET_HASH_SCRATCH_KERNEL(reg) \ mov SCRATCH_REG_HASH_KERNEL, reg; \ ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; +#define GET_HASH_PHYS_SCRATCH_USER(tmp, reg) \ + sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp; \ + mov SCRATCH_REG_HASH_USER, reg; \ + sllx tmp, 32, tmp; \ + ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; \ + andn reg, tmp, reg; + +#define GET_HASH_PHYS_SCRATCH_KERNEL(tmp, reg) \ + sethi %uhi(VM_MIN_DIRECT_ADDRESS), tmp; \ + mov SCRATCH_REG_HASH_KERNEL, reg; \ + sllx tmp, 32, tmp; \ + ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; \ + andn reg, tmp, reg; + + + + + #define GET_TSB_SCRATCH_USER(reg) \ mov SCRATCH_REG_TSB_USER, reg; \ ldxa [%g0 + reg]ASI_SCRATCHPAD, reg; ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#33 (text+ko) ==== @@ -1088,7 +1088,7 @@ wrpr %g0, %g1, %cleanwin rdpr %cwp, %g1 wrpr %g1, %g7, %tstate - MAGIC_TRAP_ON +! MAGIC_TRAP_ON retry END(user_rtt) END(utl0) @@ -1317,50 +1317,63 @@ ENTRY(tsb_miss_handler) ldxa [%g1 + %g7]ASI_REAL, %g6 ! load in the context + rdpr %tl, %g7 ! need to use real addresses + cmp %g7, 1 ! for tl > 1 + bne,pn %xcc, 2f + nop cmp %g6, %g0 ! kernel? be,pn %xcc, 1f - srlx %g5, TTARGET_VA_SHIFT, %g1 + nop GET_HASH_SCRATCH_USER(%g2) -! MAGIC_TRAP_ON - ba,pt %xcc, 2f - sllx %g6, TTARGET_CTX_SHIFT, %g6 + wr %g0, ASI_LDTD_N, %asi + ba,pt %xcc, 4f + nop 1: GET_HASH_SCRATCH_KERNEL(%g2) + wr %g0, ASI_LDTD_N, %asi + ba,pt %xcc, 4f + nop +2: +! MAGIC_TRAP_ON + cmp %g6, %g0 ! kernel? + be,pn %xcc, 3f + nop + GET_HASH_PHYS_SCRATCH_USER(%g7, %g2) + wr %g0, ASI_LDTD_REAL, %asi + ba,pt %xcc, 4f + nop +3: + GET_HASH_PHYS_SCRATCH_KERNEL(%g7, %g2) + wr %g0, ASI_LDTD_REAL, %asi +4: + + srlx %g5, TTARGET_VA_SHIFT, %g1 sllx %g6, TTARGET_CTX_SHIFT, %g6 -2: - or %g6, %g1, %g6 ! %g6 == search tag + or %g6, %g1, %g6 ! %g6 == search tag + ! %g4 == fault type %g5 == fault addr %g6 == tag ! XXX only handle normal miss for now (look at fault type in the future) #ifdef PMAP_DEBUG cmp %g5, %g0 ! NULL ptr deref - bne,pt %xcc, 3f + bne,pt %xcc, 12f nop tsb_miss_null_deref: MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! give up -3: +12: cmp %g3, T_INSTRUCTION_MISS bne,pn %xcc, 17f nop ! MAGIC_TRAP_ON ! enable debugging for instruction misses 17: - sethi %uhi(VM_MIN_DIRECT_ADDRESS), %g7 - sllx %g7, 32, %g7 - cmp %g5, %g7 - blu %xcc, 7f - nop - MAGIC_TRAP_ON - MAGIC_EXIT -7: - - #endif + tsb_miss_compute_hash_addr: sethi %hi(PAGE_SIZE), %g7 sub %g7, 1, %g7 ! %g7==PAGE_MASK - and %g2, %g7, %g4 ! size stored in lower 13 bits - andn %g2, %g7, %g2 ! actual VA of hash + and %g2, %g7, %g4 ! size stored in lower 13 bits + andn %g2, %g7, %g2 ! actual VA of hash ! XXX only handle 8k page miss ! calculate hash index @@ -1372,53 +1385,53 @@ ! fetch hash entries - exit when we find what were looking for ! %g2==entry base - add %g2, %g4, %g2 ! base + offset == entry base + add %g2, %g4, %g2 ! base + offset == entry base - mov %g5, %g7 ! save fault addr + mov %g5, %g7 ! save fault addr ! entry 0 ! %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_LDTD_N, %g4 + ldda [%g2]%asi, %g4 cmp %g4, %g0 ! entry tag == 0 ? - be,pn %xcc, 4f + be,pn %xcc, 5f nop cmp %g4, %g6 ! entry tag == VA tag? - be,pn %xcc, 5f + be,pn %xcc, 6f nop ! entry 1 -tsb_miss_lookup_1: - add %g2, 16, %g2 ! next THF - ldda [%g2 + %g0]ASI_LDTD_N, %g4 +tsb_miss_lookup_1: + add %g2, 16, %g2 + ldda [%g2]%asi, %g4 cmp %g4, %g0 ! entry tag == 0 ? - be,pn %xcc, 4f + be,pn %xcc, 5f nop cmp %g4, %g6 ! entry tag == search tag? - be,pn %xcc, 5f + be,pn %xcc, 6f nop ! entry 2 -tsb_miss_lookup_2: - add % g2, 16, %g2 ! next THF - ldda [%g2 + %g0]ASI_LDTD_N, %g4 +tsb_miss_lookup_2: + add %g2, 16, %g2 + ldda [%g2]%asi, %g4 cmp %g4, %g0 ! entry tag == 0 ? - be,pn %xcc, 4f + be,pn %xcc, 5f nop cmp %g4, %g6 ! entry tag == search tag? - be,pn %xcc, 5f + be,pn %xcc, 6f nop ! entry 3 -tsb_miss_lookup_3: - add %g2, 16, %g2 ! next THF - ldda [%g2 + %g0]ASI_LDTD_N, %g4 +tsb_miss_lookup_3: + add %g2, 16, %g2 + ldda [%g2]%asi, %g4 cmp %g4, %g0 ! entry tag == 0 ? - be,pn %xcc, 4f + be,pn %xcc, 5f nop cmp %g4, %g6 ! entry tag == search tag? - be,pn %xcc, 5f + be,pn %xcc, 6f nop tsb_miss_not_found: -4: ! not found +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 @@ -1443,7 +1456,7 @@ or %g1, %lo(trap), %g1 tsb_miss_found: -5: !found +6: !found ! %g1 == abs index %g2 == THE pointer %g3 == flags ! %g4 == tag %g5 == data %g7 == PAGE_MASK ! %g3 <- TSB RA %g6 <- TSB size, TTE RA %g7 == PAGE_MASK @@ -1455,10 +1468,10 @@ sub %g7, 1, %g7 ! %g7==PAGE_MASK cmp %g3, T_DATA_MISS ! TSB data miss - be,pt %xcc, 6f + be,pt %xcc, 7f or %g5, VTD_REF, %g5 ! set referenced unconditionally cmp %g3, T_INSTRUCTION_MISS ! TSB instruction miss - be,pt %xcc, 6f + be,pt %xcc, 7f nop cmp %g3, T_DATA_PROTECTION ! protection fault bne,pn %xcc, unsupported_fault_trap ! we don't handle any other fault types currently @@ -1467,9 +1480,14 @@ bz,pn %xcc, prot_fault_trap ! write to read only page nop or %g5, VTD_W, %g5 ! add modifed bit -6: - stx %g5, [%g2 + 8] ! update TTE +7: + rdpr %tl, %g3 + dec %g3 + movrnz %g3, ASI_REAL, %g3 + movrz %g3, ASI_N, %g3 + wr %g0, %g3, %asi + stxa %g5, [%g2 + 8]%asi ! update TTE andcc %g6, %g7, %g0 ! kernel context? bz,pn %xcc, 8f nop @@ -1492,6 +1510,8 @@ ldda [%g2]ASI_LDTD_REAL, %g2 cmp %g3, %g5 bne,pt %xcc, 10f + cmp %g2, %g4 + bne,pt %xcc, 10f nop MAGIC_TRAP_ON;MAGIC_TRAP_ON;MAGIC_EXIT ! die if all we're doing ! is storing same data