Use ATTR_DBM even when hardware dirty bit management is not enabled.

The ARMv8 reference manual only states that the bit is reserved in
this case; following Linux's example, use it instead of a
software-defined bit for the purpose of indicating that a managed
mapping is writable.

Reviewed by:	alc, andrew
MFC after:	r350004
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D21121
This commit is contained in:
Mark Johnston 2019-08-01 22:48:06 +00:00
parent 48ec75f0e7
commit 407b6a4e44
2 changed files with 6 additions and 12 deletions

View File

@ -221,8 +221,11 @@ __FBSDID("$FreeBSD$");
* The presence of this flag indicates that the mapping is writeable.
* If the ATTR_AP_RO bit is also set, then the mapping is clean, otherwise it is
* dirty. This flag may only be set on managed mappings.
*
* The DBM bit is reserved on ARMv8.0 but it seems we can safely treat it
* as a software managed bit.
*/
static pt_entry_t ATTR_SW_DBM;
#define ATTR_SW_DBM ATTR_DBM
struct pmap kernel_pmap_store;
@ -784,15 +787,6 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offset_t l1pt, vm_paddr_t kernstart,
uint64_t kern_delta;
int i;
#ifdef notyet
/* Determine whether the hardware implements DBM management. */
uint64_t reg = READ_SPECIALREG(ID_AA64MMFR1_EL1);
ATTR_SW_DBM = ID_AA64MMFR1_HAFDBS(reg) == ID_AA64MMFR1_HAFDBS_AF_DBS ?
ATTR_DBM : _ATTR_SW_DBM;
#else
ATTR_SW_DBM = _ATTR_SW_DBM;
#endif
kern_delta = KERNBASE - kernstart;
printf("pmap_bootstrap %lx %lx %lx\n", l1pt, kernstart, kernlen);

View File

@ -43,8 +43,8 @@ typedef uint64_t pt_entry_t; /* page table entry */
#define ATTR_MASK_L UINT64_C(0x0000000000000fff)
#define ATTR_MASK (ATTR_MASK_H | ATTR_MASK_L)
/* Bits 58:55 are reserved for software */
#define ATTR_SW_UNUSED (1UL << 58)
#define _ATTR_SW_DBM (1UL << 57)
#define ATTR_SW_UNUSED2 (1UL << 58)
#define ATTR_SW_UNUSED1 (1UL << 57)
#define ATTR_SW_MANAGED (1UL << 56)
#define ATTR_SW_WIRED (1UL << 55)
#define ATTR_UXN (1UL << 54)