博文

目前显示的是 五月, 2018的博文

ARM64和ARM32的混合关系

要在同一个异常级别下更改执行状态,系统必须切换到较高的异常级别,改完之后在返回到原先的异常级别。 例如,您可能会在64位操作系统下运行32位和64位应用程序。 在这种情况下,32位应用程序可以执行和生成监督调用(SVC)指令,或者通过接收中断,以此切换到EL1和AArch64。 之后OS进行任务切换并返回到EL0中的AArch64。 实际上,这意味着你不能拥有一个混合32位和64位的应用程序,因为它们之间没有直接的调用方式。 在AArch64和AArch32执行状态之间切换的要点可以总结如下: 更改为AArch32需要从较高的异常级别出发到更低的级别。 这是通过执行ERET退出异常处理程序的结果。 更改为AArch64需要从较低的异常级别出发到更高的级别。 异常可能是一条指令执行或一个外部信号的结果。 如果在发生异常或从异常返回时异常级别保持不变,则执行状态也不能改变。 AArch64和AArch32执行状态都具有类似的异常级别,但是安全和非安全操作之间存在一些差异。 当发生异常时,处理器所处的执行状态会限制能用于其他执行状态的异常级别。 如果ARMv8-A处理器在特定的异常级别以AArch32执行状态运行,它使用与ARMv7-A中相同的异常模型来处理发送到该异常级别的异常。 EL3中的代码不能在更高的异常级别中使用异常,因此除了执行复位之外,不能更改执行状态。 Arm64位上可以同时运行32位和64位。32位和64位的切换只能通过更高的EL来进行。例如,我们有一个64位的os运行在nsec的EL1,这个os上可以同时跑32位应用程序和64位应用程序,那么这两个应用程序之间的切换必须由运行在EL1的os完成,这也就意味着一个单独的程序不可能混合32位和64位。

TableGen添加指令

修改.td文件,实现指令定义 记得再上面加一个 let hasNoSchedulingInfo = 1 in

使__attribute__((annotate("xxx")))能作用于OC函数

diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp  --- orig/llvm-3.7.0.src/tools /clang/lib/CodeGen/CGBlocks.cpp    2015-06-23 01:07:51.000000000 +0200  +++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-11-13 13:05:44.000000000 +0100  @@ -1157,6 +1157,10 @@         fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());     CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);  +  // Emit annotation attributes for ObjC blocks.  +  if (blockDecl->hasAttr<AnnotateAttr>())  +    CGM.AddGlobalAnnotations(blockDecl, fn);  +     // Begin generating the function.     StartFunction(blockDecl, fnType->getReturnType(), fn, fnInfo, args,                   blockDecl->getLocation(),  diff -Nau...