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. Note that respective
49 * portions of both TSBs are invalidated at a time.
51 * @param as Address space.
52 * @param page First page to invalidate in TSB.
53 * @param pages Number of pages to invalidate. Value of (count_t) -1 means the
56 void tsb_invalidate(as_t
*as
, uintptr_t page
, count_t pages
)
61 ASSERT(as
->arch
.itsb
&& as
->arch
.dtsb
);
63 i0
= (page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
;
64 cnt
= min(pages
, ITSB_ENTRY_COUNT
);
66 for (i
= 0; i
< cnt
; i
++) {
67 as
->arch
.itsb
[(i0
+ i
) & (ITSB_ENTRY_COUNT
- 1)].tag
.invalid
=
69 as
->arch
.dtsb
[(i0
+ i
) & (DTSB_ENTRY_COUNT
- 1)].tag
.invalid
=
74 /** Copy software PTE to ITSB.
76 * @param t Software PTE.
78 void itsb_pte_copy(pte_t
*t
)
84 tsb
= &as
->arch
.itsb
[(t
->page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
];
87 * We use write barriers to make sure that the TSB load
88 * won't use inconsistent data or that the fault will
92 tsb
->tag
.invalid
= true; /* invalidate the entry
93 * (tag target has this
98 tsb
->tag
.context
= as
->asid
;
99 tsb
->tag
.va_tag
= t
->page
>> VA_TAG_PAGE_SHIFT
;
101 tsb
->data
.size
= PAGESIZE_8K
;
102 tsb
->data
.pfn
= t
->frame
>> FRAME_WIDTH
;
104 tsb
->data
.p
= t
->k
; /* p as privileged */
109 tsb
->tag
.invalid
= false; /* mark the entry as valid */
112 /** Copy software PTE to DTSB.
114 * @param t Software PTE.
115 * @param ro If true, the mapping is copied read-only.
117 void dtsb_pte_copy(pte_t
*t
, bool ro
)
123 tsb
= &as
->arch
.dtsb
[(t
->page
>> PAGE_WIDTH
) & TSB_INDEX_MASK
];
126 * We use write barriers to make sure that the TSB load
127 * won't use inconsistent data or that the fault will
131 tsb
->tag
.invalid
= true; /* invalidate the entry
132 * (tag target has this
137 tsb
->tag
.context
= as
->asid
;
138 tsb
->tag
.va_tag
= t
->page
>> VA_TAG_PAGE_SHIFT
;
140 tsb
->data
.size
= PAGESIZE_8K
;
141 tsb
->data
.pfn
= t
->frame
>> FRAME_WIDTH
;
143 #ifdef CONFIG_VIRT_IDX_DCACHE
145 #endif /* CONFIG_VIRT_IDX_DCACHE */
146 tsb
->data
.p
= t
->k
; /* p as privileged */
147 tsb
->data
.w
= ro
? false : t
->w
;
152 tsb
->tag
.invalid
= true; /* mark the entry as valid */