blob: 918cdc3839ea52b93525d564d0ab7b5542a679e7 [file] [log] [blame]
David Brazdil0f672f62019-12-10 10:32:29 +00001// SPDX-License-Identifier: GPL-2.0-only
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002/*
3 * Based on the x86 implementation.
4 *
5 * Copyright (C) 2012 ARM Ltd.
6 * Author: Marc Zyngier <marc.zyngier@arm.com>
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00007 */
8
9#include <linux/perf_event.h>
10#include <linux/kvm_host.h>
11
12#include <asm/kvm_emulate.h>
13
14static int kvm_is_in_guest(void)
15{
16 return kvm_arm_get_running_vcpu() != NULL;
17}
18
19static int kvm_is_user_mode(void)
20{
21 struct kvm_vcpu *vcpu;
22
23 vcpu = kvm_arm_get_running_vcpu();
24
25 if (vcpu)
26 return !vcpu_mode_priv(vcpu);
27
28 return 0;
29}
30
31static unsigned long kvm_get_guest_ip(void)
32{
33 struct kvm_vcpu *vcpu;
34
35 vcpu = kvm_arm_get_running_vcpu();
36
37 if (vcpu)
38 return *vcpu_pc(vcpu);
39
40 return 0;
41}
42
43static struct perf_guest_info_callbacks kvm_guest_cbs = {
44 .is_in_guest = kvm_is_in_guest,
45 .is_user_mode = kvm_is_user_mode,
46 .get_guest_ip = kvm_get_guest_ip,
47};
48
49int kvm_perf_init(void)
50{
51 return perf_register_guest_info_callbacks(&kvm_guest_cbs);
52}
53
54int kvm_perf_teardown(void)
55{
56 return perf_unregister_guest_info_callbacks(&kvm_guest_cbs);
57}