UEFI应用定时器回调仅在AMI BIOS中挂死问题排查求助
UEFI定时器回调在X64实体机AMI BIOS中挂死问题
问题概述
将UEFI应用从AARCH64移植到X64平台时,出现周期性定时器启用后应用挂死的异常:定时器回调执行完毕后,后续代码完全停止运行。调试未发现代码逻辑错误,提供的极简HelloWorld示例在AARCH64设备、X64 QEMU中运行正常,但在多款搭载AMI BIOS的X64实体机(技嘉AM2、微星LGA1200、华硕LGA1700主板)中均触发挂死。
复现环境
- 编译环境:Ubuntu 20 + GCC 9.4.0,严格遵循EDK2规范编译
- 运行环境:
- 异常环境:技嘉AM2、微星LGA1200、华硕LGA1700主板的AMI BIOS
- 正常环境:AARCH64设备、X64 QEMU
- 编译优化:EDK2默认优化为
-Os,需较复杂代码才能触发问题,因此示例中函数显式指定-O0优化
现象细节
- 示例仅在定时器回调中修改两个静态数组的单个字节,首次回调执行后应用立即挂死
- 预期行为:持续输出
Hello World、timer begin、timer end - 实际表现:仅输出少量
Hello World及一次回调日志后,程序完全停止响应 - 规避现象:移除部分代码(如仅使用一个数组、将函数改为内联)后,挂死问题不再出现
完整示例代码
#include <Library/UefiApplicationEntryPoint.h> #include <Library/UefiLib.h> #include <Library/DebugLib.h> #include <Library/UefiBootServicesTableLib.h> static volatile UINT8 test_buf1[200]; static volatile UINT8 test_buf2[200]; void* timer; __attribute((optimize("O0"))) void assign(volatile UINT8* ptr, int ind) { ptr[ind] = 10; } __attribute((optimize("O0"))) void test_func(void) { assign(test_buf1, 0); assign(test_buf2, 0); } __attribute((optimize("O0"))) void test_interrupt(EFI_EVENT Event, VOID *Context) { DEBUG ((EFI_D_ERROR, "timer begin\r\n")); test_func(); DEBUG ((EFI_D_ERROR, "timer end\r\n")); } EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; Print(L"Hello World\n"); Status = gBS->CreateEvent( EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_NOTIFY)test_interrupt, NULL, &timer); if (EFI_ERROR(Status)) { return -1; } Status = gBS->SetTimer( timer, TimerPeriodic, EFI_TIMER_PERIOD_MILLISECONDS (16)); if (EFI_ERROR(Status)) { return -1; } while(1) Print(L"Hello World\n"); return EFI_SUCCESS; }
疑问
请问该问题是现代AMI BIOS存在严重缺陷,还是代码本身存在未被发现的问题?
内容的提问来源于stack exchange,提问作者user2779778
相关产品推荐
相关产品推荐

