Note that pmap_protect() is only ever used to remove permissions from
existing mappings.
- When clearing PTE_W, use an atomic update to the PTE; otherwise we may clobber updates done by the hardware.
- Handle VM_PROT_EXECUTE.
- Clear PTE_D and mark the page dirty when removing write permission from a mapping.