EFI_BUFFER_TOO_SMALL là gì?
Quicknote EFI_BUFFER_TOO_SMALL là gì?
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.
Gọi lần đầu
Data = NULL hoặc buffer nhỏ để hỏi required size.
Nhận EFI_BUFFER_TOO_SMALL
API trả về size cần thiết qua biến Size.
Allocate buffer
Caller cấp phát đúng số byte cần thiết.
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.