SMM Handler là gì?
Giải thích SMM handler: code xử lý SMI source, validate input, policy check và failure pattern khi debug.
SMM Handler là đoạn code chạy trong SMM để xử lý một SMI source cụ thể. Nếu SMI# là tiếng chuông báo, thì handler là phần firmware quyết định phải làm gì với tiếng chuông đó.
Handler có thể xử lý SW SMI command, hardware SMI event, SMM communication request, variable service, flash service hoặc policy riêng của platform. Vì chạy trong môi trường đặc quyền cao, handler phải được review như code security-critical.
Handler nằm ở đâu trong luồng SMI?
Event arrives
SW SMI, chipset event hoặc communication request tạo SMI.
SMM Core dispatch
Core xác định handler nào đã đăng ký cho source hoặc command đó.
Validate and execute
Handler kiểm tra input, policy, buffer rồi mới thao tác tài nguyên.
Return status
Handler ghi status hoặc kết quả vào buffer nếu có.
Exit SMM
CPU rời SMM và quay lại context trước đó.
Một handler tốt cần làm gì?
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Identify | Xác định command/source | Không xử lý nhầm command hoặc event không thuộc handler. |
| Validate | Kiểm tra buffer, size, address | Đây là phần security-critical nhất với communication handler. |
| Authorize | Kiểm tra policy | Ví dụ command này có được chạy sau EndOfDxe hoặc SmmReadyToLock không. |
| Execute | Thao tác tài nguyên | Variable, SPI flash, chipset register, power event hoặc OEM service. |
| Report | Trả status/log | Không nên fail im lặng. Status rõ giúp debug nhanh hơn. |
Pseudo code public-safe
EFI_STATUS
MySmmHandler (
IN EFI_HANDLE DispatchHandle,
IN CONST VOID *Context OPTIONAL,
IN OUT VOID *CommBuffer OPTIONAL,
IN OUT UINTN *CommBufferSize OPTIONAL
)
{
if (CommBuffer == NULL || CommBufferSize == NULL) {
return EFI_INVALID_PARAMETER;
}
if (!IsBufferOutsideMmram (CommBuffer, *CommBufferSize)) {
return EFI_SECURITY_VIOLATION;
}
if (!IsKnownCommand (CommBuffer, *CommBufferSize)) {
return EFI_UNSUPPORTED;
}
if (!IsCommandAllowedInCurrentPolicy (CommBuffer)) {
return EFI_ACCESS_DENIED;
}
return DoPlatformService (CommBuffer, *CommBufferSize);
}
Pseudo code này không phải production code. Điểm cần nhớ là thứ tự tư duy: validate trước, policy sau, execute cuối cùng.
Failure pattern hay gặp
| Mục | Giá trị | Ghi chú |
|---|---|---|
| Handler không được gọi | Registration hoặc dispatch sai | Kiểm tra SMI source, command ID, context và register status. |
| Handler chạy rồi reset | Exception trong SMM | Thường do dereference pointer sai, buffer chưa validate hoặc gọi service không hợp lệ. |
| EFI_ACCESS_DENIED | Policy block | Command có thể bị cấm sau lock event hoặc variable/flash policy không cho phép. |
| EFI_SECURITY_VIOLATION | Input không an toàn | CommBuffer overlap MMRAM, nested pointer sai hoặc size invalid. |
| Log không xuất hiện | DebugLib hoặc level sai | Handler có thể chạy nhưng SMM debug output chưa được config đúng. |
Debug Diary: handler chạy đúng trong lab nhưng fail khi security bật
Một pattern rất thực tế: trong debug build, handler xử lý command bình thường. Sang release build hoặc sau khi bật policy lock, cùng command trả EFI_ACCESS_DENIED.
Đừng vội xóa check policy. Hãy hỏi:
Khi handler bị block bởi policy
Nếu command chỉ phục vụ manufacturing hoặc debug, việc bị block ở runtime có thể là đúng. Fix đúng là tách build profile, tách policy hoặc giới hạn caller, không phải bỏ security check.
Review nhanh SMM handler
SMM handler review checklist
Câu hỏi tự kiểm tra
Tự kiểm tra sau khi đọc note này
Blog seeds
- SMM Handler Review Guide: validate trước, policy sau, execute cuối cùng
- Vì sao SMM handler chạy trong lab nhưng bị ACCESS_DENIED ở release build?
- Debug SW SMI Reset: khi handler gây exception trong SMM
Bài liên quan
- SMM Architecture Overview
- SMM Driver là gì?
- SMM Communication là gì?
- SW SMI là gì?
- SMM Save State là gì?
- SMM Vulnerability là gì?
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.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
SMM Communication là gì?
Giải thích SMM Communication: kênh request vào SMM, CommBuffer, validation, nested pointer và checklist security.
SMM Vulnerability là gì?
Giải thích SMM vulnerability: CommBuffer lỗi, nested pointer, SMRAM exposure, lock timing và checklist review.
EndOfDxe là gì?
Giải thích EndOfDxe như mốc chốt DXE: policy bắt đầu lock, SMM/security ổn định trước BDS và OS.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.