17
17
#include <nvhe/mm.h>
18
18
#include <nvhe/pkvm.h>
19
19
#include <nvhe/trap_handler.h>
20
+ #include <nvhe/kcov.h>
20
21
21
22
DEFINE_PER_CPU (struct kvm_nvhe_init_params , kvm_init_params );
22
23
@@ -294,6 +295,40 @@ static void handle___pkvm_teardown_vm(struct kvm_cpu_context *host_ctxt)
294
295
cpu_reg (host_ctxt , 1 ) = __pkvm_teardown_vm (handle );
295
296
}
296
297
298
+ static void handle___pkvm_kcov_init_buffer (struct kvm_cpu_context * host_ctxt )
299
+ {
300
+ DECLARE_REG (uint , size , host_ctxt , 1 );
301
+
302
+ cpu_reg (host_ctxt , 1 ) = __pkvm_kcov_init_buffer (size );
303
+ }
304
+
305
+ static void handle___pkvm_kcov_buffer_add_page (struct kvm_cpu_context * host_ctxt )
306
+ {
307
+ DECLARE_REG (u64 , index , host_ctxt , 1 );
308
+ DECLARE_REG (u64 , pfn , host_ctxt , 2 );
309
+
310
+ cpu_reg (host_ctxt , 1 ) = __pkvm_kcov_buffer_add_page (index , pfn );
311
+ }
312
+
313
+ static void handle___pkvm_kcov_teardown_buffer (struct kvm_cpu_context * host_ctxt )
314
+ {
315
+ DECLARE_REG (u64 , index , host_ctxt , 1 );
316
+
317
+ cpu_reg (host_ctxt , 1 ) = __pkvm_kcov_teardown_buffer (index );
318
+ }
319
+
320
+ static void handle___pkvm_kcov_enable (struct kvm_cpu_context * host_ctxt )
321
+ {
322
+ DECLARE_REG (u64 , index , host_ctxt , 1 );
323
+
324
+ cpu_reg (host_ctxt , 1 ) = __pkvm_kcov_enable (index );
325
+ }
326
+
327
+ static void handle___pkvm_kcov_disable (struct kvm_cpu_context * host_ctxt )
328
+ {
329
+ cpu_reg (host_ctxt , 1 ) = __pkvm_kcov_disable ();
330
+ }
331
+
297
332
typedef void (* hcall_t )(struct kvm_cpu_context * );
298
333
299
334
#define HANDLE_FUNC (x ) [__KVM_HOST_SMCCC_FUNC_##x] = (hcall_t)handle_##x
@@ -326,6 +361,12 @@ static const hcall_t host_hcall[] = {
326
361
HANDLE_FUNC (__pkvm_init_vm ),
327
362
HANDLE_FUNC (__pkvm_init_vcpu ),
328
363
HANDLE_FUNC (__pkvm_teardown_vm ),
364
+
365
+ HANDLE_FUNC (__pkvm_kcov_init_buffer ),
366
+ HANDLE_FUNC (__pkvm_kcov_buffer_add_page ),
367
+ HANDLE_FUNC (__pkvm_kcov_teardown_buffer ),
368
+ HANDLE_FUNC (__pkvm_kcov_enable ),
369
+ HANDLE_FUNC (__pkvm_kcov_disable ),
329
370
};
330
371
331
372
static void handle_host_hcall (struct kvm_cpu_context * host_ctxt )
@@ -384,6 +425,8 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)
384
425
{
385
426
u64 esr = read_sysreg_el2 (SYS_ESR );
386
427
428
+ pkvm_kcov_enter_from_host ();
429
+
387
430
switch (ESR_ELx_EC (esr )) {
388
431
case ESR_ELx_EC_HVC64 :
389
432
handle_host_hcall (host_ctxt );
@@ -403,4 +446,5 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)
403
446
default :
404
447
BUG ();
405
448
}
449
+ pkvm_kcov_exit_to_host ();
406
450
}
0 commit comments