source: mainline/kernel/arch/arm32/src/mm/tlb.c

Last change on this file was c477c80, checked in by Jiri Svoboda <jiri@…>, 6 years ago

Fix some common misspellings

  • Property mode set to 100644
File size: 4.1 KB
RevLine 
[6b781c0]1/*
2 * Copyright (c) 2007 Michal Kebrt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
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.
16 *
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.
27 */
28
[c5429fe]29/** @addtogroup kernel_arm32_mm
[6b781c0]30 * @{
31 */
32/** @file
33 * @brief TLB related functions.
34 */
35
36#include <mm/tlb.h>
37#include <arch/mm/asid.h>
38#include <arch/asm.h>
[74dcc07]39#include <arch/cp15.h>
[d99c1d2]40#include <typedefs.h>
[6b781c0]41#include <arch/mm/page.h>
[bb75646]42#include <arch/cache.h>
[7328ff4]43#include <arch/barrier.h>
[6b781c0]44
45/** Invalidate all entries in TLB.
46 *
47 * @note See ARM Architecture reference section 3.7.7 for details.
48 */
49void tlb_invalidate_all(void)
50{
[74dcc07]51 TLBIALL_write(0);
[bb75646]52 /*
53 * "A TLB maintenance operation is only guaranteed to be complete after
54 * the execution of a DSB instruction."
55 * "An ISB instruction, or a return from an exception, causes the
56 * effect of all completed TLB maintenance operations that appear in
57 * program order before the ISB or return from exception to be visible
58 * to all subsequent instructions, including the instruction fetches
59 * for those instructions."
60 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375
61 */
[7328ff4]62 dsb();
63 isb();
[6b781c0]64}
65
66/** Invalidate all entries in TLB that belong to specified address space.
67 *
68 * @param asid Ignored as the ARM architecture doesn't support ASIDs.
69 */
70void tlb_invalidate_asid(asid_t asid)
71{
72 tlb_invalidate_all();
[74dcc07]73 // TODO: why not TLBIASID_write(asid) ?
[6b781c0]74}
75
76/** Invalidate single entry in TLB
77 *
[c477c80]78 * @param page Virtual address of the page
[74dcc07]79 */
[6b781c0]80static inline void invalidate_page(uintptr_t page)
81{
[f834cc32]82#if defined(PROCESSOR_ARCH_armv6) || defined(PROCESSOR_ARCH_armv7_a)
83 if (TLBTR_read() & TLBTR_SEP_FLAG) {
84 ITLBIMVA_write(page);
85 DTLBIMVA_write(page);
86 } else {
87 TLBIMVA_write(page);
88 }
89#elif defined(PROCESSOR_arm920t)
[5f310ec8]90 ITLBIMVA_write(page);
91 DTLBIMVA_write(page);
[f834cc32]92#elif defined(PROCESSOR_arm926ej_s)
[bb75646]93 TLBIMVA_write(page);
[f834cc32]94#else
95#error Unknown TLB type
[5f310ec8]96#endif
[f834cc32]97
[bb75646]98 /*
99 * "A TLB maintenance operation is only guaranteed to be complete after
100 * the execution of a DSB instruction."
101 * "An ISB instruction, or a return from an exception, causes the
102 * effect of all completed TLB maintenance operations that appear in
103 * program order before the ISB or return from exception to be visible
104 * to all subsequent instructions, including the instruction fetches
105 * for those instructions."
106 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375
107 */
[7328ff4]108 dsb();
109 isb();
[6b781c0]110}
111
112/** Invalidate TLB entries for specified page range belonging to specified
113 * address space.
114 *
115 * @param asid Ignored as the ARM architecture doesn't support it.
116 * @param page Address of the first page whose entry is to be invalidated.
117 * @param cnt Number of entries to invalidate.
118 */
[98000fb]119void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, size_t cnt)
[6b781c0]120{
[bb75646]121 for (unsigned i = 0; i < cnt; i++)
[6b781c0]122 invalidate_page(page + i * PAGE_SIZE);
123}
124
[9979acb]125void tlb_arch_init(void)
126{
127}
128
129void tlb_print(void)
130{
131}
132
[6b781c0]133/** @}
134 */
Note: See TracBrowser for help on using the repository browser.