162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_BOOK3S_64_HASH_PKEY_H 362306a36Sopenharmony_ci#define _ASM_POWERPC_BOOK3S_64_HASH_PKEY_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* We use key 3 for KERNEL */ 662306a36Sopenharmony_ci#define HASH_DEFAULT_KERNEL_KEY (HPTE_R_KEY_BIT0 | HPTE_R_KEY_BIT1) 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic inline u64 hash__vmflag_to_pte_pkey_bits(u64 vm_flags) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci return (((vm_flags & VM_PKEY_BIT0) ? H_PTE_PKEY_BIT0 : 0x0UL) | 1162306a36Sopenharmony_ci ((vm_flags & VM_PKEY_BIT1) ? H_PTE_PKEY_BIT1 : 0x0UL) | 1262306a36Sopenharmony_ci ((vm_flags & VM_PKEY_BIT2) ? H_PTE_PKEY_BIT2 : 0x0UL) | 1362306a36Sopenharmony_ci ((vm_flags & VM_PKEY_BIT3) ? H_PTE_PKEY_BIT3 : 0x0UL) | 1462306a36Sopenharmony_ci ((vm_flags & VM_PKEY_BIT4) ? H_PTE_PKEY_BIT4 : 0x0UL)); 1562306a36Sopenharmony_ci} 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic inline u64 pte_to_hpte_pkey_bits(u64 pteflags, unsigned long flags) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci unsigned long pte_pkey; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci pte_pkey = (((pteflags & H_PTE_PKEY_BIT4) ? HPTE_R_KEY_BIT4 : 0x0UL) | 2262306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT3) ? HPTE_R_KEY_BIT3 : 0x0UL) | 2362306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT2) ? HPTE_R_KEY_BIT2 : 0x0UL) | 2462306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT1) ? HPTE_R_KEY_BIT1 : 0x0UL) | 2562306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT0) ? HPTE_R_KEY_BIT0 : 0x0UL)); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci if (mmu_has_feature(MMU_FTR_KUAP) || 2862306a36Sopenharmony_ci mmu_has_feature(MMU_FTR_BOOK3S_KUEP)) { 2962306a36Sopenharmony_ci if ((pte_pkey == 0) && (flags & HPTE_USE_KERNEL_KEY)) 3062306a36Sopenharmony_ci return HASH_DEFAULT_KERNEL_KEY; 3162306a36Sopenharmony_ci } 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci return pte_pkey; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic inline u16 hash__pte_to_pkey_bits(u64 pteflags) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci return (((pteflags & H_PTE_PKEY_BIT4) ? 0x10 : 0x0UL) | 3962306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT3) ? 0x8 : 0x0UL) | 4062306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT2) ? 0x4 : 0x0UL) | 4162306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT1) ? 0x2 : 0x0UL) | 4262306a36Sopenharmony_ci ((pteflags & H_PTE_PKEY_BIT0) ? 0x1 : 0x0UL)); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#endif 46