selinux: kill 'flags' argument in avc_has_perm_flags() and avc_audit()
[sfrench/cifs-2.6.git] / arch / arm64 / include / asm / assembler.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Based on arch/arm/include/asm/assembler.h, arch/arm/mm/proc-macros.S
4  *
5  * Copyright (C) 1996-2000 Russell King
6  * Copyright (C) 2012 ARM Ltd.
7  */
8 #ifndef __ASSEMBLY__
9 #error "Only include this from assembly code"
10 #endif
11
12 #ifndef __ASM_ASSEMBLER_H
13 #define __ASM_ASSEMBLER_H
14
15 #include <asm-generic/export.h>
16
17 #include <asm/asm-offsets.h>
18 #include <asm/alternative.h>
19 #include <asm/asm-bug.h>
20 #include <asm/cpufeature.h>
21 #include <asm/cputype.h>
22 #include <asm/debug-monitors.h>
23 #include <asm/page.h>
24 #include <asm/pgtable-hwdef.h>
25 #include <asm/ptrace.h>
26 #include <asm/thread_info.h>
27
28         /*
29          * Provide a wxN alias for each wN register so what we can paste a xN
30          * reference after a 'w' to obtain the 32-bit version.
31          */
32         .irp    n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
33         wx\n    .req    w\n
34         .endr
35
36         .macro save_and_disable_daif, flags
37         mrs     \flags, daif
38         msr     daifset, #0xf
39         .endm
40
41         .macro disable_daif
42         msr     daifset, #0xf
43         .endm
44
45         .macro enable_daif
46         msr     daifclr, #0xf
47         .endm
48
49         .macro  restore_daif, flags:req
50         msr     daif, \flags
51         .endm
52
53         /* IRQ/FIQ are the lowest priority flags, unconditionally unmask the rest. */
54         .macro enable_da
55         msr     daifclr, #(8 | 4)
56         .endm
57
58 /*
59  * Save/restore interrupts.
60  */
61         .macro  save_and_disable_irq, flags
62         mrs     \flags, daif
63         msr     daifset, #3
64         .endm
65
66         .macro  restore_irq, flags
67         msr     daif, \flags
68         .endm
69
70         .macro  enable_dbg
71         msr     daifclr, #8
72         .endm
73
74         .macro  disable_step_tsk, flgs, tmp
75         tbz     \flgs, #TIF_SINGLESTEP, 9990f
76         mrs     \tmp, mdscr_el1
77         bic     \tmp, \tmp, #DBG_MDSCR_SS
78         msr     mdscr_el1, \tmp
79         isb     // Synchronise with enable_dbg
80 9990:
81         .endm
82
83         /* call with daif masked */
84         .macro  enable_step_tsk, flgs, tmp
85         tbz     \flgs, #TIF_SINGLESTEP, 9990f
86         mrs     \tmp, mdscr_el1
87         orr     \tmp, \tmp, #DBG_MDSCR_SS
88         msr     mdscr_el1, \tmp
89 9990:
90         .endm
91
92 /*
93  * RAS Error Synchronization barrier
94  */
95         .macro  esb
96 #ifdef CONFIG_ARM64_RAS_EXTN
97         hint    #16
98 #else
99         nop
100 #endif
101         .endm
102
103 /*
104  * Value prediction barrier
105  */
106         .macro  csdb
107         hint    #20
108         .endm
109
110 /*
111  * Speculation barrier
112  */
113         .macro  sb
114 alternative_if_not ARM64_HAS_SB
115         dsb     nsh
116         isb
117 alternative_else
118         SB_BARRIER_INSN
119         nop
120 alternative_endif
121         .endm
122
123 /*
124  * NOP sequence
125  */
126         .macro  nops, num
127         .rept   \num
128         nop
129         .endr
130         .endm
131
132 /*
133  * Emit an entry into the exception table
134  */
135         .macro          _asm_extable, from, to
136         .pushsection    __ex_table, "a"
137         .align          3
138         .long           (\from - .), (\to - .)
139         .popsection
140         .endm
141
142 #define USER(l, x...)                           \
143 9999:   x;                                      \
144         _asm_extable    9999b, l
145
146 /*
147  * Register aliases.
148  */
149 lr      .req    x30             // link register
150
151 /*
152  * Vector entry
153  */
154          .macro ventry  label
155         .align  7
156         b       \label
157         .endm
158
159 /*
160  * Select code when configured for BE.
161  */
162 #ifdef CONFIG_CPU_BIG_ENDIAN
163 #define CPU_BE(code...) code
164 #else
165 #define CPU_BE(code...)
166 #endif
167
168 /*
169  * Select code when configured for LE.
170  */
171 #ifdef CONFIG_CPU_BIG_ENDIAN
172 #define CPU_LE(code...)
173 #else
174 #define CPU_LE(code...) code
175 #endif
176
177 /*
178  * Define a macro that constructs a 64-bit value by concatenating two
179  * 32-bit registers. Note that on big endian systems the order of the
180  * registers is swapped.
181  */
182 #ifndef CONFIG_CPU_BIG_ENDIAN
183         .macro  regs_to_64, rd, lbits, hbits
184 #else
185         .macro  regs_to_64, rd, hbits, lbits
186 #endif
187         orr     \rd, \lbits, \hbits, lsl #32
188         .endm
189
190 /*
191  * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where
192  * <symbol> is within the range +/- 4 GB of the PC.
193  */
194         /*
195          * @dst: destination register (64 bit wide)
196          * @sym: name of the symbol
197          */
198         .macro  adr_l, dst, sym
199         adrp    \dst, \sym
200         add     \dst, \dst, :lo12:\sym
201         .endm
202
203         /*
204          * @dst: destination register (32 or 64 bit wide)
205          * @sym: name of the symbol
206          * @tmp: optional 64-bit scratch register to be used if <dst> is a
207          *       32-bit wide register, in which case it cannot be used to hold
208          *       the address
209          */
210         .macro  ldr_l, dst, sym, tmp=
211         .ifb    \tmp
212         adrp    \dst, \sym
213         ldr     \dst, [\dst, :lo12:\sym]
214         .else
215         adrp    \tmp, \sym
216         ldr     \dst, [\tmp, :lo12:\sym]
217         .endif
218         .endm
219
220         /*
221          * @src: source register (32 or 64 bit wide)
222          * @sym: name of the symbol
223          * @tmp: mandatory 64-bit scratch register to calculate the address
224          *       while <src> needs to be preserved.
225          */
226         .macro  str_l, src, sym, tmp
227         adrp    \tmp, \sym
228         str     \src, [\tmp, :lo12:\sym]
229         .endm
230
231         /*
232          * @dst: destination register
233          */
234 #if defined(__KVM_NVHE_HYPERVISOR__) || defined(__KVM_VHE_HYPERVISOR__)
235         .macro  this_cpu_offset, dst
236         mrs     \dst, tpidr_el2
237         .endm
238 #else
239         .macro  this_cpu_offset, dst
240 alternative_if_not ARM64_HAS_VIRT_HOST_EXTN
241         mrs     \dst, tpidr_el1
242 alternative_else
243         mrs     \dst, tpidr_el2
244 alternative_endif
245         .endm
246 #endif
247
248         /*
249          * @dst: Result of per_cpu(sym, smp_processor_id()) (can be SP)
250          * @sym: The name of the per-cpu variable
251          * @tmp: scratch register
252          */
253         .macro adr_this_cpu, dst, sym, tmp
254         adrp    \tmp, \sym
255         add     \dst, \tmp, #:lo12:\sym
256         this_cpu_offset \tmp
257         add     \dst, \dst, \tmp
258         .endm
259
260         /*
261          * @dst: Result of READ_ONCE(per_cpu(sym, smp_processor_id()))
262          * @sym: The name of the per-cpu variable
263          * @tmp: scratch register
264          */
265         .macro ldr_this_cpu dst, sym, tmp
266         adr_l   \dst, \sym
267         this_cpu_offset \tmp
268         ldr     \dst, [\dst, \tmp]
269         .endm
270
271 /*
272  * vma_vm_mm - get mm pointer from vma pointer (vma->vm_mm)
273  */
274         .macro  vma_vm_mm, rd, rn
275         ldr     \rd, [\rn, #VMA_VM_MM]
276         .endm
277
278 /*
279  * read_ctr - read CTR_EL0. If the system has mismatched register fields,
280  * provide the system wide safe value from arm64_ftr_reg_ctrel0.sys_val
281  */
282         .macro  read_ctr, reg
283 #ifndef __KVM_NVHE_HYPERVISOR__
284 alternative_if_not ARM64_MISMATCHED_CACHE_TYPE
285         mrs     \reg, ctr_el0                   // read CTR
286         nop
287 alternative_else
288         ldr_l   \reg, arm64_ftr_reg_ctrel0 + ARM64_FTR_SYSVAL
289 alternative_endif
290 #else
291 alternative_if_not ARM64_KVM_PROTECTED_MODE
292         ASM_BUG()
293 alternative_else_nop_endif
294 alternative_cb kvm_compute_final_ctr_el0
295         movz    \reg, #0
296         movk    \reg, #0, lsl #16
297         movk    \reg, #0, lsl #32
298         movk    \reg, #0, lsl #48
299 alternative_cb_end
300 #endif
301         .endm
302
303
304 /*
305  * raw_dcache_line_size - get the minimum D-cache line size on this CPU
306  * from the CTR register.
307  */
308         .macro  raw_dcache_line_size, reg, tmp
309         mrs     \tmp, ctr_el0                   // read CTR
310         ubfm    \tmp, \tmp, #16, #19            // cache line size encoding
311         mov     \reg, #4                        // bytes per word
312         lsl     \reg, \reg, \tmp                // actual cache line size
313         .endm
314
315 /*
316  * dcache_line_size - get the safe D-cache line size across all CPUs
317  */
318         .macro  dcache_line_size, reg, tmp
319         read_ctr        \tmp
320         ubfm            \tmp, \tmp, #16, #19    // cache line size encoding
321         mov             \reg, #4                // bytes per word
322         lsl             \reg, \reg, \tmp        // actual cache line size
323         .endm
324
325 /*
326  * raw_icache_line_size - get the minimum I-cache line size on this CPU
327  * from the CTR register.
328  */
329         .macro  raw_icache_line_size, reg, tmp
330         mrs     \tmp, ctr_el0                   // read CTR
331         and     \tmp, \tmp, #0xf                // cache line size encoding
332         mov     \reg, #4                        // bytes per word
333         lsl     \reg, \reg, \tmp                // actual cache line size
334         .endm
335
336 /*
337  * icache_line_size - get the safe I-cache line size across all CPUs
338  */
339         .macro  icache_line_size, reg, tmp
340         read_ctr        \tmp
341         and             \tmp, \tmp, #0xf        // cache line size encoding
342         mov             \reg, #4                // bytes per word
343         lsl             \reg, \reg, \tmp        // actual cache line size
344         .endm
345
346 /*
347  * tcr_set_t0sz - update TCR.T0SZ so that we can load the ID map
348  */
349         .macro  tcr_set_t0sz, valreg, t0sz
350         bfi     \valreg, \t0sz, #TCR_T0SZ_OFFSET, #TCR_TxSZ_WIDTH
351         .endm
352
353 /*
354  * tcr_set_t1sz - update TCR.T1SZ
355  */
356         .macro  tcr_set_t1sz, valreg, t1sz
357         bfi     \valreg, \t1sz, #TCR_T1SZ_OFFSET, #TCR_TxSZ_WIDTH
358         .endm
359
360 /*
361  * tcr_compute_pa_size - set TCR.(I)PS to the highest supported
362  * ID_AA64MMFR0_EL1.PARange value
363  *
364  *      tcr:            register with the TCR_ELx value to be updated
365  *      pos:            IPS or PS bitfield position
366  *      tmp{0,1}:       temporary registers
367  */
368         .macro  tcr_compute_pa_size, tcr, pos, tmp0, tmp1
369         mrs     \tmp0, ID_AA64MMFR0_EL1
370         // Narrow PARange to fit the PS field in TCR_ELx
371         ubfx    \tmp0, \tmp0, #ID_AA64MMFR0_PARANGE_SHIFT, #3
372         mov     \tmp1, #ID_AA64MMFR0_PARANGE_MAX
373         cmp     \tmp0, \tmp1
374         csel    \tmp0, \tmp1, \tmp0, hi
375         bfi     \tcr, \tmp0, \pos, #3
376         .endm
377
378 /*
379  * Macro to perform a data cache maintenance for the interval
380  * [kaddr, kaddr + size)
381  *
382  *      op:             operation passed to dc instruction
383  *      domain:         domain used in dsb instruciton
384  *      kaddr:          starting virtual address of the region
385  *      size:           size of the region
386  *      Corrupts:       kaddr, size, tmp1, tmp2
387  */
388         .macro __dcache_op_workaround_clean_cache, op, kaddr
389 alternative_if_not ARM64_WORKAROUND_CLEAN_CACHE
390         dc      \op, \kaddr
391 alternative_else
392         dc      civac, \kaddr
393 alternative_endif
394         .endm
395
396         .macro dcache_by_line_op op, domain, kaddr, size, tmp1, tmp2
397         dcache_line_size \tmp1, \tmp2
398         add     \size, \kaddr, \size
399         sub     \tmp2, \tmp1, #1
400         bic     \kaddr, \kaddr, \tmp2
401 9998:
402         .ifc    \op, cvau
403         __dcache_op_workaround_clean_cache \op, \kaddr
404         .else
405         .ifc    \op, cvac
406         __dcache_op_workaround_clean_cache \op, \kaddr
407         .else
408         .ifc    \op, cvap
409         sys     3, c7, c12, 1, \kaddr   // dc cvap
410         .else
411         .ifc    \op, cvadp
412         sys     3, c7, c13, 1, \kaddr   // dc cvadp
413         .else
414         dc      \op, \kaddr
415         .endif
416         .endif
417         .endif
418         .endif
419         add     \kaddr, \kaddr, \tmp1
420         cmp     \kaddr, \size
421         b.lo    9998b
422         dsb     \domain
423         .endm
424
425 /*
426  * Macro to perform an instruction cache maintenance for the interval
427  * [start, end)
428  *
429  *      start, end:     virtual addresses describing the region
430  *      label:          A label to branch to on user fault.
431  *      Corrupts:       tmp1, tmp2
432  */
433         .macro invalidate_icache_by_line start, end, tmp1, tmp2, label
434         icache_line_size \tmp1, \tmp2
435         sub     \tmp2, \tmp1, #1
436         bic     \tmp2, \start, \tmp2
437 9997:
438 USER(\label, ic ivau, \tmp2)                    // invalidate I line PoU
439         add     \tmp2, \tmp2, \tmp1
440         cmp     \tmp2, \end
441         b.lo    9997b
442         dsb     ish
443         isb
444         .endm
445
446 /*
447  * reset_pmuserenr_el0 - reset PMUSERENR_EL0 if PMUv3 present
448  */
449         .macro  reset_pmuserenr_el0, tmpreg
450         mrs     \tmpreg, id_aa64dfr0_el1
451         sbfx    \tmpreg, \tmpreg, #ID_AA64DFR0_PMUVER_SHIFT, #4
452         cmp     \tmpreg, #1                     // Skip if no PMU present
453         b.lt    9000f
454         msr     pmuserenr_el0, xzr              // Disable PMU access from EL0
455 9000:
456         .endm
457
458 /*
459  * reset_amuserenr_el0 - reset AMUSERENR_EL0 if AMUv1 present
460  */
461         .macro  reset_amuserenr_el0, tmpreg
462         mrs     \tmpreg, id_aa64pfr0_el1        // Check ID_AA64PFR0_EL1
463         ubfx    \tmpreg, \tmpreg, #ID_AA64PFR0_AMU_SHIFT, #4
464         cbz     \tmpreg, .Lskip_\@              // Skip if no AMU present
465         msr_s   SYS_AMUSERENR_EL0, xzr          // Disable AMU access from EL0
466 .Lskip_\@:
467         .endm
468 /*
469  * copy_page - copy src to dest using temp registers t1-t8
470  */
471         .macro copy_page dest:req src:req t1:req t2:req t3:req t4:req t5:req t6:req t7:req t8:req
472 9998:   ldp     \t1, \t2, [\src]
473         ldp     \t3, \t4, [\src, #16]
474         ldp     \t5, \t6, [\src, #32]
475         ldp     \t7, \t8, [\src, #48]
476         add     \src, \src, #64
477         stnp    \t1, \t2, [\dest]
478         stnp    \t3, \t4, [\dest, #16]
479         stnp    \t5, \t6, [\dest, #32]
480         stnp    \t7, \t8, [\dest, #48]
481         add     \dest, \dest, #64
482         tst     \src, #(PAGE_SIZE - 1)
483         b.ne    9998b
484         .endm
485
486 /*
487  * Annotate a function as being unsuitable for kprobes.
488  */
489 #ifdef CONFIG_KPROBES
490 #define NOKPROBE(x)                             \
491         .pushsection "_kprobe_blacklist", "aw"; \
492         .quad   x;                              \
493         .popsection;
494 #else
495 #define NOKPROBE(x)
496 #endif
497
498 #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
499 #define EXPORT_SYMBOL_NOKASAN(name)
500 #else
501 #define EXPORT_SYMBOL_NOKASAN(name)     EXPORT_SYMBOL(name)
502 #endif
503
504         /*
505          * Emit a 64-bit absolute little endian symbol reference in a way that
506          * ensures that it will be resolved at build time, even when building a
507          * PIE binary. This requires cooperation from the linker script, which
508          * must emit the lo32/hi32 halves individually.
509          */
510         .macro  le64sym, sym
511         .long   \sym\()_lo32
512         .long   \sym\()_hi32
513         .endm
514
515         /*
516          * mov_q - move an immediate constant into a 64-bit register using
517          *         between 2 and 4 movz/movk instructions (depending on the
518          *         magnitude and sign of the operand)
519          */
520         .macro  mov_q, reg, val
521         .if (((\val) >> 31) == 0 || ((\val) >> 31) == 0x1ffffffff)
522         movz    \reg, :abs_g1_s:\val
523         .else
524         .if (((\val) >> 47) == 0 || ((\val) >> 47) == 0x1ffff)
525         movz    \reg, :abs_g2_s:\val
526         .else
527         movz    \reg, :abs_g3:\val
528         movk    \reg, :abs_g2_nc:\val
529         .endif
530         movk    \reg, :abs_g1_nc:\val
531         .endif
532         movk    \reg, :abs_g0_nc:\val
533         .endm
534
535 /*
536  * Return the current task_struct.
537  */
538         .macro  get_current_task, rd
539         mrs     \rd, sp_el0
540         .endm
541
542 /*
543  * Offset ttbr1 to allow for 48-bit kernel VAs set with 52-bit PTRS_PER_PGD.
544  * orr is used as it can cover the immediate value (and is idempotent).
545  * In future this may be nop'ed out when dealing with 52-bit kernel VAs.
546  *      ttbr: Value of ttbr to set, modified.
547  */
548         .macro  offset_ttbr1, ttbr, tmp
549 #ifdef CONFIG_ARM64_VA_BITS_52
550         mrs_s   \tmp, SYS_ID_AA64MMFR2_EL1
551         and     \tmp, \tmp, #(0xf << ID_AA64MMFR2_LVA_SHIFT)
552         cbnz    \tmp, .Lskipoffs_\@
553         orr     \ttbr, \ttbr, #TTBR1_BADDR_4852_OFFSET
554 .Lskipoffs_\@ :
555 #endif
556         .endm
557
558 /*
559  * Perform the reverse of offset_ttbr1.
560  * bic is used as it can cover the immediate value and, in future, won't need
561  * to be nop'ed out when dealing with 52-bit kernel VAs.
562  */
563         .macro  restore_ttbr1, ttbr
564 #ifdef CONFIG_ARM64_VA_BITS_52
565         bic     \ttbr, \ttbr, #TTBR1_BADDR_4852_OFFSET
566 #endif
567         .endm
568
569 /*
570  * Arrange a physical address in a TTBR register, taking care of 52-bit
571  * addresses.
572  *
573  *      phys:   physical address, preserved
574  *      ttbr:   returns the TTBR value
575  */
576         .macro  phys_to_ttbr, ttbr, phys
577 #ifdef CONFIG_ARM64_PA_BITS_52
578         orr     \ttbr, \phys, \phys, lsr #46
579         and     \ttbr, \ttbr, #TTBR_BADDR_MASK_52
580 #else
581         mov     \ttbr, \phys
582 #endif
583         .endm
584
585         .macro  phys_to_pte, pte, phys
586 #ifdef CONFIG_ARM64_PA_BITS_52
587         /*
588          * We assume \phys is 64K aligned and this is guaranteed by only
589          * supporting this configuration with 64K pages.
590          */
591         orr     \pte, \phys, \phys, lsr #36
592         and     \pte, \pte, #PTE_ADDR_MASK
593 #else
594         mov     \pte, \phys
595 #endif
596         .endm
597
598         .macro  pte_to_phys, phys, pte
599 #ifdef CONFIG_ARM64_PA_BITS_52
600         ubfiz   \phys, \pte, #(48 - 16 - 12), #16
601         bfxil   \phys, \pte, #16, #32
602         lsl     \phys, \phys, #16
603 #else
604         and     \phys, \pte, #PTE_ADDR_MASK
605 #endif
606         .endm
607
608 /*
609  * tcr_clear_errata_bits - Clear TCR bits that trigger an errata on this CPU.
610  */
611         .macro  tcr_clear_errata_bits, tcr, tmp1, tmp2
612 #ifdef CONFIG_FUJITSU_ERRATUM_010001
613         mrs     \tmp1, midr_el1
614
615         mov_q   \tmp2, MIDR_FUJITSU_ERRATUM_010001_MASK
616         and     \tmp1, \tmp1, \tmp2
617         mov_q   \tmp2, MIDR_FUJITSU_ERRATUM_010001
618         cmp     \tmp1, \tmp2
619         b.ne    10f
620
621         mov_q   \tmp2, TCR_CLEAR_FUJITSU_ERRATUM_010001
622         bic     \tcr, \tcr, \tmp2
623 10:
624 #endif /* CONFIG_FUJITSU_ERRATUM_010001 */
625         .endm
626
627 /**
628  * Errata workaround prior to disable MMU. Insert an ISB immediately prior
629  * to executing the MSR that will change SCTLR_ELn[M] from a value of 1 to 0.
630  */
631         .macro pre_disable_mmu_workaround
632 #ifdef CONFIG_QCOM_FALKOR_ERRATUM_E1041
633         isb
634 #endif
635         .endm
636
637         /*
638          * frame_push - Push @regcount callee saved registers to the stack,
639          *              starting at x19, as well as x29/x30, and set x29 to
640          *              the new value of sp. Add @extra bytes of stack space
641          *              for locals.
642          */
643         .macro          frame_push, regcount:req, extra
644         __frame         st, \regcount, \extra
645         .endm
646
647         /*
648          * frame_pop  - Pop the callee saved registers from the stack that were
649          *              pushed in the most recent call to frame_push, as well
650          *              as x29/x30 and any extra stack space that may have been
651          *              allocated.
652          */
653         .macro          frame_pop
654         __frame         ld
655         .endm
656
657         .macro          __frame_regs, reg1, reg2, op, num
658         .if             .Lframe_regcount == \num
659         \op\()r         \reg1, [sp, #(\num + 1) * 8]
660         .elseif         .Lframe_regcount > \num
661         \op\()p         \reg1, \reg2, [sp, #(\num + 1) * 8]
662         .endif
663         .endm
664
665         .macro          __frame, op, regcount, extra=0
666         .ifc            \op, st
667         .if             (\regcount) < 0 || (\regcount) > 10
668         .error          "regcount should be in the range [0 ... 10]"
669         .endif
670         .if             ((\extra) % 16) != 0
671         .error          "extra should be a multiple of 16 bytes"
672         .endif
673         .ifdef          .Lframe_regcount
674         .if             .Lframe_regcount != -1
675         .error          "frame_push/frame_pop may not be nested"
676         .endif
677         .endif
678         .set            .Lframe_regcount, \regcount
679         .set            .Lframe_extra, \extra
680         .set            .Lframe_local_offset, ((\regcount + 3) / 2) * 16
681         stp             x29, x30, [sp, #-.Lframe_local_offset - .Lframe_extra]!
682         mov             x29, sp
683         .endif
684
685         __frame_regs    x19, x20, \op, 1
686         __frame_regs    x21, x22, \op, 3
687         __frame_regs    x23, x24, \op, 5
688         __frame_regs    x25, x26, \op, 7
689         __frame_regs    x27, x28, \op, 9
690
691         .ifc            \op, ld
692         .if             .Lframe_regcount == -1
693         .error          "frame_push/frame_pop may not be nested"
694         .endif
695         ldp             x29, x30, [sp], #.Lframe_local_offset + .Lframe_extra
696         .set            .Lframe_regcount, -1
697         .endif
698         .endm
699
700 /*
701  * Set SCTLR_ELx to the @reg value, and invalidate the local icache
702  * in the process. This is called when setting the MMU on.
703  */
704 .macro set_sctlr, sreg, reg
705         msr     \sreg, \reg
706         isb
707         /*
708          * Invalidate the local I-cache so that any instructions fetched
709          * speculatively from the PoC are discarded, since they may have
710          * been dynamically patched at the PoU.
711          */
712         ic      iallu
713         dsb     nsh
714         isb
715 .endm
716
717 .macro set_sctlr_el1, reg
718         set_sctlr sctlr_el1, \reg
719 .endm
720
721 .macro set_sctlr_el2, reg
722         set_sctlr sctlr_el2, \reg
723 .endm
724
725         /*
726          * Check whether preempt/bh-disabled asm code should yield as soon as
727          * it is able. This is the case if we are currently running in task
728          * context, and either a softirq is pending, or the TIF_NEED_RESCHED
729          * flag is set and re-enabling preemption a single time would result in
730          * a preempt count of zero. (Note that the TIF_NEED_RESCHED flag is
731          * stored negated in the top word of the thread_info::preempt_count
732          * field)
733          */
734         .macro          cond_yield, lbl:req, tmp:req, tmp2:req
735         get_current_task \tmp
736         ldr             \tmp, [\tmp, #TSK_TI_PREEMPT]
737         /*
738          * If we are serving a softirq, there is no point in yielding: the
739          * softirq will not be preempted no matter what we do, so we should
740          * run to completion as quickly as we can.
741          */
742         tbnz            \tmp, #SOFTIRQ_SHIFT, .Lnoyield_\@
743 #ifdef CONFIG_PREEMPTION
744         sub             \tmp, \tmp, #PREEMPT_DISABLE_OFFSET
745         cbz             \tmp, \lbl
746 #endif
747         adr_l           \tmp, irq_stat + IRQ_CPUSTAT_SOFTIRQ_PENDING
748         this_cpu_offset \tmp2
749         ldr             w\tmp, [\tmp, \tmp2]
750         cbnz            w\tmp, \lbl     // yield on pending softirq in task context
751 .Lnoyield_\@:
752         .endm
753
754 /*
755  * This macro emits a program property note section identifying
756  * architecture features which require special handling, mainly for
757  * use in assembly files included in the VDSO.
758  */
759
760 #define NT_GNU_PROPERTY_TYPE_0  5
761 #define GNU_PROPERTY_AARCH64_FEATURE_1_AND      0xc0000000
762
763 #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI      (1U << 0)
764 #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC      (1U << 1)
765
766 #ifdef CONFIG_ARM64_BTI_KERNEL
767 #define GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT          \
768                 ((GNU_PROPERTY_AARCH64_FEATURE_1_BTI |  \
769                   GNU_PROPERTY_AARCH64_FEATURE_1_PAC))
770 #endif
771
772 #ifdef GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT
773 .macro emit_aarch64_feature_1_and, feat=GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT
774         .pushsection .note.gnu.property, "a"
775         .align  3
776         .long   2f - 1f
777         .long   6f - 3f
778         .long   NT_GNU_PROPERTY_TYPE_0
779 1:      .string "GNU"
780 2:
781         .align  3
782 3:      .long   GNU_PROPERTY_AARCH64_FEATURE_1_AND
783         .long   5f - 4f
784 4:
785         /*
786          * This is described with an array of char in the Linux API
787          * spec but the text and all other usage (including binutils,
788          * clang and GCC) treat this as a 32 bit value so no swizzling
789          * is required for big endian.
790          */
791         .long   \feat
792 5:
793         .align  3
794 6:
795         .popsection
796 .endm
797
798 #else
799 .macro emit_aarch64_feature_1_and, feat=0
800 .endm
801
802 #endif /* GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT */
803
804 #endif  /* __ASM_ASSEMBLER_H */