EFI_STATUS là gì?

Quicknote EFI_STATUS là gì?

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

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.

01 CALL

Gọi UEFI service

Ví dụ GetVariable, LocateProtocol, OpenProtocol hoặc StartImage.

02 STATUS

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.

03 BRANCH

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ệ.

04 DEBUG

Khoanh vùng lỗi

Log đúng status giúp biết lỗi nằm ở input, dependency, tài nguyên hay policy.

Một status nhỏ thường quyết định cả hướng debug tiếp theo.

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:

  1. Firmware đã đọc được BootOrder.
  2. Firmware thử boot option tương ứng.
  3. 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

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.