EFI_STATUS là gì?
Quicknote EFI_STATUS là gì?
Khi debug firmware, EFI_STATUS giống như dấu vết đầu tiên trên hiện trường. Nó không chỉ nói “hàm thành công hay thất bại”, mà còn cho biết firmware đang kẹt ở lớp nào: input sai, protocol chưa xuất hiện, buffer thiếu, security policy chặn, hay tài nguyên hệ thống đã hết.
Trong UEFI/EDK2, rất nhiều API trả về EFI_STATUS: Boot Services, Runtime Services, Driver Binding, protocol method, library function. Nếu bỏ qua status, code có thể chạy tiếp với output rác và lỗi thật sẽ xuất hiện ở một nơi rất xa.
Gọi UEFI service
Ví dụ GetVariable, LocateProtocol, OpenProtocol hoặc StartImage.
Nhận EFI_STATUS
Không chỉ nhìn pass/fail, mà phải hiểu status này có bình thường trong flow hay không.
Chọn nhánh xử lý
Retry, allocate lại, fallback, return lỗi hoặc bỏ qua nếu đó là trạng thái hợp lệ.
Khoanh vùng lỗi
Log đúng status giúp biết lỗi nằm ở input, dependency, tài nguyên hay policy.
Cách đọc EFI_STATUS trong log
Ví dụ log:
[Bds] LocateProtocol(gEfiSimpleFileSystemProtocolGuid) = EFI_NOT_FOUND
[Bds] GetVariable(BootOrder) = EFI_SUCCESS, Size = 6
[Bds] LoadImage(Boot0001) = EFI_SECURITY_VIOLATION
Đừng đọc từng dòng như thông báo rời rạc. Hãy đọc theo chuỗi nguyên nhân:
- Firmware đã đọc được
BootOrder. - Firmware thử boot option tương ứng.
- Khi load image thì bị security policy chặn.
Như vậy vấn đề không nằm ở NVRAM, mà có thể nằm ở Secure Boot, image signature hoặc chain of trust.
| Mục | Giá trị | Ghi chú |
|---|---|---|
| EFI_SUCCESS | Thành công | Vẫn cần kiểm tra output có đúng kỳ vọng không. |
| EFI_NOT_FOUND | Không tìm thấy | Hay gặp khi protocol, variable, file hoặc boot option chưa tồn tại. |
| EFI_BUFFER_TOO_SMALL | Buffer thiếu | Thường là flow bình thường để hỏi size trước. |
| EFI_INVALID_PARAMETER | Tham số sai | Nên kiểm tra NULL pointer, size, attribute, alignment. |
| EFI_SECURITY_VIOLATION | Bị policy chặn | Liên quan Secure Boot, SMM lock, flash protection hoặc quyền truy cập. |
Pattern xử lý lỗi chuẩn
EFI_STATUS Status;
Status = gBS->LocateProtocol (
&gEfiSimpleFileSystemProtocolGuid,
NULL,
(VOID **)&SimpleFs
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Locate SimpleFs failed: %r\n", Status));
return Status;
}
Điểm quan trọng: log nên có API, đối tượng đang xử lý, và status. Log kiểu failed không đủ để debug.
Firmware Engineer Notes
Trong firmware, status không phải lúc nào cũng là lỗi nghiêm trọng. EFI_NOT_FOUND trong vòng enumerate protocol có thể bình thường. EFI_BUFFER_TOO_SMALL khi gọi GetVariable() lần đầu cũng bình thường. Ngược lại, EFI_SUCCESS không có nghĩa output chắc chắn đúng. Status chỉ là điểm bắt đầu, không phải kết luận cuối cùng.
Checklist khi thấy EFI_STATUS lạ
Bài liên quan
- EFI_ERROR là gì?
- EFI_SUCCESS là gì?
- EFI_NOT_FOUND là gì?
- BootOrder là gì?
- Protocol trong UEFI là gì?
Nguồn tham khảo public
Thấy nội dung này hữu ích?
Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.