Fix TEX index acquisition using L2 attributes
The TEX index is selected using (TEX0 C B) bits from the L2 descriptor. Use correct index by masking and shifting those bits accordingly. Differential Revision: https://reviews.freebsd.org/D11703
This commit is contained in:
parent
b7e0bde0af
commit
d7b7e142e2
@ -525,8 +525,8 @@ pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr)
|
||||
int old_idx, new_idx;
|
||||
|
||||
/* Map VM memattrs to indexes to tex_class table. */
|
||||
old_idx = pte2_attr_tab[(int)old_attr];
|
||||
new_idx = pte2_attr_tab[(int)new_attr];
|
||||
old_idx = PTE2_ATTR2IDX(pte2_attr_tab[(int)old_attr]);
|
||||
new_idx = PTE2_ATTR2IDX(pte2_attr_tab[(int)new_attr]);
|
||||
|
||||
/* Replace TEX attribute and apply it. */
|
||||
tex_class[old_idx] = tex_class[new_idx];
|
||||
|
@ -149,10 +149,12 @@
|
||||
#define L2_NX 0x00000001 /* Not executable */
|
||||
#define L2_B 0x00000004 /* Bufferable page */
|
||||
#define L2_C 0x00000008 /* Cacheable page */
|
||||
#define L2_CB_SHIFT 2 /* C,B bit field shift */
|
||||
#define L2_AP(x) ((x) << 4)
|
||||
#define L2_AP0 0x00000010 /* access permissions bit 0*/
|
||||
#define L2_AP1 0x00000020 /* access permissions bit 1*/
|
||||
#define L2_TEX(x) ((x) << 6) /* type extension */
|
||||
#define L2_TEX_SHIFT 6 /* type extension field shift */
|
||||
#define L2_TEX(x) ((x) << L2_TEX_SHIFT) /* type extension */
|
||||
#define L2_TEX0 0x00000040 /* type extension bit 0 */
|
||||
#define L2_TEX1 0x00000080 /* type extension bit 1 */
|
||||
#define L2_TEX2 0x00000100 /* type extension bit 2 */
|
||||
@ -271,6 +273,10 @@
|
||||
#define PTE2_FRAME L2_S_FRAME
|
||||
|
||||
#define PTE2_ATTR_MASK (L2_TEX0 | L2_C | L2_B)
|
||||
/* PTE2 attributes to TEX class index: (TEX0 C B) */
|
||||
#define PTE2_ATTR2IDX(attr) \
|
||||
((((attr) & (L2_C | L2_B)) >> L2_CB_SHIFT) | \
|
||||
(((attr) & L2_TEX0) >> (L2_TEX_SHIFT - L2_CB_SHIFT)))
|
||||
|
||||
#define PTE2_AP_KR (PTE2_RO | PTE2_NM)
|
||||
#define PTE2_AP_KRW 0
|
||||
|
Loading…
Reference in New Issue
Block a user