看完了ATF源代码,现在正在将代码移植到开发板上,配置了SCR_EL3=0x830(安全,AARCH32), SPSR_EL3=0x1d3(svc_mode,AARCH32,ARM指令集),ELR_EL3=0x40200000(BL32入口点地址),成功从BL31进入BL32初始化完成,返回BL31配置SCR_EL3=0x35(非安全),SPSR_EL3=0x1d3(svc_mode,AARCH32,ARM指令集),ELR_EL3=0x42000000(BL33入口点地址)却无法进入BL33,请问为什么?是虚拟化层EL2影响的吗?ps:源代码是默认执行AARCH64模式的BL33,但我的UBOOT是32位的,我修改了上诉寄存器期望进入32位的UBOOT执行,但失败了
>> “正常启动下面BL33/uboot其实运行在EL2里面,到kernel里面也是, stext(arch/arm64/kernel/head.S),然后再切换到NS EL1。”
> UBOOT再64位模式下运行在EL2,linux内核再切换到NS EL1
> UBOOT再32位模式下以svc权限运行,可以以hyp模式运行吗?
这样做有什么意义? 假如你不跑hypervisor的话
>> "三星方案中应该只用了EL3 monitor, 也就是BL31吧?"
> 读取read_id_aa64pfr0_el1()==0x01002222,应该是EL0 EL1 EL2 EL3都支持的
我的意思是缺省的ATF里面的Images, 该SOC厂商只采用BL31,其它的,比如 BL1和BL2没有采用ATF的实现。
>“你有对比测试吗? 比如什么都不修改,直接进入UBOOT 缺省AArch64, 这样OK吗?”
> UBOOT的AARCH64 AARCH32都试过了,不行
这说明不是这几个registers配置的问题。
你采用三星原来板子带的ATF firmware可以跑起来吗? 他们有没有开放他们芯片对应的ATF的代码? 也许他们的硬件配置和缺省的不一样。 我没有在ATF代码里面看到三星的实现。
“你采用三星原来板子带的ATF firmware可以跑起来吗? 他们有没有开放他们芯片对应的ATF的代码? 也许他们的硬件配置和缺省的不一样。 我没有在ATF代码里面看到三星的实现。”
他们没有开放他们芯片对应的ATF代码,应该说根本就没有,正是由于ATF代码中没有三星的实现,所以我正在做啊,BL1 BL2 BL31 BL32都起来了,就差最后一步进入BL33了,不容易啊
谢谢你的回答,要是我这个问题解决了会通知你的
你的目的是为了做什么? 一定要三星这个chip上跑ATF吗?
Linaro推出96boards,其中华为海思的HiKey Board,有对应的代码 HiKeyGettingStarted · 96boards/documentation Wiki · GitHub
当然ATF对ARM Juno板是原生支持。
有些好奇,ATF 在github上的代码不包括Samsung芯片的支持,整个移植都是你自己做的吗? 还是三星有提供代码。
你这个问题感觉和memory的配置有关, 但是你的调试手段有限。 尝试把SCR_EL3.EA bit使能,这样让exception都路由到EL3的exception handler,然后你在EL3 handler里面加打印,看看能否有一些错误信息。
"整个移植都是你自己做的吗? "
自己做的,他们只提供芯片手册
“ 尝试把SCR_EL3.EA bit使能,这样让exception都路由到EL3的exception handler,然后你在EL3 handler里面加打印,看看能否有一些错误信息。”
这是个好方法!
“你这个问题感觉和memory的配置有关”
问题找到了,不是内存配置的问题,是安全外设的问题,没有配置TZPC寄存器,串口默认为安全的,在安全世界正常打印出数据,进入到BL33非安全世界就打印不了了,实际上是进入了BL33的,将串口配置成非安全的就行了
非常感谢你的回答