#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的那些协议
只是在模块中调用协议即可
本文介绍了一个UEFI程序实例,包括如何使用SMBIOS结构获取系统配置信息,以及如何通过UEFI运行时服务读取和解析启动选项。文章还探讨了在UEFI环境中调试和打印内存内容的方法。
2万+

被折叠的 条评论
为什么被折叠?



