bios 基本测试代码 记录

#include  <Uefi.h>
#include  <Library/UefiLib.h>
//#include  <Library/ShellCEntryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include  <Protocol/UsbIo.h>

#include  <Protocol/AmiUsbController.h>


#include <AmiLib.h>
#include <AmiDxeLib.h>
#include <AmiDxeLib.h>

#include <Protocol/Smbios.h>
#include "EfiKey.h"


#include <Uefi.h>  
#include <Library/UefiLib.h>
#include <IndustryStandard/SmBios.h>
//#include <Library/UefiShellDebug1CommandsLib.h>
//#include <Library/LibSmbiosView.h> 


#include "HomeWorkDxe.h"

extern EFI_BOOT_SERVICES         *gBS;
extern EFI_HANDLE                     gImageHandle;


#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include  <Protocol/UsbIo.h>

#include  <Protocol/AmiUsbController.h>


#include <AmiDxeLib.h>

#include <Protocol/Smbios.h>
#include "EfiKey.h"


EFI_GUID  gEfiUsbIoProtocolGuid   = 
    { 0x2B2F68D6, 0x0CD2, 0x44CF, 
        { 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 }};

EFI_GUID  gEfiSimpleTextInputExProtocolGuid = 
    {0xdd9e7534, 0x7762, 0x4698, 
        { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa }};


EFI_GUID  ggEfiHomeWorkProtocolGuid = 
    {0x47590bea, 0x6178, 0x498d, 
        { 0xa9, 0x5, 0x3c, 0xe6, 0x63, 0xc3, 0x84, 0xd9 }};

#if 1

//*************************************************************************
//<AMI_PHDR_START>
//
// Name: Sprintf
//
// Description:
//  UINTN Sprintf(OUT CHAR8 *Buffer, IN CHAR8 *Format, IN ...) produces a
// null-terminated ASCII string in the output Buffer.  The ASCII string is
// produced by parsing the format string specified by Format.  Arguments are 
// pulled from the variable argument list based on the contents of the format
// string.  The number of ASCII characters in the produced output buffer is
// returned, not including the null-terminator. See notes for format string 
// information.
//
// Input:
//  OUT CHAR8 *Buffer
// Pointer to a null-terminated output ASCII string buffer.  User is
// responsible for allocating the necessary memory resources!
//
//  IN CHAR8 *Format
// Pointer to a null-terminated format ASCII string.
//
//  IN ...
// Variable argument list which provides the data/variables used within the
// format string.
//
// Output:
//  UINTN number of ASCII characters in the produced output buffer, not
// including the null-terminator.
//
// Modified:
//
// Referrals:
//  va_start
//  Sprintf_va_list
//  va_end
// 
// Notes:
//  Objects inside the format string have the following syntax.
//   %[flags][width]type
//
//  *** [flags] ***
//  
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
// . Flag  .  Description
// .       . 
// . -     .  The field is left justified.  If flag is not specified, then 
// .       . the field is right justified.
// .       . 
// . space .  Prefix a space character to a number.  Only valid for types X, 
// .       . x, and d.
// .       .  
// . +     .  Prefix a plus character to a number.  Only valid for types X,
// .       . x, and d.  If both space and `+' are specified, then space is
// .       . ignored.
// .       .
// . 0     .  Pad with `0' characters to the left of a number.  Only valid
// .       . for types X, x, and d.
// .       .
// . L, l  .  The number being printed is a UINT64.  Only valid for types X,
// .       . x, and d.  If this flag is not specified, then the number being
// .       . printed is an int.
// .       .
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
//  
//  NOTE
//   All invalid [flags] are ignored.
//
// *** [width] ***
//
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
// . Width  .  Description
// .        .
// . *      .  The width of the field is specified by a UINTN argument in the
// .        . argument list.
// .        .
// . Number .  The number specified as a decimal value represents the width of
// .        . the field.
// .        .
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
//
// NOTE
//  If [width] is not specified, then a field width of 0 is assumed.
//
// *** type ***
// 
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
// . Type  .  Description
// .       .
// . %     .  Print a `%'.
// .       .
// . c     .  The argument is an ASCII character. 
// .       .
// . x     .  The argument is a hexadecimal number.  The characters used are 
// .       . 0..9 and a..f.  If the flag `l' is not specified, then the
// .       . argument is assumed to be an int.
// .       .
// . X     .  The argument is a hexadecimal number.  The characters used are 
// .       . 0..9 and A..F.  If the flag `l' is not specified, then the
// .       . argument is assumed to be an int.
// .       .
// . d     .  The argument is a decimal number.  If the flag `l' is not
// .       . specified, then the argument is assumed to be an int.
// .       .
// . i     .  The same as `d'.
// .       .
// . s     .  The argument is a pointer to null-terminated ASCII string.
// .       .
// . a     .  The same as `s'.
// .       .
// . S     .  The argument is a pointer to a null-terminated Unicode string.
// .       .
// . g     .  The argument is a pointer to a GUID structure.  The GUID is
// .       . printed in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
// .       .
// . G     .  The argument is a pointer to a GUID structure.  The GUID is
// .       . printed in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
// .       .
// . r     .  The argument is an EFI_STATUS value.  This value is converted
// .       . to a string.
// .       .
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
//
// NOTE
//  All invalid type characters are copied into the result string.
//
//<AMI_PHDR_END>
//*************************************************************************

