首页 > 其他分享 >arm A64 local_irq_disable/local_irq_save实现

arm A64 local_irq_disable/local_irq_save实现

时间:2024-03-05 19:23:47浏览次数:25  
标签:save A64 irq disable linux include local

Linux很多地方会使用 local_irq_disable/local_irq_save函数,那么不同CPU架构,有不同的实现方式,arm64又是怎么实现的呢?

下面是spin_lock_irqsave的代码调用层次关系:

-> spin_lock_irqsave    /* include/linux/spinlock.h */
  -> raw_spin_lock_irqsave    /* include/linux/spinlock.h */
    -> _raw_spin_lock_irqsave    /* include/linux/spinlock_api_smp.h */
      -> __raw_spin_lock_irqsave    /* include/linux/spinlock_api_smp.h */
        -> local_irq_save    /* include/linux/irqflags.h */
          -> raw_local_irq_save    /* include/linux/irqflags.h */
            -> arch_local_irq_save    /* arch/arm64/include/asm/irqflags.h */

arm nmi使用了 GIC 架构中的中断优先级特性。Linux 对特定中断号进行编程,使其其优先级高于所有其他中断。然后重写了arm64特定的中断启用和禁用函数来更改CPU中断优先级掩码(ICC_PMR_EL1),而不是直接操作CPU IRQ异常标志(PSTATE.I),从达到特定中断即可视为NMI。

从代码来看那么arch_local_irq_disable就分为两种情况:

  1. 支持gic中断优先级时,使用gic的优先级来屏蔽中断
  2. 修改daif csr寄存器,即PSTATE.IF来屏蔽
static __always_inline void __daif_local_irq_disable(void)
{
	barrier();
	asm volatile("msr daifset, #3");
	barrier();
}

static __always_inline void __pmr_local_irq_disable(void)
{
	if (IS_ENABLED(CONFIG_ARM64_DEBUG_PRIORITY_MASKING)) {
		u32 pmr = read_sysreg_s(SYS_ICC_PMR_EL1);
		WARN_ON_ONCE(pmr != GIC_PRIO_IRQON && pmr != GIC_PRIO_IRQOFF);
	}

	barrier();
	write_sysreg_s(GIC_PRIO_IRQOFF, SYS_ICC_PMR_EL1);
	barrier();
}

标签:save,A64,irq,disable,linux,include,local
From: https://www.cnblogs.com/lvzh/p/18054699

相关文章

  • InheritableThreadLocal 使用举例
    ThreadLocalpublicclassMyThreadextendsThread{privateThreadLocal<String>threadLocal=newThreadLocal<>();publicvoidrun(){threadLocal.set("ThreadLocalvalueinMyThread");System.out.println(&quo......
  • TransmittableThreadLocal 如何解决在分布式环境下线程池中使用ThreadLocal的问题
    在分布式环境下,线程池中使用ThreadLocal会出现线程安全问题,因为线程池中的线程是可以被多个请求共享的,当多个请求同时访问同一个ThreadLocal变量时,会出现数据互相干扰的问题。为了解决这个问题,Java提供了TransmittableThreadLocal类。TransmittableThreadLocal是ThreadLocal的一......
  • 深入理解 ThreadLocal
    目录1.ThreadLocal是什么,它有哪些特性?2.ThreadLocal的底层数据结构包含哪些内容?3.ThreadLocalMap的初始大小、加载因子分别是多少?4.ThreadLocal底层用到的Hash算法是什么?5.ThreadLocal如何解决Hash冲突?6.ThreadLocal底层的扩容机制是什么?7.ThreadLocal的get方法的实现流程?8......
  • ThreadLocal解析
    ThreadLocal解析目录ThreadLocal解析1.两大使用场景——ThreadLocal的用途典型场景1:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)典型场景2:每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻......
  • locals与global函数
    使用locals与globals函数Python提供了locals和globals两个内置函数,可以用来获取当前作用域所有的变量。locals函数locals函数可以获取当前作用域所有的变量。在全局空间(函数外)调用locals,获取的是调用locals之前所有的全局变量。在局部空间(函数内)调用locals,获取的是调用......
  • SSH连接告警:-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
    问题ssh连接登录时报错Lastlogin:SatMar209:58:252024from10.10.1.1-bash:warning:setlocale:LC_ALL:cannotchangelocale(en_US.UTF-8)[root@master01~]#解决系统已经设置了默认地区_语言,字符集为en_US.UTF-8,但是在系统中没有定义对应的locale文件,只......
  • cURL error 60: SSL certificate problem: unable to get local issuer certifica 解
    cURLerror60:SSLcertificateproblem:unabletogetlocalissuercertifica解决 无法获取本地颁发者证书 Windows版本1.到https://curl.haxx.se/ca/cacert.pem下载证书文件cacert.pem,将其保存到PHP安装路径下。2.编辑php.ini文件,删除curl.cainfo配置项前......
  • ssts-hospital-web-master项目实战记录十四:项目迁移-模块实现(log-local)
    记录时间:2024-02-25一、log-local模块实现framework/config/index.ts//终端日志文件配置constLogTerminalInfoDir='D:\\LogInfo\\LogTerminalInfo\\'constLogTerminalInfoFileNamePrefix='LogTerminalInfo'//错误页面快照文件配置constLogErrorPageSnapshotFil......
  • ThreadLocal
    1.用来存储数据:set()/get()2.使用ThreadLocal存储的数据,线程安全3.用完调用remove方法释放(否则可能发生内存泄漏)`/**ThreadLocal工具类*/@SuppressWarnings("all")publicclassThreadLocalUtil{//提供ThreadLocal对象,privatestaticfinalThreadLocalTHREAD_LOCA......
  • ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    1.问题在测试Windows上使用多版本Mysql数据库时,windows如何同时安装两个不同版本的Mysql(Mysql8.0+Mysql5.7)mysql-uroot-pn3fsco#ZdR7T在尝试使用DOS连接Mysql数据库发现问题2.原因我这里使用多版本Mysql数据库,该数据库在配置时,为了避免端口号与原数据库冲突,在my.ini中将......