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