From: Khalid Aziz Date: Wed, 16 Nov 2016 23:43:13 +0000 (-0700) Subject: sparc64: Add proc files specific to ADI X-Git-Tag: v4.1.12-92~1^2~3 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=58369ded44b1165808443e79d6992471645afe06;p=users%2Fjedix%2Flinux-maple.git sparc64: Add proc files specific to ADI This patch adds /proc/sys/kernel/mcd_on_by_default and /proc//sparc_adi files. These files allow userspace access to change ADI parameters. Orabug: 22713162 Signed-off-by: Khalid Aziz Signed-off-by: Allen Pais --- diff --git a/arch/sparc/include/asm/adi_64.h b/arch/sparc/include/asm/adi_64.h index 24fe52fe9e8fd..cd2ce353de9e9 100644 --- a/arch/sparc/include/asm/adi_64.h +++ b/arch/sparc/include/asm/adi_64.h @@ -24,6 +24,8 @@ struct adi_config { extern struct adi_config adi_state; +extern int mcd_on_by_default; + extern void mdesc_adi_init(void); static inline bool adi_capable(void) diff --git a/fs/proc/base.c b/fs/proc/base.c index 093ca14f57015..5da375d7b3b46 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1299,6 +1299,47 @@ static const struct file_operations proc_pid_sched_autogroup_operations = { #endif /* CONFIG_SCHED_AUTOGROUP */ +#ifdef CONFIG_SPARC64 +static int +sparc_adi_show(struct seq_file *m, void *v) +{ + struct inode *inode = m->private; + struct task_struct *task = get_proc_task(inode); + + if (!task) + return -ENOENT; + + if (!adi_capable()) + return -ENOTSUPP; + + task_lock(task); + + /* anonymous processes can not use ADI */ + if (task->mm) { + struct pt_regs *regs; + regs = task_pt_regs(task); + seq_printf(m, "%d\n", !!(regs->tstate & TSTATE_MCDE)); + } else + seq_printf(m, "-1\n"); + + task_unlock(task); + put_task_struct(task); + return 0; +} + +static int +sparc_adi_open(struct inode *inode, struct file *filp) +{ + return single_open(filp, sparc_adi_show, inode); +} + +static const struct file_operations proc_sparc_adi_operations = { + .open = sparc_adi_open, + .read = seq_read, + .release = single_release, +}; +#endif /* CONFIG_SPARC_ADI */ + static ssize_t comm_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) { @@ -2640,6 +2681,9 @@ static const struct pid_entry tgid_base_stuff[] = { #ifdef CONFIG_CHECKPOINT_RESTORE REG("timers", S_IRUGO, proc_timers_operations), #endif +#ifdef CONFIG_SPARC64 + REG("sparc_adi", S_IRUGO, proc_sparc_adi_operations), +#endif }; static int proc_tgid_base_readdir(struct file *file, struct dir_context *ctx) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 2082b1a88fb9a..c2b551fcaac98 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1132,6 +1132,15 @@ static struct ctl_table kern_table[] = { .extra1 = &zero, .extra2 = &one, }, +#if defined(CONFIG_SPARC64) + { + .procname = "mcd_on_by_default", + .data = &mcd_on_by_default, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, +#endif { } };