#include <linux/kvm_host.h>
#include "mmu.h"
#include "spte.h"
Go to the source code of this file.
|
#define | for_each_tdp_pte_min_level(iter, root, min_level, start, end) |
|
#define | for_each_tdp_pte(iter, root, start, end) for_each_tdp_pte_min_level(iter, root, PG_LEVEL_4K, start, end) |
|
|
static u64 | kvm_tdp_mmu_read_spte (tdp_ptep_t sptep) |
|
static u64 | kvm_tdp_mmu_write_spte_atomic (tdp_ptep_t sptep, u64 new_spte) |
|
static void | __kvm_tdp_mmu_write_spte (tdp_ptep_t sptep, u64 new_spte) |
|
static bool | kvm_tdp_mmu_spte_need_atomic_write (u64 old_spte, int level) |
|
static u64 | kvm_tdp_mmu_write_spte (tdp_ptep_t sptep, u64 old_spte, u64 new_spte, int level) |
|
static u64 | tdp_mmu_clear_spte_bits (tdp_ptep_t sptep, u64 old_spte, u64 mask, int level) |
|
tdp_ptep_t | spte_to_child_pt (u64 pte, int level) |
|
void | tdp_iter_start (struct tdp_iter *iter, struct kvm_mmu_page *root, int min_level, gfn_t next_last_level_gfn) |
|
void | tdp_iter_next (struct tdp_iter *iter) |
|
void | tdp_iter_restart (struct tdp_iter *iter) |
|
◆ for_each_tdp_pte
◆ for_each_tdp_pte_min_level
#define for_each_tdp_pte_min_level |
( |
|
iter, |
|
|
|
root, |
|
|
|
min_level, |
|
|
|
start, |
|
|
|
end |
|
) |
| |
Value:
iter.valid && iter.gfn < end; \
tdp_iter_next(&iter))
void tdp_iter_start(struct tdp_iter *iter, struct kvm_mmu_page *root, int min_level, gfn_t next_last_level_gfn)
Definition at line 123 of file tdp_iter.h.
◆ __kvm_tdp_mmu_write_spte()
static void __kvm_tdp_mmu_write_spte |
( |
tdp_ptep_t |
sptep, |
|
|
u64 |
new_spte |
|
) |
| |
|
inlinestatic |
Definition at line 27 of file tdp_iter.h.
29 WRITE_ONCE(*rcu_dereference(sptep), new_spte);
◆ kvm_tdp_mmu_read_spte()
static u64 kvm_tdp_mmu_read_spte |
( |
tdp_ptep_t |
sptep | ) |
|
|
inlinestatic |
Definition at line 17 of file tdp_iter.h.
19 return READ_ONCE(*rcu_dereference(sptep));
◆ kvm_tdp_mmu_spte_need_atomic_write()
static bool kvm_tdp_mmu_spte_need_atomic_write |
( |
u64 |
old_spte, |
|
|
int |
level |
|
) |
| |
|
inlinestatic |
Definition at line 44 of file tdp_iter.h.
bool spte_has_volatile_bits(u64 spte)
static bool is_last_spte(u64 pte, int level)
static bool is_shadow_present_pte(u64 pte)
◆ kvm_tdp_mmu_write_spte()
static u64 kvm_tdp_mmu_write_spte |
( |
tdp_ptep_t |
sptep, |
|
|
u64 |
old_spte, |
|
|
u64 |
new_spte, |
|
|
int |
level |
|
) |
| |
|
inlinestatic |
Definition at line 51 of file tdp_iter.h.
static u64 kvm_tdp_mmu_write_spte_atomic(tdp_ptep_t sptep, u64 new_spte)
static void __kvm_tdp_mmu_write_spte(tdp_ptep_t sptep, u64 new_spte)
static bool kvm_tdp_mmu_spte_need_atomic_write(u64 old_spte, int level)
◆ kvm_tdp_mmu_write_spte_atomic()
static u64 kvm_tdp_mmu_write_spte_atomic |
( |
tdp_ptep_t |
sptep, |
|
|
u64 |
new_spte |
|
) |
| |
|
inlinestatic |
Definition at line 22 of file tdp_iter.h.
24 return xchg(rcu_dereference(sptep), new_spte);
◆ spte_to_child_pt()
tdp_ptep_t spte_to_child_pt |
( |
u64 |
pte, |
|
|
int |
level |
|
) |
| |
Definition at line 62 of file tdp_iter.c.
static kvm_pfn_t spte_to_pfn(u64 pte)
◆ tdp_iter_next()
void tdp_iter_next |
( |
struct tdp_iter * |
iter | ) |
|
Definition at line 161 of file tdp_iter.c.
static bool try_step_up(struct tdp_iter *iter)
static bool try_step_side(struct tdp_iter *iter)
static bool try_step_down(struct tdp_iter *iter)
void tdp_iter_restart(struct tdp_iter *iter)
◆ tdp_iter_restart()
void tdp_iter_restart |
( |
struct tdp_iter * |
iter | ) |
|
Definition at line 23 of file tdp_iter.c.
static gfn_t gfn_round_for_level(gfn_t gfn, int level)
gfn_t next_last_level_gfn
static void tdp_iter_refresh_sptep(struct tdp_iter *iter)
◆ tdp_iter_start()
void tdp_iter_start |
( |
struct tdp_iter * |
iter, |
|
|
struct kvm_mmu_page * |
root, |
|
|
int |
min_level, |
|
|
gfn_t |
next_last_level_gfn |
|
) |
| |
Definition at line 39 of file tdp_iter.c.
42 if (WARN_ON_ONCE(!root || (root->
role.level < 1) ||
43 (root->
role.level > PT64_ROOT_MAX_LEVEL))) {
static int kvm_mmu_page_as_id(struct kvm_mmu_page *sp)
union kvm_mmu_page_role role
tdp_ptep_t pt_path[PT64_ROOT_MAX_LEVEL]
◆ tdp_mmu_clear_spte_bits()
static u64 tdp_mmu_clear_spte_bits |
( |
tdp_ptep_t |
sptep, |
|
|
u64 |
old_spte, |
|
|
u64 |
mask, |
|
|
int |
level |
|
) |
| |
|
inlinestatic |
Definition at line 61 of file tdp_iter.h.
64 atomic64_t *sptep_atomic;
67 sptep_atomic = (atomic64_t *)rcu_dereference(sptep);
68 return (u64)atomic64_fetch_and(~mask, sptep_atomic);