7 #include <linux/kvm_host.h>
8 #include <asm/kvm_hyp.h>
9 #include <asm/kvm_mmu.h>
10 #include <asm/kvm_pgtable.h>
11 #include <asm/kvm_pkvm.h>
25 #define hyp_percpu_size ((unsigned long)__per_cpu_end - \
26 (unsigned long)__per_cpu_start)
38 unsigned long nr_pages;
42 nr_pages = hyp_vmemmap_pages(
sizeof(
struct hyp_page));
47 nr_pages = hyp_vm_table_pages();
52 nr_pages = hyp_s1_pgtable_pages();
57 nr_pages = host_s2_pgtable_pages();
62 nr_pages = hyp_ffa_proxy_pages();
71 unsigned long *per_cpu_base,
75 unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT;
76 enum kvm_pgtable_prot prot;
115 struct kvm_nvhe_init_params *params = per_cpu_ptr(&kvm_init_params, i);
117 start = (
void *)kern_hyp_va(per_cpu_base[i]);
148 struct kvm_nvhe_init_params *params;
152 params = per_cpu_ptr(&kvm_init_params, i);
154 dcache_clean_inval_poc((
unsigned long)params,
155 (
unsigned long)params +
sizeof(*params));
175 enum kvm_pgtable_walk_flags visit)
177 enum kvm_pgtable_prot prot;
181 if (!kvm_pte_valid(ctx->old))
184 if (ctx->level != KVM_PGTABLE_LAST_LEVEL)
187 phys = kvm_pte_to_phys(ctx->old);
213 enum kvm_pgtable_walk_flags visit)
220 if (kvm_pte_valid(ctx->old))
221 ctx->mm_ops->get_page(ctx->ptep);
228 struct kvm_pgtable_walker walker = {
230 .flags = KVM_PGTABLE_WALK_LEAF,
248 struct kvm_pgtable_walker walker = {
250 .flags = KVM_PGTABLE_WALK_LEAF | KVM_PGTABLE_WALK_TABLE_POST,
260 struct kvm_host_data *host_data = this_cpu_ptr(&kvm_host_data);
261 struct kvm_cpu_context *host_ctxt = &host_data->host_ctxt;
262 unsigned long nr_pages, reserved_pages, pfn;
267 nr_pages = hyp_s1_pgtable_pages();
315 unsigned long *per_cpu_base, u32 hyp_va_bits)
317 struct kvm_nvhe_init_params *params;
319 void (*fn)(phys_addr_t params_pa,
void *finalize_fn_va);
324 if (!PAGE_ALIGNED(phys) || !PAGE_ALIGNED(
size))
341 params = this_cpu_ptr(&kvm_init_params);
342 fn = (typeof(fn))__hyp_pa(__pkvm_init_switch_pgd);
struct vgic_global kvm_vgic_global_state
struct kvm_pgtable_mm_ops hyp_early_alloc_mm_ops
unsigned long hyp_early_alloc_nr_used_pages(void)
void * hyp_early_alloc_contig(unsigned int nr_pages)
void hyp_early_alloc_init(void *virt, unsigned long size)
int hyp_ffa_init(void *pages)
int kvm_check_pvm_sysreg_table(void)
int hyp_pool_init(struct hyp_pool *pool, u64 pfn, unsigned int nr_pages, unsigned int reserved_pages)
void hyp_get_page(struct hyp_pool *pool, void *addr)
void * hyp_alloc_pages(struct hyp_pool *pool, unsigned short order)
void hyp_put_page(struct hyp_pool *pool, void *addr)
static enum pkvm_page_state pkvm_getstate(enum kvm_pgtable_prot prot)
static enum kvm_pgtable_prot pkvm_mkstate(enum kvm_pgtable_prot prot, enum pkvm_page_state state)
bool addr_is_memory(phys_addr_t phys)
int host_stage2_idmap_locked(phys_addr_t addr, u64 size, enum kvm_pgtable_prot prot)
@ PKVM_PAGE_SHARED_BORROWED
int kvm_host_prepare_stage2(void *pgt_pool_base)
int host_stage2_set_owner_locked(phys_addr_t addr, u64 size, u8 owner_id)
static void * hyp_phys_to_virt(phys_addr_t phys)
static int hyp_page_count(void *addr)
static phys_addr_t hyp_virt_to_phys(void *addr)
#define hyp_virt_to_pfn(virt)
struct memblock_region hyp_memory[HYP_MEMBLOCK_REGIONS]
unsigned int hyp_memblock_nr
int pkvm_create_stack(phys_addr_t phys, unsigned long *haddr)
hyp_spinlock_t pkvm_pgd_lock
int hyp_create_idmap(u32 hyp_va_bits)
struct kvm_pgtable pkvm_pgtable
int hyp_map_vectors(void)
int hyp_create_pcpu_fixmap(void)
int pkvm_create_mappings(void *from, void *to, enum kvm_pgtable_prot prot)
int hyp_back_vmemmap(phys_addr_t back)
int kvm_pgtable_walk(struct kvm_pgtable *pgt, u64 addr, u64 size, struct kvm_pgtable_walker *walker)
int kvm_pgtable_hyp_init(struct kvm_pgtable *pgt, u32 va_bits, struct kvm_pgtable_mm_ops *mm_ops)
enum kvm_pgtable_prot kvm_pgtable_hyp_pte_prot(kvm_pte_t pte)
void pkvm_hyp_vm_table_init(void *tbl)
void __noreturn __host_enter(struct kvm_cpu_context *host_ctxt)
static void * host_s2_pgt_base
static int fix_hyp_pgtable_refcnt(void)
static void * hyp_zalloc_hyp_page(void *arg)
int __pkvm_init(phys_addr_t phys, unsigned long size, unsigned long nr_cpus, unsigned long *per_cpu_base, u32 hyp_va_bits)
static void hpool_get_page(void *addr)
static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size, unsigned long *per_cpu_base, u32 hyp_va_bits)
static void * ffa_proxy_pages
static void * hyp_pgt_base
unsigned long hyp_nr_cpus
void __noreturn __pkvm_init_finalise(void)
static int divide_memory_pool(void *virt, unsigned long size)
static int fix_host_ownership_walker(const struct kvm_pgtable_visit_ctx *ctx, enum kvm_pgtable_walk_flags visit)
static struct hyp_pool hpool
static int fix_hyp_pgtable_refcnt_walker(const struct kvm_pgtable_visit_ctx *ctx, enum kvm_pgtable_walk_flags visit)
static struct kvm_pgtable_mm_ops pkvm_pgtable_mm_ops
static int fix_host_ownership(void)
static void hpool_put_page(void *addr)
static void * vm_table_base
static void * vmemmap_base
static void update_nvhe_init_params(void)
#define hyp_spin_lock_init(l)