PowerPC的外部中断处理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

异常异常是e500mc核产生的,它是同步产生的(可以预知的),如非法指令,或访问存储器时出现TLBMiss等情况。中断中断是e500mc核外部引脚产生的中断,由PIC送进来的,它是异步产生的(无法预知的),主要有:int#,cint#,mcp#。©2011虹信通信2中断与异常MSR(MachineStateRegister)寄存器。用于设置e500mc的当前使用状态,初始化CPU时第一个设置的寄存器。CE(CriticalEnable,第46位),ME(MachineCheckEnable,第51位),DE(DebugInterruptEnable,第54位)。用于使能和关闭Critical异常,Machinecheck异常和Debug异常。EE(ExternalEnable,第48位)。为1时使能外部中断,为0时屏蔽外部中断。PR(第49位)。为0表示处理器在内核模式,为1表示处理器在用户模式。IS,DS(第58,59位)。e500mc支持两个地址空间——0和1。IS为0表示当前程序使用指令空间0,为1表示当前程序使用指令空间1;DS为0表示当前程序使用数据空间0,为1表示当前程序使用数据空间1。©2011虹信通信3寄存器中断向量是指中断或者异常程序的入口地址。一系列的中断向量号构成中断向量表。对于e500mc内核,中断处理程序的入口地址为虚拟地址。LinuxPowerPC使用e500mc内核的地址空间0保存这些虚拟地址。这也是为什么要清除PR,IS,DS位的原因。在e500mc内核中,使用IVPR和IVORx寄存器共同确定中断和异常程序的入口地址。中断入口地址的计算方法:IVPR[32-47]||IVPORn[48-59]||0b0000©2011虹信通信4寄存器e500mc内核的中断向量表©2011虹信通信5寄存器中断向量表中4号中断是外部中断,对应的中断处理函数是ExternalInput。IVORsInterrupttypeIVOR0CriticalinterruptIVOR1Machinecheck……IVOR4Externalinput……IVOR15Debug……MSK:若置1,此中断源的中断被无视.A:若置1,此中断源有中断发生P:若置1,active-high;若置0,active-low.S:若置1,此中断是水平触发。若置0,此中断是边界触发PRIORITY:优先级0-15。15是最高优先级,0时相当于无视此中断。VECTOR:硬件中断号。中断发生后处于pengding时,此字段被写在IACK中。©2011虹信通信6寄存器CTPR(ProcessorCurrentTaskPriorityRegister)寄存器。该寄存器存放当前CPU中运行任务的级别。©2011虹信通信7寄存器M位为0,表示当前中断控制器PIC被旁路,此时IRQ0引脚监测到的中断信息将直接送入到CPU。©2011虹信通信8寄存器该寄存器用来存放当前中断源的硬件中断号,是e500mc内核外部中断处理的一个重要寄存器。当处理器对此寄存器进行读操作时,将启动外部中断响应周期。©2011虹信通信9寄存器SRR0(Save/RestoreRegister0)64bit,用于异常发生时保存引起异常指令的地址(异常)或其下一条指令的地址(中断)。保存过程硬件自动做执行rfi从异常返回时,处理器会跳转到SRR0保存的地址处继续执行。SRR1(Save/RestoreRegister1)32bit,用于异常发生时硬件自动保存MSR(MachineStatusRegister)。执行rfi从异常返回时,处理器会将SRR1值恢复入MSR。EOI(EndofInterruptRegister)该寄存器只有“EOICODE”字段有效,对此字段写入0b0000将结束当前中断的处理。©2011虹信通信10寄存器1.捕捉到外部中断信号#cint,#int。2.保存被中断程序的返回地址到SRR0寄存器中。3.保存MSR寄存器到SRR1中,如果是地址异常还会保存错误地址到DEAR寄存器中。4.保留MSR寄存器中的CE,DE,ME位,其余全部清除。因此,e500mc在处理外部中断时,还可以被Critical中断,调试中断和MachineCheck中断重入。5.清除PR,IS,DS位。此时,处理器运行在内核模式。6.根据IVPR和IVOR4寄存器获得中断向量,进行中断程序执行。7.中断程序执行结束后,使用rfi指令返回。rfi指令从SRR1寄存器恢复MSR寄存器,从SRR0寄存器中获得中断的返回地址。©2011虹信通信11外部中断处理机制©2011虹信通信12外部中断处理过程处理器的内部或外部中断源有效时,会将相应的中断信号传递到中断控制器PIC中,此时,中断控制器PIC会进行以下操作。1.处理器首先使用IPR寄存器暂存所有有效的内部及外部中断源。2.随后中断控制器PIC会对暂存在IPR寄存器中的中断源进行处理,并将中断优先级别最高的中断源通过IS传递到IRR寄存器中。此时IRR寄存器保存这个优先级别最高的中断源的硬件中断号和中断优先级别。3.如果在IRR寄存器中的存放中断源,其优先级高于CTPR和ISR寄存器中存放的中断源,中断控制器PIC将使用int#或者cint#信号向处理器发出中断请求。4.当int#或者cint#信号有效时,CPU将跳转到外部中断向量,并开始执行外部中断处理程序。处理器进入中断服务程序后,将读取IACK寄存器,启动中断响应周期。©2011虹信通信13外部中断处理过程4.在处理器进行中断响应时,处理器开始真正意义上的中断处理,同时由软件更新CTPR寄存器为当前中断源的优先级别,并由中断控制器PIC在ISR寄存器中标记当前中断源正在被处理。处理器使用ISR寄存器,记录所有正在被处理的中断源和当前最高的中断优先级别。5.所有的中断源都有可能引发外部中断。此时中断处理程序必须通过存放在IACK寄存器中的硬件中断号,判断究竟是哪一个中断源引发的外部中断,随后调用相应的中断服务例程,处理相应的中断事件。6.中断事件处理完毕后,处理器将对EOI寄存器进行写操作完成当前中断,并由中断寄存器PIC自动完成对ISR寄存器的维护,同时使用软件更新CTPR寄存器为一个较低的值,以便其他中断进入。7.在程序员进行外部中断处理时,可以将CTPR寄存设为0,而由ISR寄存器维护中断源的级别,并判断是否允许中断重入。©2011虹信通信14外部中断处理过程在外部代理(externalproxy)功能模式,e500mc内核自动为MPIC生成IACK周期。虽然从系统软件的角度看,直到有外部中断发生,e500mc内核才会响应中断。在外部代理功能模式,中断处理程序应该从e500mc内核的EPR寄存器检索到中断向量,并且不读IACK寄存器。在在外部代理功能模式,读IACK寄存器会产生一个虚假的中断。©2011虹信通信15外部中断处理过程1.LinuxPowerPC对外部中断系统的初始化,包括一些重要结构空间的分配内存并进行初始化。2.设备驱动程序的中断服务例程与外部中断处理系统的挂接。在设备驱动程序初始化时,使用request_irq函数那个外部设备的中断服务例程与LinuxPowerPC的ExternallInput函数挂接。进入ExternalInput函数后,LinuxPowerPC经过一系列的操作后,将调用相应设备驱动程序的中断例程。3.外部中断的处理,即外部中断处理函数ExternalInput的实现过程。©2011虹信通信16外部中断系统Linux系统使用init_IRQ函数对外部中断系统进行初始化。Init_IRQ函数调用ppc_md.int_IRQ,在P4080处理器系统中,它的值等于mpc85xx_cds_pic_init。该函数进行了如下初始化。1.首先调用of_find_node_by_type函数获得P4080处理器系统有关中断控制器信息。2.调用mpic_alloc函数,为mpic结果分配内存空间并进行基本的初始化。3.使用mpic_init函数对MPIC中断控制器进行初始化。©2011虹信通信17外部中断系统初始化在LinuxPowerPC中,外部中断描述表irq_desc是联系外部中断处理函数和外部设备中断服务例程之间的纽带。外部中断描述表一共有NR_IRQS个Entry,并使用irq_desc结构描述每一个Entry。其中,NR_IRQS为当前处理器系统软件中断号的最大值。外部中断描述表的每一个Entry与Linux系统中的软件中断一一对应,该表描述Linux系统中每一个软件中断号。设备驱动程序中使用request_irq函数申请中断资源之前,LinuxPowerPC使用irq_of_parse_and_map函数建立这种软件号与硬件号之间之间的映射关系。©2011虹信通信18设备驱动程序与外部中断处理系统的挂接irq_of_parse_and_map----irq_create_of_mapping----irq_create_mapping----irq_setup_virq(调用host-ops-map函数,等效于mpic_host_map)mpic_host_map函数是LinuxPowerPC进行软硬件中断号映射重要的函数。在这个函数里会首先调用set_irq_chip_data函数将mpic结果保存在相应中断描述符irq_desc的chip_data参数中,以便以后使用,之后调用set_irq_chip_and_handler函数将相应中断描述符irq_desc的handle参数设置完毕后,当外部中断程序处理这个中断源时,将首先执行handle_fasteoi_irq函数。set_irq_chip_and_handler函数会依次调用set_irq_chip和_set_irq_handler函数。set_irq_chip函数是设备驱动程序的中断服务例程与MPIC中断控制器进行挂接的要点。©2011虹信通信19设备驱动程序与外部中断处理系统的挂接Set_irq_chip函数将中断描述符irq_desc中相应Entry的chip参数赋值为mpic-hc_irq,即为mpic_irq_chip。之后,在设备驱动中断服务例程可以使用mpic_irq_chip结构中提供的操作函数,访问MPIC中断控制器中的寄存器。_set_irq_handler函数将中断描述符irq_desc相应Entry的handle_irq赋值为mpic-hc_irq,即为handle_fasteoi_irq。request_irq函数会调用setup_irq函数,setup_irq函数将中断服务例程加入到中断描述表irq_desc中,完成设备驱动程序与外部中断系统的挂接。©2011虹信通信20设备驱动程序与外部中断处理系统的挂接set_irq_chip函数将中断描述符irq_desc中相应Entry的chip参数赋值为mpic-hc_irq,即为mpic_irq_chip。之后,在设备驱动中断服务例程可以使用mpic_irq_chip结构中提供的操作函数,访问MPIC中断控制器中的寄存器。_set_irq_handler函数将中断描述符irq_desc相应Entry的handle_irq赋值为mpic-hc_irq,即为handle_fasteoi_irq。request_irq函数会调用setup_irq函数,setup_irq函数将中断服务例程加入到中断描述表irq_desc中,完成设备驱动程序与外部中断系统的挂接。©2011虹信通信21外部中断的处理在LinuxPowerPC的外部中断处理子系统中,do_IRQ函数作为总控程序,负责外部中断的处理。do_IRQ函数的主要作用是执行设备驱动程序的中断服务例程,处理具体的中断处理。do_IRQ函数的执行流程如下:do_IRQ函数函数首先使用set_irq_regs函数将regs参数保存起来。之后调用宏

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功