1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/* $OpenBSD: pte.h,v 1.7 2021/02/28 21:28:33 patrick Exp $ */
/*
* Copyright (c) 2014 Dale Rahn <drahn@dalerahn.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _ARM_PTE_H_
#define _ARM_PTE_H_
#include "arm64/vmparam.h"
/* level X descriptor */
#define Lx_TYPE_MASK (0x00000003) /* mask of type bits */
#define Lx_TYPE_S (0x00000001)
#define Lx_TYPE_PT (0x00000003)
// XXX need to investigate use of these
#define Lx_PT_NS (1ULL<<63)
#define Lx_PT_AP00 (0ULL<<61)
#define Lx_PT_AP01 (1ULL<<61)
#define Lx_PT_AP10 (2ULL<<61)
#define Lx_PT_AP11 (3ULL<<61)
#define Lx_PT_XN (1ULL<<60)
#define Lx_PT_PXN (1ULL<<59)
#define Lx_TABLE_ALIGN (4096)
/* Block and Page attributes */
/* TODO: Add the upper attributes */
#define ATTR_MASK_H (0xfff0000000000000ULL)
#define ATTR_MASK_L (0x0000000000000fffULL)
#define ATTR_MASK (ATTR_MASK_H | ATTR_MASK_L)
/* Bits 58:55 are reserved for software */
#define ATTR_SW_MANAGED (1UL << 56)
#define ATTR_SW_WIRED (1UL << 55)
#define ATTR_UXN (1UL << 54)
#define ATTR_PXN (1UL << 53)
#define ATTR_nG (1 << 11)
#define ATTR_AF (1 << 10)
#define ATTR_SH(x) ((x) << 8)
#define ATTR_AP_RW_BIT (1 << 7)
#define ATTR_AP(x) ((x) << 6)
#define ATTR_AP_MASK ATTR_AP(3)
#define ATTR_NS (1 << 5)
#define ATTR_IDX(x) ((x) << 2)
#define ATTR_IDX_MASK (7 << 2)
#define PTE_ATTR_DEV_NGNRNE 0
#define PTE_ATTR_DEV_NGNRE 1
#define PTE_ATTR_CI 2
#define PTE_ATTR_WB 3
#define PTE_ATTR_WT 4
#define PTE_MEMATTR_DEV_NGNRNE 0x0
#define PTE_MEMATTR_DEV_NGNRE 0x1
#define PTE_MEMATTR_CI 0x5
#define PTE_MEMATTR_WB 0xf
#define PTE_MEMATTR_WT 0xa
#define SH_INNER 3
#define SH_OUTER 2
#define SH_NONE 0
/* Level 0 table, 512GiB per entry */
#define L0_SHIFT 39
#define L0_INVAL 0x0 /* An invalid address */
#define L0_BLOCK 0x1 /* A block */
/* 0x2 also marks an invalid address */
#define L0_TABLE 0x3 /* A next-level table */
/* Level 1 table, 1GiB per entry */
#define L1_SHIFT 30
#define L1_SIZE (1 << L1_SHIFT)
#define L1_OFFSET (L1_SIZE - 1)
#define L1_INVAL L0_INVAL
#define L1_BLOCK L0_BLOCK
#define L1_TABLE L0_TABLE
/* Level 2 table, 2MiB per entry */
#define L2_SHIFT 21
#define L2_SIZE (1 << L2_SHIFT)
#define L2_OFFSET (L2_SIZE - 1)
#define L2_INVAL L0_INVAL
#define L2_BLOCK L0_BLOCK
#define L2_TABLE L0_TABLE
/* page mapping */
#define L3_P 0x3
#define Ln_ENTRIES (1 << 9)
#define Ln_ADDR_MASK (Ln_ENTRIES - 1)
#define Ln_TABLE_MASK ((1 << 12) - 1)
/* physical page mask */
#define PTE_RPGN (((1ULL << 48) - 1) & ~PAGE_MASK)
/* XXX */
#ifndef _LOCORE
struct pte {
uint64_t pte;
};
typedef uint64_t pd_entry_t; /* L1 table entry */
typedef uint64_t pt_entry_t; /* L2 table entry */
struct pv_node {
};
#endif /* _LOCORE */
/// REWRITE
#define L2_L_SIZE 0x00010000 /* 64K */
#define L2_L_OFFSET (L2_L_SIZE - 1)
#define L2_L_FRAME (~L2_L_OFFSET)
#define L2_L_SHIFT 16
#define L2_S_SIZE 0x00001000 /* 4K */
#define L2_S_OFFSET (L2_S_SIZE - 1)
#define L2_S_FRAME (~L2_S_OFFSET)
#define L2_S_SHIFT 12
///
#endif /* _ARM_PTE_H_ */
|