EFI_SUCCESS là gì?
Quicknote EFI_SUCCESS là gì?
EFI_SUCCESS báo rằng API hoặc operation đã hoàn thành thành công. Nhưng trong firmware, EFI_SUCCESS chỉ trả lời câu hỏi: hàm có chạy xong không? Nó không tự trả lời câu hỏi: kết quả có đúng thứ mình cần không?
Ví dụ LocateProtocol() trả EFI_SUCCESS nghĩa là tìm được protocol. Nhưng protocol đó có đang quản lý đúng controller không, device path có đúng không, dữ liệu đọc ra có hợp lệ không - đó là phần bạn vẫn phải kiểm chứng.
Ví dụ thực tế: success nhưng data sai
Status = gRT->GetVariable (
L"BootOrder",
&gEfiGlobalVariableGuid,
&Attributes,
&Size,
BootOrder
);
if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "BootOrder size = %u\n", Size));
}
EFI_SUCCESS ở đây chỉ nói rằng biến BootOrder được đọc thành công. Nhưng bạn vẫn cần kiểm tra:
Sizecó chia hết chosizeof(UINT16)không?- mỗi entry
0000,0001,0002cóBoot####tương ứng không? Boot####đó có device path còn hợp lệ không?
GetVariable thành công
Firmware đọc được BootOrder từ NVRAM.
Kiểm tra layout
Size, attribute và số entry có hợp lệ không?
Tham chiếu Boot####
Mỗi số trong BootOrder phải trỏ tới một boot option tồn tại.
Load image
Device path và file EFI vẫn có thể fail ở bước sau.
Debug Diary: vì sao success vẫn cần log?
Trong một case boot fail, nếu chỉ log lỗi cuối cùng, bạn có thể thấy:
LoadImage() = EFI_NOT_FOUND
Nhưng nếu log cả các bước success trước đó:
GetVariable(BootOrder) = EFI_SUCCESS, Size=6
GetVariable(Boot0001) = EFI_SUCCESS, Size=142
DevicePathToText = PciRoot(...)/HD(...)/File(\EFI\ubuntu\shimx64.efi)
LoadImage(Boot0001) = EFI_NOT_FOUND
Lúc này kết luận rõ hơn: NVRAM đọc được, boot option tồn tại, nhưng file trong device path không load được.
| Mục | Giá trị | Ghi chú |
|---|---|---|
| EFI_SUCCESS + output hợp lệ | Flow tốt | Có thể chuyển sang bước tiếp theo. |
| EFI_SUCCESS + size lạ | Data có vấn đề | Cần kiểm tra layout hoặc version. |
| EFI_SUCCESS + handle sai | Match nhầm object | Hay gặp khi enumerate nhiều controller/protocol. |
| EFI_SUCCESS + bước sau fail | Lỗi nằm ở tầng sau | Ví dụ đọc Boot#### được nhưng LoadImage fail. |
Firmware Engineer Notes
Khi viết log firmware, đừng chỉ log lỗi. Hãy log một vài success quan trọng để tạo mốc timeline. Một mốc EFI_SUCCESS đúng chỗ giúp bạn loại bỏ cả một vùng nghi ngờ.
Sau khi API trả EFI_SUCCESS, nên kiểm tra gì?
Bài liên quan
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.