在开发UEFI过程中,会经常遇到开发调试问题、开发技巧等。
我开一篇UEFI相关的持续更新的博客记录一下,如果有你刚好遇到的UEFI问题 那就更好了。
- UEFI中添加.S汇编文件
这个只需要在.inf文件中添加如下代码即可
[Sources.AARCH64]
sha256-armv8.S
[Sources.ARM]
sha256-armv8.S
假设你想在UEFI代码中调中.S中的代码,比如我这里想要调用sha256_block_data_order函数,extern一下,然后就可以调用了。
extern void sha256_block_data_order(uint32_t state[8], const uint8_t *data,
size_t num_blocks);
- 在UEFI中编译遇到两个.h头文件重复定义 问题解决
比如一个.c中引用了两个不同的.h头文件,但是两个.h头文件中又都typedef了相同的内容,编译会报错。
我的解决办法是添加一个SIZET_宏,在两个typedef的地方都加上这个宏的判断,这样就不会编译报错了。
#ifndef SIZET_
typedef unsigned long size_t;
#define SIZET_
#endif
- UEFI中增加静态库.a文件
如果想在模块中引用ARM64构架的libxxx.a文件,可以在.inf配置文件中添加如下code
[BuildOptions.AARCH64]
GCC:*_*_AARCH64_CC_FLAGS = $(PLATFORM_EXTRA_FLAGS)
GCC:*_*_AARCH64_DLINK2_FLAGS = $(WORKSPACE)/yourpath/libxxx.a
- UEFI中如何通过SMC指令与ATF交互数据
发送数据给ATF,我这里带了四个参数。
ARM_SMC_ARGS ArmSmcArgs;
ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));
ArmSmcArgs.Arg0 = yourcode; //指定一个ATF中唯一的识别码即可
ArmSmcArgs.Arg1 = 1;
ArmSmcArgs.Arg2 = 2;
ArmSmcArgs.Arg3 = 3;
ArmSmcArgs.Arg4 = 4;
ArmCallSmc (&ArmSmcArgs);
接收从ATF中返回的数据,ArmSmcArgs.Arg0、ArmSmcArgs.Arg1、ArmSmcArgs.Arg2、ArmSmcArgs.Arg3是分别返回的参数值。
ARM_SMC_ARGS ArmSmcArgs;
ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));
ArmSmcArgs.Arg0 = yourcode; //ATF中定义的唯一识别码
ArmCallSmc (&ArmSmcArgs);
持续更新中。。。