QEMU ARM64 Uboot
以virt machine 为例,
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make qemu_arm64_defconfig
make -j16
make CROSS_COMPILE=aarch64-linux-gnu- -j2
QEMU启动
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 2 \
-m 2048M \
-kernel u-boot \
-nographic
qemu-system-aarch64: unable to find CPU model 'cortex-a72'
qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 2 -m 2048M -kernel u-boot -nographic
qemu-system-aarch64 -M virt -cpu cortex-a53 -m 2048M -kernel u-boot -nographic
qemu quit:
ctrl+A -> wait a moment ->+X
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* relocate - common relocation function for AArch64 U-Boot
*
* (C) Copyright 2013
* Albert ARIBAUD <albert.u.boot@aribaud.net>
* David Feng <fenghua@phytium.com.cn>
*/
#include <asm-offsets.h>
#include <config.h>
#include <elf.h>
#include <linux/linkage.h>
#include <asm/macro.h>
//ARM64 有34个寄存器,包括31个通用寄存器,SP,PC,CPSR.
//x0-x30 64bit 通用寄存器,如果有需要可以当做32bit使用:W0-W30.
//其中x0 - x7:这 8 个寄存器主要用来存储传递参数.如果参数超过 8 个,
//则会通过栈来传递; x0 也用来存放上文方法的返回值.
//FP(x29) 64bit 保存栈帧地址(栈底指针),指向当前方法栈的底部。
//LR(x30) 64bit 通常称x30为程序链接寄存器,因为这个寄存器会记录着当前方法的调用方地址 ,
//即当前方法调用完成时应该返回的位置。例如我们遇到 Crash 要获取方法堆栈,
//其本质就是不断的向上递归每一个 x30 寄存器的记录状态(也就是栈上 X30 寄存器的内容)
//来找到上层调用方。
//SP 64bit 保存栈指针,使用 SP/WSP来进行对SP寄存器的访