| 651 | CTASSERT(L1_BLOCK == L2_BLOCK); |
| 652 | |
| 653 | static pt_entry_t |
| 654 | pmap_pte_memattr(pmap_t pmap, vm_memattr_t memattr) |
| 655 | { |
| 656 | pt_entry_t val; |
| 657 | |
| 658 | if (pmap->pm_stage == PM_STAGE1) { |
| 659 | val = ATTR_S1_IDX(memattr); |
| 660 | if (memattr == VM_MEMATTR_DEVICE) |
| 661 | val |= ATTR_S1_XN; |
| 662 | return (val); |
| 663 | } |
| 664 | |
| 665 | val = 0; |
| 666 | |
| 667 | switch (memattr) { |
| 668 | case VM_MEMATTR_DEVICE: |
| 669 | return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_DEVICE_nGnRnE) | |
| 670 | ATTR_S2_XN(ATTR_S2_XN_ALL)); |
| 671 | case VM_MEMATTR_UNCACHEABLE: |
| 672 | return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_NC)); |
| 673 | case VM_MEMATTR_WRITE_BACK: |
| 674 | return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_WB)); |
| 675 | case VM_MEMATTR_WRITE_THROUGH: |
| 676 | return (ATTR_S2_MEMATTR(ATTR_S2_MEMATTR_WT)); |
| 677 | default: |
| 678 | panic("%s: invalid memory attribute %x", __func__, memattr); |
| 679 | } |
| 680 | } |
| 681 | |
| 682 | static pt_entry_t |
| 683 | pmap_pte_prot(pmap_t pmap, vm_prot_t prot) |