int macdbg_dmphex_kernel(const char* buff_in, int len)
{
    int retval = 0; 
    int x, y, tot, lineoff;
    const char* curr;
    CHAR16  buff[1024];
    UINTN index;
                                           

    DEBUG( (EFI_D_INFO, "dump addr -> 0x%x: \n", buff_in) );
    //DEBUG((EFI_D_INFO, "len = 0x%x.\n", len ));

    
    
    lineoff = 0;
    curr = buff_in;
    tot = 0;

    for( x = 0; x+16 < len; ){         
         index = 0x00;
         memset( buff, 0x00, sizeof(buff) );       
         Swprintf( &buff[index], L"0x%04x:  ", lineoff );
         index = Wcslen(buff);

         //DEBUG((EFI_D_INFO, "index = %d\n", index ));
         //DEBUG((EFI_D_INFO, "debug.0 = %s\n", buff  ));
         //DEBUG((EFI_D_INFO, "debug.1 = %S\n", buff  ));

         

         
         for( y = 0; y < 16; y++ ){
             Swprintf( &buff[index], L"%02x ", (unsigned char)*(curr + y) );             
              index = Wcslen(buff);
         }

         //DEBUG((EFI_D_INFO, "debug.2 = %s\n", buff  ));

         
         Swprintf( &buff[index], L"%s", L"    " );
         index = Wcslen(buff);
         for( y = 0; y < 16; y++ ){
              char c;
              c = *(curr + y);
              if( c > 31 && c < 127 ){
                  Swprintf( &buff[index], L"%c", c );
              }else{
                  Swprintf( &buff[index], L"%c", L'.' );
              }
              index = Wcslen(buff);
              tot++;
         }
         curr += 16;
         x += 16;
         lineoff+=16;
         Swprintf( &buff[index], L"%s", L"\n" );
         //printk("%s", buff);

         
         //DEBUG((EFI_D_INFO, "debug.2 = %s\n", buff    ));
         DEBUG((EFI_D_INFO, "%s", buff));
         
         //DEBUG((EFI_D_INFO, "debug.3 = %S\n", buff    ));
    }
     
    //do last line
    //Ser_Printf("tot %d.\r\n", tot );
    //Ser_Printf("len %d.\r\n", len );
    index = 0x00;
    memset( buff, 0x00, sizeof(buff) );
    if( tot < len ){
        curr = (buff_in + tot);
        Swprintf( &buff[index], L"0x%04x:  ", lineoff );
        index = Wcslen(buff);
        for( y = 0; y < (len - tot); y++ ){
             Swprintf( &buff[index], L"%02x ", (unsigned char)*(curr + y) );
             index = Wcslen(buff);
        }
        //padding with spaces
        //printk("(len - tot) %d.\r\n", (len - tot) );
        if( (len - tot) < 16 ){
            for( y = 0; y<(16-(len-tot)); y++ ){
                 Swprintf( &buff[index], L"%s", L"   " );  
                 index = index + 3;   
            }
        }
        
        Swprintf( &buff[index], L"%s", L"    " );  
        index = Wcslen(buff);           
        //Ser_Printf("(len - tot) %d.\r\n", (len - tot) );
        for( y = 0; y < (len - tot); y++ ){
             char c;
             c = *(curr + y);
             if( c > 31 && c < 127 ){
                 Swprintf( &buff[index], L"%c", c );
             }else{
                 Swprintf( &buff[index], L"%c", L'.' );
             }
             index = Wcslen(buff);
        }
    }
    Swprintf( &buff[index], L"%s", L"\n" );
    //printk("%s", buff);       
    DEBUG((EFI_D_INFO, "%s\n", buff));
    return retval;
}

