EFI_BUFFER_TOO_SMALL là gì?

Quicknote EFI_BUFFER_TOO_SMALL là gì?

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

EFI_BUFFER_TOO_SMALL thường xuất hiện khi caller đưa buffer quá nhỏ cho API. Nhưng trong UEFI, status này không luôn luôn là lỗi. Rất nhiều API cố tình dùng nó như một cơ chế hỏi trước kích thước dữ liệu.

Ví dụ điển hình là GetVariable(): gọi lần đầu để lấy Size, allocate buffer, rồi gọi lại để đọc dữ liệu thật.

1

Gọi lần đầu

Data = NULL hoặc buffer nhỏ để hỏi required size.

2

Nhận EFI_BUFFER_TOO_SMALL

API trả về size cần thiết qua biến Size.

3

Allocate buffer

Caller cấp phát đúng số byte cần thiết.

4

Gọi lại

API đọc dữ liệu thật và thường trả EFI_SUCCESS.

Ví dụ code đọc BootOrder

UINTN      Size;
UINT16     *BootOrder;
EFI_STATUS Status;
UINT32     Attributes;

Size = 0;
Status = gRT->GetVariable (
                L"BootOrder",
                &gEfiGlobalVariableGuid,
                &Attributes,
                &Size,
                NULL
                );

if (Status == EFI_BUFFER_TOO_SMALL) {
  BootOrder = AllocateZeroPool (Size);
  Status = gRT->GetVariable (
                  L"BootOrder",
                  &gEfiGlobalVariableGuid,
                  &Attributes,
                  &Size,
                  BootOrder
                  );
}

Debug Diary

Một bug rất dễ gặp là xử lý EFI_BUFFER_TOO_SMALL như lỗi fatal:

GetVariable(BootOrder) = EFI_BUFFER_TOO_SMALL
Return error
BDS không enumerate Boot####

Trong trường hợp này, lỗi không nằm ở NVRAM. Lỗi nằm ở code caller không hiểu pattern hai lần gọi.

Mục Giá trị Ghi chú
GetVariable Rất hay gặp Dùng để hỏi size variable trước.
LocateHandleBuffer Ít cần tự xử lý hơn EDK2 helper thường allocate giúp.
Protocol method Tùy protocol Một số protocol cũng dùng pattern caller-provided buffer.
Shell command Có thể gặp khi dump dữ liệu lớn Cần kiểm tra size output hoặc allocation.

Common Pitfall

Đừng log EFI_BUFFER_TOO_SMALL như một lỗi nghiêm trọng nếu đó là lần gọi đầu tiên để lấy size. Nhưng nếu đã allocate theo size API trả về mà lần gọi thứ hai vẫn trả EFI_BUFFER_TOO_SMALL, lúc đó cần nghi ngờ dữ liệu thay đổi giữa hai lần gọi hoặc size bị truyền sai.

Checklist khi gặp EFI_BUFFER_TOO_SMALL

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.