更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_pte_ops.h
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/**
33 * @defgroup los_pte_ops page table entry operations
34 * @ingroup kernel
35 */
36
37#ifndef __LOS_PTE_OPS_H__
38#define __LOS_PTE_OPS_H__
39
40#include "los_typedef.h"
41#include "arm.h"
43
44#ifdef __cplusplus
45#if __cplusplus
46extern "C" {
47#endif /* __cplusplus */
48#endif /* __cplusplus */
49/// PTE(Page Table Entry),页表条目,保存L1页表项至L1页表
50STATIC INLINE VOID OsSavePte1(PTE_T *pte1Ptr, PTE_T pte1)
51{
52 DMB;
53 *pte1Ptr = pte1;
54 DSB;
55}
56///生成 L1 section格式项地址
57STATIC INLINE ADDR_T OsTruncPte1(ADDR_T addr)
58{
59 return MMU_DESCRIPTOR_L1_SECTION_ADDR(addr);
60}
61///获取L1 页表项索引
62STATIC INLINE UINT32 OsGetPte1Index(vaddr_t va)
63{
64 return va >> MMU_DESCRIPTOR_L1_SMALL_SHIFT;//右移20位,得到一级页表
65}
66
67STATIC INLINE VOID OsClearPte1(PTE_T *pte1Ptr)
68{
69 OsSavePte1(pte1Ptr, 0);
70}
71
72STATIC INLINE PADDR_T OsGetPte1Paddr(PADDR_T PhysTtb, vaddr_t va)
73{
74 return (PhysTtb + (OsGetPte1Index(va) * sizeof(PADDR_T)));
75}
76///pte1BasePtr L1 转换页表基地址
77STATIC INLINE PTE_T *OsGetPte1Ptr(PTE_T *pte1BasePtr, vaddr_t va)
78{
79 return (pte1BasePtr + OsGetPte1Index(va));//得到一级页面的页号
80}
81
82STATIC INLINE PTE_T OsGetPte1(PTE_T *pte1BasePtr, vaddr_t va)//获取L1 页表项目
83{
84 return *OsGetPte1Ptr(pte1BasePtr, va);
85}
86
87STATIC INLINE BOOL OsIsPte1PageTable(PTE_T pte1)//判断是否为pageTable格式页表项
88{
89 return (pte1 & MMU_DESCRIPTOR_L1_TYPE_MASK) == MMU_DESCRIPTOR_L1_TYPE_PAGE_TABLE;//L1 pte低二位为 01
90}
91
92STATIC INLINE BOOL OsIsPte1Invalid(PTE_T pte1)//判断是否为fault格式页表项
93{
94 return (pte1 & MMU_DESCRIPTOR_L1_TYPE_MASK) == MMU_DESCRIPTOR_L1_TYPE_INVALID;//L1 pte低二位为 00
95}
96
97STATIC INLINE BOOL OsIsPte1Section(PTE_T pte1)//判断是否为section格式页表项
98{
99 return (pte1 & MMU_DESCRIPTOR_L1_TYPE_MASK) == MMU_DESCRIPTOR_L1_TYPE_SECTION;//L1 pte低二位为 10
100}
101
103{
104 return (va % MMU_DESCRIPTOR_L1_SMALL_SIZE) >> MMU_DESCRIPTOR_L2_SMALL_SHIFT;
105}
106
107STATIC INLINE PTE_T *OsGetPte2Ptr(PTE_T *pte2BasePtr, vaddr_t va)
108{
109 return (pte2BasePtr + OsGetPte2Index(va));
110}
111
112STATIC INLINE PTE_T OsGetPte2(PTE_T *pte2BasePtr, vaddr_t va)
113{
114 return *(pte2BasePtr + OsGetPte2Index(va));
115}
116
117STATIC INLINE VOID OsSavePte2(PTE_T *pte2Ptr, PTE_T pte2)
118{
119 DMB;
120 *pte2Ptr = pte2;
121 DSB;
122}
123
124STATIC INLINE UINT32 OsSavePte2Continuous(PTE_T *pte2BasePtr, UINT32 index, PTE_T pte2, UINT32 count)
125{
126 UINT32 saveCounts = 0;
127 if (count == 0) {
128 return 0;
129 }
130
131 DMB;
132 do {
133 pte2BasePtr[index++] = pte2;
134 count--;
135 pte2 += MMU_DESCRIPTOR_L2_SMALL_SIZE;
136 saveCounts++;
137 } while ((count != 0) && (index != MMU_DESCRIPTOR_L2_NUMBERS_PER_L1));
138 DSB;
139
140 return saveCounts;
141}
142
143STATIC INLINE VOID OsClearPte2Continuous(PTE_T *pte2Ptr, UINT32 count)
144{
145 UINT32 index = 0;
146
147 DMB;
148 while (count > 0) {
149 pte2Ptr[index++] = 0;
150 count--;
151 }
152 DSB;
153}
154
155STATIC INLINE BOOL OsIsPte2SmallPage(PTE_T pte2)
156{
157 return (pte2 & MMU_DESCRIPTOR_L2_TYPE_MASK) == MMU_DESCRIPTOR_L2_TYPE_SMALL_PAGE;
158}
159
160STATIC INLINE BOOL OsIsPte2SmallPageXN(PTE_T pte2)
161{
162 return (pte2 & MMU_DESCRIPTOR_L2_TYPE_MASK) == MMU_DESCRIPTOR_L2_TYPE_SMALL_PAGE_XN;
163}
164
165STATIC INLINE BOOL OsIsPte2LargePage(PTE_T pte2)
166{
167 return (pte2 & MMU_DESCRIPTOR_L2_TYPE_MASK) == MMU_DESCRIPTOR_L2_TYPE_LARGE_PAGE;
168}
169
170STATIC INLINE BOOL OsIsPte2Invalid(PTE_T pte2)
171{
172 return (pte2 & MMU_DESCRIPTOR_L2_TYPE_MASK) == MMU_DESCRIPTOR_L2_TYPE_INVALID;
173}
174
175#ifdef __cplusplus
176#if __cplusplus
177}
178#endif /* __cplusplus */
179#endif /* __cplusplus */
180
181#endif /* __LOS_PTE_OPS_H__ */
STATIC INLINE BOOL OsIsPte2Invalid(PTE_T pte2)
Definition: los_pte_ops.h:170
STATIC INLINE PTE_T OsGetPte1(PTE_T *pte1BasePtr, vaddr_t va)
Definition: los_pte_ops.h:82
STATIC INLINE VOID OsSavePte1(PTE_T *pte1Ptr, PTE_T pte1)
PTE(Page Table Entry),页表条目,保存L1页表项至L1页表
Definition: los_pte_ops.h:50
STATIC INLINE BOOL OsIsPte1PageTable(PTE_T pte1)
Definition: los_pte_ops.h:87
STATIC INLINE PTE_T OsGetPte2(PTE_T *pte2BasePtr, vaddr_t va)
Definition: los_pte_ops.h:112
STATIC INLINE BOOL OsIsPte2SmallPageXN(PTE_T pte2)
Definition: los_pte_ops.h:160
STATIC INLINE PTE_T * OsGetPte2Ptr(PTE_T *pte2BasePtr, vaddr_t va)
Definition: los_pte_ops.h:107
STATIC INLINE BOOL OsIsPte2LargePage(PTE_T pte2)
Definition: los_pte_ops.h:165
STATIC INLINE UINT32 OsSavePte2Continuous(PTE_T *pte2BasePtr, UINT32 index, PTE_T pte2, UINT32 count)
Definition: los_pte_ops.h:124
STATIC INLINE PTE_T * OsGetPte1Ptr(PTE_T *pte1BasePtr, vaddr_t va)
pte1BasePtr L1 转换页表基地址
Definition: los_pte_ops.h:77
STATIC INLINE BOOL OsIsPte2SmallPage(PTE_T pte2)
Definition: los_pte_ops.h:155
STATIC INLINE BOOL OsIsPte1Section(PTE_T pte1)
Definition: los_pte_ops.h:97
STATIC INLINE UINT32 OsGetPte2Index(vaddr_t va)
Definition: los_pte_ops.h:102
STATIC INLINE PADDR_T OsGetPte1Paddr(PADDR_T PhysTtb, vaddr_t va)
Definition: los_pte_ops.h:72
STATIC INLINE BOOL OsIsPte1Invalid(PTE_T pte1)
Definition: los_pte_ops.h:92
STATIC INLINE VOID OsClearPte1(PTE_T *pte1Ptr)
Definition: los_pte_ops.h:67
STATIC INLINE UINT32 OsGetPte1Index(vaddr_t va)
获取L1 页表项索引
Definition: los_pte_ops.h:62
STATIC INLINE VOID OsSavePte2(PTE_T *pte2Ptr, PTE_T pte2)
Definition: los_pte_ops.h:117
STATIC INLINE VOID OsClearPte2Continuous(PTE_T *pte2Ptr, UINT32 count)
Definition: los_pte_ops.h:143
STATIC INLINE ADDR_T OsTruncPte1(ADDR_T addr)
生成 L1 section格式项地址
Definition: los_pte_ops.h:57
unsigned long PADDR_T
Definition: los_typedef.h:207
unsigned long vaddr_t
Definition: los_typedef.h:206
unsigned long ADDR_T
Definition: los_typedef.h:211
unsigned long PTE_T
Definition: los_typedef.h:213
unsigned int UINT32
Definition: los_typedef.h:57
size_t BOOL
Definition: los_typedef.h:88