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:
Zbigniew Bodek 2017-07-27 23:14:17 +00:00
parent b7e0bde0af
commit d7b7e142e2
2 changed files with 9 additions and 3 deletions

View File

@ -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];

View File

@ -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