1 #include <asm/kvm_pgtable.h>
2 #include <linux/kvm_host.h>
3 #include <linux/arm-smccc.h>
4
5 #define HCALL_HANDLED 0
6 #define HCALL_UNHANDLED -1
7
8 int __pkvm_register_host_smc_handler(bool (*cb)(struct user_pt_regs *));
9 int __pkvm_register_default_trap_handler(bool (*cb)(struct user_pt_regs *));
10 int __pkvm_register_illegal_abt_notifier(void (*cb)(struct user_pt_regs *));
11 int __pkvm_register_hyp_panic_notifier(void (*cb)(struct user_pt_regs *));
12 int __pkvm_register_unmask_serror(bool (*unmask)(void), void (*mask)(void));
13
14 enum pkvm_psci_notification;
15 int __pkvm_register_psci_notifier(void (*cb)(enum pkvm_psci_notification, struct user_pt_regs *));
16
17 #ifdef CONFIG_MODULES
18 int __pkvm_init_module(void *host_mod);
19 int __pkvm_register_hcall(unsigned long hfn_hyp_va);
20 int handle_host_dynamic_hcall(struct user_pt_regs *regs, int id);
21 void __pkvm_close_module_registration(void);
22 bool module_handle_host_perm_fault(struct user_pt_regs *regs, u64 esr, u64 addr);
23 bool module_handle_host_smc(struct user_pt_regs *regs);
24 bool module_handle_guest_smc(struct arm_smccc_1_2_regs *regs, struct arm_smccc_1_2_regs *res,
25 pkvm_handle_t handle);
26 const uuid_t *module_get_guest_trng_uuid(void);
27 u64 module_get_guest_trng_rng(u64 *entropy, int nbits);
28 #else
__pkvm_init_module(void * module_init)29 static inline int __pkvm_init_module(void *module_init) { return -EOPNOTSUPP; }
30 static inline int
__pkvm_register_hcall(unsigned long hfn_hyp_va)31 __pkvm_register_hcall(unsigned long hfn_hyp_va) { return -EOPNOTSUPP; }
32 static inline int
handle_host_dynamic_hcall(struct kvm_cpu_context * host_ctxt,int id)33 handle_host_dynamic_hcall(struct kvm_cpu_context *host_ctxt, int id)
34 {
35 return HCALL_UNHANDLED;
36 }
__pkvm_close_module_registration(void)37 static inline void __pkvm_close_module_registration(void) { }
module_handle_host_perm_fault(struct user_pt_regs * regs,u64 esr,u64 addr)38 bool module_handle_host_perm_fault(struct user_pt_regs *regs, u64 esr, u64 addr) { return false; }
module_handle_host_smc(struct user_pt_regs * regs)39 bool module_handle_host_smc(struct user_pt_regs *regs) { return false; }
module_handle_guest_smc(struct arm_smccc_1_2_regs * regs,struct arm_smccc_1_2_regs * res,pkvm_handle_t handle)40 bool module_handle_guest_smc(struct arm_smccc_1_2_regs *regs, struct arm_smccc_1_2_regs *res,
41 pkvm_handle_t handle)
42 {
43 return false;
44 }
45 #endif
46