#endif


        

/**
  Return SMBIOS string for the given string number.

  @param[in] Smbios         Pointer to SMBIOS structure.
  @param[in] StringNumber   String number to return. -1 is used to skip all strings and
                            point to the next SMBIOS structure.

  @return Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1
**/
CHAR8*
LibGetSmbiosString (
  IN  SMBIOS_STRUCTURE_POINTER    *Smbios,
  IN  UINT16                      StringNumber
  )
{
  UINT16  Index;
  CHAR8   *String;

  ASSERT (Smbios != NULL);

  //
  // Skip over formatted section
  //
  String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length);

  //
  // Look through unformated section
  //
  for (Index = 1; Index <= StringNumber; Index++) {
    if (StringNumber == Index) {
      return String;
    }
    //
    // Skip string
    //
    for (; *String != 0; String++);
    String++;

    if (*String == 0) {
      //
      // If double NULL then we are done.
      //  Return pointer to next structure in Smbios.
      //  if you pass in a -1 you will always get here
      //
      Smbios->Raw = (UINT8 *)++String;
      return NULL;
    }
  }

  return NULL;
}

//**********************************************************************
//<AMI_PHDR_START>
//
// Procedure:   EfiLibGetSystemConfigurationTable
//
// Description: Get table from configuration table by name
//
// Input:       IN EFI_GUID *TableGuid,
//              IN OUT VOID **Table
//
// Output:      EFI_STATUS
//
// Modified:
//
// Referrals:
//
// Notes:
//<AMI_PHDR_END>
//**********************************************************************
EFI_STATUS EfiLibGetSystemConfigurationTable(
    IN EFI_GUID *TableGuid,
    IN OUT VOID **Table )
{
    UINTN Index;

    *Table = NULL;

    for ( Index = 0; Index < gST->NumberOfTableEntries; Index++ )
    {
        if ( !CompareMem( TableGuid, &(gST->ConfigurationTable[Index].VendorGuid),
                          sizeof(EFI_GUID)))
        {
            *Table = gST->ConfigurationTable[Index].VendorTable;
            return EFI_SUCCESS;
        }
    }

    return EFI_NOT_FOUND;
}


void test_fuck(void)
{
    CHAR16  debug_buff[128];
    UINTN index;
    int len;
    
    memset( debug_buff, 0x00, sizeof(debug_buff) );

    index = 0x00;
    Swprintf( &debug_buff[index], L"0x%04x:  ", 0x1234 );
    index = Wcslen(debug_buff);
      
    len = sizeof(debug_buff);
    macdbg_dmphex_kernel((const char *)debug_buff, len );

    DEBUG( (EFI_D_INFO, "index = %d\n", index) );  
    DEBUG( (EFI_D_INFO, "in test_fuck 4 = %s\n", debug_buff) );
    
    

}


EFI_STATUS test_smbios_table()
{
  EFI_STATUS                      Status;
  SMBIOS_TABLE_ENTRY_POINT      *mSmbiosTable   = NULL;
  SMBIOS_STRUCTURE_POINTER      m_SmbiosStruct;
  SMBIOS_STRUCTURE_POINTER      *mSmbiosStruct = &m_SmbiosStruct;
      
  SMBIOS_STRUCTURE_POINTER  Smbios;
  SMBIOS_STRUCTURE_POINTER  SmbiosEnd;
  UINT8                      *Raw;
   
  UINT16                      Handle1 = 0;
  UINT8                      *Buffer1;
  UINT16                      Length1;

  UINT16                      *Handle;
  UINT8                      **Buffer;
  UINT16                      *Length;
  UINT8                      Type;
                
  mSmbiosTable = NULL;
      
  //Get SMBIOS table from System Configure table
  Status = EfiLibGetSystemConfigurationTable(&gEfiSmbiosTableGuid,(VOID**)&mSmbiosTable);
  if (mSmbiosTable == NULL){
    Print(L"%r.\n",Status);
  }
   
  //Init SMBIOS structure table address
  mSmbiosStruct->Raw    = (UINT8 *)(UINTN)(mSmbiosTable->TableAddress);  
  //Find the structure
  Handle = &Handle1;
  Length = &Length1;
  Buffer = &Buffer1;
   
  *Length       = 0;
  Smbios.Hdr      = mSmbiosStruct->Hdr;
  SmbiosEnd.Raw = Smbios.Raw + mSmbiosTable->TableLength;
  Print(L"TableLenth:%02d\n",mSmbiosTable->TableLength);
    
  while (Smbios.Raw < SmbiosEnd.Raw){
    if (Smbios.Hdr->Handle == *Handle){
      Raw = Smbios.Raw;
      Type = Smbios.Hdr->Type;
      //Walk to next structure
      LibGetSmbiosString(&Smbios,(UINT16)(-1));
      //Length = Next structure head - this structure head
      *Length = (UINT16)(Smbios.Raw - Raw);
      *Buffer = Raw;
          
      //update with the next structure handle.
      if (Smbios.Raw < SmbiosEnd.Raw){
        *Handle = Smbios.Hdr->Handle;
      } else{
        *Handle = (UINT16)(-1);
      }
      DEBUG( (EFI_D_INFO, "Handle:0x%04x Type:0x%02x Address:%08x Length:%04x.\n", *Handle - 1, Type, *Buffer, *Length) );
      macdbg_dmphex_kernel(*Buffer, *Length );
    }
  }
  *Handle = (UINT16)(-1);
  return EFI_SUCCESS;
}


