OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [sparc64/] [kernel/] [dtlb_backend.S] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* $Id: dtlb_backend.S,v 1.1.1.1 2004-04-15 01:34:21 phoenix Exp $
2
 * dtlb_backend.S: Back end to DTLB miss replacement strategy.
3
 *                 This is included directly into the trap table.
4
 *
5
 * Copyright (C) 1996,1998 David S. Miller (davem@redhat.com)
6
 * Copyright (C) 1997,1998 Jakub Jelinek   (jj@ultra.linux.cz)
7
 */
8
 
9
#include 
10
 
11
#if PAGE_SHIFT == 13
12
#define FILL_VALID_SZ_BITS1(r1) \
13
         sllx           %g2, 62, r1
14
#define FILL_VALID_SZ_BITS2(r1)
15
#define FILL_VALID_SZ_BITS_NOP nop
16
#elif PAGE_SHIFT == 16
17
#define FILL_VALID_SZ_BITS1(r1) \
18
        or              %g0, 5, r1
19
#define FILL_VALID_SZ_BITS2(r1) \
20
        sllx            r1, 61, r1
21
#define FILL_VALID_SZ_BITS_NOP
22
#else
23
#error unsupported PAGE_SIZE
24
#endif /* PAGE_SHIFT */
25
 
26
#define VPTE_BITS               (_PAGE_CP | _PAGE_CV | _PAGE_P )
27
#define VPTE_SHIFT              (PAGE_SHIFT - 3)
28
#define TLB_PMD_SHIFT           (PAGE_SHIFT - 3 + 3)
29
#define TLB_PGD_SHIFT           (PMD_BITS + PAGE_SHIFT - 3 + 3)
30
#define TLB_PMD_MASK            (((1 << PMD_BITS) - 1) << 1)
31
#define TLB_PGD_MASK            (((1 << (VA_BITS - PAGE_SHIFT - (PAGE_SHIFT - 3) - PMD_BITS)) - 1) << 2)
32
 
33
/* Ways we can get here:
34
 *
35
 * 1) Nucleus loads and stores to/from PA-->VA direct mappings at tl>1.
36
 * 2) Nucleus loads and stores to/from user/kernel window save areas.
37
 * 3) VPTE misses from dtlb_base and itlb_base.
38
 */
39
 
40
/* TLB1 ** ICACHE line 1: tl1 DTLB and quick VPTE miss  */
41
        ldxa            [%g1 + %g1] ASI_DMMU, %g4       ! Get TAG_ACCESS
42
        add             %g3, %g3, %g5                   ! Compute VPTE base
43
        cmp             %g4, %g5                        ! VPTE miss?
44
        bgeu,pt         %xcc, 1f                        ! Continue here
45
         andcc          %g4, TAG_CONTEXT_BITS, %g5      ! From Nucleus? (for tl0 miss)
46
        ba,pt           %xcc, from_tl1_trap             ! Fall to tl0 miss
47
         rdpr           %tl, %g5                        ! For tl0 miss TL==3 test
48
1:      sllx            %g6, VPTE_SHIFT, %g4            ! Position TAG_ACCESS
49
 
50
/* TLB1 ** ICACHE line 2: Quick VPTE miss               */
51
        or              %g4, %g5, %g4                   ! Prepare TAG_ACCESS
52
        mov             TSB_REG, %g1                    ! Grab TSB reg
53
        ldxa            [%g1] ASI_DMMU, %g5             ! Doing PGD caching?
54
        srlx            %g6, (TLB_PMD_SHIFT - 1), %g1   ! Position PMD offset
55
        be,pn           %xcc, sparc64_vpte_nucleus      ! Is it from Nucleus?
56
         and            %g1, TLB_PMD_MASK, %g1          ! Mask PMD offset bits
57
        brnz,pt         %g5, sparc64_vpte_continue      ! Yep, go like smoke
58
         add            %g1, %g1, %g1                   ! Position PMD offset some more
59
 
60
/* TLB1 ** ICACHE line 3: Quick VPTE miss               */
61
        srlx            %g6, (TLB_PGD_SHIFT - 2), %g5   ! Position PGD offset
62
        and             %g5, TLB_PGD_MASK, %g5          ! Mask PGD offset
63
        lduwa           [%g7 + %g5] ASI_PHYS_USE_EC, %g5! Load PGD
64
        brz,pn          %g5, vpte_noent                 ! Valid?
65
sparc64_kpte_continue:
66
         sllx           %g5, 11, %g5                    ! Shift into place
67
sparc64_vpte_continue:
68
        lduwa           [%g5 + %g1] ASI_PHYS_USE_EC, %g5! Load PMD
69
        sllx            %g5, 11, %g5                    ! Shift into place
70
        brz,pn          %g5, vpte_noent                 ! Valid?
71
 
72
/* TLB1 ** ICACHE line 4: Quick VPTE miss               */
73
         FILL_VALID_SZ_BITS1(%g1)                       ! Put _PAGE_VALID into %g1
74
        FILL_VALID_SZ_BITS2(%g1)                        ! Put _PAGE_VALID into %g1
75
        or              %g5, VPTE_BITS, %g5             ! Prepare VPTE data
76
        or              %g5, %g1, %g5                   ! ...
77
        mov             TLB_SFSR, %g1                   ! Restore %g1 value
78
        stxa            %g5, [%g0] ASI_DTLB_DATA_IN     ! Load VPTE into TLB
79
        stxa            %g4, [%g1 + %g1] ASI_DMMU       ! Restore previous TAG_ACCESS
80
        retry                                           ! Load PTE once again
81
        FILL_VALID_SZ_BITS_NOP
82
 
83
#undef VPTE_SHIFT
84
#undef TLB_PMD_SHIFT
85
#undef TLB_PGD_SHIFT
86
#undef VPTE_BITS
87
#undef TLB_PMD_MASK
88
#undef TLB_PGD_MASK
89
#undef FILL_VALID_SZ_BITS1
90
#undef FILL_VALID_SZ_BITS2
91
#undef FILL_VALID_SZ_BITS_NOP
92
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.