int __xstat(int ver, const char *path, struct stat *sb) { int ret; init_syms(); if (STRPREFIX(path, SYSFS_CGROUP_PREFIX)) { init_sysfs(); char *newpath; if (asprintf(&newpath, "%s/%s", fakesysfscgroupdir, path + strlen(SYSFS_CGROUP_PREFIX)) < 0) { errno = ENOMEM; return -1; } ret = real___xstat(ver, newpath, sb); free(newpath); } else if (STRPREFIX(path, fakedevicedir0)) { sb->st_mode = S_IFBLK; sb->st_rdev = makedev(8, 0); return 0; } else if (STRPREFIX(path, fakedevicedir1)) { sb->st_mode = S_IFBLK; sb->st_rdev = makedev(9, 0); return 0; } else { ret = real___xstat(ver, path, sb); } return ret; }
int access(const char *path, int mode) { int ret; init_syms(); if (STRPREFIX(path, SYSFS_CGROUP_PREFIX)) { init_sysfs(); char *newpath; if (asprintf(&newpath, "%s/%s", fakesysfscgroupdir, path + strlen(SYSFS_CGROUP_PREFIX)) < 0) { errno = ENOMEM; return -1; } ret = real_access(newpath, mode); free(newpath); } else if (STREQ(path, "/proc/cgroups") || STREQ(path, "/proc/self/cgroup") || STREQ(path, SYSFS_CPU_PRESENT)) { /* These files are readable for all. */ ret = (mode == F_OK || mode == R_OK) ? 0 : -1; } else if (STREQ(path, "/proc/mounts")) { /* This one is accessible anytime for anybody. In fact, it's just * a symlink to /proc/self/mounts. */ ret = 0; } else { ret = real_access(path, mode); } return ret; }
int open(const char *path, int flags, ...) { int ret; char *newpath = NULL; init_syms(); if (STRPREFIX(path, SYSFS_PREFIX)) { init_sysfs(); if (asprintf(&newpath, "%s/%s", fakesysfsdir, path + strlen(SYSFS_PREFIX)) < 0) { errno = ENOMEM; return -1; } } if (flags & O_CREAT) { va_list ap; mode_t mode; va_start(ap, flags); mode = va_arg(ap, mode_t); va_end(ap); ret = realopen(newpath ? newpath : path, flags, mode); } else { ret = realopen(newpath ? newpath : path, flags); } free(newpath); return ret; }
int stat(const char *path, struct stat *sb) { char *newpath = NULL; int ret; init_syms(); if (STREQ(path, SYSFS_CPU_PRESENT)) { init_sysfs(); if (asprintf(&newpath, "%s/%s", fakesysfscgroupdir, SYSFS_CPU_PRESENT_MOCKED) < 0) { errno = ENOMEM; return -1; } } else if (STRPREFIX(path, SYSFS_CGROUP_PREFIX)) { init_sysfs(); if (asprintf(&newpath, "%s/%s", fakesysfscgroupdir, path + strlen(SYSFS_CGROUP_PREFIX)) < 0) { errno = ENOMEM; return -1; } } else if (STRPREFIX(path, fakedevicedir0)) { sb->st_mode = S_IFBLK; sb->st_rdev = makedev(8, 0); return 0; } else if (STRPREFIX(path, fakedevicedir1)) { sb->st_mode = S_IFBLK; sb->st_rdev = makedev(9, 0); return 0; } else { if (!(newpath = strdup(path))) return -1; } ret = real_stat(newpath, sb); free(newpath); return ret; }
static int batmon_probe(struct platform_device *pdev) { int i; struct sysedp_batmon_rbat_lut *rbat; if (pdev->dev.of_node) of_batmon_calc_get_pdata(pdev, &pdata); else pdata = pdev->dev.platform_data; if (!pdata) return -EINVAL; /* validate pdata->rbat_lut table */ rbat = pdata->rbat_lut; if (!rbat) return -EINVAL; for (i = 1; i < rbat->temp_size; i++) if (rbat->temp_axis[i] >= rbat->temp_axis[i-1]) return -EINVAL; for (i = 1; i < rbat->capacity_size; i++) if (rbat->capacity_axis[i] >= rbat->capacity_axis[i-1]) return -EINVAL; if (rbat->capacity_size * rbat->temp_size != rbat->data_size) return -EINVAL; psy = power_supply_get_by_name(pdata->power_supply); if (!psy) return -EFAULT; if (init_ocv_reader()) return -EFAULT; init_sysfs(); INIT_DEFERRABLE_WORK(&work, batmon_update); schedule_delayed_work(&work, 0); init_debug(); return 0; }
int mkdir(const char *path, mode_t mode) { int ret; init_syms(); if (STRPREFIX(path, SYSFS_CGROUP_PREFIX)) { init_sysfs(); char *newpath; if (asprintf(&newpath, "%s/%s", fakesysfscgroupdir, path + strlen(SYSFS_CGROUP_PREFIX)) < 0) { errno = ENOMEM; return -1; } ret = make_controller(newpath, mode); free(newpath); } else { ret = real_mkdir(path, mode); } return ret; }
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; }
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; }