#if 1
VOID HomeWorkDxeProtocolCallback( void )
{
    EFI_STATUS                             Status;
  
    EFI_HOMEWORKINTERFACE_PROTOCOL         *HomeworkProtocolinterface;
        
    //step.2
    DEBUG( (EFI_D_INFO, "in HomeWorkDxeProtocolCallback\n")); 


    DEBUG( (EFI_D_INFO, "gEfiHomeWorkProtocolGuid     : %g\n", ggEfiHomeWorkProtocolGuid ) );
    //CoreLocateProtocol
    Status = gBS->LocateProtocol(&ggEfiHomeWorkProtocolGuid,
                                 NULL,
                                 &HomeworkProtocolinterface );

    DEBUG((EFI_D_INFO,"HomeWorkPciread Status: %d\n",Status));
    
    if (!EFI_ERROR(Status)) {
        //step.3
        Status = HomeworkProtocolinterface->HomeWork_interface_func_0(0x55);
       
    }
}
#endif

/*
 * BootOrder.c
 *
 *  Created on: 2018年3月14日
 *      Author:
 */
 
 
 
 
#include <Uefi.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiLib.h>
//#include "UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.h"


#include <Protocol/DevicePathToText.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
#include <Uefi.h>
 
extern EFI_BOOT_SERVICES  *gBS;

EFI_GUID ggEfiDevicePathToTextProtocolGuid = 
    { 0x8b843e20, 0x8132, 0x4852, 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c };

//EFI_GUID  ggEfiHomeWorkProtocolGuid = 
    //{0x47590bea, 0x6178, 0x498d, 
        //{ 0xa9, 0x5, 0x3c, 0xe6, 0x63, 0xc3, 0x84, 0xd9 }};


 
