|
@@ -835,36 +835,45 @@ static int process_sample_event(struct perf_tool *tool,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid)
|
|
|
+{
|
|
|
+ if (strstr(cpuid, "Intel")) {
|
|
|
+ kvm->exit_reasons = vmx_exit_reasons;
|
|
|
+ kvm->exit_reasons_isa = "VMX";
|
|
|
+ } else if (strstr(cpuid, "AMD")) {
|
|
|
+ kvm->exit_reasons = svm_exit_reasons;
|
|
|
+ kvm->exit_reasons_isa = "SVM";
|
|
|
+ } else
|
|
|
+ return -ENOTSUP;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int cpu_isa_config(struct perf_kvm_stat *kvm)
|
|
|
{
|
|
|
char buf[64], *cpuid;
|
|
|
- int err, isa;
|
|
|
+ int err;
|
|
|
|
|
|
if (kvm->live) {
|
|
|
err = get_cpuid(buf, sizeof(buf));
|
|
|
if (err != 0) {
|
|
|
- pr_err("Failed to look up CPU type (Intel or AMD)\n");
|
|
|
+ pr_err("Failed to look up CPU type\n");
|
|
|
return err;
|
|
|
}
|
|
|
cpuid = buf;
|
|
|
} else
|
|
|
cpuid = kvm->session->header.env.cpuid;
|
|
|
|
|
|
- if (strstr(cpuid, "Intel"))
|
|
|
- isa = 1;
|
|
|
- else if (strstr(cpuid, "AMD"))
|
|
|
- isa = 0;
|
|
|
- else {
|
|
|
- pr_err("CPU %s is not supported.\n", cpuid);
|
|
|
- return -ENOTSUP;
|
|
|
+ if (!cpuid) {
|
|
|
+ pr_err("Failed to look up CPU type\n");
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (isa == 1) {
|
|
|
- kvm->exit_reasons = vmx_exit_reasons;
|
|
|
- kvm->exit_reasons_isa = "VMX";
|
|
|
- }
|
|
|
+ err = cpu_isa_init(kvm, cpuid);
|
|
|
+ if (err == -ENOTSUP)
|
|
|
+ pr_err("CPU %s is not supported.\n", cpuid);
|
|
|
|
|
|
- return 0;
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static bool verify_vcpu(int vcpu)
|
|
@@ -1583,8 +1592,6 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
|
|
|
.report_event = "vmexit",
|
|
|
.sort_key = "sample",
|
|
|
|
|
|
- .exit_reasons = svm_exit_reasons,
|
|
|
- .exit_reasons_isa = "SVM",
|
|
|
};
|
|
|
|
|
|
if (argc == 1) {
|