arm64: dts: rockchip: amend usb-otg related nodes for rk3368-tb
[firefly-linux-kernel-4.4.55.git] / arch / arm64 / kernel / armv8_deprecated.c
1 /*
2  *  Copyright (C) 2014 ARM Limited
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include <linux/cpu.h>
10 #include <linux/init.h>
11 #include <linux/list.h>
12 #include <linux/perf_event.h>
13 #include <linux/sched.h>
14 #include <linux/slab.h>
15 #include <linux/sysctl.h>
16
17 #include <asm/cpufeature.h>
18 #include <asm/insn.h>
19 #include <asm/opcodes.h>
20 #include <asm/sysreg.h>
21 #include <asm/system_misc.h>
22 #include <asm/traps.h>
23 #include <asm/uaccess.h>
24 #include <asm/cpufeature.h>
25
26 #define CREATE_TRACE_POINTS
27 #include "trace-events-emulation.h"
28
29 /*
30  * The runtime support for deprecated instruction support can be in one of
31  * following three states -
32  *
33  * 0 = undef
34  * 1 = emulate (software emulation)
35  * 2 = hw (supported in hardware)
36  */
37 enum insn_emulation_mode {
38         INSN_UNDEF,
39         INSN_EMULATE,
40         INSN_HW,
41 };
42
43 enum legacy_insn_status {
44         INSN_DEPRECATED,
45         INSN_OBSOLETE,
46 };
47
48 struct insn_emulation_ops {
49         const char              *name;
50         enum legacy_insn_status status;
51         struct undef_hook       *hooks;
52         int                     (*set_hw_mode)(bool enable);
53 };
54
55 struct insn_emulation {
56         struct list_head node;
57         struct insn_emulation_ops *ops;
58         int current_mode;
59         int min;
60         int max;
61 };
62
63 static LIST_HEAD(insn_emulation);
64 static int nr_insn_emulated __initdata;
65 static DEFINE_RAW_SPINLOCK(insn_emulation_lock);
66
67 static void register_emulation_hooks(struct insn_emulation_ops *ops)
68 {
69         struct undef_hook *hook;
70
71         BUG_ON(!ops->hooks);
72
73         for (hook = ops->hooks; hook->instr_mask; hook++)
74                 register_undef_hook(hook);
75
76         pr_notice("Registered %s emulation handler\n", ops->name);
77 }
78
79 static void remove_emulation_hooks(struct insn_emulation_ops *ops)
80 {
81         struct undef_hook *hook;
82
83         BUG_ON(!ops->hooks);
84
85         for (hook = ops->hooks; hook->instr_mask; hook++)
86                 unregister_undef_hook(hook);
87
88         pr_notice("Removed %s emulation handler\n", ops->name);
89 }
90
91 static void enable_insn_hw_mode(void *data)
92 {
93         struct insn_emulation *insn = (struct insn_emulation *)data;
94         if (insn->ops->set_hw_mode)
95                 insn->ops->set_hw_mode(true);
96 }
97
98 static void disable_insn_hw_mode(void *data)
99 {
100         struct insn_emulation *insn = (struct insn_emulation *)data;
101         if (insn->ops->set_hw_mode)
102                 insn->ops->set_hw_mode(false);
103 }
104
105 /* Run set_hw_mode(mode) on all active CPUs */
106 static int run_all_cpu_set_hw_mode(struct insn_emulation *insn, bool enable)
107 {
108         if (!insn->ops->set_hw_mode)
109                 return -EINVAL;
110         if (enable)
111                 on_each_cpu(enable_insn_hw_mode, (void *)insn, true);
112         else
113                 on_each_cpu(disable_insn_hw_mode, (void *)insn, true);
114         return 0;
115 }
116
117 /*
118  * Run set_hw_mode for all insns on a starting CPU.
119  * Returns:
120  *  0           - If all the hooks ran successfully.
121  * -EINVAL      - At least one hook is not supported by the CPU.
122  */
123 static int run_all_insn_set_hw_mode(unsigned long cpu)
124 {
125         int rc = 0;
126         unsigned long flags;
127         struct insn_emulation *insn;
128
129         raw_spin_lock_irqsave(&insn_emulation_lock, flags);
130         list_for_each_entry(insn, &insn_emulation, node) {
131                 bool enable = (insn->current_mode == INSN_HW);
132                 if (insn->ops->set_hw_mode && insn->ops->set_hw_mode(enable)) {
133                         pr_warn("CPU[%ld] cannot support the emulation of %s",
134                                 cpu, insn->ops->name);
135                         rc = -EINVAL;
136                 }
137         }
138         raw_spin_unlock_irqrestore(&insn_emulation_lock, flags);
139         return rc;
140 }
141
142 static int update_insn_emulation_mode(struct insn_emulation *insn,
143                                        enum insn_emulation_mode prev)
144 {
145         int ret = 0;
146
147         switch (prev) {
148         case INSN_UNDEF: /* Nothing to be done */
149                 break;
150         case INSN_EMULATE:
151                 remove_emulation_hooks(insn->ops);
152                 break;
153         case INSN_HW:
154                 if (!run_all_cpu_set_hw_mode(insn, false))
155                         pr_notice("Disabled %s support\n", insn->ops->name);
156                 break;
157         }
158
159         switch (insn->current_mode) {
160         case INSN_UNDEF:
161                 break;
162         case INSN_EMULATE:
163                 register_emulation_hooks(insn->ops);
164                 break;
165         case INSN_HW:
166                 ret = run_all_cpu_set_hw_mode(insn, true);
167                 if (!ret)
168                         pr_notice("Enabled %s support\n", insn->ops->name);
169                 break;
170         }
171
172         return ret;
173 }
174
175 static void __init register_insn_emulation(struct insn_emulation_ops *ops)
176 {
177         unsigned long flags;
178         struct insn_emulation *insn;
179
180         insn = kzalloc(sizeof(*insn), GFP_KERNEL);
181         insn->ops = ops;
182         insn->min = INSN_UNDEF;
183
184         switch (ops->status) {
185         case INSN_DEPRECATED:
186                 insn->current_mode = INSN_EMULATE;
187                 /* Disable the HW mode if it was turned on at early boot time */
188                 run_all_cpu_set_hw_mode(insn, false);
189                 insn->max = INSN_HW;
190                 break;
191         case INSN_OBSOLETE:
192                 insn->current_mode = INSN_UNDEF;
193                 insn->max = INSN_EMULATE;
194                 break;
195         }
196
197         raw_spin_lock_irqsave(&insn_emulation_lock, flags);
198         list_add(&insn->node, &insn_emulation);
199         nr_insn_emulated++;
200         raw_spin_unlock_irqrestore(&insn_emulation_lock, flags);
201
202         /* Register any handlers if required */
203         update_insn_emulation_mode(insn, INSN_UNDEF);
204 }
205
206 static int emulation_proc_handler(struct ctl_table *table, int write,
207                                   void __user *buffer, size_t *lenp,
208                                   loff_t *ppos)
209 {
210         int ret = 0;
211         struct insn_emulation *insn = (struct insn_emulation *) table->data;
212         enum insn_emulation_mode prev_mode = insn->current_mode;
213
214         table->data = &insn->current_mode;
215         ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
216
217         if (ret || !write || prev_mode == insn->current_mode)
218                 goto ret;
219
220         ret = update_insn_emulation_mode(insn, prev_mode);
221         if (ret) {
222                 /* Mode change failed, revert to previous mode. */
223                 insn->current_mode = prev_mode;
224                 update_insn_emulation_mode(insn, INSN_UNDEF);
225         }
226 ret:
227         table->data = insn;
228         return ret;
229 }
230
231 static struct ctl_table ctl_abi[] = {
232         {
233                 .procname = "abi",
234                 .mode = 0555,
235         },
236         { }
237 };
238
239 static void __init register_insn_emulation_sysctl(struct ctl_table *table)
240 {
241         unsigned long flags;
242         int i = 0;
243         struct insn_emulation *insn;
244         struct ctl_table *insns_sysctl, *sysctl;
245
246         insns_sysctl = kzalloc(sizeof(*sysctl) * (nr_insn_emulated + 1),
247                               GFP_KERNEL);
248
249         raw_spin_lock_irqsave(&insn_emulation_lock, flags);
250         list_for_each_entry(insn, &insn_emulation, node) {
251                 sysctl = &insns_sysctl[i];
252
253                 sysctl->mode = 0644;
254                 sysctl->maxlen = sizeof(int);
255
256                 sysctl->procname = insn->ops->name;
257                 sysctl->data = insn;
258                 sysctl->extra1 = &insn->min;
259                 sysctl->extra2 = &insn->max;
260                 sysctl->proc_handler = emulation_proc_handler;
261                 i++;
262         }
263         raw_spin_unlock_irqrestore(&insn_emulation_lock, flags);
264
265         table->child = insns_sysctl;
266         register_sysctl_table(table);
267 }
268
269 /*
270  *  Implement emulation of the SWP/SWPB instructions using load-exclusive and
271  *  store-exclusive.
272  *
273  *  Syntax of SWP{B} instruction: SWP{B}<c> <Rt>, <Rt2>, [<Rn>]
274  *  Where: Rt  = destination
275  *         Rt2 = source
276  *         Rn  = address
277  */
278
279 /*
280  * Error-checking SWP macros implemented using ldxr{b}/stxr{b}
281  */
282 #define __user_swpX_asm(data, addr, res, temp, B)               \
283 do {                                                            \
284         uaccess_enable();                                       \
285         __asm__ __volatile__(                                   \
286         "0:     ldxr"B"         %w2, [%3]\n"                    \
287         "1:     stxr"B"         %w0, %w1, [%3]\n"               \
288         "       cbz             %w0, 2f\n"                      \
289         "       mov             %w0, %w4\n"                     \
290         "       b               3f\n"                           \
291         "2:\n"                                                  \
292         "       mov             %w1, %w2\n"                     \
293         "3:\n"                                                  \
294         "       .pushsection     .fixup,\"ax\"\n"               \
295         "       .align          2\n"                            \
296         "4:     mov             %w0, %w5\n"                     \
297         "       b               3b\n"                           \
298         "       .popsection"                                    \
299         _ASM_EXTABLE(0b, 4b)                                    \
300         _ASM_EXTABLE(1b, 4b)                                    \
301         : "=&r" (res), "+r" (data), "=&r" (temp)                \
302         : "r" (addr), "i" (-EAGAIN), "i" (-EFAULT)              \
303         : "memory");                                            \
304         uaccess_disable();                                      \
305 } while (0)
306
307 #define __user_swp_asm(data, addr, res, temp) \
308         __user_swpX_asm(data, addr, res, temp, "")
309 #define __user_swpb_asm(data, addr, res, temp) \
310         __user_swpX_asm(data, addr, res, temp, "b")
311
312 /*
313  * Bit 22 of the instruction encoding distinguishes between
314  * the SWP and SWPB variants (bit set means SWPB).
315  */
316 #define TYPE_SWPB (1 << 22)
317
318 /*
319  * Set up process info to signal segmentation fault - called on access error.
320  */
321 static void set_segfault(struct pt_regs *regs, unsigned long addr)
322 {
323         siginfo_t info;
324
325         down_read(&current->mm->mmap_sem);
326         if (find_vma(current->mm, addr) == NULL)
327                 info.si_code = SEGV_MAPERR;
328         else
329                 info.si_code = SEGV_ACCERR;
330         up_read(&current->mm->mmap_sem);
331
332         info.si_signo = SIGSEGV;
333         info.si_errno = 0;
334         info.si_addr  = (void *) instruction_pointer(regs);
335
336         pr_debug("SWP{B} emulation: access caused memory abort!\n");
337         arm64_notify_die("Illegal memory access", regs, &info, 0);
338 }
339
340 static int emulate_swpX(unsigned int address, unsigned int *data,
341                         unsigned int type)
342 {
343         unsigned int res = 0;
344
345         if ((type != TYPE_SWPB) && (address & 0x3)) {
346                 /* SWP to unaligned address not permitted */
347                 pr_debug("SWP instruction on unaligned pointer!\n");
348                 return -EFAULT;
349         }
350
351         while (1) {
352                 unsigned long temp;
353
354                 if (type == TYPE_SWPB)
355                         __user_swpb_asm(*data, address, res, temp);
356                 else
357                         __user_swp_asm(*data, address, res, temp);
358
359                 if (likely(res != -EAGAIN) || signal_pending(current))
360                         break;
361
362                 cond_resched();
363         }
364
365         return res;
366 }
367
368 #define ARM_OPCODE_CONDITION_UNCOND     0xf
369
370 static unsigned int __kprobes aarch32_check_condition(u32 opcode, u32 psr)
371 {
372         u32 cc_bits  = opcode >> 28;
373
374         if (cc_bits != ARM_OPCODE_CONDITION_UNCOND) {
375                 if ((*aarch32_opcode_cond_checks[cc_bits])(psr))
376                         return ARM_OPCODE_CONDTEST_PASS;
377                 else
378                         return ARM_OPCODE_CONDTEST_FAIL;
379         }
380         return ARM_OPCODE_CONDTEST_UNCOND;
381 }
382
383 /*
384  * swp_handler logs the id of calling process, dissects the instruction, sanity
385  * checks the memory location, calls emulate_swpX for the actual operation and
386  * deals with fixup/error handling before returning
387  */
388 static int swp_handler(struct pt_regs *regs, u32 instr)
389 {
390         u32 destreg, data, type, address = 0;
391         int rn, rt2, res = 0;
392
393         perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->pc);
394
395         type = instr & TYPE_SWPB;
396
397         switch (aarch32_check_condition(instr, regs->pstate)) {
398         case ARM_OPCODE_CONDTEST_PASS:
399                 break;
400         case ARM_OPCODE_CONDTEST_FAIL:
401                 /* Condition failed - return to next instruction */
402                 goto ret;
403         case ARM_OPCODE_CONDTEST_UNCOND:
404                 /* If unconditional encoding - not a SWP, undef */
405                 return -EFAULT;
406         default:
407                 return -EINVAL;
408         }
409
410         rn = aarch32_insn_extract_reg_num(instr, A32_RN_OFFSET);
411         rt2 = aarch32_insn_extract_reg_num(instr, A32_RT2_OFFSET);
412
413         address = (u32)regs->user_regs.regs[rn];
414         data    = (u32)regs->user_regs.regs[rt2];
415         destreg = aarch32_insn_extract_reg_num(instr, A32_RT_OFFSET);
416
417         pr_debug("addr in r%d->0x%08x, dest is r%d, source in r%d->0x%08x)\n",
418                 rn, address, destreg,
419                 aarch32_insn_extract_reg_num(instr, A32_RT2_OFFSET), data);
420
421         /* Check access in reasonable access range for both SWP and SWPB */
422         if (!access_ok(VERIFY_WRITE, (address & ~3), 4)) {
423                 pr_debug("SWP{B} emulation: access to 0x%08x not allowed!\n",
424                         address);
425                 goto fault;
426         }
427
428         res = emulate_swpX(address, &data, type);
429         if (res == -EFAULT)
430                 goto fault;
431         else if (res == 0)
432                 regs->user_regs.regs[destreg] = data;
433
434 ret:
435         if (type == TYPE_SWPB)
436                 trace_instruction_emulation("swpb", regs->pc);
437         else
438                 trace_instruction_emulation("swp", regs->pc);
439
440         pr_warn_ratelimited("\"%s\" (%ld) uses obsolete SWP{B} instruction at 0x%llx\n",
441                         current->comm, (unsigned long)current->pid, regs->pc);
442
443         regs->pc += 4;
444         return 0;
445
446 fault:
447         set_segfault(regs, address);
448
449         return 0;
450 }
451
452 /*
453  * Only emulate SWP/SWPB executed in ARM state/User mode.
454  * The kernel must be SWP free and SWP{B} does not exist in Thumb.
455  */
456 static struct undef_hook swp_hooks[] = {
457         {
458                 .instr_mask     = 0x0fb00ff0,
459                 .instr_val      = 0x01000090,
460                 .pstate_mask    = COMPAT_PSR_MODE_MASK,
461                 .pstate_val     = COMPAT_PSR_MODE_USR,
462                 .fn             = swp_handler
463         },
464         { }
465 };
466
467 static struct insn_emulation_ops swp_ops = {
468         .name = "swp",
469         .status = INSN_OBSOLETE,
470         .hooks = swp_hooks,
471         .set_hw_mode = NULL,
472 };
473
474 static int cp15barrier_handler(struct pt_regs *regs, u32 instr)
475 {
476         perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->pc);
477
478         switch (aarch32_check_condition(instr, regs->pstate)) {
479         case ARM_OPCODE_CONDTEST_PASS:
480                 break;
481         case ARM_OPCODE_CONDTEST_FAIL:
482                 /* Condition failed - return to next instruction */
483                 goto ret;
484         case ARM_OPCODE_CONDTEST_UNCOND:
485                 /* If unconditional encoding - not a barrier instruction */
486                 return -EFAULT;
487         default:
488                 return -EINVAL;
489         }
490
491         switch (aarch32_insn_mcr_extract_crm(instr)) {
492         case 10:
493                 /*
494                  * dmb - mcr p15, 0, Rt, c7, c10, 5
495                  * dsb - mcr p15, 0, Rt, c7, c10, 4
496                  */
497                 if (aarch32_insn_mcr_extract_opc2(instr) == 5) {
498                         dmb(sy);
499                         trace_instruction_emulation(
500                                 "mcr p15, 0, Rt, c7, c10, 5 ; dmb", regs->pc);
501                 } else {
502                         dsb(sy);
503                         trace_instruction_emulation(
504                                 "mcr p15, 0, Rt, c7, c10, 4 ; dsb", regs->pc);
505                 }
506                 break;
507         case 5:
508                 /*
509                  * isb - mcr p15, 0, Rt, c7, c5, 4
510                  *
511                  * Taking an exception or returning from one acts as an
512                  * instruction barrier. So no explicit barrier needed here.
513                  */
514                 trace_instruction_emulation(
515                         "mcr p15, 0, Rt, c7, c5, 4 ; isb", regs->pc);
516                 break;
517         }
518
519 ret:
520         pr_warn_ratelimited("\"%s\" (%ld) uses deprecated CP15 Barrier instruction at 0x%llx\n",
521                         current->comm, (unsigned long)current->pid, regs->pc);
522
523         regs->pc += 4;
524         return 0;
525 }
526
527 static int cp15_barrier_set_hw_mode(bool enable)
528 {
529         if (enable)
530                 config_sctlr_el1(0, SCTLR_EL1_CP15BEN);
531         else
532                 config_sctlr_el1(SCTLR_EL1_CP15BEN, 0);
533         return 0;
534 }
535
536 static struct undef_hook cp15_barrier_hooks[] = {
537         {
538                 .instr_mask     = 0x0fff0fdf,
539                 .instr_val      = 0x0e070f9a,
540                 .pstate_mask    = COMPAT_PSR_MODE_MASK,
541                 .pstate_val     = COMPAT_PSR_MODE_USR,
542                 .fn             = cp15barrier_handler,
543         },
544         {
545                 .instr_mask     = 0x0fff0fff,
546                 .instr_val      = 0x0e070f95,
547                 .pstate_mask    = COMPAT_PSR_MODE_MASK,
548                 .pstate_val     = COMPAT_PSR_MODE_USR,
549                 .fn             = cp15barrier_handler,
550         },
551         { }
552 };
553
554 static struct insn_emulation_ops cp15_barrier_ops = {
555         .name = "cp15_barrier",
556         .status = INSN_DEPRECATED,
557         .hooks = cp15_barrier_hooks,
558         .set_hw_mode = cp15_barrier_set_hw_mode,
559 };
560
561 static int setend_set_hw_mode(bool enable)
562 {
563         if (!cpu_supports_mixed_endian_el0())
564                 return -EINVAL;
565
566         if (enable)
567                 config_sctlr_el1(SCTLR_EL1_SED, 0);
568         else
569                 config_sctlr_el1(0, SCTLR_EL1_SED);
570         return 0;
571 }
572
573 static int compat_setend_handler(struct pt_regs *regs, u32 big_endian)
574 {
575         char *insn;
576
577         perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, regs->pc);
578
579         if (big_endian) {
580                 insn = "setend be";
581                 regs->pstate |= COMPAT_PSR_E_BIT;
582         } else {
583                 insn = "setend le";
584                 regs->pstate &= ~COMPAT_PSR_E_BIT;
585         }
586
587         trace_instruction_emulation(insn, regs->pc);
588         pr_warn_ratelimited("\"%s\" (%ld) uses deprecated setend instruction at 0x%llx\n",
589                         current->comm, (unsigned long)current->pid, regs->pc);
590
591         return 0;
592 }
593
594 static int a32_setend_handler(struct pt_regs *regs, u32 instr)
595 {
596         int rc = compat_setend_handler(regs, (instr >> 9) & 1);
597         regs->pc += 4;
598         return rc;
599 }
600
601 static int t16_setend_handler(struct pt_regs *regs, u32 instr)
602 {
603         int rc = compat_setend_handler(regs, (instr >> 3) & 1);
604         regs->pc += 2;
605         return rc;
606 }
607
608 static struct undef_hook setend_hooks[] = {
609         {
610                 .instr_mask     = 0xfffffdff,
611                 .instr_val      = 0xf1010000,
612                 .pstate_mask    = COMPAT_PSR_MODE_MASK,
613                 .pstate_val     = COMPAT_PSR_MODE_USR,
614                 .fn             = a32_setend_handler,
615         },
616         {
617                 /* Thumb mode */
618                 .instr_mask     = 0x0000fff7,
619                 .instr_val      = 0x0000b650,
620                 .pstate_mask    = (COMPAT_PSR_T_BIT | COMPAT_PSR_MODE_MASK),
621                 .pstate_val     = (COMPAT_PSR_T_BIT | COMPAT_PSR_MODE_USR),
622                 .fn             = t16_setend_handler,
623         },
624         {}
625 };
626
627 static struct insn_emulation_ops setend_ops = {
628         .name = "setend",
629         .status = INSN_DEPRECATED,
630         .hooks = setend_hooks,
631         .set_hw_mode = setend_set_hw_mode,
632 };
633
634 static int insn_cpu_hotplug_notify(struct notifier_block *b,
635                               unsigned long action, void *hcpu)
636 {
637         int rc = 0;
638         if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
639                 rc = run_all_insn_set_hw_mode((unsigned long)hcpu);
640
641         return notifier_from_errno(rc);
642 }
643
644 static struct notifier_block insn_cpu_hotplug_notifier = {
645         .notifier_call = insn_cpu_hotplug_notify,
646 };
647
648 /*
649  * Invoked as late_initcall, since not needed before init spawned.
650  */
651 static int __init armv8_deprecated_init(void)
652 {
653         if (IS_ENABLED(CONFIG_SWP_EMULATION))
654                 register_insn_emulation(&swp_ops);
655
656         if (IS_ENABLED(CONFIG_CP15_BARRIER_EMULATION))
657                 register_insn_emulation(&cp15_barrier_ops);
658
659         if (IS_ENABLED(CONFIG_SETEND_EMULATION)) {
660                 if(system_supports_mixed_endian_el0())
661                         register_insn_emulation(&setend_ops);
662                 else
663                         pr_info("setend instruction emulation is not supported on the system");
664         }
665
666         register_cpu_notifier(&insn_cpu_hotplug_notifier);
667         register_insn_emulation_sysctl(ctl_abi);
668
669         return 0;
670 }
671
672 late_initcall(armv8_deprecated_init);