VOID MmBootDev (void)
{         
    UINT16                             *VariablePtr;
    UINTN                              VariableSize = 0;
    EFI_STATUS                         Status;
    UINTN                              Count;
    EFI_LOAD_OPTION                    *EfiLoadOption;
    UINTN                              OptionSize = 0;
    CHAR16                             a[100];
    UINTN                              Index;
    UINT8                              NameLen;                          
    EFI_DEVICE_PATH_PROTOCOL           *pDevicePathProcotol;                 
    EFI_DEVICE_PATH_TO_TEXT_PROTOCOL   *pDevicePath2TextProtocol;            
    CHAR16                             *pStrDevicePath;                    
                                                                         
    EfiLoadOption  = NULL;  
    VariablePtr    = NULL;
    pStrDevicePath = NULL;
    //get bootcurrent
    Status  = gRT->GetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, NULL, &VariableSize, VariablePtr);
    if( Status == EFI_BUFFER_TOO_SMALL ){
        Status = gBS->AllocatePool (EfiBootServicesData, VariableSize, &VariablePtr);
    }
    gBS->SetMem(VariablePtr ,VariableSize, 0);
    Status  = gRT->GetVariable (L"BootCurrent", &gEfiGlobalVariableGuid, NULL, &VariableSize, VariablePtr);
    macdbg_dmphex_kernel( (const char *)VariablePtr, (int)VariableSize ); 
    UnicodeSPrint (a, sizeof (L"Boot1234"), L"Boot%04x", *VariablePtr);
    Print (L"1 = %s.\r\n",a);
       
    //get bootcurrent option.
    Status  = gRT->GetVariable (a, &gEfiGlobalVariableGuid, NULL, &OptionSize, EfiLoadOption);
    if( Status == EFI_BUFFER_TOO_SMALL ){
        Status = gBS->AllocatePool (EfiBootServicesData, OptionSize, &EfiLoadOption);
    }
    gBS->SetMem(EfiLoadOption ,OptionSize, 0);
    Status  = gRT->GetVariable (a, &gEfiGlobalVariableGuid, NULL, &OptionSize, EfiLoadOption);
    macdbg_dmphex_kernel( (const char *)EfiLoadOption, (int)OptionSize ); 
    Print (L"  DeviceName:%s\r\n",((UINT8*)EfiLoadOption+6));
      
    //get device path
    NameLen = (UINT8)StrLen((UINT16*)EfiLoadOption + 3);
    DEBUG((EFI_D_INFO,"ShellAppMain NameLen: %x\n",NameLen));
        
  Status = gBS->LocateProtocol(&ggEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&pDevicePath2TextProtocol);
  
  pDevicePathProcotol = (EFI_DEVICE_PATH_PROTOCOL*)((UINT8*)EfiLoadOption+ 6 + 2*(NameLen+1));
 
  pStrDevicePath = pDevicePath2TextProtocol->ConvertDevicePathToText (pDevicePathProcotol, TRUE, TRUE);
  Print (L"  DevicePath:%s\r\n",pStrDevicePath);


  Print (L"  DevicePath:%x\r\n",pStrDevicePath);
  

  
  //get boot order.
  Status  = gRT->GetVariable (L"BootOrder", &gEfiGlobalVariableGuid, NULL, &VariableSize, VariablePtr);
  Count = VariableSize / sizeof(UINT16);
  Index = Count - 1;
  if (Status == EFI_BUFFER_TOO_SMALL)
     Status = gBS->AllocatePool (EfiBootServicesData, VariableSize, &VariablePtr);
  gBS->SetMem(VariablePtr ,VariableSize, 0);
  Status  = gRT->GetVariable (L"BootOrder", &gEfiGlobalVariableGuid, NULL, &VariableSize, VariablePtr);
  while (Count--)
  {
    UnicodeSPrint (a, sizeof (L"Boot1234"), L"Boot%04x", VariablePtr[ Index - Count]);
    Print (L"%s\r\n",a);
    
    // get boot option.
    Status  = gRT->GetVariable (a, &gEfiGlobalVariableGuid, NULL, &OptionSize, EfiLoadOption);
    if (Status == EFI_BUFFER_TOO_SMALL)
       Status = gBS->AllocatePool (EfiBootServicesData, OptionSize, &EfiLoadOption);
    gBS->SetMem(EfiLoadOption ,OptionSize, 0);
    Status  = gRT->GetVariable (a, &gEfiGlobalVariableGuid, NULL, &OptionSize, EfiLoadOption);
    Print (L"  DeviceName:%s\r\n",((UINT8*)EfiLoadOption+6));
    //get device path
    NameLen = (UINT8)StrLen((UINT16*)EfiLoadOption + 3);
    Status = gBS->LocateProtocol(&ggEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&pDevicePath2TextProtocol);
    
    pDevicePathProcotol = (EFI_DEVICE_PATH_PROTOCOL*)((UINT8*)EfiLoadOption+ 6 + 2*(NameLen+1));
 
    pStrDevicePath = pDevicePath2TextProtocol->ConvertDevicePathToText (pDevicePathProcotol, TRUE, TRUE);
    Print (L"  DevicePath:%s\r\n",pStrDevicePath);
    Print (L"  DevicePath:%x\r\n",pStrDevicePath);
 
 
  }
  gBS->FreePool(pStrDevicePath);
  gBS->FreePool(EfiLoadOption); 
  gBS->FreePool(VariablePtr);

//此处代码有内存泄漏的毛病 这个玩意多次申请 却只是释放了一次

