int __init op_nmi_init(struct oprofile_operations *ops) { __u8 vendor = boot_cpu_data.x86_vendor; __u8 family = boot_cpu_data.x86; char *cpu_type = NULL; int ret = 0; if (!cpu_has_apic) return -ENODEV; switch (vendor) { case X86_VENDOR_AMD: /* Needs to be at least an Athlon (or hammer in 32bit mode) */ switch (family) { case 6: cpu_type = "i386/athlon"; break; case 0xf: /* * Actually it could be i386/hammer too, but * give user space an consistent name. */ cpu_type = "x86-64/hammer"; break; case 0x10: cpu_type = "x86-64/family10"; break; case 0x11: cpu_type = "x86-64/family11h"; break; default: return -ENODEV; } model = &op_amd_spec; break; case X86_VENDOR_INTEL: switch (family) { /* Pentium IV */ case 0xf: p4_init(&cpu_type); break; /* A P6-class processor */ case 6: ppro_init(&cpu_type); break; default: break; } if (cpu_type) break; if (!cpu_has_arch_perfmon) return -ENODEV; /* use arch perfmon as fallback */ cpu_type = "i386/arch_perfmon"; model = &op_arch_perfmon_spec; break; default: return -ENODEV; } #ifdef CONFIG_SMP register_cpu_notifier(&oprofile_cpu_nb); #endif /* default values, can be overwritten by model */ ops->create_files = nmi_create_files; ops->setup = nmi_setup; ops->shutdown = nmi_shutdown; ops->start = nmi_start; ops->stop = nmi_stop; ops->cpu_type = cpu_type; if (model->init) ret = model->init(ops); if (ret) return ret; if (!model->num_virt_counters) model->num_virt_counters = model->num_counters; mux_init(ops); init_sysfs(); using_nmi = 1; printk(KERN_INFO "oprofile: using NMI interrupt.\n"); return 0; }
static int __init nmi_init(void) { __u8 vendor = current_cpu_data.x86_vendor; __u8 family = current_cpu_data.x86; __u8 _model = current_cpu_data.x86_model; if (!cpu_has_apic) { printk("xenoprof: Initialization failed. No APIC\n"); return -ENODEV; } switch (vendor) { case X86_VENDOR_AMD: /* Needs to be at least an Athlon (or hammer in 32bit mode) */ switch (family) { default: printk("xenoprof: Initialization failed. " "AMD processor family %d is not " "supported\n", family); return -ENODEV; case 0xf: model = &op_athlon_spec; cpu_type = "x86-64/hammer"; break; case 0x10: model = &op_athlon_spec; cpu_type = "x86-64/family10"; ibs_init(); break; case 0x11: model = &op_athlon_spec; cpu_type = "x86-64/family11h"; break; case 0x12: model = &op_athlon_spec; cpu_type = "x86-64/family12h"; break; case 0x14: model = &op_athlon_spec; cpu_type = "x86-64/family14h"; break; case 0x15: model = &op_amd_fam15h_spec; cpu_type = "x86-64/family15h"; break; case 0x16: model = &op_athlon_spec; cpu_type = "x86-64/family16h"; break; } break; case X86_VENDOR_INTEL: switch (family) { /* Pentium IV */ case 0xf: p4_init(&cpu_type); break; /* A P6-class processor */ case 6: ppro_init(&cpu_type); break; default: break; } if (!cpu_type && !arch_perfmon_init(&cpu_type)) { printk("xenoprof: Initialization failed. " "Intel processor family %d model %d" "is not supported\n", family, _model); return -ENODEV; } break; default: printk("xenoprof: Initialization failed. " "Unsupported processor. Unknown vendor %d\n", vendor); return -ENODEV; } return 0; }
int __init op_nmi_init(struct oprofile_operations *ops) { __u8 vendor = boot_cpu_data.x86_vendor; __u8 family = boot_cpu_data.x86; char *cpu_type; if (!cpu_has_apic) return -ENODEV; switch (vendor) { case X86_VENDOR_AMD: /* Needs to be at least an Athlon (or hammer in 32bit mode) */ switch (family) { default: return -ENODEV; case 6: model = &op_athlon_spec; cpu_type = "i386/athlon"; break; case 0xf: model = &op_athlon_spec; /* Actually it could be i386/hammer too, but give user space an consistent name. */ cpu_type = "x86-64/hammer"; break; case 0x10: model = &op_athlon_spec; cpu_type = "x86-64/family10"; break; } break; case X86_VENDOR_INTEL: switch (family) { /* Pentium IV */ case 0xf: if (!p4_init(&cpu_type)) return -ENODEV; break; /* A P6-class processor */ case 6: if (!ppro_init(&cpu_type)) return -ENODEV; break; default: return -ENODEV; } break; default: return -ENODEV; } init_sysfs(); using_nmi = 1; ops->create_files = nmi_create_files; ops->setup = nmi_setup; ops->shutdown = nmi_shutdown; ops->start = nmi_start; ops->stop = nmi_stop; ops->cpu_type = cpu_type; printk(KERN_INFO "oprofile: using NMI interrupt.\n"); return 0; }
int __init op_nmi_init(struct oprofile_operations *ops) { __u8 vendor = boot_cpu_data.x86_vendor; __u8 family = boot_cpu_data.x86; char *cpu_type = NULL; int ret = 0; if (!cpu_has_apic) return -ENODEV; if (force_cpu_type == timer) return -ENODEV; switch (vendor) { case X86_VENDOR_AMD: switch (family) { case 6: cpu_type = "i386/athlon"; break; case 0xf: cpu_type = "x86-64/hammer"; break; case 0x10: cpu_type = "x86-64/family10"; break; case 0x11: cpu_type = "x86-64/family11h"; break; case 0x12: cpu_type = "x86-64/family12h"; break; case 0x14: cpu_type = "x86-64/family14h"; break; case 0x15: cpu_type = "x86-64/family15h"; break; default: return -ENODEV; } model = &op_amd_spec; break; case X86_VENDOR_INTEL: switch (family) { case 0xf: p4_init(&cpu_type); break; case 6: ppro_init(&cpu_type); break; default: break; } if (cpu_type) break; if (!cpu_has_arch_perfmon) return -ENODEV; cpu_type = "i386/arch_perfmon"; model = &op_arch_perfmon_spec; break; default: return -ENODEV; } /* default values, can be overwritten by model */ ops->create_files = nmi_create_files; ops->setup = nmi_setup; ops->shutdown = nmi_shutdown; ops->start = nmi_start; ops->stop = nmi_stop; ops->cpu_type = cpu_type; if (model->init) ret = model->init(ops); if (ret) return ret; if (!model->num_virt_counters) model->num_virt_counters = model->num_counters; mux_init(ops); init_suspend_resume(); printk(KERN_INFO "oprofile: using NMI interrupt.\n"); return 0; }