MPIDR_EL1(Multiprocessor Affinity Register)是armv8 结构体系中的一个64-bit系统寄存器,为cluster中的调度目标提供了一个识别机制,该寄存器的域段结构如下:
在搭建完成验证平台运行冒烟软件用例,main函数代码如下:
void main(void){
uint64 cpu_mpidr = 0;
cpu_mpidr = get_mpidr();
printf("mpidr = %lx",cpu_mpidr );
}
get_mpidr()是通过汇编实现,代码如下:
.type get_mpidr,%function
get_mpidr:
mrs x0,mpidr_el1
ret
仿真完成后,通过log查看打印结果,mpidr只打印出了低32-bit,高32-bit未打印出来,起初怀疑是高位aff3没有赋值成功,但是从波形信号看是有值的;再分析编译后的文件,在获取到get_mpidr的值后赋值的过程中,将返回值处理为了32-bit,高32-bit丢失。
最后发现是由于在定义get_mpidr()时,将返回值设置为了32-bit,导致高32-bit丢失
extern uint32 get_mpidr();
将此处修改为64-bit返回值后,重新编译,可以看到返回值是通过64-bit寄存器将结果返回并赋值,通过仿真也可以将64-bit结果正常打印出来