2 * Copyright (C) 2006 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup sparc64mm
35 #include <arch/mm/tsb.h>
36 #include <arch/mm/tlb.h>
37 #include <arch/barrier.h>
39 #include <arch/types.h>
44 #define TSB_INDEX_MASK ((1<<(21+1+TSB_SIZE-PAGE_WIDTH))-1)
46 /** Invalidate portion of TSB.
48 * We assume that the address space is already locked.
49 * Note that respective portions of both TSBs
50 * are invalidated at a time.
52 * @param as Address space.
53 * @param page First page to invalidate in TSB.
54 * @param pages Number of pages to invalidate.
55 * Value of (count_t) -1 means the whole TSB.
57 void tsb_invalidate(as_t
*as
, uintptr_t page
, count_t pages
)
62 ASSERT(as
->arch
.itsb
&& as
->arch
.dtsb
);
64 i0
= (page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
;
65 cnt
= min(pages
, ITSB_ENTRY_COUNT
);
67 for (i
= 0; i
< cnt
; i
++) {
68 as
->arch
.itsb
[(i0
+ i
) & (ITSB_ENTRY_COUNT
-1)].tag
.invalid
= true;
69 as
->arch
.dtsb
[(i0
+ i
) & (DTSB_ENTRY_COUNT
-1)].tag
.invalid
= true;
73 /** Copy software PTE to ITSB.
75 * @param t Software PTE.
77 void itsb_pte_copy(pte_t
*t
)
83 tsb
= &as
->arch
.itsb
[(t
->page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
];
86 * We use write barriers to make sure that the TSB load
87 * won't use inconsistent data or that the fault will
91 tsb
->tag
.invalid
= true; /* invalidate the entry
92 * (tag target has this
97 tsb
->tag
.context
= as
->asid
;
98 tsb
->tag
.va_tag
= t
->page
>> VA_TAG_PAGE_SHIFT
;
100 tsb
->data
.size
= PAGESIZE_8K
;
101 tsb
->data
.pfn
= t
->frame
>> FRAME_WIDTH
;
103 #ifdef CONFIG_VIRT_IDX_CACHE
105 #endif /* CONFIG_VIRT_IDX_CACHE */
106 tsb
->data
.p
= t
->k
; /* p as privileged */
111 tsb
->tag
.invalid
= false; /* mark the entry as valid */
114 /** Copy software PTE to DTSB.
116 * @param t Software PTE.
117 * @param ro If true, the mapping is copied read-only.
119 void dtsb_pte_copy(pte_t
*t
, bool ro
)
125 tsb
= &as
->arch
.dtsb
[(t
->page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
];
128 * We use write barriers to make sure that the TSB load
129 * won't use inconsistent data or that the fault will
133 tsb
->tag
.invalid
= true; /* invalidate the entry
134 * (tag target has this
139 tsb
->tag
.context
= as
->asid
;
140 tsb
->tag
.va_tag
= t
->page
>> VA_TAG_PAGE_SHIFT
;
142 tsb
->data
.size
= PAGESIZE_8K
;
143 tsb
->data
.pfn
= t
->frame
>> FRAME_WIDTH
;
145 #ifdef CONFIG_VIRT_IDX_CACHE
147 #endif /* CONFIG_VIRT_IDX_CACHE */
148 tsb
->data
.p
= t
->k
; /* p as privileged */
149 tsb
->data
.w
= ro
? false : t
->w
;
154 tsb
->tag
.invalid
= true; /* mark the entry as valid */