SMM Handler là gì?

Giải thích SMM handler: code xử lý SMI source, validate input, policy check và failure pattern khi debug.

Cập nhật 5 phút đọc
Đọc bằng Tiếng Việt English 日本語
Security / SMM / Memory / Firmware Image Terms cover

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?

01 SMI

Event arrives

SW SMI, chipset event hoặc communication request tạo SMI.

02 Core

SMM Core dispatch

Core xác định handler nào đã đăng ký cho source hoặc command đó.

03 Handler

Validate and execute

Handler kiểm tra input, policy, buffer rồi mới thao tác tài nguyên.

04 Status

Return status

Handler ghi status hoặc kết quả vào buffer nếu có.

05 RSM

Exit SMM

CPU rời SMM và quay lại context trước đó.

SMM handler nằm sau bước dispatch. Nó phải validate input trước khi thao tác tài nguyên nhạy cảm.

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

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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.