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>
12 #include <asm/spectre.h>
24 struct memblock_region
hyp_memory[HYP_MEMBLOCK_REGIONS];
36 unsigned long phys,
enum kvm_pgtable_prot prot)
94 enum kvm_pgtable_prot prot,
100 size = PAGE_ALIGN(
size + offset_in_page(phys));
109 *haddr = addr + offset_in_page(phys);
115 unsigned long start = (
unsigned long)from;
116 unsigned long end = (
unsigned long)to;
117 unsigned long virt_addr;
122 start = start & PAGE_MASK;
125 for (virt_addr = start; virt_addr <
end; virt_addr += PAGE_SIZE) {
151 unsigned long i, start,
size,
end = 0;
162 start = max(start,
end);
187 case HYP_VECTOR_DIRECT: {
188 vector = __kvm_hyp_vector;
191 case HYP_VECTOR_SPECTRE_DIRECT: {
192 vector = __bp_harden_hyp_vecs;
195 case HYP_VECTOR_INDIRECT:
196 case HYP_VECTOR_SPECTRE_INDIRECT: {
204 vector = __kvm_vector_slot2addr(vector, slot);
205 *this_cpu_ptr(&kvm_hyp_vector) = (
unsigned long)vector;
213 unsigned long bp_base;
216 if (!kvm_system_needs_idmapped_vectors()) {
221 phys = __hyp_pa(__bp_harden_hyp_vecs);
223 PAGE_HYP_EXEC, &bp_base);
238 pte &= ~kvm_phys_to_pte(KVM_PHYS_INVALID);
239 pte |= kvm_phys_to_pte(phys) | KVM_PTE_VALID;
240 WRITE_ONCE(*
ptep, pte);
243 return (
void *)slot->
addr;
251 WRITE_ONCE(*
ptep, *
ptep & ~KVM_PTE_VALID);
263 __tlbi_level(vale2is, __TLBI_VADDR(
addr, 0), KVM_PGTABLE_LAST_LEVEL);
274 enum kvm_pgtable_walk_flags visit)
276 struct hyp_fixmap_slot *slot = per_cpu_ptr(&fixmap_slots, (u64)ctx->arg);
278 if (!kvm_pte_valid(ctx->old) || ctx->level != KVM_PGTABLE_LAST_LEVEL)
281 slot->
addr = ctx->addr;
282 slot->
ptep = ctx->ptep;
296 struct kvm_pgtable_walker walker = {
298 .flags = KVM_PGTABLE_WALK_LEAF,
307 unsigned long addr, i;
316 __hyp_pa(__hyp_bss_start), PAGE_HYP);
330 unsigned long start,
end;
333 start = ALIGN_DOWN(start, PAGE_SIZE);
336 end = ALIGN(
end, PAGE_SIZE);
355 unsigned long addr, prev_base;
366 size = PAGE_SIZE * 2;
381 PAGE_SIZE, phys, PAGE_HYP);
387 *haddr = addr +
size;
394 struct kvm_hyp_memcache *host_mc = arg;
396 if (!host_mc->nr_pages)
413 struct kvm_hyp_memcache *host_mc)
415 struct kvm_hyp_memcache tmp = *host_mc;
int __pkvm_host_donate_hyp(u64 pfn, u64 nr_pages)
unsigned long hyp_nr_cpus
static void * hyp_phys_to_virt(phys_addr_t phys)
#define hyp_phys_to_page(phys)
#define hyp_phys_to_pfn(phys)
static phys_addr_t hyp_virt_to_phys(void *addr)
void hyp_fixmap_unmap(void)
static void fixmap_clear_slot(struct hyp_fixmap_slot *slot)
int pkvm_create_mappings_locked(void *from, void *to, enum kvm_pgtable_prot prot)
struct memblock_region hyp_memory[HYP_MEMBLOCK_REGIONS]
int pkvm_create_stack(phys_addr_t phys, unsigned long *haddr)
static void * admit_host_page(void *arg)
int refill_memcache(struct kvm_hyp_memcache *mc, unsigned long min_pages, struct kvm_hyp_memcache *host_mc)
hyp_spinlock_t pkvm_pgd_lock
static int create_fixmap_slot(u64 addr, u64 cpu)
int hyp_create_idmap(u32 hyp_va_bits)
static int __pkvm_create_mappings(unsigned long start, unsigned long size, unsigned long phys, enum kvm_pgtable_prot prot)
struct kvm_pgtable pkvm_pgtable
int hyp_map_vectors(void)
int pkvm_cpu_set_vector(enum arm64_hyp_spectre_vector slot)
int hyp_create_pcpu_fixmap(void)
int pkvm_create_mappings(void *from, void *to, enum kvm_pgtable_prot prot)
static int __pkvm_alloc_private_va_range(unsigned long start, size_t size)
static DEFINE_PER_CPU(struct hyp_fixmap_slot, fixmap_slots)
int pkvm_alloc_private_va_range(size_t size, unsigned long *haddr)
int hyp_back_vmemmap(phys_addr_t back)
void * hyp_fixmap_map(phys_addr_t phys)
unsigned int hyp_memblock_nr
int __pkvm_create_private_mapping(phys_addr_t phys, size_t size, enum kvm_pgtable_prot prot, unsigned long *haddr)
static void * __hyp_bp_vect_base
static int __create_fixmap_slot_cb(const struct kvm_pgtable_visit_ctx *ctx, enum kvm_pgtable_walk_flags visit)
int kvm_pgtable_walk(struct kvm_pgtable *pgt, u64 addr, u64 size, struct kvm_pgtable_walker *walker)
int kvm_pgtable_hyp_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 phys, enum kvm_pgtable_prot prot)
static void hyp_spin_unlock(hyp_spinlock_t *lock)
static void hyp_assert_lock_held(hyp_spinlock_t *lock)
static void hyp_spin_lock(hyp_spinlock_t *lock)