18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * SHcompact irqflags support 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2006 - 2009 Paul Mundt 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/irqflags.h> 88c2ecf20Sopenharmony_ci#include <linux/module.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_civoid notrace arch_local_irq_restore(unsigned long flags) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci unsigned long __dummy0, __dummy1; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci if (flags == ARCH_IRQ_DISABLED) { 158c2ecf20Sopenharmony_ci __asm__ __volatile__ ( 168c2ecf20Sopenharmony_ci "stc sr, %0\n\t" 178c2ecf20Sopenharmony_ci "or #0xf0, %0\n\t" 188c2ecf20Sopenharmony_ci "ldc %0, sr\n\t" 198c2ecf20Sopenharmony_ci : "=&z" (__dummy0) 208c2ecf20Sopenharmony_ci : /* no inputs */ 218c2ecf20Sopenharmony_ci : "memory" 228c2ecf20Sopenharmony_ci ); 238c2ecf20Sopenharmony_ci } else { 248c2ecf20Sopenharmony_ci __asm__ __volatile__ ( 258c2ecf20Sopenharmony_ci "stc sr, %0\n\t" 268c2ecf20Sopenharmony_ci "and %1, %0\n\t" 278c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_SR_RB 288c2ecf20Sopenharmony_ci "stc r6_bank, %1\n\t" 298c2ecf20Sopenharmony_ci "or %1, %0\n\t" 308c2ecf20Sopenharmony_ci#endif 318c2ecf20Sopenharmony_ci "ldc %0, sr\n\t" 328c2ecf20Sopenharmony_ci : "=&r" (__dummy0), "=r" (__dummy1) 338c2ecf20Sopenharmony_ci : "1" (~ARCH_IRQ_DISABLED) 348c2ecf20Sopenharmony_ci : "memory" 358c2ecf20Sopenharmony_ci ); 368c2ecf20Sopenharmony_ci } 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ciEXPORT_SYMBOL(arch_local_irq_restore); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ciunsigned long notrace arch_local_save_flags(void) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci unsigned long flags; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci __asm__ __volatile__ ( 458c2ecf20Sopenharmony_ci "stc sr, %0\n\t" 468c2ecf20Sopenharmony_ci "and #0xf0, %0\n\t" 478c2ecf20Sopenharmony_ci : "=&z" (flags) 488c2ecf20Sopenharmony_ci : /* no inputs */ 498c2ecf20Sopenharmony_ci : "memory" 508c2ecf20Sopenharmony_ci ); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci return flags; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(arch_local_save_flags); 55