CN114902180A - 模间调用分支指令 - Google Patents
模间调用分支指令 Download PDFInfo
- Publication number
- CN114902180A CN114902180A CN202080091449.7A CN202080091449A CN114902180A CN 114902180 A CN114902180 A CN 114902180A CN 202080091449 A CN202080091449 A CN 202080091449A CN 114902180 A CN114902180 A CN 114902180A
- Authority
- CN
- China
- Prior art keywords
- domain
- mode
- instruction
- exception
- function return
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000012545 processing Methods 0.000 claims abstract description 308
- 230000004044 response Effects 0.000 claims abstract description 120
- 230000006870 function Effects 0.000 claims description 562
- 238000000034 method Methods 0.000 claims description 75
- 230000008569 process Effects 0.000 claims description 51
- 230000001960 triggered effect Effects 0.000 claims description 42
- 230000004888 barrier function Effects 0.000 claims description 32
- 238000013519 translation Methods 0.000 claims description 26
- 238000001514 detection method Methods 0.000 claims description 21
- 230000011664 signaling Effects 0.000 claims description 20
- 238000004590 computer program Methods 0.000 claims description 18
- 238000003672 processing method Methods 0.000 claims description 2
- 230000007704 transition Effects 0.000 description 79
- 238000006243 chemical reaction Methods 0.000 description 66
- 230000014616 translation Effects 0.000 description 25
- 230000008859 change Effects 0.000 description 19
- 230000007246 mechanism Effects 0.000 description 18
- 238000013459 approach Methods 0.000 description 17
- 238000012937 correction Methods 0.000 description 16
- 230000003111 delayed effect Effects 0.000 description 8
- 230000009471 action Effects 0.000 description 7
- 238000012546 transfer Methods 0.000 description 7
- 230000008901 benefit Effects 0.000 description 6
- 238000011161 development Methods 0.000 description 5
- 230000000694 effects Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 238000007667 floating Methods 0.000 description 4
- 238000002955 isolation Methods 0.000 description 4
- 208000011580 syndromic disease Diseases 0.000 description 4
- 230000006399 behavior Effects 0.000 description 3
- 239000003795 chemical substances by application Substances 0.000 description 3
- 238000013461 design Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 238000004088 simulation Methods 0.000 description 3
- 101100497192 Caenorhabditis elegans cpna-5 gene Proteins 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000001934 delay Effects 0.000 description 2
- 238000007429 general method Methods 0.000 description 2
- 230000002147 killing effect Effects 0.000 description 2
- 230000000670 limiting effect Effects 0.000 description 2
- 239000002245 particle Substances 0.000 description 2
- 230000002829 reductive effect Effects 0.000 description 2
- 238000000638 solvent extraction Methods 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 230000009849 deactivation Effects 0.000 description 1
- 238000006731 degradation reaction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000011010 flushing procedure Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000007334 memory performance Effects 0.000 description 1
- 230000000116 mitigating effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000036961 partial effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000002265 prevention Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 238000000926 separation method Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3861—Recovery, e.g. branch miss-prediction, exception handling
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30054—Unconditional branch instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30058—Conditional branch instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30181—Instruction operation extension or modification
- G06F9/30189—Instruction operation extension or modification according to execution mode, e.g. mode flag
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/32—Address formation of the next instruction, e.g. by incrementing the instruction counter
- G06F9/322—Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
- G06F9/323—Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for indirect branch instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3851—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/481—Exception handling
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Multimedia (AREA)
- Computer Hardware Design (AREA)
- Storage Device Security (AREA)
- Executing Machine-Instructions (AREA)
- Advance Control (AREA)
- Pharmaceuticals Containing Other Organic And Inorganic Compounds (AREA)
- Acyclic And Carbocyclic Compounds In Medicinal Compositions (AREA)
Abstract
本发明提供了一种处理电路(4),该处理电路具有处理程序模式和线程模式。响应于异常条件,进行到处理程序模式的切换。响应于该处理电路(4)处于该处理程序模式时指定分支目标地址的模间调用分支指令,指令解码器(10)控制该处理电路来将函数返回地址保存到函数返回地址存储位置;将该处理电路(4)的当前模式切换到该线程模式;以及分支到该分支目标地址所识别的指令。这对于异常的特权解除可能很有用。
Description
本技术涉及数据处理领域。
处理电路可具有许多操作模式,其中处理电路可处理指令。例如,这些模式可至少包括处理程序模式和线程模式。异常条件可使处理电路切换到在处理程序模式下处理异常处理程序。通过提供处理程序模式和线程模式的硬件分离,这可能更容易地管理与操作系统相关联的异常处理程序的操作和由操作系统管理的线程之间的隔离。
至少一些示例提供了一种装置,该装置包括:处理电路,该处理电路用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;异常控制电路,所述异常控制电路响应于异常条件,用于控制所述处理电路来切换到在所述处理程序模式下处理异常处理程序;和指令解码器,该指令解码器用于解码指令以控制该处理电路来执行数据处理;其中:至少当处理电路处于处理程序模式时,响应于指定分支目标地址的模间调用分支指令,指令解码器被配置为控制处理电路以:将函数返回地址保存到函数返回地址存储位置;将所述处理电路的当前模式切换到所述线程模式;以及分支到该分支目标地址所识别的指令。
至少一些示例提供了一种用于装置的数据处理方法,该装置包括:处理电路,该处理电路用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;和异常控制电路,所述异常控制电路响应于异常条件,用于控制所述处理电路来切换到在所述处理程序模式下处理异常处理程序;该方法包括:解码指定分支目标地址的模间调用分支指令;以及至少当处理电路处于处理程序模式时,响应于模间调用分支指令:将函数返回地址保存到函数返回地址存储位置;将所述处理电路的当前模式切换到所述线程模式;以及分支到分支目标地址所识别的指令。
至少一些示例提供了一种计算机程序,该计算机程序用于控制主机数据处理装置来提供用于执行来自目标程序代码的指令的指令执行环境;该计算机程序包括:处理程序逻辑,该处理程序逻辑用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;异常控制程序逻辑,所述异常控制程序逻辑响应于异常条件,用于控制所述处理程序逻辑来切换到在所述处理程序模式下处理异常处理程序;和指令解码程序逻辑,该指令解码程序逻辑用于解码目标程序代码的指令,以控制处理程序逻辑来执行数据处理;其中:至少当处理程序逻辑处于处理程序模式时,响应于指定分支目标地址的模间调用分支指令,指令解码程序逻辑被配置为控制处理程序逻辑以:将函数返回地址保存到函数返回地址存储位置;将所述处理程序逻辑的当前模式切换到所述线程模式;以及分支到分支目标地址所识别的目标程序代码的指令。
一种计算机可读存储介质可存储上述计算机程序。该存储介质可以是非暂态存储介质。
本技术的另外的方面、特征和优点将从结合附图阅读的示例的以下描述中显而易见,在这些附图中:
图1示意性地示出具有支持不同操作模式的处理电路的数据处理系统的示例;
图2示出处理电路的不同域和操作模式的示例;
图3示出处理电路的寄存器的示例;
图4示出无法用于可执行指令的保留地址范围的提供;
图5示出虚拟函数返回地址和虚拟异常返回地址;
图6示出可响应于函数调用或异常而保存到栈的不同栈帧;
图7示出在不支持模间调用分支指令的情况下异常特权解除的示例以供比较;
图8示出使用模间调用分支指令进行的异常特权解除的示例;
图9示出禁止的组合域/模式切换的示例;
图10示出允许的组合域/模式切换的示例;
图11A至图11C示出图10的组合域/模式切换可能对其有用的尾部调用的示例;
图12是示出当调用函数时执行的步骤的流程图;
图13是示出在异常进入时执行的步骤的流程图;
图14是示出响应于除函数调用之外的分支指令而执行的步骤的流程图;
图15是示出响应于到虚拟函数返回地址的分支而执行的步骤的流程图;
图16A至图16D示出可使用图15所示的完整性交叉检查来检测的潜在攻击;
图17是示出在线程模式下禁用域转换的流程图;
图18至图20示出使用域转换禁用配置参数的示例;
图21是示出在提取地址在安全地址区域中的指令时检查域转换禁用配置参数的流程图;并且
图22示出可使用的模拟器示例。
模间调用分支指令
在其中处理电路支持处理程序模式和线程模式的系统中,通常期望将处理程序模式用于处理异常处理程序(例如,与操作系统或其他监控软件相关联),将线程模式用于处理由操作系统或监控软件管理的线程的后台代码。然而,有时可能存在一些类型的异常,它们指向可能不可信的设备,诸如USB控制器或无线网络接口。指向此类设备的中断可通过第三方提供的异常处理程序代码来处理,该第三方不同于提供操作系统的一方,该操作系统管理处理系统的一般操作。操作系统提供方可能不信任另一方提供的代码,因此可能希望用于控制此类不可信设备的不可信异常处理程序代码不应具有与处理程序模式相关联的全部特权。因此,可能希望能够对异常进行“特权解除”,使得异常处理程序可能无法访问处理程序模式下的代码通常能够访问的所有寄存器或存储器。此外,在设备上运行的所有软件都来自同一供应商的情况下,可能希望降低特权软件的复杂性,并因此降低在特权软件中存在安全漏洞的可能性。因此,即使在所有软件都来自单个供应商的情况下,作为纵深防御策略的一部分,仍可能希望对异常进行“特权解除”。
然而,在具有处理程序模式和线程模式的典型系统中,在模式之间切换的机制可以是使用异常来从线程模式切换到处理程序模式,并使用异常返回来切换回线程模式。简单地触发异常返回到线程模式可能不合适,因为这通常会降低与原始异常相关联的优先级级别,从而导致难以适当地确定不同中断或异常的优先级。因此,通常可能需要生成“假”第二异常,仅用于建立异常返回控制信息,在从第二异常返回时,该异常返回控制信息导致在线程模式而不是处理程序模式下处理原始异常。这种机制可能很慢,因为调用第二异常可能不仅产生用于建立假异常返回操作的操作的性能成本,还会产生附加状态保存和恢复操作的成本,这些操作通常在异常进入和返回时执行,以保留与在异常之前执行的进程相关联的架构状态。因此,如果使用异常进入和返回机制来对异常处理程序进行特权解除,则这可能增加整体中断/异常处理延迟,这在某些系统中可能是不可接受的,尤其是在旨在用于实时应用程序的系统中。此外,这种方法可能难以为编译器编写代码,从而导致可能的错误。
在下面描述的示例中,提供指定分支目标地址的模间调用分支指令。响应于模间调用分支指令,至少当处理电路处于处理程序模式时,指令解码器控制处理电路来将函数返回地址保存到函数返回地址存储位置,将处理电路的当前模式切换到线程模式,并且分支到分支指令所指定的分支目标地址所识别的指令。因此,提供了一种函数调用机制,其中指令可直接分支到指令的分支目标地址,然后将在线程模式而不是处理程序模式下处理该指令。这提供了一种更快且更简单的机制来对异常进行特权解除,消除了对如上所述的假第二异常的需要。
除了处理程序模式和线程模式之外,处理电路还可支持在至少包括安全域和较低安全域的多个安全域中的一个安全域中进行数据处理。可提供存储器访问检查电路,以根据处理电路的当前安全域来检查是否允许存储器访问。例如,存储器访问检查电路可维护提供安全属性的表,这些安全属性将相应地址区域定义为与安全域相关联的安全区域或与较低安全域相关联的较低安全区域。当在安全域中操作时,处理电路可访问存储器的安全区域和较低安全区域两者,而在较低安全域中,处理电路可访问较低安全区域,但不被允许访问安全区域。
指令解码器和处理电路可支持指定分支目标地址的域间调用分支指令。响应于域间调用分支指令,指令解码器可控制处理电路来将函数返回地址保存到函数返回地址存储位置,分支到分支目标地址所识别的指令并且切换处理电路的当前安全域。因此,通过允许从一个域直接分支到另一域,也可更快地改变安全域。在一些系统中,可在从安全域到较低安全域以及从较低安全域到安全域的两个方向上支持域间调用分支指令。然而,在其他具体实施中,可能不需要为交换域的两个方向提供域间调用分支指令。例如,在一些具体实施中,域间调用分支指令可以是触发从安全域切换到较低安全域的安全到较低安全调用分支指令,并且可提供其他机制来从较低安全域转换到安全域(例如,作为替代,安全网关指令可导致域从较低安全域切换到安全域,使得可通过要求在执行来自存储器的较低安全区域的指令之后从存储器的安全区域提取的第一地址处存在安全网关指令来限制可进入安全域的有效位置)。一些具体实施可使用类似的方案来防止在较低特权状态下运行的代码访问存储器的仅被标记为特权的区域。
因此,可支持多个调用分支指令,该多个调用分支指令导致处理电路执行保存函数返回地址并分支到分支目标地址处的指令的函数调用操作。这些指令可包括保持在相同模式和相同域内的调用分支指令,以及触发切换到线程模式的模间调用分支指令和触发安全域改变的域间调用分支指令。然而,响应于同一调用分支指令的模式和域的组合切换可被禁止。因此,响应于模间调用分支指令,指令解码器可控制处理电路来将当前模式切换到线程模式,而无需改变处理电路的当前安全域。这可通过减少允许的安全域的有效转换的数量来增加安全性,从而更容易验证安全域的改变是否安全。
响应于模间函数返回指令,处理电路可将处理电路的当前模式切换回处理程序模式,并且分支到模间调用分支指令先前所保存的函数返回地址所识别的指令。因此,当异常处理程序的特权解除部分完成时,模间函数返回指令可用于触发切换回到处理程序模式,在该模式下,当发生对应的异常时,处理电路首先执行。
在一些示例中,模间函数返回指令可以是专用函数返回指令,其具有由指令解码器识别为需要函数返回操作的编码。
然而,这不是必需的,并且在某些情况下,指令是否导致模间函数返回可取决于在执行时存储在寄存器或存储器中的信息。例如,可通过尝试分支到保留的不可执行地址(下面称为虚拟函数返回地址,例如图5所示的FNC_RETURN地址140,稍后将对其进行更详细描述)来触发模间函数返回。由于模间函数返回指令可以是异常处理程序的特权解除部分内的不可信代码的一部分,因此如果模间函数返回指令具有与非模间函数返回指令相同的指令编码,而该非模间函数返回指令并非旨在触发从线程模式切换回处理程序模式,则这可能很有用,因为异常处理程序的特权解除部分可能由不知道其异常处理程序进行了特权解除的第三方提供。
在一些示例中,响应于模间调用分支指令,指令解码器可控制处理电路来将虚拟函数返回地址保存到链接寄存器。虚拟函数返回地址可以是保留地址范围中的地址,该地址并非有效可执行地址。虚拟函数返回地址可包括模间调用指示值,以指示响应于模间调用分支指令而保存虚拟函数返回地址。如果指令尝试分支到虚拟函数返回地址,此时虚拟函数返回地址包括模间调用指示值,则处理电路可将该指令视为模间函数返回指令,并切换到处理程序模式以及分支到从栈获得的真实函数返回地址。因此,通过在虚拟函数返回地址内存储模间调用指示值,这可区分模间函数返回与非模间返回,使得可将同一指令编码用于这两种类型的函数返回。这意味着不需要修改第三方特权解除异常处理程序代码来支持上面讨论的模间分支技术。此外,通过在链接寄存器中使用不可执行虚拟函数返回地址来发信号通知在函数返回时,应从栈中访问真实函数返回地址,这可对特权解除代码隐藏真实函数返回地址,以便在模间调用分支指令之后在线程模式下执行。
模间函数返回指令可以是可能导致分支到虚拟函数返回地址的多种类型的指令中的一种指令,例如分支指令或非分支指令(诸如寄存器移动指令、加载指令或栈弹出指令),该指令导致程序计数器被设置为虚拟函数返回地址。因此,在一些具体实施中,该指令可为处理电路(而不是指令解码器),其识别出应执行模间函数返回,并且因此这也应触发切换到处理程序模式。在一些示例中,如果所有类型的分支将虚拟函数返回地址指定为分支目标地址,则它们可导致函数返回处理。在其他示例中,可能存在不会导致执行函数返回处理的某些类型的分支,即使它们确实将虚拟函数返回地址指定为分支目标地址(例如,使用立即值指定目标地址的分支可能不会导致执行函数返回处理,因为它们不需要执行函数返回,因为响应于函数调用指令无法保存立即指定的分支目标地址)。
与模间调用分支指令不同,对于模间函数返回指令,可能希望允许域和模式两者的组合切换。因此,响应于模间函数返回指令,处理电路可能能够执行从第一安全域和线程模式中的处理到第二安全域和处理程序模式中的处理的组合域/模式切换。这对于支持尾部调用很有用,尾部调用是在调用第二函数作为针对第一函数执行的代码内的最后一个动作的场景中,一些编译器使用的性能优化。由于第二函数可在与第一函数不同的安全域中进行处理,因此这对于模间函数返回指令支持组合域/模式切换可能很有用,使得先前使用尾部调用编译的遗留代码仍可正常运行。
然而,在一些情况下,如果第一安全域是安全域并且第二安全域是较低安全域,则可允许在模间函数返回时进行组合域/模式切换,但当第一安全域是较低安全域并且第二安全域是安全域时,禁止进行组合域/模式切换。如果这将导致转换到安全域,则通过禁止在函数返回时进行组合域/模式切换,这可通过减少可用于有效进入安全域的途径的数量来提高安全性。
如下面进一步描述的,可提供域转换禁用配置值,以指示在处于线程模式时禁用还是启用安全域与较低安全域之间的转换。这对于支持与安全域或较低安全域中的一者相关联的资源的延迟分配可能很有用。由于执行模间调用分支指令的异常处理程序或其他进程通常可能知道其是否已配置了在这两个域中操作所需的资源,因此响应于模间调用分支指令来设置域转换禁用配置值可能很有用。这通过避免需要执行单独的指令来设置域转换禁用配置值,从而提高性能。模间调用分支指令存在一个或多个变体。响应于模间调用分支指令的第一变体,指令解码器可控制处理电路来设置域转换禁用配置值,以指示在处于线程模式时安全域与较低安全域之间的转换被禁用。响应于模间调用分支指令的第二变体,指令解码器可控制处理电路来设置域转换禁用配置值,以指示在处于线程模式时安全域与较低安全域之间的转换被启用。一些系统可支持模间调用分支指令的这两种变体。其他系统可仅支持模间调用分支指令的第一变体/第二变体中的一者。
响应于模间调用分支指令,当处理电路的当前模式是线程模式时,指令解码器可触发故障的信令。由于模间调用分支指令旨在导致处理程序模式到线程模式转换,因此从线程模式执行该模间调用分支指令可能是错误的指示。在这种情况下提出故障可防止误用。例如,由于模间调用分支指令的执行可能触发状态的保存,这指示在对应的函数返回时,应进行从线程模式到处理程序模式的转换,因此在线程模式下运行进程的攻击者可能会倾向于使用模间调用分支指令来尝试在对应的函数返回时获得特权。通过防止在线程模式中的模间调用分支指令的成功执行且如果尝试此情况则发信号通知故障,这可通过防止此类攻击成功来提高安全性。
一般而言,函数返回指令可以是导致分支到先前响应于调用分支指令而设置的函数返回地址所识别的指令的任何指令。模间函数返回指令是特定类型的函数返回指令,其还触发在当前模式下从线程模式到处理程序模式的切换(例如,通过存储在寄存器或存储器中的信息,或者通过作为保留的虚拟函数返回地址的分支目标,可将模间函数返回与非模间函数返回区分开来)。如果在当前模式是处理程序模式时遇到模间函数返回指令,则可发信号通知故障。这可提高安全性。在模间函数调用时,一些信息可能会保存在存储器中的栈数据结构上的栈帧中。如果在当前模式是处理程序模式时尝试模间函数返回,则这可能表明函数返回转换并非预期使用该栈帧的预期转换,如果该栈帧上的信息被误用,则这可能会有损害安全性的风险。通过强制规定只有在处于处理程序模式时才能成功执行模间返回分支指令,这会减少此类攻击的漏洞。
处理器架构可提供链接寄存器,该链接寄存器被指定用于响应于调用分支指令而存储函数返回地址。链接寄存器也可用作通用寄存器,但在函数调用时用于存储函数返回地址,在函数完成时处理将分支到该地址。对于除了模间调用分支指令之外的至少一个调用分支指令,链接寄存器可用作函数返回地址存储位置。然而,对于模间调用分支指令,函数返回地址存储位置可以是存储在存储器中的栈数据结构上的位置。存储器的包括栈数据结构的区域可能是线程模式不可访问的区域(例如,由于为对应地址区域定义访问权限的存储器保护数据表明具有与线程模式相关联的特权级别的代码无法访问该地址区域,和/或由于指向栈数据结构的栈指针位于在线程模式下不可访问的寄存器中)。通过将函数返回地址保存到栈而不是保存到链接寄存器,这可防止函数返回地址对在模间函数调用之后在线程模式下执行的特权解除代码可见,从而通过减少攻击者查看或修改与在处理程序模式下执行的较高特权代码的操作有关的信息的机会来提高安全性。
如上所述,响应于模间调用分支指令,可将虚拟函数返回地址保存到链接寄存器。然而,应当注意,在对应的函数返回指令尝试分支到虚拟函数返回地址时,该虚拟函数返回地址可能不再存储在链接寄存器中。一些编译器可生成代码,使得虚拟函数返回地址保留在链接寄存器中,并且如果另一函数嵌套在先前调用的函数内,则编译代码可将虚拟函数返回地址保存到存储器中的栈,然后一旦嵌套函数完成,就将虚拟函数返回地址恢复到链接寄存器,使得在从第一函数返回时,虚拟函数返回地址再次位于链接寄存器中。然而,这不是必需的。其他编译器可编译在从嵌套函数调用返回时不会将虚拟函数返回地址恢复到链接寄存器的代码,而是作为替代,在需要对应函数返回时,通过替代地将虚拟函数返回地址直接从栈加载到程序计数器寄存器中来提高性能,从而有效地导致分支到虚拟函数返回地址,然后可将其检测为需要从栈中获得真实函数返回地址。因此,在函数返回时,虚拟函数返回地址是否仍存储在链接寄存器中并不重要。需注意,在虚拟函数返回地址被保存到栈以实现函数调用的嵌套的情况下,用于存储虚拟函数返回地址的栈可以是与在执行模间调用分支指令时用于存储真实函数返回地址的栈数据结构不同的栈数据结构。例如,用于响应于模间调用分支指令而存储真实函数返回地址的栈可以是与处理程序模式相关联的主栈,而如果在线程模式下执行的特权解除代码内存在函数调用嵌套,则先前在链接寄存器中的虚拟函数返回地址可被保存到与线程模式相关联的进程栈数据结构。
虚拟函数返回地址可包括用于在尝试对应的函数返回时控制操作的各种信息。例如,虚拟函数返回地址可指示以下至少一者:是否响应于尝试分支到虚拟函数返回地址的指令而请求从线程模式到处理程序模式的切换;是否响应于尝试分支到虚拟函数返回地址的指令而请求处理电路的当前安全域的切换;以及应使用多个栈数据结构中的哪一个作为栈数据结构,响应于尝试分支到虚拟函数返回地址的所述指令而从该栈数据结构获得函数返回地址。因此,在函数返回时,处理电路可使用虚拟函数返回地址中的信息来确定是否切换模式,切换域和/或确定使用哪个栈数据结构来获得函数返回地址。在一些示例中,虚拟函数返回地址可使用两个位来指示这三个信息片段:第一位指示是否响应于模间调用分支指令设置了虚拟函数返回地址,第二位指示进行模间函数调用的安全域。可从这两个位推断出应使用哪个栈数据结构,因此可能不需要明确的指示。然而,应理解,这仅仅是在虚拟函数返回地址内编码信息的一种方式,并且其他方法可采用不同的选项。此外,一些具体实施可能不会指示上述三种类型的信息的全部。
虚拟函数返回地址的预定部分可指示是否响应于尝试分支到虚拟函数返回地址的指令而请求处理电路的当前安全域的切换。例如,该预定部分可以是虚拟函数返回地址的最低有效位。响应于当前安全域是较低安全域时的安全网关指令,处理电路可将返回地址的一部分(例如,链接寄存器中的地址)设置为指示较低安全状态的值,其中该部分在返回地址值内与在虚拟函数返回地址中指示域切换的部分处于相同的相对位置。通过基于在从较低安全域调用安全函数时,较低安全代码将假返回地址传递到安全代码来减轻攻击,试图使安全代码中的对应返回分支跳转到安全域中的任意位置,而不是返回到较低安全域中的地址,这种方法有助于提高安全性。安全网关指令可以是当从较低安全域执行时触发从较低安全域到安全域的切换的指令,并且如果在较低安全域中执行指令之后从安全域提取的第一指令并非是安全网关指令,则处理电路可触发故障的信令。因此,可能期望安全网关指令存在于安全域的有效进入点处,从而可在进入安全域时清理由较低安全代码设置的返回地址,以指示返回地址不可信,从而导致分支到安全域中的任意地址。当在安全域中执行预定类型的分支指令时,该安全域指定具有被设置为指示较低安全状态的值的部分的地址作为分支目标地址,这导致处理电路切换回较低安全域,而不管目标地址对应于存储器中的安全区域还是较低安全区域。因此,可编写安全代码以在预期使用由较低安全域控制的分支目标地址的那些分支处包括预定类型的分支指令,因此这提供了针对上述攻击类型的保护。模间函数返回分支可能面临类似攻击的风险,因此,通过对虚拟函数返回地址进行编码,使得用于发信号通知是否请求安全域的切换的部分是否与响应于安全网关指令而被设置为指示较低安全状态的值的返回地址的部分处于相同的相对位置,这还保护模间函数返回分支免受攻击。
链接寄存器可以是在线程模式下执行的代码可访问的寄存器。因此,虽然使用存储到链接寄存器的虚拟函数返回地址来提供指示对应函数返回是否应被视为模间调用的信息很方便,但置于虚拟函数返回地址中的信息可能容易被较低特权代码执行线程模式修改。为了防止基于虚拟函数返回地址的恶意修改的攻击,响应于模间调用分支指令,指令解码器可控制处理电路来将交叉检查值保存在保存到栈数据结构的栈帧中的第一相对位置的至少一部分中。其中保存有交叉检查值的栈数据结构可以是在线程模式下执行的代码不可访问的栈。响应于尝试分支到地址的虚拟函数的至少一种类型的指令,处理电路可将用于编码模间调用指示值的虚拟函数返回地址的一部分与从栈数据结构获得的栈帧中的第一相对位置的至少一部分中的值进行比较,以基于该比较确定是否触发故障的信令。因此,虽然虚拟函数返回地址可发信号通知是否有必要访问栈数据结构上的栈帧,但栈帧中的交叉检查值可提供双重检查,即指示函数返回时的模式改变的任何信息均可信,从而提高安全性。可对虚拟函数返回地址中的安全域指示进行类似检查。
响应于除模间调用分支指令之外的至少一种类型的调用分支指令,指令解码器可控制处理电路来将除交叉检查值之外的值保存在保存到栈数据结构的栈帧内的第一相对位置的至少一部分中。因此,交叉检查还可防止试图使用模间函数返回作为从经由非模间调用分支指令进入的代码返回的机制的攻击。这种类型的不匹配的函数调用和函数返回可能导致基于存储器中的不匹配栈帧出现漏洞。因此,如果尝试修改虚拟函数返回地址以指示调间函数返回,但存储器中的对应栈数据结构实际上由非调间调用分支指令保存到存储器,则交叉检查可能会失败,因此可能会触发故障。
响应于模间调用分支指令,指令解码器可控制处理电路来将指示处理程序模式的值保存在保存到栈数据结构的栈帧中的第二相对位置的至少一部分中。第二相对位置可以是与第一相对位置相同的地址(在这种情况下,模间调用指示值和指示处理程序模式的值的交叉检查信息可能位于栈上同一数据字内的不同位部分中),或者可以是栈帧内与第一相对位置不同的地址对应的不同相对偏移。响应于虚拟函数返回地址包括模间调用指示值时尝试分支到虚拟函数返回地址的至少一种类型的指令,当栈帧中的第二相对位置的相关部分中的值不指示处理程序模式时,处理电路可触发故障的信令。因此,如果虚拟函数返回地址指示线程模式到处理程序模式函数返回,但存储器中的栈帧指示对应的函数调用最初并非来自处理程序模式,则可触发故障。同样,这可防止某些形式的攻击。
一些具体实施可在栈上在第一相对位置处提供交叉检查值以及在第二相对位置处提供处理程序模式指示值。其他具体实施可省略这些类型的交叉检查中的一种交叉检查,并且可仅提供交叉检查值或处理程序模式指示值。
响应于虚拟函数返回地址包括模间调用指示值时尝试分支到虚拟函数返回地址的至少一种类型的指令,处理电路可执行对从栈数据结构获得的函数返回地址的检查。在将处理电路的当前模式切换到处理程序模式之前,处理电路可检查从栈数据结构获得的函数返回地址是否在从其禁止指令执行的预定保留地址范围内。当函数返回地址在预定保留地址范围内时,可触发归因于程序代码执行线程模式的故障。这种类型的检查可能很有用,因为当执行模间调用分支指令时,函数返回地址可被保存到保存至栈数据结构的栈帧内的第三相对位置,并且对于由异常条件触发的至少一种类型的异常转换,异常控制电路可存储栈帧,该栈帧包括存储在栈帧内的第三相对位置处的预定保留地址范围中的一个地址。因此,通过在模间函数返回时检查函数返回地址是否是预定保留地址范围中的一个地址,这可防止基于尝试基于响应于异常进入转换而不是函数调用转换而实际保存的栈帧来执行函数返回的攻击,否则可能会导致不可预测的结果危及安全性。检查函数返回地址也可能有助于防止其他类型的攻击。例如,如果栈的开头在栈帧内的第三相对位置用另一保留值(来自预定保留地址范围)密封,则还将检测到对栈下溢的尝试(即,当栈为空时,使用栈帧),并且发信号通知故障。
作为对模间函数返回指令的检查的一部分,检查函数返回地址是否在保留地址范围内似乎是冗余的,正如所期望的那样,尝试从预定保留地址范围执行指令所引起的故障应在尝试从保留地址中的一个地址提取指令时触发。然而,发明人认识到,对于模间函数返回,如果允许模间函数返回成功完成,使得模式被切换到处理程序模式,然后在尝试从函数返回地址提取下一指令时触发故障,则该故障可能归因于在处理程序模式下执行的代码,而不是在切换到处理程序模式之前在线程模式下执行的程序代码。这可能是个问题,因为处理程序代码可能与操作系统相关联,因此该故障可能导致操作系统操作被怀疑为故障,这可能需要执行相对侵入性的动作,诸如完全系统重置。因此,使用该方法,这可为攻击者提供一种方式来执行旨在破坏处理系统正常运行的拒绝服务攻击(通过基于异常栈帧重复触发函数返回)。
相比之下,使用本文描述的方法,其中在处理模间函数返回指令时(在触发从线程模式到处理程序模式的任何模式切换之前)提前检查函数返回地址是否在保留地址范围内,故障可归因于线程模式代码,因此故障处理动作对系统功能的影响可能要小得多(例如,仅杀死并重新启动单个线程),减少拒绝服务攻击的机会,从而提高安全性。
出于可靠性和安全性目的,一些具体实施可具有错误检测/校正电路,用于检测由硬件故障或临时小故障引起的瞬时或永久错误。例如,错误检测/校正电路可包括使用错误检测/校正代码来检测存储在寄存器或存储器中的数据中的错误的电路,该错误可能由粒子撞击或存储元件卡在例如0或1引起。错误检测/校正电路还可包括冗余处理逻辑,该冗余处理逻辑可执行相同的操作两次或更多次,使得可根据这些操作的冗余结果的比较检测错误。根据系统的需要,错误检测/校正电路的特定形式可在系统之间显著变化。出于与上述拒绝服务攻击场景类似的原因,能够将检测到的任何错误归于特定数据处理上下文很有用的,使得可更有效地解决错误(例如,如果错误实际发生在与特定线程相关联的数据处理内,则无需终止操作系统并执行侵入式系统重置)。
为了能够隔离开错误,响应于模间调用分支指令,指令解码器可控制处理电路来执行错误同步屏障操作,以将对与在错误同步屏障操作之前执行的数据处理相关联的错误的检测与对与在错误同步屏障操作之后执行的数据处理相关联的错误的检测隔离开。类似地,对于模间函数返回指令,这也可触发错误同步屏障操作。例如,错误同步屏障操作可包括暂停处理,直到任何未完成的操作已完成,并且在错误同步屏障操作之前执行的任何操作的任何错误检查的结果可用,并且已知提前处理的结果是否正确。因此,这允许将出现的任何错误更好地精确定位到发生错误的特定代码。在一些系统中,模间调用分支指令和模间函数返回指令可能始终触发错误同步屏障操作。其他系统(例如,不具有任何可靠性/安全性错误检查电路的系统)可能不支持错误同步屏障操作。在其他示例中,可提供一些配置状态数据,该配置状态数据控制模间调用分支指令和模间函数返回指令是否触发错误同步屏障操作。通过允许由软件配置错误同步屏障操作的存在,单个芯片可更好地满足不同市场的需求,例如性能比错误隔离更重要的市场,反之亦然。
一些具体实施可提供两个或更多个栈指针寄存器,该两个或更多个栈指针寄存器包括每安全域的进程栈指针寄存器和每安全域的主指针寄存器(在仅具有一个安全域的系统中,可仅存在单个进程栈指针寄存器和单个主栈指针寄存器,而在支持多个安全域的系统中,栈指针寄存器可每安全域进行分组)。选择电路可为每个安全域选择应使用哪个栈指针寄存器来提供用于访问存储器中的栈数据结构的栈指针。在处理程序模式下,选择电路可为当前安全域选择主栈指针寄存器。在线程模式下,选择电路可基于当前域的栈指针选择值在当前域的主栈指针寄存器与进程栈指针寄存器之间进行选择。分别为处理程序模式和线程模式提供单独的主栈和进程栈可使异常处理程序代码的开发更简单,因为这意味着在异常返回之后,在线程模式下运行的线程访问通常可能无法访问异常处理程序可能在主栈数据结构上留下的任何数据。在一些具体实施中,为线程模式和处理程序模式使用单独的栈也可能有助于防止基于假异常返回栈帧的伪造的某些类型的攻击。然而,在某些场景中(例如,在可用存储器有限的情况下),可能希望允许线程模式代码与处理程序模式共享主栈指针所识别的主栈,而不是使用单独的进程栈的线程模式。因此,可提供栈指针选择值(由较高特权代码控制),以定义应在线程模式下使用哪一栈。
响应于模间调用分支指令,指令解码器可控制处理电路来设置当前安全域的栈指针选择值,以指示当处于线程模式时应选择进程栈指针寄存器。这可防止在模间函数调用访问较高特权代码可能留在主栈结构上的信息之后执行异常处理程序的特权解除部分,从而提高安全性。
可提供模拟器计算机程序,以用于控制主机数据处理装置,以提供用于执行来自目标程序代码的指令的指令执行环境。该计算机程序可具有处理程序逻辑、异常控制程序逻辑和指令解码程序逻辑,这些逻辑仿真上述处理电路、异常控制电路和指令解码器的功能。这包括对如上所述的模间调用分支指令的支持。因此,此类模拟器计算机程序可为在模拟器计算机程序上执行的目标代码呈现与实际硬件设备所提供的指令环境类似的指令环境,即使在执行模拟器计算机程序的主机计算机中可能没有提供这些特征的任何实际硬件。这对于在实际上不支持该架构的主机平台上执行为一个指令集架构编写的代码可能很有用。此外,当软件开发与支持新版本的指令集架构的硬件设备的开发并行执行时,模拟器在为新版本的指令集架构开发软件期间很有用,使得正在开发的软件可在模拟时进行测试,使得软件开发可在支持新版本的指令集架构的硬件设备就绪之前开始。
域转换禁用配置参数
如上所述,处理电路可具有多个安全域,该多个安全域至少包括安全域和较低安全域,并且可提供存储器访问检查电路,以根据处理电路的当前安全域来检查是否允许存储器访问。例如,该存储器访问检查可基于定义存储器区域被认为是安全的还是较低安全的属性数据,并且当在较低安全域中操作时,可禁止对安全区域的访问。
可提供控制存储单元来存储域转换禁用配置参数,该域转换禁用配置参数指定在处理电路处在至少一种模式下,安全域与较低安全域之间的域转换被启用还是禁用。在该至少一种模式下,当域转换禁用配置参数指定域转换被禁用时,处理电路可响应于从安全域转换到较低安全域的尝试而触发禁用域转换故障的信令,并且可响应于从较低安全域转换到安全域的尝试而触发禁用域转换故障的信令。这种方法可能违反直觉,因为虽然期望出于安全原因能够防止从较低安全域到安全域的转换可能是有用的,但可能会质疑,为什么能够选择性地禁用从安全域到较低安全域的转换很有用。然而,本发明人认识到,这提供了一种将特定处理线程包含到单个安全域和较低安全域中的方法,这可能对性能有好处,因为如果已知切换域的尝试将触发禁用域转换故障,则可抑制线程跨越两个域时可能需要的一些性能密集操作。然后,这允许延迟执行那些性能密集操作,仅在尝试切换域时才在需要时执行,以避免为所有线程推测性地执行这些操作的性能成本,而不管这些线程是否会跨域。因此,当处理电路处于至少一种模式时,在安全域与较低安全域之间在这两个方向上禁用转换的域转换禁用配置参数的提供可有利于性能。
当在安全域中,处理电路使用存储在至少一个安全配置寄存器中的信息控制对存储器的访问,而在不安全域中,处理电路使用存储在至少一个较低安全配置寄存器中的信息控制对存储器的访问时,该技术尤其有用。例如,安全/较低安全配置寄存器可包括:栈指针寄存器,该栈指针寄存器存储栈指针,用于访问存储器中的相应安全栈数据结构或较低安全栈数据结构;存储器保护单元(MPU)内的寄存器,该寄存器定义存储器保护属性,用于定义对存储器区域的访问权限;和/或MPU指针寄存器,该MPU指针寄存器提供指向存储器中提供存储器保护区域属性的表的指针。为了确保安全域与较低安全域之间的隔离,可能希望定义单独的MPU属性集或栈数据结构以分别供安全域和较低安全域使用。然而,用于配置栈指针、为栈数据结构分配存储器地址空间中的空间和/或为安全域和较低安全域配置MPU区属性的操作可能相对性能密集,并且因此对于仅需要在另一个域中操作的线程,可能希望避免对安全域和较低安全域中的一者执行这些操作。当需要执行如中断处理等时间关键操作时,这可能特别重要。因此,通过提供域转换禁用配置参数,这提供了一种故障,该故障可用于检测尚未执行这些配置操作的线程试图切换到另一个域的情况,使得可根据需要延迟执行这些配置操作。在一个示例中,配置的资源可包括存储用于指向栈数据结构的栈指针的栈指针寄存器,包括与安全域相关联的至少一个栈指针寄存器和与较低安全域相关联的至少一个栈指针寄存器。
响应于在至少一种模式下执行从较低安全域到安全域的至少一种类型的转换的尝试,处理电路可使用域转换禁用配置参数来执行禁用域转换检查,以确定是否触发禁用域转换故障的信令。对于从较低安全域转换到安全域的尝试,该禁用域转换检查可在执行至少一个其他安全检查以确定是否允许从较低安全域转换到安全域的尝试之前执行。可能的情况是,至少一个其他安全检查的至少一部分可取决于尚未针对不期望切换域的线程配置的信息或资源,诸如MPU配置或栈指针寄存器所引用的栈数据结构。因此,如果在禁用域转换检查之前执行另一个安全检查,则这可能导致该安全检查失败,这仅仅是因为尚未配置要检查的相关数据,而不是因为识别出一些其他安全风险。由于安全检查可能与触发比与禁用域转换故障相关联的故障处理程序更激烈的操作的故障处理程序相关联(这可能仅触发资源的延迟配置),因此可能希望首先执行禁用的域转换检查,使得如果资源不可用,则可在继续执行其他类型的安全检查之前配置这些资源。例如,一些具体实施可执行安全检查,如果检查失败,则导致安全故障。为了确保安全状态的完整性,与安全故障相关联的异常处理程序可终止整个较低安全状态的执行。这种故障可由在较低安全和较低特权状态下运行的软件故意触发,作为对在较低安全状态下运行的操作系统执行拒绝服务攻击的手段。
对于尝试从安全域到较低安全域的转换,也可使用域转换禁用配置参数来执行禁用域转换检查。然而,由于该转换是从安全域到较低安全域,因此可能不需要执行其他安全检查,因此禁用域转换检查与其他安全检查之间的排序可能不相关。另选地,一些系统仍可在从安全域返回到较低安全域时执行安全检查,在这种情况下,禁用域转换检查与其他安全检查之间的顺序可取决于响应于禁用域转换故障而配置的任何信息是否预期用于该其他安全检查。
可通过尝试执行从较低安全域到安全域或从安全域到较低安全域的至少一种类型的转换来触发禁用域转换检查。有时,禁用域转换检查可由事件或指令触发,该事件或指令实际上不一定会导致安全域与较低安全域之间的转换。例如,在一些情况下,可在遇到可能导致安全域之间的转换的事件或指令时,但在识别该事件或指令是否实际上触发域改变之前执行禁用域转换检查。因此,虽然至少响应于改变域的实际尝试来检查域转换禁用配置参数,但这并不排除如果禁用的域转换检查通过并确定域转换将被启用,则有时还可以检查实际上不会导致域改变的事件。
域转换禁用配置参数在安全域和较低安全域中均可修改。在一些具体实施中,还可对是否允许特定程序代码段修改域转换禁用配置参数施加其他条件。例如,在具有特权状态和较低特权状态的系统中,域转换禁用配置参数只能在特权状态下修改。然而,即使当前安全域是较低安全域,也可允许处理电路修改域转换禁用配置参数。这可能看起来违反直觉,因为通常限制安全域改变的配置参数预期会从安全域进行配置。然而,由于禁用域转换故障的触发可用作提高性能而非安全性的机制,因此从较低安全域修改域转换禁用配置参数是可接受的。这利用了这样一个事实,即如果线程没有为其建立适当的安全资源,则对于该线程启用安全域的改变可能几乎没有益处,如在这种情况下,如果线程尝试切换到安全域,则处理将失败,因为不会建立任何此类资源。
如上文所讨论的,处理电路可具有线程模式和处理程序模式。这些模式可与安全域正交,因为在安全域中,处理电路可在线程模式或处理程序模式下操作,并且类似地,在较低安全域中,处理电路可在线程模式或处理程序模式下操作。上述处理电路的至少一种模式可以是线程模式。因此,当处于线程模式时,域转换禁用配置参数可选择性地禁用安全域的转换。然而,至少一种模式可排除处理程序模式,使得在处理程序模式下,处理电路可独立于域转换禁用配置参数来确定是否允许域转换。因此,即使域转换禁用配置参数指示在线程模式下禁用安全域与较低安全域之间的转换,仍可在处理程序模式下允许此类安全/较低安全域转换。更可能的情况是,在具有安全域和较低安全域的系统中,在处理程序模式下执行的处理程序代码(例如,其可与操作系统相关联)可涉及安全处理和较低安全处理两者,并且因此需要来自这两个域的资源,因此在处理程序模式下禁用安全/较低安全域转换的值较小。此外,在处理程序模式下执行的处理程序代码可以是在线程模式代码已触发禁用域转换故障的情况下介入并为其他域延迟配置资源的代码,因此即使线程模式已禁用域转换,也允许处理程序模式继续在这两个域中操作也可能很有用。
如前所述,指令解码器可支持模间调用分支指令,除了保存函数返回地址和分支到分支目标地址之外,该指令还将处理电路的当前模式从处理程序模式切换到线程模式。响应于此类指令设置域转换禁用配置参数,以指定启用还是禁用域转换也可能很有用。可定义模间调用分支指令的第一变体和第二变体中的至少一者,其中第一变体导致域转换禁用配置参数被设置为指定在至少一个模式下禁用域转换,而第二变体使得参数被设置为指定在至少一个模式下启用域转换。支持这两种变体的系统可能特别有用,因为这使得处理程序代码能够在调用异常处理程序代码的特权解除部分的同一模间调用分支指令中发信号通知其是否已为特权解除部分配置了资源以在这两个域中操作。
类似地,对于如前所述的模间函数返回指令,这也可触发域转换禁用配置参数的设置。对于函数返回,将域转换禁用配置参数设置为指定在至少一种模式下启用域转换的值可能特别有用。这很有用,因为如上所述,模间函数调用分支和模间函数返回的一个用例可以是允许异常处理程序在线程模式下调用要进行特权解除的函数,并且此代码可由第三方提供商提供。处理程序模式下的较高特权代码可执行“包装器”代码,以便在代码的特权解除部分之前和之后执行。通过响应于模间函数返回指令将域转换禁用配置参数设置为默认值,这意味着特权解除部分的末尾的包装器代码始终以一致的已知状态执行,而不管特权解除部分是否实际使用了安全域和较低安全域两者。此外,通过使用“启用”指示作为在模间函数返回之后设置的默认值而不是“禁用”指示,这意味着为不支持域转换禁用配置参数(其预期将允许线程模式域转换)的系统编写的后续遗留代码仍可运行,而不会触发附加故障。
此外,响应于模间函数返回指令,以及更新域转换禁用配置参数以指示在至少一种模式下启用域转换,处理电路还可记录在执行模间函数返回指令之前域转换禁用配置参数是否指定在至少一种模式下启用或禁用域转换的指示。域转换禁用配置参数的先前状态的这种指示对于允许后续处理程序代码确定配置寄存器中属于其他安全状态的信息(诸如MPU状态或栈指针)是否已被在模间调用与模间函数返回之间执行的代码改变可能很有用,使得如果其他安全状态的配置寄存器未改变,则可省略恢复先前配置的任何操作以提高性能。
如果在检查域转换禁用配置参数之后,当尝试从第一安全域转换到第二安全域时发信号通知禁用域转换故障,则异常控制电路可控制处理电路来处理第一安全域中的异常处理程序。因此,如果通过尝试从较低安全域切换到安全域来触发故障,则将在较低安全域中处理故障,并且如果尝试从安全域转换到较低安全域,则将在安全域中处理故障。这很有用,因为通常在域切换之前对应线程正在操作的域将是其中线程首先初始化的域,并且因此是与管理该线程的管理进程相关联的域。例如,在安全域中创建的安全线程可由安全操作系统管理,而在较低安全域中创建的较低安全线程可由较低安全操作系统管理,因此可能希望将任何禁用域转换故障引导到与尝试禁用域转换的线程相关联的管理进程。虽然可在第一安全域中处理故障,但由异常处理程序响应于故障而执行的资源配置可以是与第二安全域相关联的资源。由于禁用域转换故障所针对的域与需要延迟配置资源的状态不同,因此在处理程序模式下可能需要在较低安全状态下操作的程序代码与安全状态之间的密切协调。因此,从执行禁用域转换检查的至少一个模式中排除处理程序模式可能是有利的。
在发生异常条件时,异常控制电路可更新域转换禁用配置参数,以指定在至少一种模式下启用安全/较低安全域转换。同样,这为异常处理程序提供了安全、已知的默认状态,使得异常处理程序可以一致的方式运行,而不管与在发生异常时正在处理的后台代码相关联的域转换禁用配置参数的值如何。此外,通过默认响应于异常条件而启用转换,这提高了与异常处理程序中的遗留代码的兼容性,该遗留代码可能是为不支持域转换禁用功能的系统编写的。
当异常条件发生时,异常控制电路可触发一些状态保存,以保存与在异常条件发生之前执行的处理相关联的架构状态。异常控制电路的硬件不必保存与先前处理相关联的所有架构状态,并且在某些情况下,硬件可仅保存架构状态的子集。如果其他状态所在的寄存器将被异常处理程序覆盖,则后续异常处理程序可能负责保存未保存在硬件中的其他架构状态。
当响应于异常而执行这种状态保存时,保存在状态保存中的架构状态可包括域转换禁用配置参数。因此,当异常发生时,可由硬件自动保存域转换禁用配置参数,使得一旦异常处理完成并且处理返回到在异常发生之前执行的先前处理,则可将域转换禁用配置参数恢复到控制存储位置,使得后台代码的后续处理可以与从未发生异常相同的方式起作用。
在一些具体实施中,域转换禁用配置参数可响应于异常条件而保存为栈帧的一部分,该栈帧被保存到栈数据结构,该栈帧还包括其他架构状态,诸如通用寄存器内容或异常返回地址。然而,在一些具体实施中,栈帧内可能存在很少的备用空间用于对域转换禁用配置参数进行编码,并且可能优选的是保留任何备用编码空间用于其他目的。
因此,在一些示例中,在状态保存期间,异常控制电路可将包括异常返回地址和架构状态的第一子集的第一栈帧保存到栈数据结构,但指示域转换禁用配置参数的值可作为替代保存到预定寄存器而不是包括在第一栈帧中(例如,预定寄存器可以是链接寄存器)。这避免了需要在栈帧中消耗额外的位。需注意,指示域转换禁用配置参数的保存值不需要与域转换禁用配置参数本身具有相同的编码,可将任何值保存到栈,能够确定域转换禁用配置参数在异常发生时的值。
然而,响应于异常条件而执行的异常处理程序可访问预定寄存器。至少对于导致从安全域到较低安全域的转换的异常,可能不希望允许在异常之后执行的较低安全代码修改指示在异常之前执行的处理中是否已禁用安全域转换的值。
为了防止这种场景,至少响应于触发从安全域到较低安全域的转换的异常条件,异常控制电路不仅可将上述第一栈帧保存到栈数据结构,而且可将包括架构状态的第二子集和用于检查指示域转换禁用配置参数的值的交叉检查信息的第二栈帧保存到栈数据结构。至少在从较低安全域到安全域的异常返回转换时,异常控制电路可将指示域转换禁用配置参数的值与第二栈帧中的交叉检查信息进行比较,并且如果在比较中检测到不匹配,则触发故障的信令。需注意,虽然可能已响应于初始异常,将指示域转换禁用配置参数的值保存到预定寄存器,但在执行异常返回转换时,域转换禁用配置参数可能不再位于预定寄存器中,但可能位于从存储器中的栈数据结构加载的值内,或者位于分支以触发异常返回的虚拟不可执行地址内的字段中。通过在第二栈帧中提供交叉检查信息,这可允许较低安全异常处理程序尝试修改初始置于要检测的预定寄存器中的域转换禁用配置参数的保存值,以防止违反安全性。虽然这种方法可能看起来更复杂,但第二栈帧可记录保存到存储器的附加状态,以将其相对较低安全异常处理程序隐藏,并且可能比第一栈帧具有更多备用容量用于附加信息,从而提供为所有异常进入保存的状态子集。因此,将交叉检查信息记录在第二栈帧中意味着,对于仅需要第一栈帧的那些异常,则无需产生保存任何附加栈状态以保留在域转换禁用配置参数中的存储器成本和中断延迟(因为在这种情况下,依赖预定寄存器是安全的),但在需要保存第二栈帧的那些安全到较低安全异常转换时,则可将交叉检查保存到栈以提高安全性。
处理电路可有多种方式允许在安全域与较低安全域之间执行域转换,并且可根据用于在安全域之间转换的路由以略微不同的方式执行域转换禁用配置参数的检查。
如前所述,切换域的一种方式是使用域间调用分支指令,该指令请求从安全域到较低安全域的转换,作为响应,指令解码器可控制处理电路来执行域间调用分支操作,该操作包括:将函数返回地址保存到函数返回地址存储位置(例如,存储器中的栈数据结构);将虚拟函数返回地址保存到预定寄存器(例如,链接寄存器);将处理电路切换到较低安全域;以及分支到域间调用分支指令所指定的分支目标地址所识别的指令。通过允许从安全域到较低安全域的直接函数调用,这避免了调用异常处理程序或监视代码来监视域转换的需要,从而提高了性能。
对于域间调用分支指令,可检查域转换禁用配置参数,并且当域转换禁用配置参数指定在至少一种模式下启用域间转换时,则可执行域间调用分支操作。此外,不管域转换禁用配置参数的值如何,如果处理电路当前处于除至少一种模式以外的模式(例如,在当前模式是处理程序模式时),则可执行域间调用分支操作。相反,当处于至少一种模式(例如,线程模式)中并且域转换禁用配置参数指定在该至少一种模式下禁用域转换时,则可触发禁用域转换故障的信令。
域之间转换的另一种方式可以是尝试执行域间返回分支指令,该指令请求从安全域到较低安全域的转换,并分支到域间返回分支指令所指定的分支目标地址所识别的指令。执行指令的尝试可触发域间转换禁用配置参数被检查,并且当域间转换禁用配置参数指定在至少一种模式下启用域间转换时,则可执行域间返回分支操作。此外,不管域转换禁用配置参数的值如何,如果处理电路当前处于除至少一种模式以外的模式(例如,在当前模式是处理程序模式时),则可执行域间返回分支操作。相反,当处于至少一种模式(例如,线程模式)中并且域转换禁用配置参数指定在该至少一种模式下禁用域转换时,则可触发禁用域转换故障的信令。
域之间转换的另一种方式可以是尝试分支到虚拟函数返回地址,该地址由前面讨论的早期函数调用分支指令建立。当执行域间调用分支指令,请求从安全域到较低安全域的转换时,可将函数调用的函数返回地址保存到栈数据结构,以防止其在较低安全代码中可见,并且可将虚拟函数返回地址保存到对较低安全代码可见的链接寄存器。虚拟函数返回地址可包括指示在对应的函数返回时应执行域转换以返回到安全域的信息。因此,当稍后尝试分支到虚拟函数返回地址并且虚拟函数返回地址指示域间函数返回时,如果处理电路当前处于至少一种模式并且域转换禁用配置参数指定应在该至少一种模式下禁用域转换,则处理电路可触发禁用域转换故障的信令。
从较低安全域转换到安全域的另一种方式可以是从安全地址区域提取指令。由存储器访问检查电路维护的安全属性数据可将地址区域定义为较低安全地址区域或安全地址区域。存储在存储器的安全地址区域中的指令可仅从安全域执行。在当前处于较低安全域时,如果试图提取地址在安全地址区域中的指令,则这可能需要执行一些安全检查,以检查是否允许转换到安全域。例如,该检查可包括检查在安全地址区域中的地址处的指令是否是标记进入安全域的有效进入点的特定类型的安全网关指令。在一些情况下,如果安全地址区域中的地址处的指令是安全网关指令,则安全网关指令的解码可触发安全域从较低安全域到安全域的改变。在其他情况下,仅当提取指令的尝试以特定类型的安全存储器为目标时,才允许从较低安全域到安全域的转换,该特定类型的安全存储器可以是较低安全可调用安全存储器。一些具体实施可执行安全网关指令检查和较低安全可调用安全存储器检查两者。
然而,如前所述,对于从较低安全域到安全域的转换,安全检查可取决于可能尚未针对预期保留在单个安全域内的线程而配置的资源(例如,检查可取决于正在设置的安全区域的存储器保护单元属性,使得可提取并解码从安全区域提取的指令)。因此,如果预期仅驻留在较低安全域中的线程尝试切换状态,则安全检查本身可能会失败。为了防止这些安全检查失败,可能希望尽快执行域转换禁用配置参数的检查。
因此,可响应于尝试提取地址在安全地址区域中的指令而执行此检查,而不是等待该指令被提取和解码。通过在流水线的早期阶段执行域转换禁用配置参数的检查,这降低了由于缺乏配置的资源而导致安全检查失败的可能性。在完成该检查时,可能还不知道正在提取的指令实际上是否是将触发到安全域的转换的指令(例如,如果提取的指令并非是安全网关指令,则可能没有触发进入安全域)。因此,域转换禁用配置参数的检查可能是保守的,因为如果指令是从安全地址区域中的地址提取的并且当前域是较低安全域,则无论提取的指令类型如何,都可对其进行检查。应理解,在一些具体实施中,流水线内的各种检查的位置可变化,但首先执行域转换禁用检查的相同效果可通过稍后在流水线中执行此检查来实现,但将任何所得的域转换禁用故障的信令优先于其他故障的信令。
对于前面描述的模间调用分支指令,域转换禁用配置参数可在模拟环境中使用,其中如果目标程序代码在真实硬件设备上执行,则在主机数据处理装置上执行的模拟计算机程序模拟与预期等效的指令执行环境,该硬件设备具有存储域转换禁用配置参数的控制存储位置以及用于设置和使用如上所述的参数的相关逻辑的特征。因此,计算机程序可具有处理程序逻辑、存储器访问检查程序逻辑和配置参数设置程序逻辑,这些逻辑仿真处理电路、存储器访问检查电路和用于如上所述在控制存储位置中维护域转换禁用配置参数的电路的功能。
具体示例的描述
图1示意性地示出了数据处理系统2的示例,该数据处理系统包括处理电路4,该处理电路用于响应于从存储器系统6提取的指令来执行数据处理。存储器系统6可包括高速缓存(例如,一个或多个级别的数据高速缓存和/或指令高速缓存)以及主存储器。处理电路4包括处理流水线,该处理流水线包括多个流水线级,该多个流水线级包括例如:提取级8,该提取级用于从存储器系统6提取待执行的指令;解码级10,该解码级用于对所提取的指令解码以生成控制信号,该控制信号用于控制其余流水线级以执行数据处理;和执行级12,该执行级用于执行解码的指令以执行数据处理操作。提供寄存器14以用于存储由流水线4处理的指令的输入操作数。寄存器14包括多种类型的寄存器,包括:通用(整数)寄存器16,该通用(整数)寄存器用于存储整数值;和控制寄存器20,该控制寄存器用于存储控制参数,该控制参数用于控制处理电路4对指令的执行和诸如异常处理、安全检查等的其他操作。也可提供其他类型的寄存器,例如:浮点寄存器,该浮点寄存器用于存储浮点值;或向量寄存器,该向量寄存器用于存储包括多个独立数据值的向量操作数。
应理解,图1所示的流水线级是简化表示,并且还可提供其他类型的流水线级,诸如:重命名级,该重命名级用于执行寄存器重命名;发布级,该发布级用于将等待执行的指令排队并在这些指令的所需操作数可用时发布这些指令以供执行;和回写级,该回写级用于处理指令的提交并将结果回写到寄存器14。流水线可为有序流水线或无序流水线。
提供可靠性、可用性和可服务性(RAS)错误检测/校正电路29以用于执行错误检测或校正操作,以检测或校正在处理系统的操作中随机出现的硬件故障。例如,由于粒子撞击导致存储的状态位或处理逻辑路径上的信号在0与1之间翻转,可能会出现硬件故障。此外,硬件故障可能由于电子电路随时间的推移发生物理劣化而引起,例如,电迁移可能最终导致存储元件卡在0或1,而不管写入该存储元件的位值如何。为了检测此类故障,RAS可包括一个或多个错误检测/校正机制。例如,一种机制可以是提供冗余处理逻辑以冗余地执行与处理电路4相同的操作,以及提供比较逻辑以比较主处理和冗余处理的结果以检测任何故障。另一机制可以是管理与写入存储器的数据相关联地存储的错误检测码或错误校正码的设置和检查,使得在从存储器读回数据时,可重新计算对应的错误检测码/错误校正码并将其与存储的错误检测码/错误校正码进行比较,以检测(并且如果可能的话,校正)错误。如果检测到RAS错误,则在可能的情况下校正错误,并继续进行处理(例如,这可通过三核锁步技术或使用错误校正码实现)。另选地,如果错误不可校正,则可发信号通知故障,这可导致处理的线程终止并重新启动。应理解,可使用用于错误检测/校正和恢复的任何已知技术。
系统2还包括存储器访问检查电路22,该存储器访问检查电路用于基于针对存储器地址空间的各个区域指定的属性数据来检查是否允许对存储器系统6的访问。存储器访问检查电路包括安全属性单元(SAU)24,该SAU用于存储安全域定义数据,该安全域定义数据定义与存储器地址空间的每个相应区域相关联的安全域。基于安全属性数据,安全属性单元24可根据处理电路的当前操作安全域和与包括存储器访问的目标地址的区域相关联的安全域来检查是否允许存储器访问。在其他实施方案中,SAU可不直接存储安全域定义数据,而是访问存储在别处的安全域定义数据,以便执行存储器访问检查。在一些系统中,安全域定义数据可存储在存储器系统6中,或者可以是系统2中别处的配置寄存器。处理电路4可在当前操作安全域中操作,该当前操作安全域通常可对应于与当前正执行的指令的地址相关联的安全域(尽管可能存在某些异常,例如当处理域之间的转换时)。当指令从由SAU24指定为在一个域中的区域中的地址分支到与不同域相关联的区域中的地址时,这可触发处理电路4正在其中操作的当前安全域的转换。在其他实施方案中,这样的分支可不直接触发当前安全域的转换,而是触发附加安全检查,诸如是否存在网关指令,在这些实施方案中,可能是网关指令本身触发当前安全域的改变。一般来讲,在安全域中操作时,处理电路可访问与安全域和较低安全域两者相关联的存储器区域中的数据,而当在较低安全域中操作时,处理电路可访问与较低安全域相关联的区域中的数据,但可能不被允许访问SAU 24指定为与安全域相关联的地址空间的区域中的数据。这使得能够保护敏感数据免受来自在较低安全域中操作的代码的未授权访问。
此外,存储器访问检查电路可包括存储器保护单元(MPU)26,该MPU检查对存储器系统6的存储器访问是否满足访问权限,该访问权限可指定例如允许处理电路4的哪些特权级别访问存储器的给定区域,或者可指定地址空间的存储器区域可通过读操作和写操作两者来访问,还是是禁止写入的只读区域。例如,MPU 26所使用的访问权限可由较高特权进程(诸如超管理器或操作系统)指定,以控制允许较低特权的进程(诸如应用程序)访问存储器的哪些区域,以及如何访问这些区域(只读或读/写,以及存储器是否可执行)。在一些具体实施中,MPU 26还可应用检查特权进程被允许访问存储器的哪些区域,以及如何访问这些区域(只读或读/写,以及存储器是否可执行)。MPU 26可允许针对较低特权访问和特权访问指定不同的权限。MPU 26提供的权限可与SAU 24提供的权限正交,使得对于待允许的给定存储器访问,其应基于针对MPU 26和SAU 24两者定义的访问权限来通过检查。MPU 26可包括单独的安全MPU 26-S和较低安全MPU 26-NS,各自与安全域中的一个安全域相关联,使得可根据当前域是安全域还是较低安全域来针对给定存储器区域指定不同的存储器访问权限(例如,区域在较低安全域中可仅被读取,但在安全域中既可读又可写)。
因此,如图2所示,处理电路4可支持在至少包括安全域(S)和较低安全域(也称为较低安全域,NS)的多个安全域中的一个安全域中执行数据处理。尽管图2示出了仅具有两个安全域的系统,但可以提供与不同安全级别相关联的三个或更多个域,在这种情况下,所示的S域和NS域可以是所提供的三个或更多个域中的任何两个域。
此外,在给定安全域内,如图2所示,处理电路可以多种模式中的一种模式执行数据处理,该多种模式包括用于异常处理的处理程序模式(H)和用于后台处理的线程模式(T)。如图1所示,可提供异常控制电路28来控制异常处理操作,包括异常进入转换和异常返回转换,以及在此类转换期间对架构状态的任何保存/恢复。将异常处理分离为专用处理程序模式H以助于简化对处理电路允许访问哪些寄存器的管理(例如,用于异常处理的一些寄存器在处理程序模式H下是可访问的,但在线程模式T下是不可访问的)。一般来讲,当在处理程序模式H下操作时,则在默认情况下,可假设处理电路4具有较高特权操作模式,使得根据除了最小特权级别之外的特定特权级别来控制对存储器和寄存器的访问,而在线程模式T下,根据存储在控制寄存器20中的其他架构状态,处理电路可具有多个不同特权级别中的一个特权级别。
因此,如图2所示,安全域和处理电路4的操作模式的组合可确定处理电路4如何执行处理的各方面。图2示出了这些模式的四个不同组合,包括:
·安全线程模式(安全域和线程模式的组合的简写)
·较低安全线程模式(较低安全域和线程模式的组合)
·安全处理程序模式(安全域和处理程序模式的组合)以及
·较低安全处理程序模式(较低安全域和处理程序模式的组合)。
如下所述,响应于异常条件和异常返回条件,所执行的动作可取决于在安全域和模式的这些相应组合之间进行的特定转换。安全属性单元(SAU)24中的属性管理安全域与较低安全域之间的边界。安全MPU 26-S中的属性可用于管理以安全线程模式操作的不同线程之间以及这些线程与安全操作系统之间的边界。较低安全MPU 26-NS中的属性可用于管理以较低安全线程模式操作的不同线程之间以及这些线程与较低安全操作系统之间的边界。
图3示出了处理系统的寄存器14中的一些寄存器。应理解,该表示并未示出可提供的所有可能寄存器,也可提供许多其他寄存器。如图3所示,寄存器14包括通用寄存器16和多个控制寄存器20(图3中仅示出了控制寄存器中的一些控制寄存器,也可提供其他控制寄存器)。在该示例中,提供了16个通用寄存器,标记为R0至R15。在一些实施方案中,通用寄存器16还可包括程序状态寄存器(XPSR),该XPSR可保存与当前上下文相关的条件标记值和其他信息。
在通用寄存器R0至R15中,寄存器R0至R12用于存储通用操作数,诸如用于算术或逻辑指令的输入操作数或用于导出用于存取存储器系统6的加载/存储指令的地址的操作数。可以将通用寄存器R13至R15用于此类通用操作数,但它们也服务于其他控制功能。
寄存器R15用作存储程序计数器的程序计数器(PC)寄存器,该程序计数器提供由处理电路4达到的程序的当前点的指示。程序计数器寄存器可由提取级8使用来确定从存储器系统提取哪些指令。
寄存器R14用作链接寄存器(LR),其用于在调用函数时存储函数返回地址,使得当与函数相关联的处理完成时,则链接寄存器中的地址可用于在函数调用指令之后将程序流重新引导回到下一指令。此外,在发生异常时,可使用链接寄存器来存储异常返回值,该异常返回值提供用于在遇到对应异常返回条件时控制架构状态的解堆栈的信息。类似地,当执行模间或域间函数调用时,也可使用链接寄存器来存储虚拟函数返回地址。这些将在下面更详细地讨论。
寄存器R13用作栈指针寄存器,该栈指针寄存器提供指示存储器中的栈数据结构的地址的栈指针。栈数据结构可用于在异常条件发生时保存架构状态,并用于在异常返回条件发生时恢复架构状态。如图3所示,寄存器R13被分组,使得在硬件中提供多个不同的物理寄存器,每个寄存器可使用寄存器说明符R13来访问,当指定R13时如何选择特定分块寄存器可取决于多个因素,包括当前安全域和处理电路的模式,以及配置寄存器的值。
例如,分组栈指针寄存器可包括安全主栈指针寄存器(MSP_S)、安全进程栈指针寄存器(PSP_S)、较低安全主栈指针寄存器(MSP_NS)和较低安全进程栈指针寄存器(PSP_NS)。一般来讲,安全栈指针寄存器MSP_S和PSP_S在安全域S中时可供处理电路4访问,但在较低安全域NS中时不可访问。较低安全栈指针寄存器MSP_NS和PSP_NS在较低安全域中是可访问的。一些具体实施可提供访问分组栈指针的附加方式,这可授予安全域对与较低安全域(MSP_NS和PSP_NS)相关联的栈指针的访问权限。一般来讲,进程栈指针PSP_S或PSP_NS预期在线程模式T内使用,并且主栈指针MSP_S或MSP_NS预期在处理程序模式H内使用。分别针对处理程序模式和线程模式提供单独的主栈和进程栈可使异常处理程序代码的开发更简单,因为这意味着异常处理程序可能留在主栈上的任何数据通常在异常返回之后对于以线程模式运行的线程是不可访问的。这可简化异常处理程序代码的开发,因为异常处理程序不需要包括用于从主栈数据结构清除其所有数据的指令。然而,线程模式T中的进程可能使用主栈指针,其中存储在控制寄存器32中的栈指针选择值30控制当处于线程模式T中时应使用主栈指针还是进程栈指针。因此,应使用哪一栈指针不仅可基于当前模式(线程或处理程序)与当前域(安全或较低安全)的组合,而且可基于栈指针选择值30来确定。如图3所示,栈指针选择值30可在安全状态之间分组,使得安全域和较低安全域可使用栈指针选择值30的单独的安全版本30-S和较低安全版本30-NS独立地控制安全域和较低安全域是否分别使用主栈指针或进程栈指针。当前安全域控制哪个分组版本30-S、30-NS被读/写。
一般来讲,在以处理程序模式H操作的异常处理程序或以线程模式T操作的线程的主体内,安全或较低安全栈指针的选择可取决于处理电路4正在其中执行代码的当前安全域。对于异常进入和返回,从与在异常发生之前运行的后台代码的安全域相关联的栈指针所识别的栈执行状态的堆栈和解堆栈。
控制寄存器32还可包括特权控制值(nPRIV)31,该nPRIV控制在线程模式下执行的代码为特权还是无特权。可针对安全域和较低安全域以不同的方式设置特权控制值(例如,安全线程模式可为无特权,而较低安全线程模式可为特权,反之亦然)。另选地,安全线程模式和较低安全线程模式均可在相同的特权级别上操作。应理解,特权控制值31仅仅是一个示例,并且可存在使用存储在控制寄存器中的架构状态来控制在安全/较低安全线程模式下分配给代码的特权级别的其他方式。在图3的示例中,特权控制值31被分组,使得单独的安全特权控制值31_S和较低安全特权控制值31_NS被提供用于控制分别在安全域和较低安全域中由线程模式使用的特权级别。然而,另一种方法可以是提供在域转换时切换的单个控制位。
如图3所示,控制寄存器32还包括线程模式中间状态禁用(TMID)参数34,也称为域转换禁用配置参数,用于控制在线程模式下启用还是禁用安全域与较低安全域之间的转换。这将在下面更详细地讨论。与栈指针选择值30和特权值31不同,TIMID 34值在安全状态之间共享。TMID参数34可用于在线程模式下禁用安全域与较低安全域之间的转换,如下文进一步描述,这对于为安全域/较低安全域中的一者启用资源的延迟配置可能很有用,因为禁用域转换(如果尝试执行禁用域转换,则触发故障)意味着线程可被限于单个域。
如图3所示,控制寄存器20还包括提供异常编号36的寄存器。异常编号36可能不是存储在该控制寄存器中的唯一值,其他状态可存储在同一寄存器中。当系统处于处理程序模式时,异常编号识别与当前执行的异常处理程序相关联的异常。当系统处于线程模式时,异常编号36被设置为某个默认值(例如,0),其指示当前没有正在处理异常。因此,异常编号36实际上也是系统当前处于线程模式还是处理程序模式的指示,因为如果注册的异常编号36指定了特殊值(例如,0),则系统处于线程模式,而如果指定了任何其他值,则系统处于处理程序模式,并且特定非零值识别正在处理的当前异常。因此,可能不需要单独的寄存器来指示系统正在运行的当前模式。虽然图3中未示出,但可能存在指示当前域是安全域还是较低安全域的控制寄存器。另选地,这样的寄存器可能不是必需的,因为在确定正在处理的指令的地址是在SAU 24定义的存储器的安全区域还是较低安全区域时,它可能是隐含的。
图4示出了用于寻址存储器系统6的存储器地址空间的示例。存储器地址空间100可包括在安全域和较低安全域中都可访问的一个或多个较低安全区域102,以及在安全域中可访问而在较低安全域中不可访问的一个或多个安全区域104。尽管为了便于解释,图4仅示出了一个较低安全区域102和一个安全区域104,但每种类型可存在多个区域,并且这些区域可彼此散布,因此没有必要所有安全区域都在连续块中,并且所有较低安全区域都在连续块中。较低安全区域可包括较低安全程序代码110、栈数据结构112(使用较低安全栈指针MSP_NS和PSP_NS存取)和较低安全数据114。类似地,安全区域104可包括安全程序代码122栈数据结构124(使用安全栈指针MSP_S和PSP_S来访问)和安全数据126。此外,安全区域104或较低安全区域102内的程序代码、栈和数据不必组织成如图4所示的连续块,并且在实践中,栈和程序代码可分布在散布有其他数据的多个不连续块中。在可执行地址范围内的存储器的特定分配可由在处理系统上执行的软件来选择,而不是由硬件来固定。
如图4所示,存储器地址空间100包括保留区域130,在该示例中,该保留区域包括大于或等于0xF0000000的地址(以十六进制表示,应理解,其他示例可选择不同的地址范围作为保留区域130)。保留区域130表示不允许提供可执行指令的地址范围。这些保留地址中的一些保留地址可被分配用于特殊目的,诸如指示函数返回或异常返回,如下面进一步描述的。如果尝试从保留地址130中的一个保留地址提取指令,那么指令提取级8可发信号通知故障。这些保留地址可为该架构的未来版本提供分配用于特殊目的的附加地址的机会,使得从这些地址中的一个地址提取指令的尝试可被解释为发信号通知要处理给定事件。
如图5所示,一些保留地址范围被分配来表示特殊的虚拟函数返回地址140和虚拟异常返回地址142,它们被用来指示用于某些域/模式转换和异常返回操作的函数返回。虚拟函数返回地址140是保留范围130内的一组地址中的任一地址,其位144的最高有效部分被设置为某个函数返回前缀值144。在该示例中,函数前缀的值大于或等于0xF0,使得虚拟函数返回地址在保留范围130中。虚拟函数返回地址用于发信号通知:如果尝试从该虚拟函数返回地址提取或执行指令,则应执行函数返回操作。在一些具体实施中,可能是尝试将程序计数器(PC)(通过分支或一些其他指令,如以PC为目标的加载)设置为虚拟保留地址会触发函数返回操作,而不是指令提取。为了简化硬件,可能只有能够设置PC的指令子集(通常用于执行函数返回的指令)能够实际触发函数返回操作。这提供了一种机制,用于避免在链接寄存器R14中为模间或域间函数调用公开真实函数返回地址,使得无法通过较低安全或较低特权代码访问它。
虚拟函数返回地址140包括可在执行模间或域间函数调用时设置的多条状态信息,以指示函数调用的属性和/或关于如何处理相应函数返回的信息。在该示例中,虚拟函数返回地址140包括模间调用标志(M)146,该模间调用标志指示虚拟函数返回地址是响应于从处理程序模式到线程模式的模间函数调用而设置,还是响应于保持在相同模式(保持在处理程序模式或保持在线程模式)内的非模间调用而设置。在该示例中,对模间调用标记146进行编码,使得如果其值为0,则这指示模间调用,并且如果标记146为1,则这指示模式在对应的函数调用期间保持不变。可在函数返回时使用模间调用标记146来确定当前模式是应从线程模式切换回处理程序模式还是应保持不变。
此外,虚拟函数返回地址140包括安全域指示符(S)148,该安全域指示符指示对应的函数调用是从较低安全域还是从安全域进行。在该示例中,对安全域指示符进行编码,使得如果从安全域进行调用,则将该安全域指示符设置为1,并且如果从较低安全域进行调用,则将该安全域指示符设置为0。应理解,虚拟函数返回地址140中所示的标记146、148的特定编码仅是一个示例,并且其他方法可使用不同的编码。此外,虚拟函数返回地址可包括图5中未示出的附加状态标记。在一些具体实施中,安全网关指令被置于可从较低安全域调用的安全函数的开头。该安全网关指令可导致处理电路执行从较低安全域到安全域的转换。因此,后续函数返回可确定函数是从安全域调用还是从较低安全域调用,以及因此应返回到哪个域执行,如果安全网关指令执行从较低安全域到安全域的转换,则安全网关指令可清除链接寄存器中的返回地址的最低有效位。如稍后将讨论的,将S 148置于虚拟函数返回地址的最低有效位,并对S 148指示符进行编码,使得0指示较低安全域,当与上述安全网关指令行为结合使用时,可提供附加安全保护。应理解,虽然在上述具体实施中,S 148的值0表示较低安全状态,并且安全网关指令清除返回地址的最低有效位,但也可利用S 148字段的其他编码来实现期望行为。例如,如果S 148的值1指示较低安全状态,则安全网关指令将返回地址的最低有效位设置为1。
虚拟异常返回地址142响应于某些异常进入转换而保存到链接寄存器,并且以与虚拟函数返回地址140类似的方式提供一种机制,用于使得实际异常返回地址能够保存到栈(并随后从栈中恢复),以将该实际异常返回地址相对在异常之后正在执行的较低安全进程隐藏。虚拟异常返回地址142包括位于虚拟异常返回地址142的最高有效位部分中的异常返回前缀150,该异常返回前缀再次具有大于或等于0xF0的值以确保异常返回地址在保留范围130内。异常返回前缀150与函数前缀144不同,使得可将虚拟函数/异常返回地址140、142彼此区分开。
虚拟异常返回地址142包括模式标记152和安全域标记(S)156,该模式标记用于指示从中发生异常的模式(线程或处理程序),该安全域标记用于指示从中发生异常的安全域(安全或较低安全)。在一些具体实施中,还可存在异常安全域标记(ES)157,其指示异常最初被带到哪个安全域(安全的或较低安全)。此外,异常返回值包括线程模式中间状态启用(TMIE)值158,该值指示在发生异常之前,TMID标记34是否指示在发生异常的上下文中在线程模式下禁用或启用了域转换。出于向后兼容性的原因(使得预期将对应于158的位设置为1的遗留代码将TMIE标记158表示为在线程模式下启用域转换),虚拟异常返回地址中的TMIE标记158具有与控制寄存器32中的TMID标记34相反的编码,使得当在虚拟异常返回地址142中设置TMIE标记158时,当前安全域的TMID标记的值被反转。不需要TMIE标记158本身来控制异常返回操作,但将TMIE标记158保存到虚拟异常返回地址有效地提供了上下文保存/恢复功能,使得在从异常返回时,控制寄存器32中的TMID标记34的值(用于被返回的进程)可恢复到它在发生异常之前所处的状态。在从异常返回时,TMIE标记158的值再次反转,并且反转的值被写入控制寄存器32中的TMID标记34。虽然图5示出了用于TMIE标记158的特定编码,但该编码不是必需的,并且可使用其他表示要恢复到TMID 34的值的方式。
需注意,由于虚拟函数返回地址140和虚拟异常返回地址142中记录的状态信息146、148、152、156、157、158可取不同的值,这意味着在保留范围130内存在各自表现为虚拟函数返回地址140的多个不同地址,以及各自表现为虚拟异常返回地址142的多个不同地址。因此,在调用函数或进入异常时保存到链接寄存器R14的特定虚拟地址是基于要在状态标志中编码的信息来选择的。
图6示出了在执行模间或域间函数调用时或在进入异常时可保存到存储器中的栈数据结构的不同栈帧的示例。栈帧保存到的特定栈数据结构取决于函数调用或异常时的当前模式和安全域,并且如果当前处于线程模式,则所选择的栈还取决于与前面描述的当前域相关联的栈指针选择值30。
如图6的部分170中所示,对于除域间/模间函数调用(其不触发模式或域的任何转换)之外的函数调用,无需将栈帧存储到栈,因为对于同一模式和同一域内的函数调用,可简单地将真实函数返回地址保存到链接寄存器R14,无需从函数调用之后正执行的代码隐藏函数返回地址。
对于域间函数调用或从安全域到较低安全域的模间函数调用,将函数返回栈帧172保存到栈。对于从安全域到较低安全域的域间函数调用,将栈帧172保存到由安全栈指针中的一个安全栈指针指示的安全栈。如果从处理程序模式进行域间函数调用,则这将是安全主栈指针MSP_S,而如果从线程模式进行域间调用,则栈帧被保存到安全主栈(MSP_S)和安全进程栈(PSP_S)中的一者,安全主栈和安全进程栈的指针由安全域的栈指针选择值30-S指示。对于模间函数调用,默认情况下,这些调用是从处理程序模式进行的,因此使用与当前安全域相关联的主栈指针。
如图6所示,函数返回栈帧172包括返回地址174,该返回地址表示当从被调用的函数返回时,处理将返回到的真实函数返回地址。真实函数返回地址可设置为从函数调用分支指令的地址开始顺序地跟随的下一个指令的地址。此外,函数返回栈帧包括状态数据字176(FRETPSR),该状态数据字提供用于确定如何处理对应的函数返回的信息。在该示例中,这包括处理程序特权解除到线程模式(HDT)标记178,该标记指示是否响应于从处理程序模式到线程模式调用而保存函数返回栈帧172。例如,如果函数调用并非模间函数调用,则HDT标记可具有值0,因此不会导致处理程序模式特权解除到线程模式,如果函数调用是模间函数调用,则HDT标记可具有值1。此外,状态数据字176包括异常编号值179,该异常编号值对应于调用函数时异常编号寄存器36的值。这充当“处理程序模式指示值”,其指示是否响应于从处理程序模式或线程模式调用的函数而保存函数返回栈帧。应理解,其他信息也可存储在函数返回状态字176内,或存储在函数返回栈帧172的其他部分内。
异常栈帧180、182的示例在图6的上半部分示出。响应于异常,将第一(调用者)栈帧180和第二(被调用者)栈帧182中的一者或两者保存到栈。出于性能原因,将可能需要响应于异常进入事件而保存的寄存器划分为两个组(称为“调用者”寄存器和“被调用者”寄存器)可能很有用。调用者寄存器是在硬件中实现的异常控制电路28负责保存到栈的寄存器。因此,异常处理程序的软件不需要包括用于将调用者寄存器保存到栈数据结构的指令。
如图6所示,调用者寄存器(包括在调用者栈帧180中)可包括通用寄存器的子集。在该示例中,调用者状态包括通用寄存器R0、R1、R2、R3和R12、链接寄存器LR(R14)、在处理异常之后处理要返回到的返回地址181的指示(其可被设置为在发生异常时从程序计数器寄存器R15导出的值)以及异常返回程序状态值(ERETPSR),该异常返回程序状态值基于程序状态寄存器XPSR中的值来设置,该程序状态寄存器可提供用于控制条件指令的结果和与当前处理状态有关的其他状态信息的条件代码。ERETPSR还可指定在发生异常之前正在执行的处理的异常编号36,如果处理电路在发生异常之前在线程模式下操作,则该异常编号可具有默认值0。应理解,这仅仅是可在调用者寄存器状态中包括哪个寄存器状态的一个特定示例。一些示例还可包括位于调用者栈帧中的浮点寄存器状态,并且可配置是否应包括浮点寄存器状态(例如,取决于正在执行的线程是否启用了浮点状态)。
对于其中仅调用者栈帧180被保存到栈的异常,在异常控制电路28响应于异常事件将调用者栈帧180保存到栈之后,可开始执行异常处理代码,然后异常处理程序软件可将来自附加被调用者寄存器的状态保存到栈上,如果异常处理程序软件知道它将在执行期间覆盖此状态。然而,通过控制处理电路4的加载/存储单元以响应于在异常处理程序代码中提供的加载/存储指令而将相关数据保存到存储器来执行异常处理程序的这种状态保存,这可能比异常控制电路28控制硬件中的堆栈的情况更慢。然而,允许调用者和被调用者寄存器状态之间的分区可能是有益的,使得在进入异常后执行的软件可能影响需要保存哪些寄存器。如果异常处理程序永远不会访问特定的被调用者寄存器(例如,通用寄存器R7),则异常处理程序不需要保存相应的架构状态,并且也避免了与在异常控制电路28和硬件中进行这种状态保存相关联的能量和时间。可鼓励异常处理程序的代码编写器或此类代码的编译器首先使用调用者寄存器,然后再使用附加被调用者寄存器,以减少需要在软件中进行附加状态保存的机会。
然而,如果异常进入导致从安全域到较低安全域的转换,并且在异常之前在安全域中执行原始后台处理,则如果异常控制电路28仅将调用者寄存器保存到存储器,则这可使寄存器组14内的被调用者寄存器可被较低安全异常处理程序访问,以在最新的异常之后执行。这可能是不希望的,因为被调用者寄存器可包括从存储器地址空间的安全区域导出的信息,否则SAU 24将阻止较低安全异常处理程序访问该安全区域。
因此,对于从安全域到先前在安全域中执行后台处理的较低安全域的某些转换,除了保存调用者寄存器之外,异常控制电路28还可将被调用者寄存器保存到相关栈数据结构,并可清除已保存的寄存器的内容(包括调用者寄存器和被调用者寄存器)。因此,通过在硬件中执行附加状态保存,这意味着在这种情况下通常会保存被调用者寄存器的较低安全软件无法在异常发生之前访问存储在这些寄存器中的潜在安全信息。
因此,对于某些异常进入转换,除了存储调用者栈帧180之外,还可将第二(被调用者)栈帧182保存到栈(在异常控制电路28的硬件控制下,即无需处理电路4执行明确的加载/存储指令)。需注意,虽然在图6中,被调用者栈帧被称为与调用者栈帧分开的栈帧,但其他人可能会将被调用者栈帧视为调用者栈帧的扩展,因此180、182的组合被视为单个栈帧。这两种方法都可被视为等效的。
被调用者栈帧182包括附加被调用者状态,该状态包括未保存在调用者栈帧180中的寄存器R4-R11。任选地,浮点上下文也可包括在被调用者栈帧182中。由硬件保存的附加状态还可包括预定完整性签名190。当调用者状态和被调用者状态两者均由异常控制硬件28保存,但从调用者异常栈帧180中丢失时,完整性签名190包括在被调用者栈帧182中。完整性签名190的值对应于不可执行地址130的保留范围中的一个地址,使得如果存在从其提取指令的尝试,则将发信号通知故障。完整性签名190的值可能无法与任何有效虚拟函数返回地址140或虚拟异常返回地址142匹配。完整性签名190可用于检测某些形式的攻击,这些攻击可安装在处理电路上以试图规避由硬件提供的安全保护,该硬件强制执行安全域与较低安全域之间的分区。一个可能的攻击途径是,攻击者尝试执行异常进入转换以进入异常处理,但随后将不同类型的返回转换伪造为预期从异常进入返回的返回转换,诸如执行函数返回转换。签名190位于栈帧上与函数返回栈帧172中用于存储函数返回地址174的相对位置相同的相对位置处。因此,如果在函数返回时检测到返回地址174与完整性签名190匹配(其对应于任何不可执行的保留地址130),则可触发故障,因为这意味着用于执行函数返回的栈帧实际上已响应于异常进入事件而被保存到栈,这可能正在执行攻击的指示符。同样,在从栈上存在与被调用者寄存器关联的附加架构状态的异常返回时,部分安全检查可以是检查栈中与完整性签名190相对应的相关偏移处的值是否具有预期值,因为缺少签名可能表明异常返回事件是基于响应于函数调用而保存到存储器中的栈帧执行的,这又可能存在违反安全性的风险。
如图6所示,作为预定签名值190的一部分,TMIE交叉检查值192可存储在预定签名190的一个位内(因此有效地,预定签名190可能存在两个或更多个有效值,每个有效值均在保留地址范围130内,但与用于虚拟函数返回值和虚拟异常返回值的地址分开)。当发生保存了被调用者栈帧182的异常时,TMIE交叉检查值192被设置为指示写到链接寄存器中的虚拟异常返回地址142的TMIE标记158的状态的值(例如,交叉检查值192可等于TMIE标记158,或者可相对于TMIE标记158被反转,或者使用另一编码来表示TMIE标记的状态)。在被调用者栈帧182被保存到栈的情况下,这指示在在异常之前执行的原始后台处理位于安全域中的情况下,异常正从安全域被带到较低安全域,因此可能存在以下风险:在异常之后执行的较低安全代码可修改虚拟异常返回地址142中的TMIE值,以试图阻止安全代码在异常返回之后正常运行。TMIE交叉检查值192提供交叉检查以检测对TMIE值158的篡改。
在一些系统具体实施中,有时可能希望某些类型的异常使其异常处理程序在无特权状态下执行。这可能很有用,因为对于与由不可信第三方提供的库代码控制的设备相关联的某些类型的异常,可能不希望允许由不可信第三方提供的异常处理程序具有可用于处理程序模式的全部特权,因为不信任它们不修改某些状态信息。然而,如图2所示,默认情况下,处理程序模式在特权状态下操作,因此要使异常处理程序在无特权状态下操作,这需要切换回线程模式。然而,在典型具体实施中,用于从处理程序模式切换到线程模式的机制将经由异常返回。通常不希望原始异常触发异常返回(在修改返回地址之后,因此返回进行到无特权库代码而不是先前的后台处理),因为这会降低原始异常的执行优先级。以此方式降低执行优先级可防止异常处理例程被正确地确定优先级。因此,如果正在处理原始异常的处理程序代码能够切换到线程模式而不触发异常返回,则将是优选的。
在典型系统中,由于从处理程序切换到线程模式的唯一机制是经由异常返回,因此如图7所示,为了能够对异常处理程序进行特权解除以处理原始异常,则这将需要生成进一步的异常(例如,管理程序调用异常,SVC),使得可在存储器中建立异常返回栈帧,该异常返回栈帧不表示在异常之前执行的真实处理上下文,而是伪造的,以确保当SVC异常从中返回时,处理将切换到线程模式,使得可在线程模式下以无特权状态处理先前发生的异常的主体。
例如,如图7所示,当在线程模式中处理线程T1中的一些后台代码时,发生中断IRQ,该中断IRQ的类型为将被传递到无特权库。在图7的步骤1处,中断导致异常控制电路28触发寄存器状态到进程栈的堆栈,以保持线程T1的寄存器状态。中断导致从线程模式到处理程序模式的转换,因为最初默认情况下在处理程序模式下发生异常。虽然用于处理IRQ异常的异常处理程序的主体200将由不可信库执行,但用于处理IRQ异常的异常处理程序被提供有包装器代码202,以便在主异常处理程序主体200之前和之后执行,其中包装器代码在处理程序模式下执行,并且控制用于生成SVC异常的操作,以确保可在线程模式下处理主体。
因此,在图7中的步骤2处,处理程序模式下的包装器代码生成SVC异常,该异常实际上并未处理原始IRQ中断,而是仅为使IRQ处理程序能够切换到线程模式而生成的。SVC异常导致异常控制电路28执行寄存器状态到与当前域相关联的主栈指针MSP所指向的主栈的堆栈(由此当前模式是处理程序模式,因此使用主栈)。响应于SVC异常而执行的SVC异常处理程序将进程栈指针切换为指向与线程TIRQ相关联的不同栈结构PSPIRQ,该线程将执行主异常处理程序主体200以处理原始IRQ异常。SVC异常处理程序在进程堆栈上伪造栈帧,该栈帧在其异常返回状态信息(ERETPSR)中指示异常编号零,以指示对应的异常返回应返回到线程模式。需注意,此值为假,因为在SVC异常之前执行的处理实际上处于处理程序模式。
当SVC异常处理程序完成时,它会导致分支到假虚拟异常返回地址的分支,该假虚拟异常返回地址使用在由PSPIRQ指向的栈上创建的假异常返回栈帧,而不是在步骤2中在主栈上创建的异常栈帧来触发异常返回。然后,由异常控制电路28执行异常返回,这在图7的步骤3处导致硬件从PSPIRQ栈中解堆栈。硬件检测到假虚拟异常返回地址142中的M位152指示应返回到线程模式,并且因此在步骤4处,用于处理IRQ异常的异常处理程序200的后续主体可由无特权库在线程模式下执行。需注意,这是在未从原始IRQ异常返回的情况下完成的,因此用于处理IRQ异常的异常处理程序的优先级并未降低。
一旦主异常处理程序主体200完成,则在步骤5处,进行另一SVC异常调用(SVC是可由软件自愿触发的异常类型,而不是由意外或错误事件触发的异常类型),这再次导致对由PSPIRQ指向的进程栈的进一步硬件堆栈,并且被调用的SVC处理程序随后破坏刚刚在由PSPIRQ指向的进程栈上创建的栈帧,并且随后更新当前安全域的进程栈指针,以恢复与后台线程T1相关联的先前栈指针PSP1。在图7的步骤6处,SVC异常生成异常返回,该异常返回然后触发使用MSP从主栈的进一步硬件解堆栈(即,解堆栈在步骤2期间创建的栈帧),并且然后在处理程序模式下执行任何剩余包装器函数202之后,然后在步骤7处生成进一步的异常返回,该进一步的异常返回导致与线程T1相关联的寄存器状态从由PSP1指向的进程栈的硬件解堆栈(即,解堆栈在步骤1期间创建的栈帧)。然后,在线程模式下执行的线程T1的后台代码中继续处理。
图7所示的过程使得某些类型的异常能够被解除特权,使得它们的异常处理程序在线程模式下操作。然而,它具有许多缺点。首先,由于所需异常栈帧的伪造,很难生成用于控制此过程的软件代码,因此编程器可能容易出错,这可能提供攻击者可能利用或阻止系统正常运行的漏洞,或者为攻击者提供提取诸如加密密钥的秘密值的方式。
另一个缺点是,对于这种工作方法,SVC异常的异常优先级(在主异常处理程序主体200的开头和末尾处执行,以创建假栈帧并在从原始异常返回之前清除)必须高于需要进行特权解除的每个中断IRQ的优先级。这可能使实时系统的设计更加复杂,因为SVC异常始终具有相同的优先级,并且因此其他IRQ异常的最坏情况中断延迟会延长最长SVC调用的持续时间。这可能是不希望的。
此外,图7所示的方法非常慢,这是使用具有关键中断延迟的无特权库的主要障碍。这种较差的性能是由多个因素造成的,包括在图7的步骤2和3之间处理SVC异常时手动创建异常栈帧,以及需要两个不同的SVC异常的事实,这会在图7的步骤2、3、5和6处触发四个附加寄存器状态堆栈和解堆栈事件,这表示存储器访问延迟,如果用于处理IRQ的异常处理程序仅在处理程序模式下执行,则不需要该延迟。因此,性能成本可能意味着一些系统设计者可能觉得他们根本无法使用与不可信库代码相关联的设备,诸如无线网络接口或USB控制器,这可能限制系统设计的灵活性。如图7的底部部分中所示,在该示例中,在较低安全域中执行整个特权解除过程,但应理解,该过程也可在安全域内执行。
图8示出了使用如本申请中所描述的模间调用分支指令来改进异常特权解除的性能的另选方法。通过提供能够分支到由指令指定的目标地址处的指令并设置函数返回地址以指示一旦函数完成处理应返回到的地址的模间调用分支指令,以及触发从处理程序模式到线程模式的切换,这意味着可以更快地对中断进行特权解除,并减少性能影响、复杂性和与图7所示方法相关联的上述其他问题。使用这种方法,对将在无特权状态中处理的IRQ异常的响应可以简单得多。
图8的步骤1与图7中的步骤相同。在步骤2处,执行某个包装器代码203,用于准备执行主中断处理程序主体201,该主中断处理程序主体具有模间调用分支指令,作为其在主中断处理程序主体201之前的最后一个指令,该模间调用分支指令指定将在主异常处理程序主体201中执行的第一指令的地址作为分支目标地址。在一些操作系统中,包装器203可与包装器202相同,不同之处在于它执行模间分支指令而不是触发SVC异常。在一些具体实施中,模间调用分支指令可为专用指令编码,其不同于用于不从处理程序转换到线程模式的非模间调用分支指令的指令编码。因此,在图8的步骤3处,模间调用分支指令的执行触发从处理程序模式到线程模式的切换,然后主异常处理程序主体201继续在图8的步骤4处在线程模式下执行。不需要调用SVC异常。
在进行模间函数调用时,可将信息存储在虚拟函数返回地址140中以指示(使用模间调用指示符146)函数调用为模间调用,使得当在图8的步骤5处触发对应的函数返回时,处理电路4可检测指示符146,并且除了分支到与先前函数调用(存储在函数返回栈帧178中)相关联的函数返回地址174之外,还检测到当前模式还应从线程模式切换回处理程序模式。然后,在图8的步骤6处,一些剩余包装器代码203在处理程序模式下执行,接着进行步骤7,在步骤7中,执行异常返回,以从处理程序返回到在IRQ异常发生之前执行的后台线程T1。在一些系统中,主中断处理程序主体201(图8中)可与主中断处理程序主体200(图7中)相同,不同之处在于,代替触发SVC异常以从无特权主中断处理程序主体返回,可通过简单地分支到在图8的步骤3处置于链接寄存器中的虚拟函数返回地址140来请求返回。因此,主中断处理程序主体201(图8中)可为标准C函数,并且不需要任何特殊处理。
因此,使用该方法,所需的唯一硬件堆栈和解堆栈操作是用于保存和恢复与后台代码T1相关联的寄存器状态的操作,并且不需要与两个SVC异常相关联的另外的硬件堆栈和解堆栈操作。此外,这种方法对于编译器或编程器来说更容易编码,减少了错误的机会,并且不需要SVC异常具有比要进行特权解除的所有异常更高的优先级。
为了通过限制切换安全域的机会数量来提高安全性,可能不允许模间函数调用改变安全域,而是可仅在模式之间改变。因此,当执行模间函数调用分支指令时,处理电路4可保持当前安全域与执行模间函数调用分支指令之前相同。如图9所示,可禁止从较低安全线程模式到安全处理程序模式的组合域/模式函数返回转换以保持安全性。这可通过明确检查是否在模间函数返回时请求返回到安全域来强制执行,并且如果检测到故障,则可触发故障,如下面参考图15所述。
然而,对于模间函数返回,如图10所示,至少对于模间函数返回是从安全线程模式到较低安全处理程序模式的情况,可能希望允许组合的模式/域转换。这可使编译器能够使用如图11A至图11C所示的称为尾部调用的技术。在一些具体实施中,出于安全原因,对于安全到较低安全函数调用,可能已禁止尾部调用。因此,尽管可能需要支持图10所示的安全线程到较低安全处理程序模间返回转换,但可能不需要支持图9所示的较低安全线程到安全处理程序模间返回转换。
如图11A所示,一些高级代码(将被编译成由处理系统的指令解码器10支持的汇编代码)可包括嵌套函数调用,其中在第一函数fn1内调用第二函数fn2,并且对函数fn2的调用的位置使得在fn2的末尾与fn1的末尾之间无fn1的进一步指令。
在这种场景中,如图11B所示,编译器生成汇编代码的一个选项可以是针对对fn1和fn2的每个调用,生成调用分支指令(BL,也称为分支和链接指令),该调用分支指令触发函数返回地址到链接寄存器LR(R14)的保存以及到表示该函数的函数代码的开头的目标地址的分支,接着生成函数返回指令(间接分支指令BX,其将链接寄存器指定为其地址操作数),该函数返回指令指示处理应返回到先前保存到链接寄存器的返回地址。图11B中未示出用于调用fn1的调用分支指令,因为它将是调用fn1的代码的一部分,并且图11B仅示出了用于fn1和fn2的函数代码。因此,对于fn1,编译器生成BL指令283(调用fn2)和BX指令286(从fn1返回到调用fn1的代码)。对于fn2,编译器生成用于从fn2返回到fn1的BX指令284。为了确保在调用fn2时保留fn1的返回地址,fn1代码还包括在调用fn2之前将链接寄存器的内容推送到栈的推送指令282,以及在从fn1返回之前从栈中恢复链接寄存器的弹出指令285。实际上,由于fn2是在fn1内要执行的最后一个活动,因此将函数1的链接寄存器推送到栈和从栈中弹出会带来一些不必要的存储器性能开销。
因此,如图11C所示,用于编译函数的另选方法可以是使用不更新链接寄存器的非调用分支指令287来调用与fn2相关联的代码,从而将保存在链接寄存器中的返回地址有效地传递到fn1至fn2。这意味着当执行最终返回分支288时,处理返回到fn1之前正在处理的后台代码。这种方法称为尾部调用,可通过避免对PUSH 282、POP 285和BX 286指令的需要来提高性能。
然而,在函数1处于较低安全线程模式并通过图10的示例中所示的模间函数调用而调用并且函数2处于安全线程模式并通过域间函数调用而调用(从较低安全域NS到安全域S的调用)的场景中,这意味着为了支持尾部调用,后续返回分支指令288将需要触发从安全线程模式到较低安全处理程序模式的直接返回。如果不支持组合的域/模式转换,则无法进行尾部调用,这可能需要重新编译很多现有的遗留代码,因此当组合的域/模式转换是从安全线程模式到较低安全处理程序模式时,支持组合的域/模式转换可能更有效。然而,通过禁止从较低安全域到安全域的模间函数返回,则这提高了安全性,因为这限制了可进入安全域的途径。如前所述,可能不需要这种转换组合,因为在遗留代码中可能已禁止从安全域到较低安全域的尾部调用。
图12是示出响应于函数调用分支指令(BLX)而执行的步骤的流程图。这些步骤由处理电路4在指令解码器10的控制下响应于对识别为函数调用分支指令的指令的解码而执行。在步骤300处,确定函数调用分支指令是否为模间调用分支指令,该模间调用分支指令为特定类型的函数调用分支指令,通过对其他类型的函数调用分支指令进行不同指令编码来区分。例如,模间调用分支指令可具有与非模间调用分支指令不同的操作码,或可具有相同的操作码,但具有在指令编码中指定的单独参数,该单独参数辨别其是否为模间调用分支指令。在图12所示的示例性实施方案中,模间调用分支指令存在两个变体,BLXT和BLXTI,它们均触发模间函数调用,但它们在控制寄存器32中设置TMID参数34的方式不同。应理解,一些系统具体实施可能不支持模间调用分支指令的两个变体并且可仅具有BLXT变体和BLXTI变体中的一者。此外,一些具体实施可具有模间调用分支指令的进一步变体。
如果函数调用分支指令并非模间调用分支指令,则在步骤302处,处理电路4(在指令解码器10的控制下)确定函数调用是否为从安全域到较低安全域的域间函数调用。在一些具体实施中,这种安全到较低安全域间调用可由函数调用分支指令的又一变体BLXNS来发信号通知,该变体具有将其与其他类型的函数调用分支区分开的专用指令编码。此外,在一些具体实施中,BLXNS指令是否触发域间调用还可取决于由指令指定的分支目标地址,特别是分支目标地址的最低有效位是否为0。在一些示例中,在有效函数调用或从较低安全代码分支到安全域中时,响应于在函数调用之后作为安全代码中的第一指令执行的安全网关指令,函数返回地址的最低有效位可被清理为0,以确保后续函数返回然后返回到较低安全域,使得较低安全代码不能通过提供在安全区域中的函数返回地址来欺骗安全代码分支到由SAU 24定义的安全地址区域内的任意位置。由于可使用分支目标地址的最低有效位的清理来确保安全到较低安全域间函数返回的安全性(使用BXNS指令),因此,使用类似的方案来确保安全到较低安全域间函数调用的安全性可能很方便(使用BLXNS指令)。因此,在检测到存在域间调用指令BLXNS且分支目标地址的最低有效位设置为0时,这可被视为安全到较低安全域间调用。在一些具体实施中,当处理电路4在安全域中操作时,安全到较低安全域间调用指令(BLXNS)可能仅在指令集中可用(并且因此可由解码级10检测)。在这种具体实施中,从较低安全状态执行BLXNS指令的尝试可能导致解码级10不将该指令识别为当前状态的有效指令,因此处理将不会到达步骤300。
如果函数调用并较低安全到较低安全域间调用,则在步骤304处,可处理函数调用而无任何特定的安全隐患,并且在步骤304处,将链接寄存器(R14)设置为函数返回地址。函数返回地址具有在地址空间100中的函数调用指令之后的指令的地址的值(即,函数调用指令的地址加上函数调用指令操作码的长度)。在步骤306处,基于由函数调用分支指令指定的分支目标地址来更新程序计数器寄存器R15,使得处理随着分支为分支目标地址处的指令。这代表函数调用的分支处理的正常情况,这些函数调用不会触发域的任何改变或模式的改变。
如果在步骤302处确定函数调用分支是安全到较低安全域间调用,则在步骤307处,处理电路4确定(基于异常编号36是否是特殊线程模式值0)当前模式是否是线程模式,并且还确定线程模中间状态禁用(TMID)参数34是否指示在线程模式下禁用域转换。如果当前模式是线程模式并且在线程模式下禁用域间转换,则在步骤308处,处理电路发信号通知故障。发信号通知的特定类型的故障可以是专用故障类型,仅用于由在TMID标志34指示禁用时在线程模式下切换安全域的尝试所触发的异常。另选地,故障可指向用于处理各种故障状况的异常处理程序,并且在此类情况下,可设置与域间转换禁用检查相关联的校正子标记,使得异常处理例程可很容易识别故障的原因以及需要执行的后续动作。在图12中,这表示为INVTMI(无效线程模式中间状态)UsageFault,尽管这种类型的故障的确切命名约定当然可能会有所不同。对于安全到较低安全域间调用,在安全域(在尝试调用之前的当前域)中处理INVTMI故障,这是有用的,因为用于管理请求安全到较低安全转换的线程的进程将是安全操作系统管理安全线程,其可能更适合处理INVTMI故障,使得可配置该线程在较低安全域中操作所需的任何资源。
如果在步骤307处确定当前模式为处理程序模式(例如,当异常编号36为非零时)或TMID参数34为0,以指示在线程模式下启用域转换,则在步骤310处,处理电路将链接寄存器R14设置为有效虚拟函数返回地址值140中的一个返回地址值,如图5所示。在虚拟函数返回地址140中,将模间标记(M)146设置为1以指示其并非模间函数调用,并且还将安全域标记(S)148设置为1以指示从安全域进行了调用。在步骤312处,将函数返回栈帧172保存到安全主栈指针MSP_S或安全进程栈指针PSP_S所指向的栈数据结构(取决于当前模式是处理程序模式还是线程模式,并且如果处于线程模式,则取决于安全域13_S的栈指针选择值30)。保存的函数返回栈帧172将HDT标记178指定为等于0,以指示其并非模间函数调用。此外,函数返回栈帧172中的异常编号字段179被设置为等于控制寄存器20中的异常编号36的当前值,以指示调用是从处理程序模式还是线程模式进行的。该异常编号字段179用作指示当前模式是否为处理程序模式的处理程序模式指示值。函数返回栈帧还包括函数返回地址174,其设置方式与步骤304相同,但这次将其保存到栈而不是链接寄存器,使得在域间调用之后要执行的较低安全代码无法获知在函数调用之前在安全代码中正在执行什么指令。在步骤314处,处理电路然后将当前域切换到较低安全域,然后该方法前进至步骤306,在步骤306处,以与前述相同的方式执行到由函数调用分支指令指定的分支目标地址的分支。
再次参考步骤300,如果函数调用分支指令为模间调用分支指令,则在步骤320处,处理电路确定当前操作模式是否为线程模式,并且如果当前模式为线程模式,则在步骤322处,发信号通知使用故障。这可能是与INVTMI UsageFault不同类型的使用故障。由于模间调用分支指令旨在触发从处理程序模式到线程模式的切换以支持中断特权解除,因此从线程模式执行它的尝试是错误的。在处于线程模式时抑制模间调用分支的指令执行避免了由于响应于调用分支而可能设置错误的栈帧所引起的潜在不可预测的结果,这可能导致安全漏洞。因此,模间调用分支指令只能从处理程序模式执行。
如果在步骤320处确定当前模式为处理程序模式,则该方法前进至步骤324,在步骤324处,将链接寄存器设置为特殊虚拟函数返回地址值140中的一个返回地址值,但与步骤310不同,在步骤324处,将模间标记(M)146设置为0,以指示对应的函数返回应被视为模间函数返回。此外,函数返回值140中的安全域标记(S)148指示执行模间调用分支指令时的当前操作域(可从安全域或较低安全域进行模间调用)。
在步骤326处,处理电路在执行模间调用指令和栈指针选择值30之前,将函数返回栈帧172保存到基于操作的域和模式而选择的栈。函数返回栈值再次包括函数返回地址174(以与步骤304或312相同的方式设置),以及对应于异常编号36的当前值的处理程序模式指示值。当从处理机模式进行模间调用时,可以预期异常编号字段179将为非零。对于模间调用,将函数返回栈帧中的HDT标记178被设置为1,以指示此函数返回栈帧是响应于模间调用而保存的,该模间调用可提供交叉检查信息,以在使用虚拟函数返回地址140进行对应函数返回时,检查模间标记146是否正确或已被不可信代码篡改。需注意,在步骤312或326处保存函数返回栈帧之后,如果在当前保存的栈帧被解除堆栈之前需要进一步的堆栈,则对应的栈指针也将被更新以指向应将进一步的堆栈信息保存到栈的位置。
在步骤328处,任选地,处理电路响应于模间调用分支指令触发要执行的错误同步屏障操作。例如,错误同步屏障操作可涉及处理电路4暂停指令的进一步执行,直到确定用于检查任何先前执行的指令的有效性的至少一些类型的错误检测或校正操作的结果已完成,并且确认这些操作是无错误的,涉及可校正的错误,或者涉及可在从处理程序改变到线程模式之前被正确地归因于指令的执行的错误。错误同步屏障操作是确保由可靠性、可用性和可服务性(RAS)错误检测/校正电路29检测到的至少一些类型的错误可归因于在由模间调用分支指令引起的模式改变之前正执行的代码,并与当处理在由模间调用分支指令引起的模式改变之后执行的代码时出现的错误区分的操作。对于模间调用分支,能够准确地查明检测到的RAS错误是影响在由模间函数调用引起的模式改变之前执行的较高特权代码还是影响在模式改变之后执行的较低特权代码可能很有用。这是因为通常解决与较低特权代码相关联的错误可能比解决与较高特权代码相关联的错误对系统可用性造成低得多的影响。例如,较高特权代码可能是操作系统,因此处理归因于操作系统的错误可能需要完全的系统重置,而归因于与单个线程相关联的较低特权代码的错误可简单地通过杀死该线程但不影响其他线程和操作系统来处理。因此,通过响应于模间运调用而执行错误同步屏障操作,这可通过限制处理任何检测到的错误的影响来提高系统的可用性,在这种情况下,错误可安全地归因于由模间函数调用引起的模式改变之后执行的较低特权代码。应理解,可能存在某些类型的错误,这些错误可能超出错误同步屏障的范围,并因此可能无法通过使用此类屏障来控制。这些无法控制的错误可能仍需要完全的系统重置。然而,错误同步屏障的使用可能会增加错误归因于单个线程的可能性,并因此降低需要完全系统重置的可能性。
并非所有场景都需要触发错误同步屏障操作。一些系统可能更喜欢通过不人为地阻止在模间函数调用之后执行的后续指令的执行来改进常规程序执行的性能。例如,对于某些实时关键中断,中断处理延迟可能必须尽可能短,并且因此可能优选的是,如果检测到RAS错误,则不触发错误同步屏障操作,代价是更高的性能成本,而对于对实时性要求较低或与安全关键行为相关的其他类型的中断,则可能优选的是,触发错误同步屏障操作,使得尽管常规中断延迟可能会稍微慢一些,因为在模间调用之后,在错误检测/校正结果可用之前,指令的执行会被延迟,但如果检测到错误,则可查明错误的位置,并在可能的情况下避免系统重置的全部影响。因此,在一些具体实施中,控制寄存器20可存储配置参数,该配置参数指定是否应响应于模间调用指令而触发错误同步屏障操作。在一些系统中,指定是否应执行错误同步屏障操作的配置参数在安全域之间分组,使得较低安全域和安全域可独立地选择是否应执行屏障操作。
无论是否执行错误同步屏障操作,在步骤330处,响应于模间调用分支指令,处理电路还为当前安全域设置栈指针选择值30-S或30-NS,以指示在模间函数调用之后应针对以线程模式执行的后续操作选择进程栈指针。这确保在模间调用之后要执行的异常处理程序的较低特权部分不能访问或破坏在模间调用指令之前在处理程序模式下执行的包装器代码的较高特权部分所使用的主栈指针,即使在异常处理程序处理异常之前执行的线程模式代码确实能够访问主栈指针。
在步骤332处,处理电路4确定正在执行的模间调用分支指令是否为指令的BLXTI变体。如果是,则在步骤334处,将TMID参数34设置为0,以指示在线程模式下启用安全域与较低安全域之间的域转换。这对应于如前所述的模间调用分支指令的第二变体。如果模间调用分支指令为BLXT变体(第一变体),则在步骤336处,将TMID参数34设置为1,以指示在线程模式下禁用域转换。编程器可选择是使用BLXT还是BLXTI变体,这取决于是否已为在模间函数调用之后要执行的线程建立了安全域和较低安全域的资源。在这两个域的资源都已建立的情况下,可选择BLXTI变体,使得在必要时在安全域与较低安全域之间切换很安全,而在S/NS域中仅一个S/NS域配置了资源的情况下,可选择BLXT变体。这些资源可包括安全MPU26-S和较低安全MPU 26-NS中的相关一者内的MPU配置(其中MPU配置可包括定义对相应存储器区域的访问权限的某些存储器区域属性和/或指向存储器系统6中提供这些存储器属性的表的指针中的一者或两者)。此外,资源可包括安全栈指针寄存器或较低安全栈指针寄存器(如图3中所示的R13的分组版本)中的栈指针,并且如果存储器中尚无合适的栈结构可用,则资源还可包括存储在存储器中的对应栈结构的分配。通过提供在线程模式下禁用域转换的能力,这使线程能够将其资源配置为仅用于一个域,然后只有在尝试切换域时才需要延迟分配用于其他域的资源,否则会触发故障,如上面的步骤308所示,或者如前面针对其他类型的域间转换所描述的那样。通过使用BLXTI或BLXT指令来另外设置线程最大中间状态禁用参数34,这避免了需要单独的指令来单独设置标记。
不管执行模间调用分支指令的哪个变体,在步骤338处,处理电路更新异常编号36以指示非异常处理值(例如,0),因此处理器切换到线程模式。再次,该方法然后前进至步骤306,以分支到由函数调用分支指令指定的分支目标地址。然后,后续程序执行将从存储在分支目标地址处的指令继续进行。应理解,分支目标地址可由函数调用分支指令以若干方式指定。对于间接分支,可使用操作数来定义分支目标地址,以选择包含目标地址的寄存器。直接分支可使用在指令编码中直接编码的立即值来指定目标地址。程序计数器相关分支(其可为间接的或直接的)可指定要添加到当前程序计数器值的偏移量,以获得分支目标地址。
图13示出了在进入异常时执行的步骤。在步骤350处,发生异常。异常可以是软件触发的异常(诸如管理程序调用(SVC))或由软件直接引起的故障的发生所引起的异常(诸如执行未定义指令的尝试、从保留地址范围130取出指令的尝试或对存储器的访问),其由于在存储器访问检查电路22处的存储器权限检查失败而触发地址故障。此外,异常可以是由从外部设备或外围设备接收信号或消息引起的硬件触发的中断。
不管异常的原因如何,当发生异常时,然后在步骤352处,处理电路4由异常控制电路28控制,以将链接寄存器R14设置为前面所述的特殊虚拟异常返回值142。更具体地,选择几个虚拟异常返回值中的一个虚拟异常返回值,其中当前模式和当前域标记152、156的值基于异常发生时的当前操作模式和域来选择。此外,线程模式中间状态启用(TMIE)标记158被设置为控制寄存器32中的TMID标记34的当前值的倒数。这在异常处理期间将信息保留在TMID标记中,使得可在异常返回时恢复该信息。应理解,反转TMID标记以设置TMIE标记的具体实施仅仅是一种可能具体实施,并且其他示例可使用与TMID值相同的编码来对TMIE值进行编码,并且简单地直接对其进行复制,或者可使用完全不同的编码,该完全不同的编码不需要用单一位标记来表示,而是可使用多位值。
在步骤354处,异常控制电路28触发寄存器状态从寄存器1到存储器中的栈数据结构的硬件触发的状态保存,该栈数据结构由分组栈指针寄存器中的栈指针中的一个栈指针识别。要选择的特定栈指针取决于当前域和模式以及在异常发生之前使用的栈指针选择值30。状态保存可涉及仅存储图6中所示的调用者栈帧180或存储调用者栈帧180和被调用者栈帧182两者。关于是仅保存调用者栈帧还是保存调用者栈帧和被调用者栈帧两者的决定可取决于发生异常时的当前操作域和要处理异常的域,并且在一些情况下基于存储在控制寄存器20中的状态数据。
如果从本身不处理异常的后台代码发生异常,并且已处理了任何先前发生的异常,并且在较低安全域中处理了后台代码,则只需保存调用者栈帧180,而不需要保存被调用者栈帧182。此外,如果在安全域中处理了后台代码,但在安全域中将发生异常,则再次不需要保存被调用者栈帧182。
在从在安全域中处理的后台代码发生异常但要在较低安全域中处理异常的情况下,则存在这样的风险,较低安全异常处理程序能够访问由在异常之前操作的安全代码置于寄存器14中的寄存器状态。因此,在这种情况下,调用者栈帧180和被调用者栈帧182两者都将被保存到由安全主栈指针和安全进程栈指针中的一者所识别的安全栈,并且可清除通用寄存器16以隐藏安全数据,使其不被较低安全处理程序访问。
前一段描述了当从后台代码发生异常时,确定是否保存附加被调用者栈帧的一般原理。然而,当进一步的异常先占了尚未完成其异常处理程序的早期异常时,或者当执行了异常的尾部链接,其中在完成一个异常时,在返回到后台代码之前会发生另一个异常,则可能存在更复杂的决定,即是否保存调用者栈帧和/或被调用者栈帧。在已公开的PCT申请WO2013/117899 A1和WO2014/0538048 A1中描述了用于确定响应于异常而保存调用者和被调用者状态中的哪一者的决定过程的示例,其内容通过引用并入,并且可用于决定在本申请的图13中的步骤354处可应用哪些寄存器进行堆栈。具体参见WO 2013/117899 A1的图12和相关说明。
在步骤354处,如果决定将被调用者栈帧182保存到栈,则在预定签名190内,指定TMIE交叉检查信息192,该信息被设置为与在步骤352处设置的虚拟异常返回地址内的TMIE标记158相同的值(或者在另选的具体实施中,被设置为可用于检查TMIE标记158是否已正确设置的另一值)。这提供了一定的保护,防止出现在异常发生后操作的较低安全代码可能篡改虚拟异常返回地址中的TMIE标记158的风险,一旦TMIE标记158被用于将TMID标记34恢复到控制寄存器32,其方式可能冒着安全代码在从异常返回后接收到中间状态禁用标记TMID 34的错误值之后被处理的风险。这可防止由基于TMID 34生成的虚假故障引起的拒绝服务攻击,该TMID是基于篡改的TMIE标记34设置的。
可以质疑为什么TMIE交叉检查值190是在被调用者栈帧182而不是调用者栈帧180中指定,因为可以认为如果为后台代码保留TMID标记34的值被保存到调用者栈帧180中,则它可保持安全,而不会被链接寄存器中的异常处理程序访问,就像异常返回值142中的TMIE标记158一样。然而,实际上,调用者栈帧180可能没有太多空闲容量用于额外信息,因为状态字段ERETPSR可能已具有许多信息要编码,因此可能没有空间用于交叉检查信息192。在一些具体实施中,可能在ERETPSR值中有足够的空间用于添加TMIE标记,但ERETPSR值中的剩余空间仍然有限,并且优选地保留该空间以供将来添加到架构。被调用者栈帧182并非针对所有类型的异常而保存,因此不能依赖于它来存储TMIE值158的主副本,TMIE值指示在异常返回时要恢复到TMID标记34的值。因此,在图5和图6中所示的方法中,TMIE标记158置于链接寄存器中作为虚拟异常返回地址的一部分,但交叉检查信息190包括在被调用者栈帧182中,使所有类型的异常都能够保留TMID标记34的值,尽管在调用者栈帧180中缺少空间,但对于存在TMIE标记158被篡改风险的那些场景,这些也是通过保存附加被调用者栈帧182来保护寄存器状态的相同场景,因此保存到被调用者栈帧182的交叉检查信息192保护TMIE标记158免受篡改。
在步骤356处,作为异常进入转换的一部分,异常控制电路28触发处理电路4,以将控制寄存器32中的TMID标记34设置为0,以指示在线程模式下启用域转换。这确保所有异常处理程序都能看到是否在线程模式下启用域转换的一致视图,而不管是否针对在异常之前执行的代码禁用了域转换。为了与创建TMID标记34之前编写的软件向后兼容,可能需要以这种方式在线程模式下启用域转换。
在步骤358处,异常控制电路28控制处理电路4分支到异常处理例程。可基于将不同类型的异常映射到相应异常处理例程地址的异常向量表来确定在异常处理例程开始时要执行的指令的地址。在处理程序模式中处理异常处理例程,因此如果处理电路4当前处于线程模式,则响应于发生异常,将当前模式切换到处理程序模式。如果发生异常时的当前模式已经是处理程序模式,则不改变当前模式。因此,最初不可能对线程模式进行异常处理,尽管在处理程序模式下处理了一些代码之后,可执行如先前所述的模间函数调用以切换到线程模式。
此外,在异常进入时,异常控制电路28可任选地触发处理电路4以在必要时切换安全域。不同的异常可能与不同的安全域相关联。某些异常可能始终需要在特定域中发生,诸如安全域或较低安全域。发生异常时,当前域中可能会发生其他异常。因此,如果要在与当前域不同的域中处理异常,则除了分支到异常处理例程之外,异常控制电路28还可触发安全域的改变。
图14是示出响应于并非图12所示类型的函数调用分支指令的分支指令而执行的步骤的流程图。在步骤400处,处理电路检查目标地址是否在保留地址范围130内。如果不是,则这是到可执行指令的地址的常规分支指令。在步骤402处,检测分支是否正请求从安全域到较低安全域的转换。这可通过检查处理电路4的当前操作域并检查分支目标地址的最低有效位来识别。如果分支目标地址的最低有效位是0,则它指示分支回到较低安全域。另选地,在一些具体实施中,可通过使用专用域转换分支指令(其可称为BXNS)来指示请求从安全域到较低安全域的转换的分支。专用域转换分支指令可通过与其他类型的分支指令不同的操作码值来检测,或其可为与其他类型的分支指令相同的操作码,但具有指示请求安全到较低安全域转换的参数值。一些具体实施可组合这两种方法,使得安全到较低安全域转换请求既要求分支目标地址的最低有效位为0,又要求使用专用域转换指令。
如果分支不请求安全到较低安全分支,则在步骤404处,可正常处理分支,并基于由分支指令指定的分支目标地址来更新程序计数器寄存器R15,然后程序流继续在分支目标地址处执行指令(与执行分支之前在同一域中)。应理解,在一些具体实施中,并非所有类型的非函数调用分支都将用于函数返回。例如,基于在指令操作码内编码的立即值确定目标地址的分支可能始终分支到同一位置,因此它们可能不适合函数返回分支,其中程序流可能需要分支回到调用正从其返回的函数的各种不同函数。为了简化设计,一些具体实施可选择仅对可用于执行函数返回的非函数调用分支的子集执行图14中描述的步骤。如上所述,可存在可具有执行分支的效果的许多类型的指令,即使所述指令可能不是专用分支指令(例如,其可能是将加载的值写入程序计数器的加载指令)。图14中描述的步骤也可应用于具有执行分支的效果的此类非分支指令的至少一个子集。
如果在步骤402处确定分支是安全到较低安全分支,则在步骤406处,处理电路检查当前模式是否为线程模式,以及域转换禁用配置参数(TMID)是否为1,其指示在线程模式下禁用域间转换。如果当前模式为线程模式并且TMID指示在线程模式下禁用域转换,则在步骤408处,触发在安全域中处理的INVTMI UsageFault。这允许管理安全线程的安全操作系统根据需要配置任何MPU或栈资源,以允许安全线程也在较低安全域中操作。
另选地,如果在步骤406处确定当前模式为处理程序模式或控制寄存器32中的TMID值34为0以指示启用域转换(中间状态),则在步骤410处,将安全域切换到较低安全域(NS),然后在步骤404处,执行到目标地址的分支,如先前所述。
如果在步骤400处确定目标地址在保留范围内,则这指示分支可旨在表示函数返回或异常返回。在步骤412处,处理电路4的执行级12确定分支的目标地址是否为有效虚拟函数返回地址140中的一个地址,如由函数返回前缀144在其最高有效位部分处所指示。如果目标地址为有效虚拟函数返回地址140中的一个地址,则在步骤414处,执行函数返回分支处理,这将在下面参考图15更详细地描述。
另选地,如果分支的目标地址并非有效虚拟函数返回地址中的一个地址,则在步骤416处,确定目标地址是否为有效虚拟异常返回地址142中的一个地址,如图5所示。如果不是,则分支到目标地址的尝试是错误的,因为该地址表示不可执行指令地址并且其并非用于发信号通知异常函数返回的虚拟地址,因此在步骤418处可能会触发故障。另选地,代替响应于检测到分支到不可执行地址而直接触发故障,可正常执行分支以将程序计数器寄存器设置为分支目标地址(因此,在步骤416的“N”确定的情况下,图14从步骤416转换到步骤404),随后当指令提取电路8尝试从不可执行地址提取指令时,这可能导致发信号通知故障。因此,故障的产生可能由分支间接地引起,但可能并非响应于分支指令本身而直接发信号通知。任何一种方法都可能有效。
如果在步骤416处确定目标地址为有效虚拟异常返回地址142中的一个地址,则在步骤420处,至少如果异常返回涉及较低安全到安全域转换(其可根据虚拟异常返回地址中的安全域标记156确定),则在虚拟异常返回地址142中的TMIE标记158与作为调用栈帧182的一部分而保存的TMIE交叉检查信息190之间进行交叉检查比较。如果检测到不匹配,则在步骤422处触发故障,因为这可指示已尝试篡改链接寄存器中的TMIE标记158,或者另选地已出现意外错误。如果TMIE标记158与交叉检查信息192匹配,或者另选地异常返回转换为不需要该交叉检查的转换,则该方法前进至步骤424,在步骤424处处理异常返回。
步骤420和424处的异常返回处理还可包括如先前引用的PCT公布WO 2013/117899A1和WO 2014/053804 A1中描述的其他操作。在步骤420处检查TMIE值之前,步骤424的异常返回处理可包括将寄存器状态从栈解堆栈到寄存器14。解堆栈应仅涉及调用者栈帧180的解堆栈还是涉及调用者栈帧180和被调用者栈帧182两者的解堆栈的确定可基于状态标记来确定,该状态标记可在发生异常时作为异常返回值142的一部分来存储。有关决定哪些寄存器需要解堆栈的更多细节,请参见WO 2013/117899 A1的图13或WO 2014/053804 A1的图13。
此外,异常返回处理可包括检查预定签名190是否预期作为被调用者栈帧182的一部分存在于栈上。这可根据WO 2014/053804 A1的图14来确定。如果预期存在预定签名190,但栈上的位置的内容与预定签名相比不匹配,则可触发故障,因为这可检测基于响应于函数调用而保存的栈帧已尝试异常返回机制的情况。故障的产生在WO 2014/053804 A1的图7中示出。
异常返回处理操作还可包括其他操作,诸如基于加载的栈帧中的ERETPSR值来更新恢复的异常编号值36,以及基于返回到的处理优先级来改变异常优先级等级。
此外,在步骤424处,可基于被分支到的虚拟异常返回地址中包括的TMIE标记158来恢复控制寄存器32中的TMID值34。TMIED标记34的恢复值可对应于TMIE标记158的值的倒数,以便指示应在线程模式下启用还是禁用域转换,以匹配TMID 34在发生对应异常之前具有的值。应理解,也可在处理在此未讨论的异常返回时执行许多其他操作。
图15更详细地示出了在图14的步骤414处针对到函数返回地址的分支执行的操作。在步骤440处,处理电路确定被检测为分支的分支目标地址的虚拟函数返回地址140是否指示模间函数返回。例如,这可检查模间指示符146是否为0,以指定在从处理程序到线程模式的模间调用时设置了对应的函数返回值。如果尝试的函数返回并非模间函数返回,则它是域间函数返回(因为如果对应的函数调用既非模间调用也非域间调用,则链接寄存器将简单地被设置为函数返回地址,并且将不需要使用虚拟函数返回地址)。
在步骤442处,对于域间函数返回,执行线程模式中间状态禁用标记TMID 34的检查。如果当前模式为线程模式并且TMID标记34为1以指示在线程模式下禁用域转换,则在步骤444处,再次触发INVTMI UsageFault,如图12的步骤308或图14的步骤408。然而,在步骤444处,在尝试分支时在当前域中的任何域中处理INVTMI故障(也就是说,正在尝试域间函数返回的源域,而不是与步骤308和408中的情况相同的安全域)。这确保了负责管理请求分支的线程的进程可处理故障,然后根据需要为目标域配置所需的资源。
如果在步骤442处,当前模式被确定为处理程序模式,或者TMID标记34被确定为0,指示启用了中间状态,则在步骤446处,可允许分支继续。从基于安全域正转换到的当前操作模式确定的相关栈中读取要进行分支的函数返回地址174,并且如果处于线程模式,则基于栈指针选择值30来读取。执行验证是否允许域间转换所需的任何完整性检查。例如,这些完整性检查可包括函数返回栈帧172中的异常编号179是否指示栈帧是在与当前操作模式相同的模式下创建的(即,如果当前操作模式为线程模式,则异常编号179为零,并且如果当前操作模式为处理程序模式,则该异常编号为非零),以及检查HDT标记178是否为0,如对于域间函数返回所预期的那样。此外,可检查限制允许的域转换的任何其他要求。如果通过完整性检查,则允许到函数返回地址174的分支成功,然后从自函数返回地址174提取的指令继续后续处理(这是从函数返回栈帧172加载的真实函数返回地址,而不是实际指定为在图14的步骤400处遇到的尝试分支的目标地址的虚拟函数返回地址140)。可调整指向函数返回栈帧172的栈指针,以解决函数返回栈帧从栈数据结构的解堆栈和移除。如果任何所需的完整性检查失败,则发信号通知故障(这可能是可在安全域中处理的安全故障)。
如果在步骤440处,尝试的函数返回被确定为模间函数返回,则在步骤450处,处理电路确定当前域是否为较低安全域,并且虚拟函数返回地址140中的安全域指示符148指示请求返回到安全域。如果是这种情况,则在步骤452处,触发将在当前域(较低安全域)中处理的INVPC使用故障。触发此故障,以防止禁止的组合域/模式从较低安全线程模式转换到安全处理程序模式,如上面的图9所示,否则可能会造成安全漏洞。
如果尝试的模间函数返回并非从较低安全域到安全域(或者保持在同一域内,或者从安全域到较低安全域),则该方法前进至步骤454,在步骤454处,如果已配置,则触发错误同步屏障操作,类似于图12的步骤328处的操作。此外,通过在模间函数返回时触发错误同步屏障,这可帮助查明错误,以便如果错误可归因于在模间函数返回之前执行的较低特权处理,则减少对侵入式系统重置操作的需要。
在步骤456处,响应于模间函数返回指令,处理电路从与正在返回的目标安全域相关联的主栈加载函数返回栈帧172。在步骤458处,处理电路执行完整性交叉检查操作,并确定该完整性交叉检查的结果是否成功。这种完整性交叉检查可检查函数返回栈帧上的多个项。例如,处理电路可检查函数返回地址174是否为保留地址范围130中的一个地址。如果函数返回地址为保留地址范围中的一个地址,则这可能指示基于栈帧尝试函数返回,该栈帧实际上是异常栈帧,该异常栈帧包括预定签名190,该预定签名在栈上与函数返回栈帧172内的函数返回地址174相同的相对位置处,并且异常和函数进入和返回的这种不匹配可能是攻击的一个途径。因此,如果栈帧上的函数返回地址174是保留地址130,则完整性交叉检查失败。
而且,作为完整性交叉检查的一部分,处理电路基于控制寄存器20中的异常编号值36检查当前模式是否为线程模式。如果当前模式为处理程序模式,则完整性交叉检查失败。
此外,完整性交叉检查包括检查函数返回栈帧中的异常编号字段179,如果该字段为0,则会触发完整性交叉检查失败,因为模间函数返回预期将从线程模式返回到处理程序模式。
此外,完整性交叉检查使用HDT标记178来检测函数返回栈帧是否响应于模间调用分支指令而被保存。如果HDT标记为0,则这表示函数返回栈帧是响应于域间函数调用而不是模间函数调用而建立的(参见图12的步骤312),因此完整性交叉检查失败。这再次防止函数调用和函数返回的不匹配序列以限制基于不匹配栈帧的攻击机会,并且还防止在虚拟函数返回地址140内的模间标记146被保存在通常可访问的链接寄存器中时的潜在修改,其中HDT标记178充当用于检查模间标记是正确的交叉检查值。
如果任何完整性交叉检查失败,则在步骤460处触发INVPC使用故障,这表示安全检查失败,并且将在与尝试分支到的代码相关联的目标安全域中处理这种类型的故障。
另选地,如果所有的完整性交叉检查都通过,则在步骤462处,可对模间函数返回采取行动。当执行模间函数返回时,则在步骤462处执行多个动作。安全状态被更新为由虚拟函数返回地址140中的安全域指示符148指示的安全状态。这确保了安全域恢复到在进行对应的模间函数调用之前正在执行的域。
此外,在步骤462处,保存指示以记录在模间函数返回之前TMID标记34是0还是1。该指示与在异常进入时保存的TMIE标记158分开。存储TMID的先前值的指示的位置可根据实施方案而变化。例如,该指示可被保存到通用寄存器16,或可被保存到控制寄存器20,诸如标记寄存器中的条件标记,其可由后续条件指令直接测试。
此外,在步骤462处,控制寄存器32中的TMID值34可被设置为0,以指示现在再次启用线程模式域转换。这确保了不管在模间函数返回之前执行的异常处理程序代码的特权解除部分是否已尝试切换安全域,在返回到较高特权包装器代码时,域转换禁用配置值34都可处于一致状态。
此外,在步骤462处,在模间函数返回时,可调整从中加载函数返回栈帧的目标栈指针,以考虑已从栈中移除的解堆栈数据。此外,更新目标域的栈指针选择值30,以指示应选择主栈指针,并且通过从函数返回栈帧172中的异常编号字段179恢复异常编号寄存器36,将当前操作模式切换到处理程序模式(步骤458处的先前完整性检查可能已检查异常编号字段179为非零,因此恢复异常编号寄存器36会将当前模式切换到处理程序模式)。在步骤464处,执行从函数返回栈帧172获得的到真实函数返回地址174的分支,使得要处理的下一个指令是函数返回地址处的指令。
因此,通过使用在调用函数时保存的虚拟函数返回地址140(ISR 201的主体)来发信号通知后续函数返回是否应为模间函数返回,这意味着触发函数返回本身的指令不需要知道它是否正切换模式,这意味着仍可使用完全不知道对模间函数调用和返回的支持而编写的遗留异常处理程序代码。这对于上面关于图7和图8描述的中断特权解除场景特别有用。也就是说,函数返回分支指令可具有相同的编码,而不管它是否是模间分支。
需注意,在图14和图15中,触发到给定目标地址的分支的指令可以是导致程序计数器寄存器R15被修改到分支目标地址的各种指令中的任一种指令。在某些情况下,该指令可为专用分支指令,但其也可能是将分支目标地址移动到程序计数器寄存器中的寄存器移动指令,或从栈数据结构中弹出信息并将其加载到程序计数器寄存器中的栈弹出指令。具体地,在分支是到虚拟函数返回地址140或虚拟异常返回地址142中的一者的情况下,如果在对应的函数/异常返回之前进行进一步的函数调用,则这些地址可能最终被保存到栈,编译器生成直接将返回地址从栈帧弹出到程序计数器寄存器的代码可能更有效,而不是首先将其加载到链接寄存器中,然后执行指定链接寄存器的返回分支。因此,尽管最初可在调用函数或发生异常时将真实函数返回地址、虚拟函数返回或虚拟异常返回地址保存到链接寄存器中,但在执行对应的返回时,这些地址可能不再位于链接寄存器中,并且应理解,触发图14和图15中的分支操作的指令实际上可能并非专用分支指令。
图16A至图16D示出了可使用上述检查来防止的可能攻击的示例。这些攻击可基于不匹配的异常或函数调用和返回序列,该序列可试图利用由调用建立并在返回时预期的不匹配栈帧。
在图16A的示例中,在以安全处理程序模式进行处理期间,在步骤1处发生异常,并且该异常将在较低安全域中发生,因此调用者栈帧180和被调用者栈帧182都被保存到栈。在图16A中的步骤2处,进行一系列异常返回和/或函数调用,其最终导致在安全线程模式下执行处理。一旦处于安全线程模式,则在步骤3处,基于在步骤1处设置的异常栈帧180、182,尝试执行模间函数返回。例如,这可通过分支到虚拟函数返回值140中的一个值来完成。可检测到这种类型的攻击,因为在图15的步骤458处对函数返回的完整性交叉检查将检测到函数返回地址174是保留地址范围130的中的一个地址(因为预定签名190将位于在步骤3处加载的异常栈帧的底部,而不是预期的函数返回栈帧172)。
图16B示出了第二示例,其中在步骤1处从安全域到较低安全域进行域间函数调用,导致函数返回栈帧172被保存到安全主栈。在步骤2处,再次执行一系列其他转换,然后在步骤3处,基于在步骤1处设置的域间栈帧尝试模间函数返回。不应允许此模间函数返回成功,因为对应的调用是域间调用而不是模间调用。检测到这是因为在步骤1处在域间函数调用时,函数返回栈帧中的HDT值178将设置为0,而对于步骤3处的模间函数返回,HDT值应为1,因此图15的步骤458处的完整性交叉检查将失败。
图16C示出了另一种潜在攻击,其中首先在步骤1处进行模间函数调用,该调用从处理程序模式进行特权解除到线程模式,然后在步骤2处进行一系列其他转换,之后在步骤3处尝试执行域间函数返回,以基于在步骤1处设置的模间函数返回栈帧从较低安全域转换到安全域。在图15的步骤446处,执行函数返回栈帧172中的HDT值178是否等于0的完整性检查,并且如果HDT值等于1,则可触发故障。因此,在图16C的场景找那个,其中进行了模间函数调用,尝试域间函数返回,然后HDT检查将检测不匹配,并确保在步骤1处创建的模间栈帧在步骤3处不能被解释为域间栈帧。需注意,步骤446和458处的HDT检查可被认为等效于虚拟函数返回地址中的模间标记M146与函数返回栈帧中的HDT标记178之间的比较,因为此比较中所识别的任何不匹配都会在模间返回(图16B)的情况下或在域间返回(图16C)的情况下触发故障。
仍参考图16C,代替在步骤3处执行域间返回(模间标记M=0),攻击者可能已尝试了模间函数返回(模间标记M=1)。虽然对应的函数调用实际上是模间调用,但它仍与尝试的模间函数返回不匹配,因为步骤3之前的当前模式是处理程序模式而不是线程模式。在这种情况下,虽然模间调用值146可能与步骤1中在模间调用时设置的函数返回栈帧内的HDT值178相匹配,但该攻击被阻止,因为在当前状态是处理程序模式时不允许模间函数返回,这将被图15的步骤458的完整性检查捕获,该步骤检查当前模式是否是线程模式。
图16D示出了另一示例,其中由于从安全域到较低安全域的域间分支指令而在步骤1处建立域间栈帧,并且随后在步骤2处进行一系列转换以返回到安全域,然后在步骤3处尝试使用在步骤1处由域间分支设置的栈帧来执行模间函数返回。这种类型的攻击将无法成功,因为函数返回栈帧172中的异常编号字段179将指示在步骤1处设置的栈帧被设置为线程模式,而不是模间函数返回将请求进入的处理程序模式。另选地,如果如步骤2'所示,尝试了域和模式从较低安全线程模式到安全处理程序模式的组合转换,则这将再次失败,因为在步骤450处,将阻止未经允许的组合转换。
应理解,一些检查可能重叠,并且相同类型的攻击可能触发多于一种类型的检查的失败。对于一些架构具体实施,如果这些检查中的一些检查被认为是冗余的,则它们可能会从架构要求中删除,并且因此,根据需要保护的重要内容,执行所有不同类型的攻击预防机制并不一定是必要的。然而,可提供这些检查中的任一个或多个检查。应理解,图16所示的攻击只是大量类似不匹配类型攻击的不同组合的一小部分,其中攻击者试图通过尝试与原始转换不匹配的返回操作(函数或异常返回)来破坏系统的状态,从而破坏创建的栈帧类型。
图12、图14和图15中的步骤307、406和442示出了分别针对函数调用分支、非函数调用分支和函数返回检查域转换禁用配置参数(TMID)34的特定示例。然而,在一些架构中,可能还有其他有效的手段,通过这些手段可以触发域之间的转换,并且图17示出了处理TMID值的检查的更一般方法。在步骤500处,检测在当前模式内执行安全到较低安全域转换或在当前模式内执行较低安全到安全域转换的可能尝试。该尝试可以是执行域转换的实际尝试,或者可以仅仅是在通过其他安全性或完整性检查的情况下,有时可能触发此类域转换的操作,但可能并不始终触发域转换,如果TMID检查执行得足够早,以至于无法检测到是否会允许域转换,或者是否会再次检查失败并引发故障。
在步骤502处,如果检测到触发域转换的可能尝试,则确定当前模式是否为线程模式。如果当前模式为线程模式,则在步骤504处,处理电路确定TMID值34是否指示在线程模式下禁用域转换。如果当前模式为线程模式并且在线程模式下禁用域转换,则在步骤506处,发信号通知禁用域转换故障(例如,上述INVTMI UsageFault)。在执行尝试的域转换之前,在当前安全域中处理该故障,因此如果尝试的域转换是从安全域到较低安全域,则在安全域中处理该故障,而如果尝试的域转换是从较低安全域到安全域,则在较低安全域中处理该故障。此外,任选地,可将一些校正子信息存储到控制寄存器,以指示关于尝试的转换发生故障的信息。在一些具体实施中,设置校正子信息可包括在UsageFault状态寄存器(UFSR)中设置INVTMI位。
如果在步骤502处确定当前模式为处理程序模式,或者在步骤504处检测到TMID值34指示在线程模式下启用域转换,则该方法前进至步骤508,在步骤508处,至少如果尝试的转换是从较低安全域到安全域,则检查是否已通过任何其他所需的安全检查,并且如果它们通过,则在步骤510处允许转换。如果不需要安全检查(例如,对于某些类型的安全到较低安全域转换可能不需要检查,因为可以信任安全代码不会攻击较低安全代码),则在步骤510处可允许转换,而不执行任何安全检查(即,对于此类转换,可省略步骤508)。另选地,如果安全检查失败,则在步骤512处,可触发故障,并且可在安全域中处理该故障,因为它与不允许进入或退出安全状态有关。在步骤512处触发的故障类型和设置的任何校正子可取决于失败的安全检查的类型。
虽然图17示出步骤502和504顺序地执行,但在一些示例中,它们也可以相反的顺序或并行地执行。
图18至图20示出了涉及TMID值34的用例的一些示例。图18基本上对应于图8的示例,其涉及模间调用,使得异常处理程序进行特权解除,从而该异常处理程序包括以线程模式处理的主体201。在该示例中,异常为不安全(也称为较低安全)异常,因此包括包装器203和主体201的异常处理程序处理均在较低安全域中。任何跨越安全/较低安全域边界的任何线程都可能需要建立安全资源和较低安全资源两者(诸如MPU配置和分配在存储器中的相关联栈结构的栈指针)。对于仅在一个域中操作的线程(诸如图18所示的T2),可能希望避免为另一个域分配资源,以避免浪费存储器和增加上下文切换时间。因此,优选地,系统可避免为所有线程分配额外资源的成本,而不管是否将使用额外资源。这种不为所有线程配置安全资源和较低安全资源两者的能力还可帮助改进需要进行特权解除回到图18所示的线程模式的中断的中断延迟,因为这将意味着包装器代码203不需要花很长时间来执行,因为其可省略配置安全MPU和较低安全MPU中的一者以及安全栈指针和较低安全栈指针中的一者。
处理此问题的一种方法可以是,可针对单个安全状态为线程分配栈和MPU配置(例如,图18中的线程2的示例中的较低安全域),然后,只有在该线程尝试切换到另一安全域时,才可为另一个域分配资源。然而,在无TMID参数34的情况下,强制执行此操作并生成触发延迟分配所需的故障的唯一方式是重新配置MPU 26,使得在尝试访问该进程无权访问的地址或MPU 26中未定义区域许可数据的地址时产生地址错误。这将是一个缺点,因为这将需要每线程而不是每进程来处理MPU配置,并且还将需要相当多的安全/较低安全交互,因为它将涉及用于这两个安全域的MPU 26-S、MPU 26-NS,从而消除了能够跳过用于安全域中的一个安全域的MPU配置操作的优点。例如,在运行安全线程之前,较低安全操作系统可能需要重新配置其较低安全MPU 26-NS,使得分支到较低安全状态的尝试引起故障。因此,使用MPU 26来产生故障可能是困难的并且是性能密集型的,并且对于提供安全和较低安全不安全操作系统代码的不同方来说,很难进行编码。另选地,如果预先知道哪些线程将仅使用一个安全域并且哪些线程将使用两个安全域,则可使用此信息来避免延迟分配,然而这不能依赖,因为软件可能崩溃且试图存取另一状态,或者攻击者可能会试图利用此漏洞进行攻击,因此,当仅为一个域建立资源时,可能仍然希望提供一种机制来检测到向另一个域的转换时发生故障。
相反,通过提供在线程模式下选择性地禁用域转换的TMID参数34,这意味着预期仅在较低安全域中的线程(如图18中的T2)最初可将其TMID参数34设置为禁用域转换,并且然后仅在其确实尝试切换域时才可产生故障,从而可配置适当的资源。
因此,图18示出了在进入特权解除异常处理程序主体201时禁用线程模式转换的示例(因为使用模间调用分支指令的BLXT变体来调用异常处理程序主体201)。在这种情况下,异常处理程序的主体201保持在较低安全域内,并且不尝试切换到安全域,因此在主体201稍后执行函数返回到包装器代码203时,在为线程T2的安全域配置MPU或栈资源时,没有浪费处理资源或存储器分配。因此,这提高了性能。当主体201的处理完成时,在步骤604处执行到模间虚拟函数返回地址140的分支。这触发返回到处理程序模式,并且在一些具体实施中,可导致控制寄存器32中的TMID标记34的指示在如图15的步骤462中所述被清除之前被保存(例如,保存到通用寄存器)。然后,程序流继续回到包装器203,其中包装器检查已保存的TMID标记34的指示,并确定在步骤604处的模间函数返回之前,TMID标记34为1。因此,包装器203确定与安全状态相关联的资源仍为后台线程T2配置,并且在执行异常返回以返回到T2的后台处理之前不需要重新配置这些资源。
图19示出了类似场景,但在这种情况下,在使用BLXT指令调用特权解除异常处理程序主体201并因此在处于线程模式时禁用域间转换之后,主体这次确实尝试切换到安全域,这会触发使用故障,如前所述。此故障导致异常,然后由处理程序代码608在处理程序模式下处理该异常,然后可请求为安全MPU 26-S和安全栈指针寄存器中的线程T2分配或配置资源,然后再返回到异常处理程序主体201,该异常处理程序主体然后可在图19的点600处重新尝试较低安全到安全域转换(为了清楚起见,图19中夸大了处理返回到较低安全T2的点与域间转换600之间的间隙,应理解,域间转换600实际上可在返回到T2之后的第一指令时发生)。在完成需要在安全域中的处理部分之后,可在点602处执行域间返回,然后后续处理与图18中相同。
图19示出了一种场景,其中当在图19的部分604处执行模间返回时,为了从特权解除异常处理程序主体201转换回包装器代码203时,存储指示,以指示在该模间返回之前,对于针对线程T2执行的线程模式下的较低安全处理,TMID值34是0还是1。这在模间返回时在清除TMID标记之前完成,以重新启用包装器代码203的域转换。如上面在图15的步骤462处所述,可将TMID 34在图19的步骤604之前是零还是一的指示保存到任何方便的位置,诸如控制寄存器、通用寄存器或条件代码中的一者。这很有用,因为一旦处理返回到较低安全包装器代码203以便在处理程序模式下处理,就允许在610处的后续代码将图18所示的情形与图19所示的情形区分开来。如在图18所示的场景中,在安全域中尚未进行处理,在安全域中后台代码的先前处理期间,任何安全栈指针和MPU配置仍可如先前在点606处设置的那样。相比之下,在图19中,在步骤601处尝试进入线程T2的安全域(其随后在步骤600处重试时成功)意味着在图19的点608处为线程T2配置MPU/栈资源将改变线程模式的相关MPU内容和栈指针寄存器。因此,在图18和图19的部分610处执行的剩余包装器代码203可能需要在将处理返回到线程T1的安全部分之前,确定是否有必要更新安全栈指针和安全MPU配置,以恢复在部分606处存在的信息。可使用在模间函数返回的步骤604之前TMID等于零还是等于一的指示来做出此决定。
在其他具体实施中,在保存模间返回之前在线程模式下禁用还是启用域转换的指示并不重要,在这种情况下,在图18和图19的步骤610处,包装器代码203可简单地始终执行用于恢复在步骤606处存在的安全资源的操作。然而,图19中所示的示例(其保存是否禁用线程模式中间状态的指示)可通过在不需要时避免冗余栈指针更新操作来提高性能。
为了比较,图20示出了另一种场景,其中当IRQ异常处理程序进行特权解除时,此时预期异常处理程序将使用安全域和较低安全域两者,并且因此在点620处执行的包装器代码203期间,执行为这两个域配置安全资源和较低安全资源的适当操作,并且使用模间函数调用分支的BLXTI变体而非图18和图19中的BLXT来调用将在线程模式下在特权解除状态下执行的异常处理程序的主体201。因此,这次在执行从处理程序模式到线程模式的模间函数调用时,TMID值34被设置为0,以指示在线程模式下启用了域转换,并且因此这次在步骤622处,当中断处理程序主体尝试转换到安全域时,这是允许的,并且不需要故障,如图19的示例中那样。同样,在模间函数返回64处保存TMID在模间返回之前为0的指示可由在626处执行的包装器代码203使用,以确定有必要将与线程T1相关联的安全侧栈指针或MPU配置恢复到中断发生之前它们在点628处的状态。在包装器代码的一些具体实施中,包装器代码203可能不会检查在图20的示例中在模间函数返回期间保存的TMID标记的指示,因为包装器在执行主体201之前执行两个域的配置,因此包装器将预先知道在返回到后台线程T1之前,需要恢复用于两个域的资源。尽管这可能看起来是比冗余地检查在模间函数返回期间保存的TMID的指示更简单的方法,但这可能意味着对于不同的异常处理程序在不同的包装器之间共享代码更困难。因此这两种方法都可能有用。
图21示出了更具体场景的另一示例,其中在尝试切换域时检查TMID值34可能很有用。这是图17中的通用方法的另一具体示例。可能出现域转换的另一种方式是,在较低安全域中,尝试从由SAU 24定义的安全地址区域中的一个安全地址区域中的地址提取指令。在步骤700处,指令提取电路8确定当前域是否为较低安全域以及是否已尝试提取地址在由SAU 24定义的安全地址区域中的一个安全地址区域中的指令。如果不是,则指令提取将继续正常进行。如果当前域为较低安全域,并且尝试从安全地址区域提取指令,则在步骤702处,检查当前模式是否为线程模式以及中间状态禁用标记(TMID 34)是否指示线程模式下的域转换被禁用,并且如果是,则在步骤704处,触发INVTMI UsageFault,以防止发生域转换。此故障在当前域(即,较低安全域)中处理。需注意,从安全地址区域提取的指令可能实际上并未触发域转换,但仍然会保守地产生故障,假设如果后续安全检查通过,则可能会出现转换。通过在提取级8处产生故障,这确保了与可能需要执行的其他类型的安全检查相比,相对较早地评估由禁用的域转换触发的UsageFault,使得这些其他安全检查不会仅仅因为尚未配置安全资源而失败。
另一方面,如果在步骤702处,在提取级8处确定当前模式为处理程序模式或TMID34指示启用线程模式域转换,则在步骤706处,允许继续进行指令提取。如果从安全地址区域提取的指令在解码级10处被识别为触发域改变的指令(例如,标记安全域的有效进入点的安全网关指令),则一旦该指令到达执行级12,就对其进行任何附加安全检查,并且如果这些检查通过,则允许转换到安全域。
因此,图21是其中TMID值34的检查不一定发生在执行级12而是可在指令提取时执行的示例。
图22示出了可使用的模拟器具体实施。虽然先前所述的实施方案在用于操作支持所涉及技术的特定处理硬件的装置和方法方面实现了本发明,但也可以提供根据本文所述的实施方案的指令执行环境,该指令执行环境是通过使用计算机程序来实现的。此类计算机程序通常被称为模拟器,在一定程度上是因为此类计算机程序提供硬件架构的基于软件的具体实施。模拟器计算机程序的种类包括仿真器、虚拟机、模型和二进制转换器,其包括动态二进制转换器。通常,模拟器具体实施可在支持模拟器程序810的主机处理器830上运行,任选地运行主机操作系统820。在一些布置中,在硬件和所提供的指令执行环境和/或在同一主机处理器上提供的多个不同指令执行环境之间可存在多个模拟层。在历史上,需要强大的处理器来提供以合理速度执行的模拟器具体实施,但这种方法在某些情况下可能是合理的,诸如当出于兼容性或重复使用原因而希望运行另一个处理器本地的代码时。例如,模拟器具体实施可向指令执行环境提供主机处理器硬件不支持的附加功能,或者提供通常与不同硬件架构相关联的指令执行环境。模拟概述在以下文献中给出:“Some EfficientArchitecture Simulation Techniques”,Robert Bedichek,Winter 1990USENIXConference,第53-63页。
就先前已参考特定硬件构造或特征描述了实施方案而言,在模拟的实施方案中,等效功能可由合适的软件构造或特征提供。例如,特定电路可在模拟的实施方案中被实现为计算机程序逻辑。类似地,存储器硬件诸如寄存器或高速缓存存储器可在模拟的实施方案中被实现为软件数据结构。在先前描述的实施方案中参考的硬件元件中的一个或多个硬件元件存在于主机硬件(例如,主机处理器830)上的布置中,在合适的情况下,一些模拟的实施方案可利用主机硬件。
模拟器程序810可存储在计算机可读存储介质(其可以是非暂态介质)上,并且向目标代码800(其可包括应用程序、操作系统和管理程序)提供程序接口(指令执行环境),该程序接口与由模拟器程序810建模的硬件架构的应用程序接口相同。因此,可使用模拟器程序810从指令执行环境内执行目标代码800的程序指令(包括上述模间调用分支指令),使得实际上不具有上述装置2的硬件特征的主机计算机830可仿真这些特征。
如图22所示,模拟器程序810包括指令解码程序逻辑811、处理程序逻辑812、异常控制程序逻辑813和存储器访问检查程序逻辑814,这些逻辑执行与上述指令解码器10、执行级12、异常控制电路28和存储器访问检查电路22等效的功能。指令解码程序逻辑811对目标代码800的指令进行解码,并且根据编码的指令类型,在处理程序逻辑812中选择多个程序代码序列中的一个程序代码序列,这些程序代码序列控制主机硬件830,以执行与在模拟指令集架构中针对目标代码800的解码指令定义的那些操作等效的操作。如果出现模拟异常,则异常控制程序逻辑813以类似于上述异常控制电路28的方式控制异常处理。模拟器程序810还包括寄存器仿真程序逻辑815,该寄存器仿真程序逻辑将目标代码800的指令所需的寄存器引用映射到对主机装置所使用的主机存储器地址空间的等效存储器访问,使得可在主机存储器地址空间中维护与模拟器程序所模拟的目标数据处理装置的寄存器14的内容相对应的数据结构。类似地,存储器访问程序逻辑817将使用来自模拟地址空间816的地址而定义的目标代码800所需的存储器访问和指令提取映射到主机数据处理硬件830所使用的主机存储器地址空间上。例如,存储器访问程序逻辑817可控制对栈数据结构818的访问,这些栈数据结构实际上存储在主机存储器地址空间中,但从目标代码800看来似乎存储在模拟地址空间816中。
因此,由寄存器仿真程序逻辑815仿真的控制寄存器可包括上述TMID标记34,并且处理程序逻辑812可基于TMID标记34来仿真是否允许线程模式下的域间转换。寄存器仿真程序逻辑815可包括配置参数设置程序逻辑819,该配置参数设置程序逻辑响应于诸如执行模间函数调用和返回、异常进入或返回或用于写入TMID标记34的其他指令等事件来设置TMID标记34。此外,指令解码程序逻辑811可响应模间调用分支指令,以将由处理程序逻辑812表示的模拟处理器的当前模式从处理程序模式切换到线程模式,如上所述。
在本申请中,字词“被配置为…”用于意指装置的元件具有能够执行所限定的操作的配置。在该上下文中,“配置”意指硬件或软件的互连的布置或方式。例如,该装置可具有提供所限定的操作的专用硬件,或者可对处理器或其他处理设备进行编程以执行该功能。“被配置为”并不意味着装置元件需要以任何方式改变以便提供所限定的操作。
虽然本文已结合附图详细描述了本发明的示例性实施方案,但应当理解,本发明并不限于那些精确的实施方案,并且在不脱离所附权利要求书所限定的本发明的范围和实质的前提下,本领域的技术人员可在其中实现各种变化和修改。
Claims (24)
1.一种装置,所述装置包括:
处理电路,所述处理电路用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;
异常控制电路,所述异常控制电路响应于异常条件,用于控制所述处理电路来切换到在所述处理程序模式下处理异常处理程序;和
指令解码器,所述指令解码器用于解码指令以控制所述处理电路来执行所述数据处理;其中:
至少当所述处理电路处于所述处理程序模式时,响应于指定分支目标地址的模间调用分支指令,所述指令解码器被配置为控制所述处理电路以:
将函数返回地址保存到函数返回地址存储位置;
将所述处理电路的当前模式切换到所述线程模式;以及
分支到所述分支目标地址所识别的指令。
2.根据权利要求1所述的装置,其中所述处理电路被配置为在至少包括安全域和较低安全域的多个安全域的一个安全域中执行所述数据处理;
所述装置包括存储器访问检查电路,所述存储器访问检查电路用于根据所述处理电路的当前安全域来检查是否允许存储器访问;以及
响应于指定分支目标地址的域间调用分支指令,所述指令解码器被配置为控制所述处理电路来将所述函数返回地址保存到所述函数返回地址存储位置,分支到所述分支目标地址所识别的指令并且切换所述处理电路的当前安全域。
3.根据权利要求2所述的装置,其中响应于所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来将所述处理电路的所述当前模式切换到所述线程模式,而无需改变所述处理电路的所述当前安全域。
4.根据权利要求2和3中任一项所述的装置,其中:
响应于模间函数返回指令,所述处理电路被配置为将所述处理电路的所述当前模式切换到所述处理程序模式;以及分支到所述函数返回地址所识别的指令;并且
响应于所述模间函数返回指令,所述处理电路能够执行从第一安全域和所述线程模式中的处理到第二安全域和所述处理程序模式中的处理的组合域/模式切换。
5.根据权利要求4所述的装置,其中,响应于所述模间函数返回指令,所述处理电路被配置为:
当所述第一安全域是所述安全域并且所述第二安全域是所述较低安全域时,允许所述组合域/模式切换;以及
当所述第一安全域是所述较低安全域并且所述第二安全域是所述安全域时,禁止所述组合域/模式切换。
6.根据任一前述权利要求所述的装置,其中响应于所述模间调用分支指令,所述指令解码器被配置为当所述处理电路的所述当前模式是所述线程模式时,触发故障的信令。
7.根据任一前述权利要求所述的装置,其中响应于函数返回指令,所述处理电路被配置为:
分支到所述函数返回地址所识别的指令;以及
当所述函数返回指令是模间函数返回指令时,还将所述处理电路的所述当前模式切换到所述处理程序模式。
8.根据权利要求7所述的装置,其中响应于所述模间返回分支指令,所述处理电路被配置为当所述处理电路的所述当前模式是所述处理程序模式时,触发故障的信令。
9.根据任一前述权利要求所述的装置,其中:
对于除所述模间调用分支指令以外的至少一个调用分支指令,所述函数返回地址存储位置包括链接寄存器;并且
对于所述模间调用分支指令,所述函数返回地址存储位置包括栈数据结构上的位置。
10.根据权利要求9所述的装置,其中响应于所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来将虚拟函数返回地址保存到所述链接寄存器,所述虚拟函数返回地址包括模间调用指示值以指示响应于所述模间调用分支指令而保存所述虚拟函数返回地址;以及
响应于所述虚拟函数返回地址包括所述模间调用指示值时尝试分支到所述虚拟函数返回地址的至少一种类型的指令,所述处理电路被配置为分支到从所述栈数据结构上的所述位置获得的所述函数返回地址所识别的指令,并且将所述处理电路的所述当前模式切换到所述处理程序模式。
11.根据权利要求10所述的装置,其中所述虚拟函数返回地址指示以下各项中的至少一者:
是否响应于尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令而请求从线程模式到处理程序模式的切换;
是否响应于尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令而请求所述处理电路的当前安全域的切换;以及
应使用多个栈数据结构中的哪一个栈数据结构作为所述栈数据结构,从所述栈数据结构中将响应于尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令而获得所述函数返回地址。
12.根据权利要求10所述的装置,其中所述虚拟函数返回地址的一部分指示是否响应于尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令而请求所述处理电路的所述当前安全域的切换;
响应于所述当前安全域是所述安全域时的安全网关指令,所述指令解码器被配置为将返回地址的一部分设置为指示较低安全状态的值;以及
返回地址的所述部分和所述虚拟函数返回地址的所述部分在所述相应的返回地址值内处于相同的相对位置处。
13.根据权利要求12所述的装置,其中所述虚拟函数返回地址的所述部分是最低有效位。
14.根据权利要求10至13中任一项所述的装置,其中:
响应于所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来将交叉检查值保存在保存到所述栈数据结构的栈帧中的第一相对位置的至少一部分中;并且
响应于尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令,所述处理电路被配置为执行用于编码所述模间调用指示值的所述虚拟函数返回地址的一部分与从所述栈数据结构获得的所述栈帧中的所述第一相对位置的所述至少一部分中的值的比较,并且基于所述比较来确定是否触发故障的信令。
15.根据权利要求14所述的装置,其中:
响应于除所述模间调用分支指令之外的至少一种类型的调用分支指令,所述指令解码器被配置为控制所述处理电路来将除所述交叉检查值之外的值保存在保存到所述栈数据结构的所述栈帧内的所述第一相对位置的所述至少一部分中。
16.根据权利要求10至15中任一项所述的装置,其中:
响应于所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来将指示所述处理程序模式的值保存在保存到所述栈数据结构的栈帧中的第二相对位置的至少一部分中;并且
响应于所述虚拟函数返回地址包括所述模间调用指示值时尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令,所述处理电路被配置为当所述栈帧中的所述第二相对位置的所述至少一部分中的值不指示所述处理程序模式时,触发故障的信令。
17.根据权利要求10至16中任一项所述的装置,其中响应于所述虚拟函数返回地址包括所述模间调用指示值时尝试分支到所述虚拟函数返回地址的所述至少一种类型的指令,所述处理电路被配置为:
在将所述处理电路的所述当前模式切换到所述处理程序模式之前,检查从所述栈数据结构获得的所述函数返回地址是否处于从中禁止指令执行的预定保留地址范围内,并且当所述函数返回地址处于所述预定保留地址范围内时,触发归因于在所述线程模式下执行的程序代码的故障的信令。
18.根据权利要求17所述的装置,其中:
对于所述模间调用分支指令,所述函数返回地址存储位置包括保存到栈数据结构的栈帧内的第三相对位置处的位置;并且
对于由异常条件触发的至少一种类型的异常转换,所述异常控制电路被配置为将栈帧存储到所述栈数据结构,包括存储在所述栈帧内的所述第三相对位置处的所述预定保留地址范围中的一个地址。
19.根据任一前述权利要求所述的装置,其中:
响应于所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来执行错误同步屏障操作,以将对与在所述错误同步屏障操作之前执行的数据处理相关联的错误的检测与对与在所述错误同步屏障操作之后执行的数据处理相关联的错误的检测隔离开。
20.根据权利要求7和8中任一项所述的装置,其中响应于所述模间函数返回指令,所述处理电路被配置为执行错误同步屏障操作,以将对与在所述错误同步屏障操作之前执行的数据处理相关联的错误的检测与对与在所述错误同步屏障操作之后执行的数据处理相关联的错误的检测隔离开。
21.根据任一前述权利要求所述的装置,所述处理电路被配置为在至少一个安全域中执行所述数据处理;
所述装置包括:
多个栈指针寄存器,所述多个栈指针寄存器至少包括每安全域的进程栈指针寄存器和每安全域的主栈指针寄存器;
选择电路,所述选择电路用于为每个安全域选择应使用所述栈指针寄存器中的哪一个栈指针寄存器来提供用于访问存储器中的栈数据结构的栈指针;以及
至少一个栈指针选择值存储位置,所述至少一个栈指针选择值存储位置用于存储每安全域的栈指针选择值;在所述处理程序模式下,所述选择电路被配置为选择所述主栈指针寄存器;
在所述线程模式下,所述选择电路被配置为基于所述栈指针选择值在所述进程栈指针寄存器与所述主栈指针寄存器之间进行选择;以及
响应于在所述至少一个安全域的当前安全域中执行的所述模间调用分支指令,所述指令解码器被配置为控制所述处理电路来设置所述当前安全域的所述栈指针选择值,以指示当处于所述线程模式时应选择所述进程栈指针寄存器。
22.一种用于装置的数据处理方法,所述装置包括:处理电路,所述处理电路用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;和异常控制电路,所述异常控制电路响应于异常条件,用于控制所述处理电路来切换到在所述处理程序模式下处理异常处理程序;
所述方法包括:
解码指定分支目标地址的模间调用分支指令;以及
至少当所述处理电路处于所述处理程序模式时,响应于所述模间调用分支指令:
将函数返回地址保存到函数返回地址存储位置;
将所述处理电路的当前模式切换到所述线程模式;以及
分支到所述分支目标地址所识别的指令。
23.一种计算机程序,所述计算机程序用于控制主机数据处理装置以提供用于执行来自目标程序代码的指令的指令执行环境;所述计算机程序包括:
处理程序逻辑,所述处理程序逻辑用于在至少包括处理程序模式和线程模式的多种模式中的一种模式下执行数据处理;
异常控制程序逻辑,所述异常控制程序逻辑响应于异常条件,用于控制所述处理程序逻辑来切换到在所述处理程序模式下处理异常处理程序;以及
指令解码程序逻辑,所述指令解码程序逻辑用于解码所述目标程序代码的指令,以控制所述处理程序逻辑来执行所述数据处理;其中:
至少当所述处理程序逻辑处于所述处理程序模式时,响应于指定分支目标地址的模间调用分支指令,所述指令解码程序逻辑被配置为控制所述处理程序逻辑以:
将函数返回地址保存到函数返回地址存储位置;
将所述处理程序逻辑的当前模式切换到所述线程模式;以及
分支到所述分支目标地址所识别的所述目标程序代码的指令。
24.一种计算机可读存储介质,所述计算机可读存储介质存储根据权利要求23所述的计算机程序。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB1918213.8 | 2019-12-11 | ||
GB1918213.8A GB2589895B (en) | 2019-12-11 | 2019-12-11 | Intermodal calling branch instruction |
PCT/GB2020/052797 WO2021116653A1 (en) | 2019-12-11 | 2020-11-05 | Intermodal calling branch instruction |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114902180A true CN114902180A (zh) | 2022-08-12 |
Family
ID=69172017
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080091449.7A Pending CN114902180A (zh) | 2019-12-11 | 2020-11-05 | 模间调用分支指令 |
Country Status (9)
Country | Link |
---|---|
US (1) | US12067400B2 (zh) |
EP (1) | EP4073635B1 (zh) |
JP (1) | JP2023511814A (zh) |
KR (1) | KR20220108175A (zh) |
CN (1) | CN114902180A (zh) |
GB (1) | GB2589895B (zh) |
IL (1) | IL293194A (zh) |
TW (1) | TW202143030A (zh) |
WO (1) | WO2021116653A1 (zh) |
Family Cites Families (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5701493A (en) * | 1995-08-03 | 1997-12-23 | Advanced Risc Machines Limited | Exception handling method and apparatus in data processing systems |
EP1410174A2 (en) * | 2001-04-23 | 2004-04-21 | Atmel Corporation | Microprocessor for executing byte compiled java code |
US20030126520A1 (en) * | 2001-12-31 | 2003-07-03 | Globespanvirata | System and method for separating exception vectors in a multiprocessor data processing system |
US7117284B2 (en) | 2002-11-18 | 2006-10-03 | Arm Limited | Vectored interrupt control within a system having a secure domain and a non-secure domain |
WO2004046924A1 (en) * | 2002-11-18 | 2004-06-03 | Arm Limited | Processor switching between secure and non-secure modes |
WO2004046925A1 (en) | 2002-11-18 | 2004-06-03 | Arm Limited | Security mode switching via an exception vector |
DE60306952T2 (de) * | 2002-11-18 | 2007-02-08 | Arm Ltd., Cherry Hinton | Zuordnung von virtuellen zu physischen speicheradressen in einem system mit einem sicheren bereich und einem nicht sicheren bereich |
EP1447742A1 (en) * | 2003-02-11 | 2004-08-18 | STMicroelectronics S.r.l. | Method and apparatus for translating instructions of an ARM-type processor into instructions for a LX-type processor |
GB2483907A (en) | 2010-09-24 | 2012-03-28 | Advanced Risc Mach Ltd | Privilege level switching for data processing circuitry when in a debug mode |
US9116711B2 (en) | 2012-02-08 | 2015-08-25 | Arm Limited | Exception handling in a data processing apparatus having a secure domain and a less secure domain |
US9477834B2 (en) * | 2012-02-08 | 2016-10-25 | Arm Limited | Maintaining secure data isolated from non-secure access when switching between domains |
GB2501343A (en) | 2012-02-08 | 2013-10-23 | Advanced Risc Mach Ltd | Data processing apparatus and method using secure domain and less secure domain |
GB201217531D0 (en) | 2012-10-01 | 2012-11-14 | Advanced Risc Mach Ltd | ARMv7-M Asset Protection Proposal |
US9213828B2 (en) * | 2012-02-08 | 2015-12-15 | Arm Limited | Data processing apparatus and method for protecting secure data and program code from non-secure access when switching between secure and less secure domains |
US10210349B2 (en) * | 2012-02-08 | 2019-02-19 | Arm Limited | Data processing apparatus and method using secure domain and less secure domain |
US9202071B2 (en) * | 2012-02-08 | 2015-12-01 | Arm Limited | Exception handling in a data processing apparatus having a secure domain and a less secure domain |
GB2515047B (en) * | 2013-06-12 | 2021-02-10 | Advanced Risc Mach Ltd | Security protection of software libraries in a data processing apparatus |
GB2522906B (en) * | 2014-02-10 | 2021-07-14 | Advanced Risc Mach Ltd | Region identifying operation for identifying a region of a memory attribute unit corresponding to a target memory address |
US9390260B2 (en) | 2014-06-09 | 2016-07-12 | Lehigh University | Methods for enforcing control flow of a computer program |
US10095519B2 (en) | 2015-09-19 | 2018-10-09 | Microsoft Technology Licensing, Llc | Instruction block address register |
GB2563884B (en) | 2017-06-28 | 2020-01-08 | Advanced Risc Mach Ltd | Exception return instruction |
US11055401B2 (en) * | 2017-09-29 | 2021-07-06 | Intel Corporation | Technologies for untrusted code execution with processor sandbox support |
US11171983B2 (en) * | 2018-06-29 | 2021-11-09 | Intel Corporation | Techniques to provide function-level isolation with capability-based security |
GB2577878B (en) * | 2018-10-08 | 2020-11-11 | Advanced Risc Mach Ltd | Transition disable indicator |
GB2578135B (en) * | 2018-10-18 | 2020-10-21 | Advanced Risc Mach Ltd | Range checking instruction |
US11520493B2 (en) * | 2019-07-23 | 2022-12-06 | Arm Technology (China) Co. LTD | Allocation policy for shared resource accessible in both secure and less secure domains |
GB2589896B (en) * | 2019-12-11 | 2022-07-27 | Advanced Risc Mach Ltd | An apparatus and method for handling exceptions |
GB2589897B (en) * | 2019-12-11 | 2022-03-23 | Advanced Risc Mach Ltd | Domain transition disable configuration parameter |
-
2019
- 2019-12-11 GB GB1918213.8A patent/GB2589895B/en active Active
-
2020
- 2020-11-05 CN CN202080091449.7A patent/CN114902180A/zh active Pending
- 2020-11-05 US US17/757,197 patent/US12067400B2/en active Active
- 2020-11-05 KR KR1020227023737A patent/KR20220108175A/ko active Search and Examination
- 2020-11-05 JP JP2022532803A patent/JP2023511814A/ja active Pending
- 2020-11-05 IL IL293194A patent/IL293194A/en unknown
- 2020-11-05 EP EP20804635.9A patent/EP4073635B1/en active Active
- 2020-11-05 WO PCT/GB2020/052797 patent/WO2021116653A1/en unknown
- 2020-11-17 TW TW109140066A patent/TW202143030A/zh unknown
Also Published As
Publication number | Publication date |
---|---|
TW202143030A (zh) | 2021-11-16 |
IL293194A (en) | 2022-07-01 |
US12067400B2 (en) | 2024-08-20 |
KR20220108175A (ko) | 2022-08-02 |
US20230010863A1 (en) | 2023-01-12 |
JP2023511814A (ja) | 2023-03-23 |
GB2589895A (en) | 2021-06-16 |
GB201918213D0 (en) | 2020-01-22 |
WO2021116653A1 (en) | 2021-06-17 |
GB2589895B (en) | 2022-03-16 |
EP4073635A1 (en) | 2022-10-19 |
EP4073635B1 (en) | 2024-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7594111B2 (en) | Secure execution of a computer program | |
US7603704B2 (en) | Secure execution of a computer program using a code cache | |
CN114902178A (zh) | 域转换禁用配置参数 | |
TWI811456B (zh) | 用於驗證堆疊指標的設備、方法、電腦程式及電腦可讀取儲存媒體 | |
KR20160019454A (ko) | 데이터 처리장치에서의 소프트웨어 라이브러리들의 보안 보호 | |
CN110709817B (zh) | 用于控制指令集中改变的设备与方法 | |
US11307856B2 (en) | Branch target variant of branch-with-link instruction | |
CN114902180A (zh) | 模间调用分支指令 | |
CN112805710B (zh) | 数据处理装置和方法 | |
US11989425B2 (en) | Apparatus and method for controlling access to a set of memory mapped control registers | |
TW202418067A (zh) | 堆疊指標切換有效性檢查 | |
TW202409842A (zh) | 例外返回狀態鎖定參數 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |