PG_LEVEL_4K
case PG_LEVEL_4K:
accept_size = try_accept_one(start, len, PG_LEVEL_4K);
if (level != PG_LEVEL_4K)
if (WARN_ON(!pte || level != PG_LEVEL_4K))
#define KVM_NR_PAGE_SIZES (KVM_MAX_HUGEPAGE_LEVEL - PG_LEVEL_4K + 1)
#define RMP_TO_PG_LEVEL(level) (((level) == RMP_PG_SIZE_4K) ? PG_LEVEL_4K : PG_LEVEL_2M)
#define PG_LEVEL_TO_RMP(level) (((level) == PG_LEVEL_4K) ? RMP_PG_SIZE_4K : RMP_PG_SIZE_2M)
return &slot->arch.rmap[level - PG_LEVEL_4K][idx];
PG_LEVEL_4K, slot);
PG_LEVEL_4K, slot);
kvm_mmu_try_split_huge_pages(kvm, slot, start, end + 1, PG_LEVEL_4K);
return kvm_mmu_slot_gfn_write_protect(vcpu->kvm, slot, gfn, PG_LEVEL_4K);
return walk_slot_rmaps(kvm, slot, fn, PG_LEVEL_4K, PG_LEVEL_4K, flush_on_yield);
PG_LEVEL_4K, KVM_MAX_HUGEPAGE_LEVEL,
for (level = PG_LEVEL_4K; level <= KVM_MAX_HUGEPAGE_LEVEL; level++) {
if (level == PG_LEVEL_4K)
WARN_ON_ONCE(level == PG_LEVEL_4K);
if (role.level > PG_LEVEL_4K && sp->unsync)
WARN_ON_ONCE(role.level != PG_LEVEL_4K);
if (iterator->level < PG_LEVEL_4K)
WARN_ON_ONCE(parent_sp->role.level == PG_LEVEL_4K);
if (parent->role.level == PG_LEVEL_4K)
WARN_ON_ONCE(sp->role.level != PG_LEVEL_4K);
if (level > PG_LEVEL_4K && !is_large_pte(*sptep)) {
if (sp->role.level > PG_LEVEL_4K)
int level = PG_LEVEL_4K;
order != KVM_HPAGE_GFN_SHIFT(PG_LEVEL_4K));
return PG_LEVEL_4K;
max_level = PG_LEVEL_4K;
if (max_level == PG_LEVEL_4K)
for ( ; max_level > PG_LEVEL_4K; max_level--) {
if (max_level == PG_LEVEL_4K)
return PG_LEVEL_4K;
if (unlikely(fault->max_level == PG_LEVEL_4K))
if (fault->req_level == PG_LEVEL_4K || fault->huge_page_disallowed)
if (cur_level > PG_LEVEL_4K &&
if (sp->role.level > PG_LEVEL_4K &&
u8 level = PG_LEVEL_4K;
.max_level = PG_LEVEL_4K,
.req_level = PG_LEVEL_4K,
.goal_level = PG_LEVEL_4K,
if (sp->role.level == PG_LEVEL_4K)
if (gentry && sp->role.level != PG_LEVEL_4K)
PG_LEVEL_4K, KVM_MAX_HUGEPAGE_LEVEL - 1, true))
if (sp->role.level > PG_LEVEL_4K)
if (kvm_mmu_slot_gfn_write_protect(kvm, slot, gfn, PG_LEVEL_4K))
kvm_flush_remote_tlbs_gfn(kvm, gfn, PG_LEVEL_4K);
if (sp->role.level > PG_LEVEL_4K)
.req_level = PG_LEVEL_4K,
.goal_level = PG_LEVEL_4K,
if (kvm_mmu_slot_gfn_write_protect(kvm, slot, gfn, PG_LEVEL_4K))
index = gfn_to_index(gfn, slot->base_gfn, PG_LEVEL_4K);
index = gfn_to_index(gfn, slot->base_gfn, PG_LEVEL_4K);
if (FNAME(is_rsvd_bits_set)(vcpu->arch.mmu, gpte, PG_LEVEL_4K))
gpte |= level - PG_LEVEL_4K - 1;
if (walker->level > PG_LEVEL_4K && is_cpuid_PSE36())
if (level == PG_LEVEL_4K) {
if (sp->role.level > PG_LEVEL_4K)
#define gpte_to_gfn(pte) gpte_to_gfn_lvl((pte), PG_LEVEL_4K)
WARN_ON_ONCE(sp->role.level != PG_LEVEL_4K);
if (level > PG_LEVEL_4K && is_nx_huge_page_enabled(vcpu->kvm)) {
if (level > PG_LEVEL_4K)
WARN_ON_ONCE(level > PG_LEVEL_4K);
if (role.level == PG_LEVEL_4K) {
KVM_BUG_ON(!is_shadow_present_pte(small_spte) || level == PG_LEVEL_4K, kvm);
return (level == PG_LEVEL_4K) || is_large_pte(pte);
for_each_tdp_pte_min_level(iter, kvm, root, PG_LEVEL_4K, start, end)
if (iter.level > PG_LEVEL_4K ||
WARN_ON_ONCE(level < PG_LEVEL_4K);
__tdp_mmu_zap_root(kvm, root, shared, PG_LEVEL_4K);
for_each_tdp_pte_min_level(iter, kvm, root, PG_LEVEL_4K, start, end) {
ret = rmp_make_private(pfn, gfn << PAGE_SHIFT, PG_LEVEL_4K,
fw_args.page_size = PG_LEVEL_TO_RMP(PG_LEVEL_4K);
ret = rmp_make_private(pfn, INITIAL_VMSA_GPA, PG_LEVEL_4K, sev->asid, true);
if (kvm_rmp_make_shared(vcpu->kvm, pfn, PG_LEVEL_4K))
if (kvm_rmp_make_shared(kvm, pfn, PG_LEVEL_4K))
if (rmp_level == PG_LEVEL_4K)
assigned && rmp_level == PG_LEVEL_4K)
return PG_LEVEL_4K;
if (max_level_for_order(order) > PG_LEVEL_4K &&
level = PG_LEVEL_4K;
rmp_level > PG_LEVEL_4K;
if (!use_2m_update && rmp_level > PG_LEVEL_4K) {
rc = rmp_make_shared(pfn, use_2m_update ? PG_LEVEL_2M : PG_LEVEL_4K);
return PG_LEVEL_4K;
return PG_LEVEL_4K;
if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
if (KVM_BUG_ON(level != PG_LEVEL_4K, kvm))
return PG_LEVEL_4K;
kvm_mmu_slot_try_split_huge_pages(kvm, new, PG_LEVEL_4K);
kvm_mmu_slot_remove_write_access(kvm, new, PG_LEVEL_4K);
update_page_count(PG_LEVEL_4K, pages_4k);
update_page_count(PG_LEVEL_4K, -pages);
update_page_count(PG_LEVEL_4K, pages);
case PG_LEVEL_4K:
case PG_LEVEL_4K:
if (level == PG_LEVEL_4K) {
if (level != PG_LEVEL_4K) {
direct_pages_count[PG_LEVEL_4K] << 2);
if (level == PG_LEVEL_4K) {
if (lookup_address(start, &level) && (level != PG_LEVEL_4K))
*level = PG_LEVEL_4K;
if (!pte || WARN_ON(level != PG_LEVEL_4K) || pte_none(*pte))
if (level == PG_LEVEL_4K)
BUG_ON(!ptep || level != PG_LEVEL_4K);
BUG_ON(!ptep || level != PG_LEVEL_4K);
BUG_ON(!ptep || level != PG_LEVEL_4K);
BUG_ON(!ptep || level != PG_LEVEL_4K);
PG_LEVEL_4K, 0, true))
if (rmp_make_private(sla_to_pfn(ret), 0, PG_LEVEL_4K, 0, true))
ret = rmp_make_shared(__phys_to_pfn(paddr), PG_LEVEL_4K);
rc = rmp_make_private(pfn, 0, PG_LEVEL_4K, 0, true);
if (level > PG_LEVEL_4K) {
return rmp_make_shared(pfn, PG_LEVEL_4K);
#define PG_SIZE_4K PG_LEVEL_SIZE(PG_LEVEL_4K)
current_level > PG_LEVEL_4K;
pte = virt_get_pte(vm, mmu, pte, gva, PG_LEVEL_4K);
__virt_pg_map(vm, &vm->mmu, gva, gpa, PG_LEVEL_4K);
current_level > PG_LEVEL_4K;
return virt_get_pte(vm, mmu, pte, gva, PG_LEVEL_4K);
int level = PG_LEVEL_4K;
int level = PG_LEVEL_4K;
__tdp_map(vm, l2_gpa, gpa, size, PG_LEVEL_4K);
virt_map_level(vm, HPAGE_GVA, HPAGE_GPA, nr_bytes, PG_LEVEL_4K);