xref: /freebsd/sys/riscv/include/pte.h (revision ccbe9a9f732ee2f10f252a5586309a82e6ffd1e7)
18d7e7a98SRuslan Bukin /*-
28d7e7a98SRuslan Bukin  * Copyright (c) 2014 Andrew Turner
3b977d819SRuslan Bukin  * Copyright (c) 2015-2018 Ruslan Bukin <br@bsdpad.com>
48d7e7a98SRuslan Bukin  * All rights reserved.
58d7e7a98SRuslan Bukin  *
68d7e7a98SRuslan Bukin  * Portions of this software were developed by SRI International and the
78d7e7a98SRuslan Bukin  * University of Cambridge Computer Laboratory under DARPA/AFRL contract
88d7e7a98SRuslan Bukin  * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
98d7e7a98SRuslan Bukin  *
108d7e7a98SRuslan Bukin  * Portions of this software were developed by the University of Cambridge
118d7e7a98SRuslan Bukin  * Computer Laboratory as part of the CTSRD Project, with support from the
128d7e7a98SRuslan Bukin  * UK Higher Education Innovation Fund (HEIF).
138d7e7a98SRuslan Bukin  *
148d7e7a98SRuslan Bukin  * Redistribution and use in source and binary forms, with or without
158d7e7a98SRuslan Bukin  * modification, are permitted provided that the following conditions
168d7e7a98SRuslan Bukin  * are met:
178d7e7a98SRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
188d7e7a98SRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
198d7e7a98SRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
208d7e7a98SRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
218d7e7a98SRuslan Bukin  *    documentation and/or other materials provided with the distribution.
228d7e7a98SRuslan Bukin  *
238d7e7a98SRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
248d7e7a98SRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
258d7e7a98SRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
268d7e7a98SRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
278d7e7a98SRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
288d7e7a98SRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
298d7e7a98SRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
308d7e7a98SRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
318d7e7a98SRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
328d7e7a98SRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
338d7e7a98SRuslan Bukin  * SUCH DAMAGE.
348d7e7a98SRuslan Bukin  */
358d7e7a98SRuslan Bukin 
368d7e7a98SRuslan Bukin #ifndef _MACHINE_PTE_H_
378d7e7a98SRuslan Bukin #define	_MACHINE_PTE_H_
388d7e7a98SRuslan Bukin 
398d7e7a98SRuslan Bukin #ifndef LOCORE
408d7e7a98SRuslan Bukin typedef	uint64_t	pd_entry_t;		/* page directory entry */
418d7e7a98SRuslan Bukin typedef	uint64_t	pt_entry_t;		/* page table entry */
4214232d42SRuslan Bukin typedef	uint64_t	pn_t;			/* page number */
438d7e7a98SRuslan Bukin #endif
448d7e7a98SRuslan Bukin 
4559f192c5SMark Johnston /* Level 0 table, 512GiB per entry, SV48 only */
468d7e7a98SRuslan Bukin #define	L0_SHIFT	39
4759f192c5SMark Johnston #define	L0_SIZE		(1UL << L0_SHIFT)
4859f192c5SMark Johnston #define	L0_OFFSET	(L0_SIZE - 1)
498d7e7a98SRuslan Bukin 
508d7e7a98SRuslan Bukin /* Level 1 table, 1GiB per entry */
518d7e7a98SRuslan Bukin #define	L1_SHIFT	30
5259f192c5SMark Johnston #define	L1_SIZE 	(1UL << L1_SHIFT)
538d7e7a98SRuslan Bukin #define	L1_OFFSET 	(L1_SIZE - 1)
548d7e7a98SRuslan Bukin 
558d7e7a98SRuslan Bukin /* Level 2 table, 2MiB per entry */
568d7e7a98SRuslan Bukin #define	L2_SHIFT	21
5759f192c5SMark Johnston #define	L2_SIZE 	(1UL << L2_SHIFT)
588d7e7a98SRuslan Bukin #define	L2_OFFSET 	(L2_SIZE - 1)
598d7e7a98SRuslan Bukin 
608d7e7a98SRuslan Bukin /* Level 3 table, 4KiB per entry */
618d7e7a98SRuslan Bukin #define	L3_SHIFT	12
6259f192c5SMark Johnston #define	L3_SIZE 	(1UL << L3_SHIFT)
638d7e7a98SRuslan Bukin #define	L3_OFFSET 	(L3_SIZE - 1)
648d7e7a98SRuslan Bukin 
65f6893f09SMark Johnston #define	Ln_ENTRIES_SHIFT 9
66f6893f09SMark Johnston #define	Ln_ENTRIES	(1 << Ln_ENTRIES_SHIFT)
678d7e7a98SRuslan Bukin #define	Ln_ADDR_MASK	(Ln_ENTRIES - 1)
688d7e7a98SRuslan Bukin 
69b977d819SRuslan Bukin /* Bits 9:8 are reserved for software */
7098f50c44SRuslan Bukin #define	PTE_SW_MANAGED	(1 << 9)
7198f50c44SRuslan Bukin #define	PTE_SW_WIRED	(1 << 8)
7298f50c44SRuslan Bukin #define	PTE_D		(1 << 7) /* Dirty */
7398f50c44SRuslan Bukin #define	PTE_A		(1 << 6) /* Accessed */
7498f50c44SRuslan Bukin #define	PTE_G		(1 << 5) /* Global */
7598f50c44SRuslan Bukin #define	PTE_U		(1 << 4) /* User */
7698f50c44SRuslan Bukin #define	PTE_X		(1 << 3) /* Execute */
7798f50c44SRuslan Bukin #define	PTE_W		(1 << 2) /* Write */
7898f50c44SRuslan Bukin #define	PTE_R		(1 << 1) /* Read */
7998f50c44SRuslan Bukin #define	PTE_V		(1 << 0) /* Valid */
8098f50c44SRuslan Bukin #define	PTE_RWX		(PTE_R | PTE_W | PTE_X)
8198f50c44SRuslan Bukin #define	PTE_RX		(PTE_R | PTE_X)
82d198cb6dSJohn Baldwin #define	PTE_KERN	(PTE_V | PTE_R | PTE_W | PTE_A | PTE_D)
837703ac2eSMark Johnston #define	PTE_PROMOTE	(PTE_V | PTE_RWX | PTE_D | PTE_G | PTE_U | \
84f6893f09SMark Johnston 			 PTE_SW_MANAGED | PTE_SW_WIRED)
858d7e7a98SRuslan Bukin 
86b7312c3dSMitchell Horne /*
87b7312c3dSMitchell Horne  * Svpbmt Memory Attribute (MA) bits [62:61].
88b7312c3dSMitchell Horne  *
89b7312c3dSMitchell Horne  * +------+-------+------------------------------------------------------------+
90b7312c3dSMitchell Horne  * | Mode | Value | Requested Memory Attributes                                |
91b7312c3dSMitchell Horne  * +------+-------+------------------------------------------------------------+
92b7312c3dSMitchell Horne  * | PMA  | 00    | None, inherited from Physical Memory Attributes (firmware) |
93b7312c3dSMitchell Horne  * | NC   | 01    | Non-cacheable, idempotent, weakly-ordered (RVWMO),         |
94b7312c3dSMitchell Horne  * |      |       | main memory                                                |
95b7312c3dSMitchell Horne  * | IO   | 10    | Non-cacheable, non-idempotent, strongly-ordered, I/O       |
96b7312c3dSMitchell Horne  * | --   | 11    | Reserved                                                   |
97b7312c3dSMitchell Horne  * +------+-------+------------------------------------------------------------+
98b7312c3dSMitchell Horne  */
99b7312c3dSMitchell Horne #define	PTE_MA_SHIFT		61
100b7312c3dSMitchell Horne #define	PTE_MA_MASK		(0x3ul << PTE_MA_SHIFT)
101b7312c3dSMitchell Horne #define	PTE_MA_NONE		(0ul)
102b7312c3dSMitchell Horne #define	PTE_MA_NC		(1ul << PTE_MA_SHIFT)
103b7312c3dSMitchell Horne #define	PTE_MA_IO		(2ul << PTE_MA_SHIFT)
104b7312c3dSMitchell Horne 
105*ccbe9a9fSMitchell Horne /*
106*ccbe9a9fSMitchell Horne  * T-HEAD Custom Memory Attribute (MA) bits [63:59].
107*ccbe9a9fSMitchell Horne  *
108*ccbe9a9fSMitchell Horne  * bit 59: Trustable (relating to TEE)
109*ccbe9a9fSMitchell Horne  * bit 60: Shareable (among CPUs, not configurable)
110*ccbe9a9fSMitchell Horne  * bit 61: Bufferable (writes to device memory)
111*ccbe9a9fSMitchell Horne  * bit 62: Cacheable
112*ccbe9a9fSMitchell Horne  * bit 63: Memory Ordering (1 = strongly ordered (device), 0 = default)
113*ccbe9a9fSMitchell Horne  *
114*ccbe9a9fSMitchell Horne  * +------+-------+------------------------------------------------------------+
115*ccbe9a9fSMitchell Horne  * | Mode | Value | Requested Memory Attributes                                |
116*ccbe9a9fSMitchell Horne  * +------+-------+------------------------------------------------------------+
117*ccbe9a9fSMitchell Horne  * | NC   | 00110 | Weakly-ordered, non-cacheable, bufferable, shareable,      |
118*ccbe9a9fSMitchell Horne  * |      |       | non-trustable                                              |
119*ccbe9a9fSMitchell Horne  * | PMA  | 01110 | Weakly-ordered, cacheable, bufferable, shareable,          |
120*ccbe9a9fSMitchell Horne  * |      |       | non-trustable                                              |
121*ccbe9a9fSMitchell Horne  * | IO   | 10010 | Strongly-ordered, non-cacheable, non-bufferable,           |
122*ccbe9a9fSMitchell Horne  * |      |       | shareable, non-trustable                                   |
123*ccbe9a9fSMitchell Horne  * +------+-------+------------------------------------------------------------+
124*ccbe9a9fSMitchell Horne  */
125*ccbe9a9fSMitchell Horne #define	PTE_THEAD_MA_SHIFT	59
126*ccbe9a9fSMitchell Horne #define	PTE_THEAD_MA_MASK	(0x1ful << PTE_THEAD_MA_SHIFT)
127*ccbe9a9fSMitchell Horne #define	PTE_THEAD_MA_NC		(0x6ul  << PTE_THEAD_MA_SHIFT)
128*ccbe9a9fSMitchell Horne #define	PTE_THEAD_MA_NONE	(0xeul  << PTE_THEAD_MA_SHIFT)
129*ccbe9a9fSMitchell Horne #define	PTE_THEAD_MA_IO		(0x12ul << PTE_THEAD_MA_SHIFT)
130*ccbe9a9fSMitchell Horne 
131b865714dSKristof Provost /* Bits 63 - 54 are reserved for future use. */
132b865714dSKristof Provost #define PTE_HI_MASK	0xFFC0000000000000ULL
133b865714dSKristof Provost 
1348d7e7a98SRuslan Bukin #define	PTE_PPN0_S	10
1358d7e7a98SRuslan Bukin #define	PTE_PPN1_S	19
1368d7e7a98SRuslan Bukin #define	PTE_PPN2_S	28
1378d7e7a98SRuslan Bukin #define	PTE_PPN3_S	37
1388d7e7a98SRuslan Bukin #define	PTE_SIZE	8
1398d7e7a98SRuslan Bukin 
1408d7e7a98SRuslan Bukin #endif /* !_MACHINE_PTE_H_ */
141