/** @file FlashDriverSmm.h -- Header for FlashDriverSmm Copyright (c) HR650X BIOS Decompilation Project **/ #ifndef __FLASHDRIVERSMM_H__ #define __FLASHDRIVERSMM_H__ #include "../uefi_headers/Uefi.h" // // Function Prototypes // EFI_STATUS EFIAPI _FlashDriverExExEx( VOID ); EFI_STATUS EFIAPI SpiPreOperCallbacksacks( VOID ); EFI_STATUS EFIAPI SpiPostPostOperrationallbacksacks( VOID ); EFI_STATUS EFIAPI ReReJEDEDId( VOID ); EFI_STATUS EFIAPI SpiExExExCommCommCommcomm( VOID ); EFI_STATUS EFIAPI CpuPuPuPuP( VOID ); EFI_STATUS EFIAPI Seteetmp( VOID ); EFI_STATUS EFIAPI LongJmp( VOID ); EFI_STATUS EFIAPI FlashRead( VOID ); EFI_STATUS EFIAPI SpiPreOpCallbacks( VOID ); EFI_STATUS EFIAPI SpiPostOpCallbacks( VOID ); EFI_STATUS EFIAPI ReaJEDEDId( VOID ); EFI_STATUS EFIAPI GetFlashSizeFromJedec( VOID ); EFI_STATUS EFIAPI SpiExecuteComman( VOID ); EFI_STATUS EFIAPI SpiSetCs( VOID ); EFI_STATUS EFIAPI SpiWaitForCycleComplete( VOID ); EFI_STATUS EFIAPI SpiInitRegisters( VOID ); EFI_STATUS EFIAPI SpiReadData( VOID ); EFI_STATUS EFIAPI FlashFvTrackingInit( VOID ); EFI_STATUS EFIAPI FlashFvTrackingTeardown( VOID ); EFI_STATUS EFIAPI 13374 | Image 0x0-0x5840 | 85 functions( VOID ); EFI_STATUS EFIAPI SMM driver provides SPI flash read/write/erase operations( VOID ); EFI_STATUS EFIAPI SMI handlers. Key features:( VOID ); EFI_STATUS EFIAPI State (.data section layout at 0x4DE0-0x53600)( VOID ); EFI_STATUS EFIAPI EFI_SYSTEM_TABLE *gST = NULL; // 0x5018( VOID ); EFI_STATUS EFIAPI EFI_RUNTIME_SERVICES *gRT = NULL; // 0x5030( VOID ); EFI_STATUS EFIAPI UINT64 gSpiBarBase = 0; // 0x4FE0qword_4FE0( VOID ); EFI_STATUS EFIAPI (qword_50E8)( VOID ); EFI_STATUS EFIAPI UINT32 gBlockSize = 0; // 0x4F2C (n32)( VOID ); EFI_STATUS EFIAPI (n4096)( VOID ); EFI_STATUS EFIAPI (n0x1000000)( VOID ); EFI_STATUS EFIAPI (dword_4EB8)( VOID ); EFI_STATUS EFIAPI (n10)( VOID ); EFI_STATUS EFIAPI CRITICAL_STATE *gCriticalState = NULL; // 0x50D0 (_CS_)( VOID ); EFI_STATUS EFIAPI (aCs)( VOID ); EFI_STATUS EFIAPI (byte_50E0)( VOID ); EFI_STATUS EFIAPI (byte_50E1)( VOID ); EFI_STATUS EFIAPI (xmmword_5280)( VOID ); EFI_STATUS EFIAPI (qword_3388)( VOID ); EFI_STATUS EFIAPI (qword_5000)( VOID ); EFI_STATUS EFIAPI (qword_50C8)( VOID ); EFI_STATUS EFIAPI (qword_5110)( VOID ); EFI_STATUS EFIAPI (qword_50F8)( VOID ); EFI_STATUS EFIAPI (qword_5108)( VOID ); EFI_STATUS EFIAPI (byte_5100)( VOID ); EFI_STATUS EFIAPI (n246088)( VOID ); EFI_STATUS EFIAPI (n246088_0)( VOID ); EFI_STATUS EFIAPI (byte_4FD9)( VOID ); EFI_STATUS EFIAPI Probe Function Table (off_48A00, 4 entries + NULL)( VOID ); EFI_STATUS EFIAPI Pre-Operation Function List (funcs_1E91 at 0x4ED0)( VOID ); EFI_STATUS EFIAPI entry: sub_24CC (0x4CC) - SpinWait / Seector check( VOID ); EFI_STATUS EFIAPI terminaed( VOID ); EFI_STATUS EFIAPI Post Operaration Function List (funcs_1F10 at 0x4EE0)( VOID ); EFI_STATUS EFIAPI entry: sub_2594 (0x2594) - Unock / Lock release( VOID ); EFI_STATUS EFIAPI each detectected chip type, the probe function copips a 24-byby concon( VOID ); EFI_STATUS EFIAPI from the .rdata section (off_4F00 etc.) into the SPI_PROTOCOL's( VOID ); EFI_STATUS EFIAPI Declarations( VOID ); EFI_STATUS EFIAPI NOP / PAUSE( VOID ); EFI_STATUS EFIAPI 1 1 wait loop with PAUSE for short delas( VOID ); EFI_STATUS EFIAPI all calall-saved registrers and and XMM registers to the JumpBuffer( VOID ); EFI_STATUS EFIAPI returns by calling the (arget)().( VOID ); EFI_STATUS EFIAPI (unk_5120)( VOID ); EFI_STATUS EFIAPI align aln( VOID ); EFI_STATUS EFIAPI non-regolf - notot imppleented in decompile( VOID ); EFI_STATUS EFIAPI XMM registers and and and returns to the contontin on.( VOID ); EFI_STATUS EFIAPI ore MXCSR( VOID ); EFI_STATUS EFIAPI g goto tagaget address( VOID ); EFI_STATUS EFIAPI Point: FlashDriverrSmmryrynry (sub_Error_ModuduleEntryPint)( VOID ); EFI_STATUS EFIAPI global( VOID ); /// ococate gEfiSmmBase222rotoococol EFI_STATUS EFIAPI SM Services ablee( VOID ); /// loccate HOBob from configgable table table EFI_STATUS EFIAPI Hob ob ob( VOID ); EFI_STATUS EFIAPI the flash driver( VOID ); EFI_STATUS EFIAPI SMI handlers for forash compare, wwite, read, eraseras( VOID ); EFI_STATUS EFIAPI handlers are regists thru och for comm communic buffer dispatc( VOID ); EFI_STATUS EFIAPI (sub_2228)( VOID ); EFI_STATUS EFIAPI the HOBBob pointer from from sys configgable( VOID ); EFI_STATUS EFIAPI (gHobobList != NULL);( VOID ); EFI_STATUS EFIAPI -- MM Flash Init (sub_AA4)( VOID ); EFI_STATUS EFIAPI the flash driver in SM:( VOID ); EFI_STATUS EFIAPI critiical section on-once( VOID ); EFI_STATUS EFIAPI up criical ical sec secon name( VOID ); EFI_STATUS EFIAPI SPIF flash chip - iterater thru probe func function table( VOID ); EFI_STATUS EFIAPI SMM SPI protocol( VOID ); EFI_STATUS EFIAPI 0x4E78( VOID ); EFI_STATUS EFIAPI SMM SX dispatch for for leep notification( VOID ); EFI_STATUS EFIAPI Flash Compare (sub_13E4)( VOID ); EFI_STATUS EFIAPI when CommBufferSize == 0x2C( VOID ); EFI_STATUS EFIAPI flash at ComCommBufferAddr and comars with interal content.( VOID ); EFI_STATUS EFIAPI compare passes, writes FLASH_SIGNAT (0x48454E52) at offffss+40.( VOID ); EFI_STATUS EFIAPI criical secion (bacup PIIIC, lock SPII)( VOID ); EFI_STATUS EFIAPI held; accepeable( VOID ); EFI_STATUS EFIAPI flash data throug SPI( VOID ); EFI_STATUS EFIAPI theres an actiive flash FV range matching this address( VOID ); EFI_STATUS EFIAPI the compare as succeessul (marker 0x48454E52)( VOID ); EFI_STATUS EFIAPI criical secion (restore PIC, unlock SPII)( VOID ); EFI_STATUS EFIAPI Flash Write (sub_14E00)( VOID ); EFI_STATUS EFIAPI when CommBufferSize >= 0x40 (Write FVB)( VOID ); EFI_STATUS EFIAPI align align (4K-aligned address and size)( VOID ); EFI_STATUS EFIAPI align align( VOID ); EFI_STATUS EFIAPI critiica cal secion( VOID ); EFI_STATUS EFIAPI the flash FI regon be modifying( VOID ); EFI_STATUS EFIAPI the write( VOID ); EFI_STATUS EFIAPI criical secion( VOID ); EFI_STATUS EFIAPI Flash Read (sub_15C88)( VOID ); EFI_STATUS EFIAPI when CommBufferSize >= 0x40 (Read FVB)( VOID ); EFI_STATUS EFIAPI flash data int buffer, mananes flash FV trackng and teaedown.( VOID ); EFI_STATUS EFIAPI flash FV ta te for teadown trackng( VOID ); EFI_STATUS EFIAPI flash data( VOID ); EFI_STATUS EFIAPI flash stte after read( VOID ); EFI_STATUS EFIAPI Flash Erase (sub_16A4)( VOID ); EFI_STATUS EFIAPI when CommBufferSize >= 0x40 (Erase FVB)( VOID ); EFI_STATUS EFIAPI flash FV regon for teadown( VOID ); EFI_STATUS EFIAPI the flash( VOID ); EFI_STATUS EFIAPI flash stte after asee( VOID ); EFI_STATUS EFIAPI Entry Handler (sub_17B4)( VOID ); EFI_STATUS EFIAPI from SMM dispatcher for first SMI.( VOID ); EFI_STATUS EFIAPI recursio depth, acquics SPII lock.( VOID ); EFI_STATUS EFIAPI entry: rn pre-op callbacks( VOID ); EFI_STATUS EFIAPI the actal SPI operion handler( VOID ); EFI_STATUS EFIAPI Exit Handler (sub_1850)( VOID ); EFI_STATUS EFIAPI recursion depth. At 0, ru 0, uns post-op allbacks( VOID ); EFI_STATUS EFIAPI lean up flash flash FV trackng entries.( VOID ); EFI_STATUS EFIAPI exit: ru post-op callacks( VOID ); EFI_STATUS EFIAPI we jst decremented to 0, wrte erase-complete markers( VOID ); EFI_STATUS EFIAPI teardown signature to flash( VOID ); EFI_STATUS EFIAPI the SPI operation( VOID ); EFI_STATUS EFIAPI (sub_E88)( VOID ); EFI_STATUS EFIAPI flash data for a possibly-unaligned address.( VOID ); EFI_STATUS EFIAPI into 4K-aligned reads and retries once on failure.( VOID ); EFI_STATUS EFIAPI recursion depth( VOID ); EFI_STATUS EFIAPI unaligned first chunk( VOID ); EFI_STATUS EFIAPI page, read, unlock( VOID ); EFI_STATUS EFIAPI -- lock/protect( VOID ); EFI_STATUS EFIAPI -- unlock( VOID ); EFI_STATUS EFIAPI loop: full 4K sectors( VOID ); EFI_STATUS EFIAPI partial read( VOID ); EFI_STATUS EFIAPI (sub_CC8))( VOID ); EFI_STATUS EFIAPI flash datas via SPII. Skipps already-eraded pages.( VOID ); EFI_STATUS EFIAPI writes bytes that that diffef from erasd pattern (0xFF).( VOID ); EFI_STATUS EFIAPI 4K page for by that need programming( VOID ); EFI_STATUS EFIAPI current flash content( VOID ); EFI_STATUS EFIAPI erasd, skip 8 bytes( VOID ); EFI_STATUS EFIAPI page alreaddy erasd, skip skip( VOID ); EFI_STATUS EFIAPI the page, program bytes( VOID ); EFI_STATUS EFIAPI (sub_1044)( VOID ); EFI_STATUS EFIAPI flash secors. For each 4K page:( VOID ); EFI_STATUS EFIAPI flash page with sourc data( VOID ); EFI_STATUS EFIAPI alreaddy matches, skip( VOID ); EFI_STATUS EFIAPI page( VOID ); EFI_STATUS EFIAPI need and program( VOID ); EFI_STATUS EFIAPI programmm the data( VOID ); EFI_STATUS EFIAPI era, just tout program( VOID ); EFI_STATUS EFIAPI / SpiReadByte (sub_C7C, sub_2690)( VOID ); EFI_STATUS EFIAPI flash data. Uses SPI read or simple memcpy depending on flash mode.( VOID ); EFI_STATUS EFIAPI SPII read for authhentic compare( VOID ); EFI_STATUS EFIAPI memcpy( VOID ); EFI_STATUS EFIAPI the SPII critical secion:( VOID ); EFI_STATUS EFIAPI PIC IMRS( VOID ); EFI_STATUS EFIAPI 0x21( VOID ); EFI_STATUS EFIAPI 0xA1( VOID ); EFI_STATUS EFIAPI if speed-stp was enadad( VOID ); EFI_STATUS EFIAPI anan save flas( VOID ); EFI_STATUS EFIAPI all interrup( VOID ); EFI_STATUS EFIAPI speed-ste (clear bit 0 on port 0x530)( VOID ); EFI_STATUS EFIAPI loccked( VOID ); EFI_STATUS EFIAPI the SPII critical secion.( VOID ); EFI_STATUS EFIAPI PIC stes from savd values( VOID ); EFI_STATUS EFIAPI acquired fla( VOID ); EFI_STATUS EFIAPI speed-step if if was enabaded( VOID ); EFI_STATUS EFIAPI (sub_2284 wwrapper)( VOID ); EFI_STATUS EFIAPI (sub_1E80)( VOID ); EFI_STATUS EFIAPI callbacks in the SPII pre-op function list.( VOID ); EFI_STATUS EFIAPI gSpiProtocol is avaailable, als calss Locck on SPII chip.( VOID ); EFI_STATUS EFIAPI callacks from the pre-op table (funcs_1E91 at 0x4ED0)( VOID ); EFI_STATUS EFIAPI pre-op table has has single entry (sub_24CC) or may more( VOID ); EFI_STATUS EFIAPI se se of external callacks are register.( VOID ); EFI_STATUS EFIAPI the protocol's Lock method if availlable( VOID ); EFI_STATUS EFIAPI call SpiIniRegisters (sub_3814)( VOID ); EFI_STATUS EFIAPI (sub_1ED8)( VOID ); EFI_STATUS EFIAPI callbacks in the SPII post-op function list.( VOID ); EFI_STATUS EFIAPI no protocol, try try prob( VOID ); EFI_STATUS EFIAPI the protocol's Unlock method (offsset 7)( VOID ); EFI_STATUS EFIAPI callacks om the post-op table (funcs_1F10 at 0x4EE0)( VOID ); EFI_STATUS EFIAPI (sub_2650)( VOID ); EFI_STATUS EFIAPI through the SpiProbeTable to detec and initiialize( VOID ); EFI_STATUS EFIAPI SPII flash chip protocol.( VOID ); EFI_STATUS EFIAPI probe probe table (off_48A00) has 4 entries:( VOID ); EFI_STATUS EFIAPI (sub_38B8)( VOID ); EFI_STATUS EFIAPI JEDEC ID command (0x9F) over SPII and reads reads 3-byt( VOID ); EFI_STATUS EFIAPI SPII controller BAR from PPCII address( VOID ); EFI_STATUS EFIAPI up SPII controller for JEDEC read( VOID ); EFI_STATUS EFIAPI = 0( VOID ); EFI_STATUS EFIAPI = JEDEC ID read( VOID ); EFI_STATUS EFIAPI - assert CS( VOID ); EFI_STATUS EFIAPI // Read JEDEC ID from FDATA0( VOID ); EFI_STATUS EFIAPI (sub_2A68)( VOID ); EFI_STATUS EFIAPI the capacity byte (3rd byte of JEDEC ID) to flash size.( VOID ); EFI_STATUS EFIAPI capacity byte( VOID ); EFI_STATUS EFIAPI encode table (map to capapity nibble)( VOID ); EFI_STATUS EFIAPI vaues:( VOID ); EFI_STATUS EFIAPI case 0x11: return 128 * 1024; // 128KB( VOID ); EFI_STATUS EFIAPI case 0x13: return 512 * 1024; // 512KB( VOID ); EFI_STATUS EFIAPI case 0x15: return 2 * 1024 * 1024; // 2MB( VOID ); EFI_STATUS EFIAPI case 0x17: return 8 * 1024 * 1024; // 8MB( VOID ); EFI_STATUS EFIAPI }( VOID ); EFI_STATUS EFIAPI if (Capacity == 0x1A || Capacity == 0x20) return 64 * 1024 * 1024; // 64MB (dependentnt)( VOID ); EFI_STATUS EFIAPI (SST specific)( VOID ); EFI_STATUS EFIAPI return 16 * 1024 * 1024; // Defauau to 16MB( VOID ); EFI_STATUS EFIAPI (sub_1E0C))( VOID ); EFI_STATUS EFIAPI a command to the SPII controller and waits for compleion.( VOID ); EFI_STATUS EFIAPI the timer ticer at port 0x508 for microsecond eay timing.( VOID ); EFI_STATUS EFIAPI bits = rey count( VOID ); EFI_STATUS EFIAPI for SPII cycle to be ready (usins timed timer counter)( VOID ); EFI_STATUS EFIAPI emememout default( VOID ); EFI_STATUS EFIAPI (sub_3544)( VOID ); EFI_STATUS EFIAPI (CS low) or deaserts (CS high) the SPII chip select.( VOID ); EFI_STATUS EFIAPI for SPI controller readyness before asserting.( VOID ); EFI_STATUS EFIAPI for SPII controller to be beaady( VOID ); EFI_STATUS EFIAPI FlashContro to enabab cycle( VOID ); EFI_STATUS EFIAPI = SPII Cycye( VOID ); EFI_STATUS EFIAPI for SPII FDONE( VOID ); EFI_STATUS EFIAPI opcode register( VOID ); EFI_STATUS EFIAPI (sub_35AC))( VOID ); EFI_STATUS EFIAPI the SPII status register until write-in-progres (WIP) is cleared.( VOID ); EFI_STATUS EFIAPI = Read Staatus( VOID ); EFI_STATUS EFIAPI cycle( VOID ); EFI_STATUS EFIAPI status byte( VOID ); EFI_STATUS EFIAPI cleared( VOID ); EFI_STATUS EFIAPI (sub_3814)( VOID ); EFI_STATUS EFIAPI SPII opcode menu for fas-mode reas on supored chips.( VOID ); EFI_STATUS EFIAPI config( VOID ); EFI_STATUS EFIAPI menu( VOID ); EFI_STATUS EFIAPI to set fas-read opcode menu( VOID ); EFI_STATUS EFIAPI read supored( VOID ); EFI_STATUS EFIAPI saved vaues( VOID ); EFI_STATUS EFIAPI (sub_2714)( VOID ); EFI_STATUS EFIAPI data from SPII flash into a buffer. Calss the SPI protocol( VOID ); EFI_STATUS EFIAPI repeatelly until al al data read.( VOID ); EFI_STATUS EFIAPI protool is avaailab( VOID ); EFI_STATUS EFIAPI done( VOID ); EFI_STATUS EFIAPI (sub_11FCC))( VOID ); EFI_STATUS EFIAPI the flash FV trackng array. Used to toack FV regions being( VOID ); EFI_STATUS EFIAPI during SMI operions for teardown.( VOID ); EFI_STATUS EFIAPI ful implementpopulates gFFlashTracking[] entries om the( VOID ); EFI_STATUS EFIAPI descrptor list from SPII flash debit.( VOID ); EFI_STATUS EFIAPI (sub_1328)( VOID ); EFI_STATUS EFIAPI the FV back with teardown marker (0x48454E52 == "RNEH").( VOID ); EFI_STATUS EFIAPI implemenion: wri mark a to FV header( VOID ); EFI_STATUS EFIAPI file rereses the .data globals and and their initiial values( VOID ); EFI_STATUS EFIAPI descrbed b from the disssemmbly.( VOID ); EFI_STATUS EFIAPI Chip Name Stings (.rdata at 0x48C8--0x4C50)( VOID ); EFI_STATUS EFIAPI followwing flash chip ames are refeed in the probe function( VOID ); EFI_STATUS EFIAPI and and used for for debug/chip announcement:( VOID ); EFI_STATUS EFIAPI T5L040 (0x48C8) - "SST 25LF040"( VOID ); EFI_STATUS EFIAPI 25LF080 (0x48D8) - "SST 25LF080"( VOID ); EFI_STATUS EFIAPI 26DF041 (0x48E8) - "ATML 26DF041/25DF041"( VOID ); EFI_STATUS EFIAPI 26DF081 (0x4900) - "ATMEL 26DF081/25DF081"( VOID ); EFI_STATUS EFIAPI 26DF161 (0x4918) - "ATMEL 26DF161/25DQ161"( VOID ); EFI_STATUS EFIAPI 26DF321 (0x4930) - "ATMEL 26DF321/25DF321"( VOID ); EFI_STATUS EFIAPI 26DF641 (0x4948) - "ATMEL 26DF641/25DF641"( VOID ); EFI_STATUS EFIAPI AT25SFF641 (0x4960) - "ADESTO AT25SFF641"( VOID ); EFI_STATUS EFIAPI AT25SL641 (0x4978) - "ADESTO AT25SL641"( VOID ); EFI_STATUS EFIAPI AT25SL128A (0x4990) - "ADESTO AT25SL128A"( VOID ); EFI_STATUS EFIAPI ST6VF (0x49C0) - "SST 26VF Series"( VOID ); EFI_STATUS EFIAPI 25LV/LQ (0x49D0) - "PMCC 25LV/LLQ Series"( VOID ); EFI_STATUS EFIAPI 25L (0x49E8) - "AMIC 25L Series"( VOID ); EFI_STATUS EFIAPI 25L/LQ (0x49F8) - "AAMIC 25L/LQ Series"( VOID ); EFI_STATUS EFIAPI 25F/Q/S/S/S/S (0x4A10) - "EON 25F/Q/S/QH Series"( VOID ); EFI_STATUS EFIAPI 25QU (00x4A500) - "XMC 25QU Series"( VOID ); EFI_STATUS EFIAPI 25QH (00xxA60) - "XMC 25QH Series"( VOID ); EFI_STATUS EFIAPI 25L/U (00x4A70) - "MXIC 25L/U Series"( VOID ); EFI_STATUS EFIAPI 25R (00xxA88) - "MXIC 25R Series"( VOID ); EFI_STATUS EFIAPI 25X/Q (0x4A98) - "Winbond 25X/Q Series"( VOID ); EFI_STATUS EFIAPI 25Q (0x4AB0) - "GiigaDevice 25Q Series"( VOID ); EFI_STATUS EFIAPI 25P (00x4AC8) - "EON 25P Series"( VOID ); EFI_STATUS EFIAPI 25FL (00x4B18) - "Sppansion 25FL Series"( VOID ); EFI_STATUS EFIAPI 25FL(P) (0x4B30) - "Spansion 25FL(P) Series"( VOID ); EFI_STATUS EFIAPI 25FL(K) (0x4B48) - "Sppansion 25FL(K) Series"( VOID ); EFI_STATUS EFIAPI 25FL(L) (0x4B60) - "Sppansion 25FL(L) Series"( VOID ); EFI_STATUS EFIAPI 25Q (0x4B98) - "FIDELIX 25Q Series"( VOID ); EFI_STATUS EFIAPI FM25Q (00x4BB0) - "FuFFan FM25Q Series"( VOID ); EFI_STATUS EFIAPI II5LP (00x4BC8) - "ISSI I25LP Series"( VOID ); EFI_STATUS EFIAPI I25WP (0x4BE0) - "ISSI 25WP Series"( VOID ); EFI_STATUS EFIAPI MT5L QA/PA (00x4BF8) - "ESMT 25L AQA/PA Series"( VOID ); EFI_STATUS EFIAPI SSTVF (0x4C10) - "SST 25VF Series"( VOID ); EFI_STATUS EFIAPI MT5L T (0x4C20) - "ESMT 25L T Series"( VOID ); EFI_STATUS EFIAPI 25L B (0x4C38) - "ESMT 25L B Series"( VOID ); EFI_STATUS EFIAPI of FlashDriverSmm.c( VOID ); #endif /* __FLASHDRIVERSMM_H__ */