1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2020 - Google LLC 4 * Author: David Brazdil <dbrazdil@google.com> 5 */ 6 7 #include <asm/kvm_asm.h> 8 #include <asm/kvm_hyp.h> 9 #include <asm/kvm_mmu.h> 10 11 DEFINE_PER_CPU(int, hyp_cpu_number); 12 13 /* 14 * nVHE copy of data structures tracking available CPU cores. 15 * Only entries for CPUs that were online at KVM init are populated. 16 * Other CPUs should not be allowed to boot because their features were 17 * not checked against the finalized system capabilities. 18 */ 19 u64 __ro_after_init hyp_cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = INVALID_HWID }; 20 cpu_logical_map(unsigned int cpu)21u64 cpu_logical_map(unsigned int cpu) 22 { 23 BUG_ON(cpu >= ARRAY_SIZE(hyp_cpu_logical_map)); 24 25 return hyp_cpu_logical_map[cpu]; 26 } 27 28 unsigned long __ro_after_init kvm_arm_hyp_percpu_base[NR_CPUS]; 29 __hyp_per_cpu_offset(unsigned int cpu)30unsigned long __hyp_per_cpu_offset(unsigned int cpu) 31 { 32 unsigned long *cpu_base_array; 33 unsigned long this_cpu_base; 34 unsigned long elf_base; 35 36 BUG_ON(cpu >= ARRAY_SIZE(kvm_arm_hyp_percpu_base)); 37 38 cpu_base_array = (unsigned long *)&kvm_arm_hyp_percpu_base; 39 this_cpu_base = kern_hyp_va(cpu_base_array[cpu]); 40 elf_base = (unsigned long)&__per_cpu_start; 41 return this_cpu_base - elf_base; 42 } 43