2026-01-29 22:25:33 +08:00

132 lines
3.0 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_SW64_KVM_MMU_H
#define _ASM_SW64_KVM_MMU_H
#define AF_ACCESS_TYPE_SHIFT 55
#define AF_INV_LEVEL_SHIFT 53
#define AF_FAULT_STATUS_SHIFT 48
#define AF_ACCESS_TYPE_MASK 0x3
#define AF_INV_LEVEL_MASK 0x3
#define AF_FAULT_STATUS_MASK 0x1f
#define AF_ENTRY_ADDR_MASK ((0x1UL << AF_FAULT_STATUS_SHIFT) - 1)
/* access type defination */
#define AF_READ_ACCESS_TYPE 0x1
#define AF_WRITE_ACCESS_TYPE 0x2
#define AF_EXEC_ACCESS_TYPE 0x3
/* invalid page level */
#define AF_INV_LEVEL_1 0
#define AF_INV_LEVEL_2 1
#define AF_INV_LEVEL_3 2
#define AF_INV_LEVEL_4 3
/* fault status */
#define AF_STATUS_MISCONFIG 0x1
#define AF_STATUS_FOR 0x2
#define AF_STATUS_FOW 0x4
#define AF_STATUS_FOE 0x8
#define AF_STATUS_INV 0x10
#define KVM_MMU_CACHE_MIN_PAGES 2
static inline void kvm_set_aptpte_readonly(pte_t *pte)
{
pte_val(*pte) |= _PAGE_FOW;
}
static inline bool kvm_aptpte_readonly(pte_t *pte)
{
return (pte_val(*pte) & _PAGE_FOW) == _PAGE_FOW;
}
static inline void kvm_set_aptpmd_readonly(pmd_t *pmd)
{
pmd_val(*pmd) |= _PAGE_FOW;
}
static inline bool kvm_aptpmd_readonly(pmd_t *pmd)
{
return (pmd_val(*pmd) & _PAGE_FOW) == _PAGE_FOW;
}
static inline void kvm_set_aptpud_readonly(pud_t *pud)
{
pud_val(*pud) |= _PAGE_FOW;
}
static inline bool kvm_aptpud_readonly(pud_t *pud)
{
return (pud_val(*pud) & _PAGE_FOW) == _PAGE_FOW;
}
static inline pte_t kvm_pte_mkwrite(pte_t pte)
{
pte_val(pte) &= ~_PAGE_FOW;
return pte;
}
static inline pte_t kvm_pte_mkexec(pte_t pte)
{
pte_val(pte) &= ~_PAGE_FOE;
return pte;
}
static inline bool kvm_pte_exec(pte_t *pte)
{
return !(pte_val(*pte) & _PAGE_FOE);
}
static inline pmd_t kvm_pmd_mkwrite(pmd_t pmd)
{
pmd_val(pmd) &= ~_PAGE_FOW;
return pmd;
}
static inline pmd_t kvm_pmd_mkexec(pmd_t pmd)
{
pmd_val(pmd) &= ~_PAGE_FOE;
return pmd;
}
static inline bool kvm_pmd_exec(pmd_t *pmd)
{
return !(pmd_val(*pmd) & _PAGE_FOE);
}
static inline pud_t kvm_pud_mkwrite(pud_t pud)
{
pud_val(pud) &= ~_PAGE_FOW;
return pud;
}
static inline pud_t kvm_pud_mkexec(pud_t pud)
{
pud_val(pud) &= ~_PAGE_FOE;
return pud;
}
static inline bool kvm_pud_exec(pud_t *pud)
{
return !(pud_val(*pud) & _PAGE_FOE);
}
void kvm_core4_commit_memory_region(struct kvm *kvm,
const struct kvm_userspace_memory_region *mem,
const struct kvm_memory_slot *old,
const struct kvm_memory_slot *new,
enum kvm_mr_change change);
void kvm_core4_flush_shadow_memslot(struct kvm *kvm,
struct kvm_memory_slot *slot);
void kvm_core4_flush_shadow_all(struct kvm *kvm);
void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu);
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
void kvm_handle_apt_fault(struct kvm_vcpu *vcpu);
int kvm_alloc_addtional_stage_pgd(struct kvm *kvm);
void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
struct kvm_memory_slot *slot);
int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run);
void apt_unmap_vm(struct kvm *kvm);
#endif /* _ASM_SW64_KVM_MMU_H */