Merge tag 'kvm-ppc-fixes-5.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / sh / kernel / irq_32.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * SHcompact irqflags support
4  *
5  * Copyright (C) 2006 - 2009 Paul Mundt
6  */
7 #include <linux/irqflags.h>
8 #include <linux/module.h>
9
10 void notrace arch_local_irq_restore(unsigned long flags)
11 {
12         unsigned long __dummy0, __dummy1;
13
14         if (flags == ARCH_IRQ_DISABLED) {
15                 __asm__ __volatile__ (
16                         "stc    sr, %0\n\t"
17                         "or     #0xf0, %0\n\t"
18                         "ldc    %0, sr\n\t"
19                         : "=&z" (__dummy0)
20                         : /* no inputs */
21                         : "memory"
22                 );
23         } else {
24                 __asm__ __volatile__ (
25                         "stc    sr, %0\n\t"
26                         "and    %1, %0\n\t"
27 #ifdef CONFIG_CPU_HAS_SR_RB
28                         "stc    r6_bank, %1\n\t"
29                         "or     %1, %0\n\t"
30 #endif
31                         "ldc    %0, sr\n\t"
32                         : "=&r" (__dummy0), "=r" (__dummy1)
33                         : "1" (~ARCH_IRQ_DISABLED)
34                         : "memory"
35                 );
36         }
37 }
38 EXPORT_SYMBOL(arch_local_irq_restore);
39
40 unsigned long notrace arch_local_save_flags(void)
41 {
42         unsigned long flags;
43
44         __asm__ __volatile__ (
45                 "stc    sr, %0\n\t"
46                 "and    #0xf0, %0\n\t"
47                 : "=&z" (flags)
48                 : /* no inputs */
49                 : "memory"
50         );
51
52         return flags;
53 }
54 EXPORT_SYMBOL(arch_local_save_flags);