//虽然代码 有点瑕疵 但是对于初学bios的我来说 还是有参考意义的
  
 
}


 
INTN EFIAPI ShellAppMain( void )
{                      
    EFI_STATUS                      Status;
    IN OUT UINTN                    DataSize;
    OUT VOID                        *pData;
    UINT32                          Attributes;
    CHAR16                          *InputStr;
    UINT64                          Data;
     
    DataSize    = 0;
    pData       = NULL;
    InputStr    = NULL;
    Data        = 0;
      
    DEBUG((EFI_D_INFO,"ShellAppMain pData: %x\n",pData)); 
    Status = gRT->GetVariable(L"BootOrder", &gEfiGlobalVariableGuid, &Attributes, &DataSize,pData);
    DEBUG((EFI_D_INFO,"ShellAppMain Status: %d\n",Status));
    DEBUG((EFI_D_INFO,"ShellAppMain Status: %r\n",Status));
    DEBUG((EFI_D_INFO,"ShellAppMain DataSize: %d\n",DataSize));
    DEBUG((EFI_D_INFO,"ShellAppMain pData1: %x\n",pData));  
    if( Status == EFI_BUFFER_TOO_SMALL ){
        Status = gBS->AllocatePool(EfiBootServicesData, DataSize, &pData);
        DEBUG((EFI_D_INFO,"ShellAppMain pData2: %x\n",pData));
        Status = gRT->GetVariable(L"BootOrder", &gEfiGlobalVariableGuid, &Attributes, &DataSize,pData);
    }
    DEBUG((EFI_D_INFO,"ShellAppMain Status1: %d\n",Status));
    macdbg_dmphex_kernel( (const char *)pData, 12 ); 
    //DumpHex(0, 2, DataSize, pData);

  MmBootDev();


  #if 0
  ShellPromptForResponse (ShellPromptResponseTypeFreeform, NULL, (VOID**) &InputStr);
  if (EFI_ERROR (ShellConvertStringToUint64 (InputStr, &Data, TRUE, TRUE))) {
    Print(L"input data error.\r\n");
    return EFI_SUCCESS;
  }
  #endif

  
  //((UINT64*)pData)[0] = Data;
 
  //Status = gRT->SetVariable(L"BootOrder", &gEfiGlobalVariableGuid, Attributes, DataSize, pData);
  //DumpHex(0, 2, DataSize, pData);
  return EFI_SUCCESS;
 
}

EFI_STATUS UefiMain ( 
    IN EFI_HANDLE ImageHandle, 
    IN EFI_SYSTEM_TABLE  *SystemTable )
{       
    EFI_STATUS                        Status;
    Status = EFI_SUCCESS;
  
    DEBUG( (EFI_D_WARN, "start UefiMain...\n") ); 


  
    ShellAppMain();

    


     //HomeWorkDxeProtocolCallback();

    return EFI_SUCCESS;
}

#if 0


//xxvv

EFI_STATUS UefiMain ( 
    IN EFI_HANDLE ImageHandle, 
    IN EFI_SYSTEM_TABLE  *SystemTable )
{       
    EFI_STATUS                        Status;
    EFI_SMBIOS_HANDLE                 SmbiosHandle = 0;
    EFI_SMBIOS_TABLE_HEADER           *Record;
    EFI_SMBIOS_PROTOCOL               *Smbios;
    UINTN                             OrigStringNumber = 5;
    CHAR8                             *AsciiData = "smbios_test_str = 12345";
  
    DEBUG( (EFI_D_WARN, "start UefiMain...\n") ); 

     
    Status = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios);
    Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);

    DEBUG( (EFI_D_INFO, "gEfiSmbiosProtocolGuid     : %g\n", gEfiSmbiosProtocolGuid ) );

    
    

   
    DEBUG( (EFI_D_INFO, "Type    : %x\n", Record->Type) );
    DEBUG( (EFI_D_INFO, "Length  : %x\n", Record->Length) );
    DEBUG( (EFI_D_INFO, "Handle  : %x\n", Record->Handle) );
    macdbg_dmphex_kernel( (const char *)Record, 256 ); 
    Status = Smbios->UpdateString (Smbios, &SmbiosHandle, &OrigStringNumber, AsciiData);
    macdbg_dmphex_kernel((const char *)Record, 256 );
    return EFI_SUCCESS;
    test_smbios_table();
    
    
    return EFI_SUCCESS;
}     

#endif

                 
直接修改bios代码的方法去熟悉bios源码的效率 太低

每次必须整体编译 然后 烧录 固件

然后插上spi flash

重启 

重启之后 还得重新校准 sdram

然后又重启 保存 内存训练的参数

。。。。。。

 

编译一个shell efi文件 是一个不错的选择

无需重烧固件

efi模块拷贝到u盘

在shell下直接执行efi文件

 

类似于linux下的驱动模块 ko

此模式对于熟悉bios代码有用 一般初学 无需修改 bios的那些协议 

只是在模块中调用协议即可 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值