EFI_SUCCESS là gì?

Quicknote EFI_SUCCESS là gì?

3 phút đọc
Đọc bằng Tiếng Việt English 日本語
Debug / Shell / Driver Terms cover

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:

  • Size có chia hết cho sizeof(UINT16) không?
  • mỗi entry 0000, 0001, 0002Boot#### tương ứng không?
  • Boot#### đó có device path còn hợp lệ không?
01 OK

GetVariable thành công

Firmware đọc được BootOrder từ NVRAM.

02 CHECK

Kiểm tra layout

Size, attribute và số entry có hợp lệ không?

03 LINK

Tham chiếu Boot####

Mỗi số trong BootOrder phải trỏ tới một boot option tồn tại.

04 LOAD

Load image

Device path và file EFI vẫn có thể fail ở bước sau.

Success không đồng nghĩa với đúng logic boot.

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.