| /* SPDX-License-Identifier: BSD-2-Clause */ |
| |
| #ifndef _STM_API_H_ |
| #define _STM_API_H_ |
| |
| #include <stdint.h> |
| |
| // definition in STM spec |
| |
| #define STM_SPEC_VERSION_MAJOR 1 |
| #define STM_SPEC_VERSION_MINOR 0 |
| |
| #pragma pack(push, 1) |
| |
| #define STM_HARDWARE_FIELD_FILL_TO_2K (2048 - sizeof(uint32_t) * 8) |
| typedef struct { |
| uint32_t stm_header_revision; |
| uint32_t monitor_features; |
| uint32_t gdtr_limit; |
| uint32_t gdtr_base_offset; |
| uint32_t cs_selector; |
| uint32_t eip_offset; |
| uint32_t esp_offset; |
| uint32_t cr3_offset; |
| uint8_t reserved[STM_HARDWARE_FIELD_FILL_TO_2K]; |
| } HARDWARE_STM_HEADER; |
| |
| #define STM_FEATURES_IA32E 0x1 |
| |
| typedef struct { |
| uint32_t intel_64mode_supported : 1; |
| uint32_t ept_supported : 1; |
| uint32_t mbz : 30; |
| } STM_FEAT; |
| |
| typedef struct { |
| uint8_t stm_spec_ver_major; |
| uint8_t stm_pec_ver_minor; |
| uint16_t mbz; |
| uint32_t static_image_size; |
| uint32_t per_proc_dynamic_memory_size; |
| uint32_t additional_dynamic_memory_size; |
| STM_FEAT stm_features; |
| uint32_t number_of_rev_ids; |
| uint32_t stm_smm_rev_id[1]; |
| |
| // The total STM_HEADER should be 4K. |
| } SOFTWARE_STM_HEADER; |
| |
| typedef struct { |
| HARDWARE_STM_HEADER hw_stm_hdr; |
| SOFTWARE_STM_HEADER sw_stm_hdr; |
| } STM_HEADER; |
| |
| #define SHA1 1 |
| #define SHA256 2 |
| typedef struct { |
| uint64_t bios_component_base; |
| uint32_t image_size; |
| uint32_t hash_algorithm; // SHA1 or SHA256 |
| uint8_t hash[32]; |
| } TXT_BIOS_COMPONENT_STATUS; |
| |
| #define PAGE_SIZE 4096 |
| typedef struct { |
| uint32_t image_size; |
| uint32_t reserved; |
| uint64_t image_page_base[1]; //[NumberOfPages]; |
| } TXT_BIOS_COMPONENT_UPDATE; |
| |
| typedef struct { |
| uint64_t spe_rip; |
| uint64_t spe_rsp; |
| uint16_t spe_ss; |
| uint16_t page_violation_exception : 1; |
| uint16_t msr_violation_exception : 1; |
| uint16_t register_violation_exception : 1; |
| uint16_t io_violation_exception : 1; |
| uint16_t pci_violation_exception : 1; |
| uint16_t reserved1 : 11; |
| uint32_t reserved2; |
| } STM_PROTECTION_EXCEPTION_HANDLER; |
| |
| typedef struct { |
| uint8_t execution_disable_outside_smrr : 1; |
| uint8_t intel_64mode : 1; |
| uint8_t cr4_pae : 1; |
| uint8_t cr4_pse : 1; |
| uint8_t reserved1 : 4; |
| } STM_SMM_ENTRY_STATE; |
| |
| typedef struct { |
| uint8_t smram_to_vmcs_restore_required : 1; // BIOS restore hint |
| uint8_t reinitialize_vmcs_required : 1; // BIOS request |
| uint8_t reserved2 : 6; |
| } STM_SMM_RESUME_STATE; |
| |
| typedef struct { |
| uint8_t domain_type : 4; // STM input to BIOS on each SM |
| uint8_t x_state_policy : 2; // STM input to BIOS on each SMI |
| uint8_t ept_enabled : 1; |
| uint8_t reserved3 : 1; |
| } STM_SMM_STATE; |
| |
| typedef struct { |
| uint64_t signature; |
| uint16_t size; |
| uint8_t smm_descriptor_ver_major; |
| uint8_t smm_descriptor_ver_minor; |
| uint32_t local_apic_id; |
| STM_SMM_ENTRY_STATE smm_entry_state; |
| STM_SMM_RESUME_STATE smm_resume_state; |
| STM_SMM_STATE stm_smm_state; |
| uint8_t reserved4; |
| uint16_t smm_cs; |
| uint16_t smm_ds; |
| uint16_t smm_ss; |
| uint16_t smm_other_segment; |
| uint16_t smm_tr; |
| uint16_t reserved5; |
| uint64_t smm_cr3; |
| uint64_t smm_stm_setup_rip; |
| uint64_t smm_stm_teardown_rip; |
| uint64_t smm_smi_handler_rip; |
| uint64_t smm_smi_handler_rsp; |
| uint64_t smm_gdt_ptr; |
| uint32_t smm_gdt_size; |
| uint32_t required_stm_smm_rev_id; |
| STM_PROTECTION_EXCEPTION_HANDLER stm_protection_exception_handler; |
| uint64_t reserved6; |
| uint64_t bios_hw_resource_requirements_ptr; |
| // extend area |
| uint64_t acpi_rsdp; |
| uint8_t physical_address_bits; |
| } TXT_PROCESSOR_SMM_DESCRIPTOR; |
| |
| #define TXT_PROCESSOR_SMM_DESCRIPTOR_SIGNATURE "TXTPSSIG" |
| #define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MAJOR 1 |
| #define TXT_PROCESSOR_SMM_DESCRIPTOR_VERSION_MINOR 0 |
| |
| #define SMM_PSD_OFFSET 0xfb00 |
| |
| typedef enum { |
| TxtSmmPageViolation = 1, |
| TxtSmmMsrViolation, |
| TxtSmmRegisterViolation, |
| TxtSmmIoViolation, |
| TxtSmmPciViolation |
| } TXT_SMM_PROTECTION_EXCEPTION_TYPE; |
| |
| typedef struct { |
| uint32_t rdi; |
| uint32_t rsi; |
| uint32_t rbp; |
| uint32_t rdx; |
| uint32_t rcx; |
| uint32_t rbx; |
| uint32_t rax; |
| uint32_t cr3; |
| uint32_t cr2; |
| uint32_t cr0; |
| uint32_t vmcs_exit_instruction_info; |
| uint32_t vmcs_exit_instruction_length; |
| uint64_t vmcs_exit_qualification; |
| uint32_t error_code; // TXT_SMM_PROTECTION_EXCEPTION_TYPE |
| uint32_t rip; |
| uint32_t cs; |
| uint32_t rflags; |
| uint32_t rsp; |
| uint32_t ss; |
| } STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32; |
| |
| typedef struct { |
| uint64_t r15; |
| uint64_t r14; |
| uint64_t r13; |
| uint64_t r12; |
| uint64_t r11; |
| uint64_t r10; |
| uint64_t r9; |
| uint64_t r8; |
| uint64_t rdi; |
| uint64_t rsi; |
| uint64_t rbp; |
| uint64_t rdx; |
| uint64_t rcx; |
| uint64_t rbx; |
| uint64_t rax; |
| uint64_t cr8; |
| uint64_t cr3; |
| uint64_t cr2; |
| uint64_t cr0; |
| uint64_t vmcs_exit_instruction_info; |
| uint64_t vmcs_exit_instruction_length; |
| uint64_t vmcs_exit_qualification; |
| uint64_t error_code; // TXT_SMM_PROTECTION_EXCEPTION_TYPE |
| uint64_t rip; |
| uint64_t cs; |
| uint64_t rflags; |
| uint64_t rsp; |
| uint64_t ss; |
| } STM_PROTECTION_EXCEPTION_STACK_FRAME_X64; |
| |
| typedef union { |
| STM_PROTECTION_EXCEPTION_STACK_FRAME_IA32 *ia32_stack_frame; |
| STM_PROTECTION_EXCEPTION_STACK_FRAME_X64 *x64_stack_frame; |
| } STM_PROTECTION_EXCEPTION_STACK_FRAME; |
| |
| #define STM_SMM_REV_ID 0x80010100 |
| |
| typedef struct _STM_SMM_CPU_STATE { // Writable? |
| uint8_t reserved1[0x1d0]; // fc00h |
| uint32_t gdt_base_hi_dword; // fdd0h : NO |
| uint32_t ldt_base_hi_dword; // fdd4h : NO |
| uint32_t idt_base_hi_dword; // fdd8h : NO |
| uint8_t reserved2[0x4]; // fddch |
| uint64_t io_rdi; // fde0h : NO |
| // - restricted |
| uint64_t io_eip; // fde8h : YES |
| uint64_t io_rcx; // fdf0h : NO |
| // - restricted |
| uint64_t io_rsi; // fdf8h : NO |
| // - restricted |
| uint8_t reserved3[0x40]; // fe00h |
| uint32_t cr4; // fe40h : NO |
| uint8_t reserved4[0x48]; // fe44h |
| uint32_t gdt_base_lo_dword; // fe8ch : NO |
| uint32_t gdt_limit; // fe90h : NO |
| // - RESTRICTED |
| uint32_t idt_base_lo_dword; // fe94h : NO |
| uint32_t idt_limit; // fe98h : NO |
| // - RESTRICTED |
| uint32_t ldt_base_lo_dword; // fe9ch : NO |
| uint32_t ldt_limit; // fea0h : NO |
| // - RESTRICTED |
| uint32_t ldt_info; // fea4h : NO |
| // - RESTRICTED |
| uint8_t reserved5[0x30]; // fea8h |
| uint64_t eptp; // fed8h : NO |
| uint32_t enabled_ept; // fee0h : NO |
| uint8_t reserved6[0x14]; // fee4h |
| uint32_t smbase; // fef8h : YES |
| // - NO for STM |
| uint32_t smm_rev_id; // fefch : NO |
| uint16_t io_restart; // ff00h : YES |
| uint16_t auto_halt_restart; // ff02h : YES |
| uint8_t reserved7[0x18]; // ff04h |
| uint64_t r15; // ff1ch : YES |
| uint64_t r14; // ff24h : YES |
| uint64_t r13; // ff2ch : YES |
| uint64_t r12; // ff34h : YES |
| uint64_t r11; // ff3ch : YES |
| uint64_t r10; // ff44h : YES |
| uint64_t r9; // ff4ch : YES |
| uint64_t r8; // ff54h : YES |
| uint64_t rax; // ff5ch : YES |
| uint64_t rcx; // ff64h : YES |
| uint64_t rdx; // ff6ch : YES |
| uint64_t rbx; // ff74h : YES |
| uint64_t rsp; // ff7ch : YES |
| uint64_t rbp; // ff84h : YES |
| uint64_t rsi; // ff8ch : YES |
| uint64_t rdi; // ff94h : YES |
| uint64_t io_mem_addr; // ff9ch : NO |
| uint32_t io_misc; // ffa4h : NO |
| uint32_t es; // ffa8h : NO |
| uint32_t cs; // ffach : NO |
| uint32_t ss; // ffb0h : NO |
| uint32_t ds; // ffb4h : NO |
| uint32_t fs; // ffb8h : NO |
| uint32_t gs; // ffbch : NO |
| uint32_t ldtr; // ffc0h : NO |
| uint32_t tr; // ffc4h : NO |
| uint64_t dr7; // ffc8h : NO |
| uint64_t dr6; // ffd0h : NO |
| uint64_t rip; // ffd8h : YES |
| uint64_t ia32_efer; // ffe0h : YES |
| // - NO for STM |
| uint64_t rflags; // ffe8h : YES |
| uint64_t cr3; // fff0h : NO |
| uint64_t cr0; // fff8h : NO |
| } STM_SMM_CPU_STATE; |
| |
| // STM Mapping |
| typedef struct { |
| uint64_t physical_address; |
| uint64_t virtual_ddress; |
| uint32_t Page_count; |
| uint32_t Pat_cache_type; |
| } STM_MAP_ADDRESS_RANGE_DESCRIPTOR; |
| |
| #define ST_UC 0x00 |
| #define WC 0x01 |
| #define WT 0x04 |
| #define WP 0x05 |
| #define WB 0x06 |
| #define UC 0x07 |
| #define FOLLOW_MTRR 0xFFFFFFFF |
| |
| typedef struct { |
| uint64_t virtual_address; |
| uint32_t length; |
| } STM_UNMAP_ADDRESS_RANGE_DESCRIPTOR; |
| |
| typedef struct { |
| uint64_t interrupted_guest_virtual_address; |
| uint32_t length; |
| uint64_t interrupted_cr3; |
| uint64_t interrupted_eptp; |
| uint32_t map_to_smm_guest : 2; |
| uint32_t interrupted_cr4_pae : 1; |
| uint32_t interrupted_cr4_pse : 1; |
| uint32_t interrupted_ia32e_mode : 1; |
| uint32_t reserved1 : 27; |
| uint32_t reserved2; |
| uint64_t physical_address; |
| uint64_t smm_guest_virtual_address; |
| } STM_ADDRESS_LOOKUP_DESCRIPTOR; |
| |
| #define DO_NOT_MAP 0 |
| #define ONE_TO_ONE 1 |
| #define VIRTUAL_ADDRESS_SPECIFIED 3 |
| |
| // STM_RESOURCE_LIST |
| #define END_OF_RESOURCES 0 |
| #define MEM_RANGE 1 |
| #define IO_RANGE 2 |
| #define MMIO_RANGE 3 |
| #define MACHINE_SPECIFIC_REG 4 |
| #define PCI_CFG_RANGE 5 |
| #define TRAPPED_IO_RANGE 6 |
| #define ALL_RESOURCES 7 |
| #define REGISTER_VIOLATION 8 |
| #define MAX_DESC_TYPE 8 |
| |
| typedef struct { |
| uint32_t rsc_type; |
| uint16_t length; |
| uint16_t return_status : 1; |
| uint16_t reserved : 14; |
| uint16_t ignore_resource : 1; |
| } STM_RSC_DESC_HEADER; |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER Hdr; |
| uint64_t resource_list_continuation; |
| } STM_RSC_END; |
| |
| // byte granular Memory range support |
| #define STM_RSC_BGM 0x4 |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint64_t base; |
| uint64_t length; |
| uint32_t rwx_attributes : 3; |
| uint32_t reserved : 29; |
| uint32_t reserved_2; |
| } STM_RSC_MEM_DESC; |
| |
| #define STM_RSC_MEM_R 0x1 |
| #define STM_RSC_MEM_W 0x2 |
| #define STM_RSC_MEM_X 0x4 |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint16_t base; |
| uint16_t length; |
| uint32_t reserved; |
| } STM_RSC_IO_DESC; |
| |
| // byte granular MMIO range support |
| #define STM_RSC_BGI 0x2 |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint64_t base; |
| uint64_t length; |
| uint32_t rwx_attributes : 3; |
| uint32_t reserved : 29; |
| uint32_t reserved_2; |
| } STM_RSC_MMIO_DESC; |
| |
| #define STM_RSC_MMIO_R 0x1 |
| #define STM_RSC_MMIO_W 0x2 |
| #define STM_RSC_MMIO_X 0x4 |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint32_t msr_index; |
| uint32_t kernel_mode_processing : 1; |
| uint32_t reserved : 31; |
| uint64_t read_mask; |
| uint64_t write_mask; |
| } STM_RSC_MSR_DESC; |
| |
| // bit granular MSR resource support |
| #define STM_RSC_MSR 0x8 |
| |
| typedef struct { |
| uint8_t type; // must be 1, indicating Hardware Device Path |
| uint8_t subtype; // must be 1, indicating PCI |
| uint16_t length; // sizeof(STM_PCI_DEVICE_PATH_NODE) which is 6 |
| uint8_t pci_function; |
| uint8_t pci_device; |
| } STM_PCI_DEVICE_PATH_NODE; |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint16_t rw_attributes : 2; |
| uint16_t reserved : 14; |
| uint16_t base; |
| uint16_t length; |
| uint8_t originating_bus_number; |
| uint8_t last_node_index; |
| STM_PCI_DEVICE_PATH_NODE pci_device_path[1]; |
| // STM_PCI_DEVICE_PATH_NODE PciDevicePath[LastNodeIndex + 1]; |
| } STM_RSC_PCI_CFG_DESC; |
| |
| #define STM_RSC_PCI_CFG_R 0x1 |
| #define STM_RSC_PCI_CFG_W 0x2 |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint16_t base; |
| uint16_t length; |
| uint16_t in : 1; |
| uint16_t out : 1; |
| uint16_t api : 1; |
| uint16_t reserved1 : 13; |
| uint16_t reserved2; |
| } STM_RSC_TRAPPED_IO_DESC; |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| } STM_RSC_ALL_RESOURCES_DESC; |
| |
| typedef struct { |
| STM_RSC_DESC_HEADER hdr; |
| uint32_t register_type; |
| uint32_t reserved; |
| uint64_t readMask; |
| uint64_t write_mask; |
| } STM_REGISTER_VIOLATION_DESC; |
| |
| typedef enum { |
| stm_register_cr0, |
| stm_register_cr2, |
| stm_register_cr3, |
| stm_register_cr4, |
| stm_register_cr8, |
| stm_register_max, |
| } STM_REGISTER_VIOLATION_TYPE; |
| |
| typedef union { |
| STM_RSC_DESC_HEADER header; |
| STM_RSC_END end; |
| STM_RSC_MEM_DESC mem; |
| STM_RSC_IO_DESC io; |
| STM_RSC_MMIO_DESC mmio; |
| STM_RSC_MSR_DESC msr; |
| STM_RSC_PCI_CFG_DESC pci_cfg; |
| STM_RSC_TRAPPED_IO_DESC trapped_io; |
| STM_RSC_ALL_RESOURCES_DESC all; |
| STM_REGISTER_VIOLATION_DESC register_violation; |
| } STM_RSC; |
| |
| // VMCS database |
| #define STM_VMCS_DATABASE_REQUEST_ADD 1 |
| #define STM_VMCS_DATABASE_REQUEST_REMOVE 0 |
| |
| // Values for DomainType |
| // Interpreter of DomainType |
| #define DOMAIN_DISALLOWED_IO_OUT (1u << 0) |
| #define DOMAIN_DISALLOWED_IO_IN (1u << 1) |
| #define DOMAIN_INTEGRITY (1u << 2) |
| #define DOMAIN_CONFIDENTIALITY (1u << 3) |
| |
| #define DOMAIN_UNPROTECTED 0x00 |
| #define DOMAIN_INTEGRITY_PROT_OUT_IN (DOMAIN_INTEGRITY) |
| #define DOMAIN_FULLY_PROT_OUT_IN (DOMAIN_CONFIDENTIALITY | DOMAIN_INTEGRITY) |
| #define DOMAIN_FULLY_PROT \ |
| (DOMAIN_CONFIDENTIALITY | DOMAIN_INTEGRITY | DOMAIN_DISALLOWED_IO_IN \ |
| | DOMAIN_DISALLOWED_IO_OUT) |
| |
| // Values for XStatePolicy |
| #define XSTATE_READWRITE 0x00 |
| #define XSTATE_READONLY 0x01 |
| #define XSTATE_SCRUB 0x03 |
| |
| typedef struct { |
| uint64_t vmcs_phys_pointer; // bits 11:0 are reserved and must be 0 |
| uint32_t domain_type : 4; |
| uint32_t x_state_policy : 2; |
| uint32_t degradation_policy : 4; |
| uint32_t reserved1 : 22; // Must be 0 |
| uint32_t add_or_remove; |
| } STM_VMCS_DATABASE_REQUEST; |
| |
| // Event log |
| #define NEW_LOG 1 |
| #define CONFIGURE_LOG 2 |
| #define START_LOG 3 |
| #define STOP_LOG 4 |
| #define CLEAR_LOG 5 |
| #define DELETE_LOG 6 |
| typedef enum { |
| evt_log_started, |
| evt_log_stopped, |
| evt_log_invalid_parameter_detected, |
| evt_handled_protection_exception, |
| // unhandled protection exceptions result in reset & cannot be logged |
| evt_bios_access_to_unclaimed_resource, |
| evt_mle_resource_protection_granted, |
| evt_mle_resource_protection_denied, |
| evt_mle_resource_unprotect, |
| evt_mle_resource_unprotect_error, |
| evt_mle_domain_type_degraded, |
| // add more here |
| evt_mle_max, |
| // Not used |
| evt_invalid = 0xFFFFFFFF, |
| } EVENT_TYPE; |
| |
| typedef struct { |
| uint32_t page_count; |
| uint64_t pages[1]; // number of elements is PageCount |
| } STM_EVENT_LOG_MANAGEMENT_REQUEST_DATA_LOG_BUFFER; |
| |
| typedef union { |
| STM_EVENT_LOG_MANAGEMENT_REQUEST_DATA_LOG_BUFFER log_buffer; |
| uint32_t event_enable_bitmap; // bitmap of EVENT_TYPE |
| } STM_EVENT_LOG_MANAGEMENT_REQUEST_DATA; |
| |
| typedef struct { |
| uint32_t sub_functionindex; |
| STM_EVENT_LOG_MANAGEMENT_REQUEST_DATA data; |
| } STM_EVENT_LOG_MANAGEMENT_REQUEST; |
| |
| // VMCALL API Numbers |
| // |
| // API number convention: BIOS facing VMCALL interfaces have bit 16 clear |
| #define STM_API_MAP_ADDRESS_RANGE 0x00000001 |
| #define STM_API_UNMAP_ADDRESS_RANGE 0x00000002 |
| #define STM_API_ADDRESS_LOOKUP 0x00000003 |
| #define STM_API_RETURN_FROM_PROTECTION_EXCEPTION 0x00000004 |
| |
| // API number convention: MLE facing VMCALL interfaces have bit 16 set |
| // |
| // The STM configuration lifecycle is as follows: |
| // 1. SENTER->SINIT->MLE: MLE begins execution with SMI disabled (masked). |
| // 2. MLE invokes InitializeProtectionVMCALL() to prepare STM for setup of |
| // initial protection profile. This is done on a single CPU and has global |
| // effect. |
| // 3. MLE invokes ProtectResourceVMCALL() to define the initial protection |
| // profile. The protection profile is global across all CPUs. |
| // 4. MLE invokes StartStmVMCALL() to enable the STM to begin receiving SMI |
| // events. This must be done on every logical CPU. |
| // 5. MLE may invoke ProtectResourceVMCALL() or UnProtectResourceVMCALL() |
| // during runtime as many times as necessary. |
| // 6. MLE invokes StopStmVMCALL() to disable the STM. SMI is again masked |
| // following StopStmVMCALL(). |
| // |
| #define STM_API_START 0x00010001 |
| #define STM_API_STOP 0x00010002 |
| #define STM_API_PROTECT_RESOURCE 0x00010003 |
| #define STM_API_UNPROTECT_RESOURCE 0x00010004 |
| #define STM_API_GET_BIOS_RESOURCES 0x00010005 |
| #define STM_API_MANAGE_VMCS_DATABASE 0x00010006 |
| #define STM_API_INITIALIZE_PROTECTION 0x00010007 |
| #define STM_API_MANAGE_EVENT_LOG 0x00010008 |
| |
| // Return codes |
| typedef uint32_t STM_STATUS; |
| |
| #define STM_SUCCESS 0x00000000 |
| #define SMM_SUCCESS 0x00000000 |
| // all error codes have bit 31 set |
| // STM errors have bit 16 set |
| #define ERROR_STM_SECURITY_VIOLATION 0x80010001 |
| #define ERROR_STM_CACHE_TYPE_NOT_SUPPORTED 0x80010002 |
| #define ERROR_STM_PAGE_NOT_FOUND 0x80010003 |
| #define ERROR_STM_BAD_CR3 0x80010004 |
| #define ERROR_STM_PHYSICAL_OVER_4G 0x80010005 |
| #define ERROR_STM_VIRTUAL_SPACE_TOO_SMALL 0x80010006 |
| #define ERROR_STM_UNPROTECTABLE_RESOURCE 0x80010007 |
| #define ERROR_STM_ALREADY_STARTED 0x80010008 |
| #define ERROR_STM_WITHOUT_SMX_UNSUPPORTED 0x80010009 |
| #define ERROR_STM_STOPPED 0x8001000A |
| #define ERROR_STM_BUFFER_TOO_SMALL 0x8001000B |
| #define ERROR_STM_INVALID_VMCS_DATABASE 0x8001000C |
| #define ERROR_STM_MALFORMED_RESOURCE_LIST 0x8001000D |
| #define ERROR_STM_INVALID_PAGECOUNT 0x8001000E |
| #define ERROR_STM_LOG_ALLOCATED 0x8001000F |
| #define ERROR_STM_LOG_NOT_ALLOCATED 0x80010010 |
| #define ERROR_STM_LOG_NOT_STOPPED 0x80010011 |
| #define ERROR_STM_LOG_NOT_STARTED 0x80010012 |
| #define ERROR_STM_RESERVED_BIT_SET 0x80010013 |
| #define ERROR_STM_NO_EVENTS_ENABLED 0x80010014 |
| #define ERROR_STM_OUT_OF_RESOURCES 0x80010015 |
| #define ERROR_STM_FUNCTION_NOT_SUPPORTED 0x80010016 |
| #define ERROR_STM_UNPROTECTABLE 0x80010017 |
| #define ERROR_STM_UNSUPPORTED_MSR_BIT 0x80010018 |
| #define ERROR_STM_UNSPECIFIED 0x8001FFFF |
| |
| // SMM errors have bit 17 set |
| #define ERROR_SMM_BAD_BUFFER 0x80020001 |
| #define ERROR_SMM_INVALID_RSC 0x80020004 |
| #define ERROR_SMM_INVALID_BUFFER_SIZE 0x80020005 |
| #define ERROR_SMM_BUFFER_TOO_SHORT 0x80020006 |
| #define ERROR_SMM_INVALID_LIST 0x80020007 |
| #define ERROR_SMM_OUT_OF_MEMORY 0x80020008 |
| #define ERROR_SMM_AFTER_INIT 0x80020009 |
| #define ERROR_SMM_UNSPECIFIED 0x8002FFFF |
| |
| // Errors that apply to both have bits 15, 16, and 17 set |
| #define ERROR_INVALID_API 0x80038001 |
| #define ERROR_INVALID_PARAMETER 0x80038002 |
| |
| // STM TXT.ERRORCODE codes |
| #define STM_CRASH_PROTECTION_EXCEPTION 0xC000F001 |
| #define STM_CRASH_PROTECTION_EXCEPTION_FAILURE 0xC000F002 |
| #define STM_CRASH_DOMAIN_DEGRADATION_FAILURE 0xC000F003 |
| #define STM_CRASH_BIOS_PANIC 0xC000E000 |
| |
| typedef struct { |
| uint32_t event_serial_number; |
| uint16_t type; |
| uint16_t lock : 1; |
| uint16_t valid : 1; |
| uint16_t read_by_mle : 1; |
| uint16_t wrapped : 1; |
| uint16_t reserved : 12; |
| } LOG_ENTRY_HEADER; |
| |
| typedef struct { |
| uint32_t reserved; |
| } ENTRY_EVT_LOG_STARTED; |
| |
| typedef struct { |
| uint32_t reserved; |
| } ENTRY_EVT_LOG_STOPPED; |
| |
| typedef struct { |
| uint32_t vmcall_api_number; |
| } ENTRY_EVT_LOG_INVALID_PARAM; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_MLE_RSC_PROT_GRANTED; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_MLE_RSC_PROT_DENIED; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_MLE_RSC_UNPROT; |
| |
| typedef struct { |
| STM_RSC resource; |
| } ENTRY_EVT_MLE_RSC_UNPROT_ERROR; |
| |
| typedef struct { |
| uint64_t vmcs_phys_pointer; |
| uint8_t expected_domain_type; |
| uint8_t degraded_domain_type; |
| } ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED; |
| |
| typedef union { |
| ENTRY_EVT_LOG_STARTED started; |
| ENTRY_EVT_LOG_STOPPED stopped; |
| ENTRY_EVT_LOG_INVALID_PARAM invalid_param; |
| ENTRY_EVT_LOG_HANDLED_PROTECTION_EXCEPTION |
| handled_protection_exception; |
| ENTRY_EVT_BIOS_ACCESS_UNCLAIMED_RSC bios_unclaimed_rsc; |
| ENTRY_EVT_MLE_RSC_PROT_GRANTED mle_rsc_prot_granted; |
| ENTRY_EVT_MLE_RSC_PROT_DENIED mle_rsc_prot_denied; |
| ENTRY_EVT_MLE_RSC_UNPROT mle_rsc_unprot; |
| ENTRY_EVT_MLE_RSC_UNPROT_ERROR mle_rsc_unprot_error; |
| ENTRY_EVT_MLE_DOMAIN_TYPE_DEGRADED mle_domain_type_degraded; |
| } LOG_ENTRY_DATA; |
| |
| typedef struct { |
| LOG_ENTRY_HEADER hdr; |
| LOG_ENTRY_DATA data; |
| } STM_LOG_ENTRY; |
| |
| #define STM_LOG_ENTRY_SIZE 256 |
| #define STM_CONFIG_SMI_UNBLOCKING_BY_VMX_OFF 0x1 |
| |
| // TXT debug |
| #define SW_SMI_STM_ADD_RUNTIME_RESOURCES_SUB_FUNC 0 |
| #define SW_SMI_STM_READ_BIOS_RESOURCES_SUB_FUNC 1 |
| #define SW_SMI_STM_REPLACE_BIOS_RESOURCES_SUB_FUNC 2 |
| |
| typedef struct { |
| uint32_t buffer_size; |
| uint32_t reserved; |
| // uint8_t Data[]; |
| } TXT_BIOS_DEBUG; |
| |
| #pragma pack(pop) |
| |
| #endif |