diff --git a/CloverEFI/OsxDxeCore/DxeMain/DxeMain.c b/CloverEFI/OsxDxeCore/DxeMain/DxeMain.c index c099ef91fd..a0b71a25c5 100644 --- a/CloverEFI/OsxDxeCore/DxeMain/DxeMain.c +++ b/CloverEFI/OsxDxeCore/DxeMain/DxeMain.c @@ -207,6 +207,7 @@ EFI_SYSTEM_TABLE *gDxeCoreST = NULL; EFI_RUNTIME_SERVICES *gDxeCoreRT = &mEfiRuntimeServicesTableTemplate; EFI_HANDLE gDxeCoreImageHandle = NULL; +static BOOLEAN mExitBootServicesCalled = FALSE; // // EFI Decompress Protocol @@ -778,9 +779,13 @@ CoreExitBootServices ( Status = CoreTerminateMemoryMap (MapKey); if (EFI_ERROR(Status)) { // - // Notify other drivers that ExitBootServices fail + // Notify other drivers that ExitBootServices fail. Do this ones // - CoreNotifySignalList (&gEventExitBootServicesFailedGuid); + //CoreNotifySignalList (&gEventExitBootServicesFailedGuid); + if (!mExitBootServicesCalled) { + CoreNotifySignalList (&gEventExitBootServicesFailedGuid); + mExitBootServicesCalled = TRUE; + } return Status; } diff --git a/Drivers/SataControllerDxe/SataController.c b/Drivers/SataControllerDxe/SataController.c index 8f8ebb232b..a11e8d61c6 100644 --- a/Drivers/SataControllerDxe/SataController.c +++ b/Drivers/SataControllerDxe/SataController.c @@ -355,6 +355,31 @@ SataControllerSupported ( EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; PCI_TYPE00 PciData; + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + // + // Attempt to open DevicePath Protocol + // + Status = gBS->OpenProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + (VOID *)&ParentDevicePath, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + /// + /// Close the protocol because we don't use it here + /// + gBS->CloseProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + Controller + ); + // // Attempt to open PCI I/O Protocol diff --git a/Drivers/SataControllerDxe/SataController.h b/Drivers/SataControllerDxe/SataController.h index 653aea7aa8..ef8dc4026f 100644 --- a/Drivers/SataControllerDxe/SataController.h +++ b/Drivers/SataControllerDxe/SataController.h @@ -17,6 +17,7 @@ #include #include +#include #include #include #include diff --git a/Drivers/SataControllerDxe/SataControllerDxe.inf b/Drivers/SataControllerDxe/SataControllerDxe.inf index 43bddc2f16..fc23c0d1b6 100644 --- a/Drivers/SataControllerDxe/SataControllerDxe.inf +++ b/Drivers/SataControllerDxe/SataControllerDxe.inf @@ -48,4 +48,5 @@ [Protocols] gEfiPciIoProtocolGuid gEfiIdeControllerInitProtocolGuid + gEfiDevicePathProtocolGuid diff --git a/Drivers/XhciDxe/XhciSched.c b/Drivers/XhciDxe/XhciSched.c index bd8f2fb860..99202e1d0b 100644 --- a/Drivers/XhciDxe/XhciSched.c +++ b/Drivers/XhciDxe/XhciSched.c @@ -2762,7 +2762,7 @@ XhcInitializeEndpointContext ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *)(IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); @@ -2954,7 +2954,7 @@ XhcInitializeEndpointContext64 ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *)(IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); @@ -3155,7 +3155,7 @@ XhcSetConfigCmd ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); @@ -3248,7 +3248,7 @@ XhcSetConfigCmd64 ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); @@ -3532,7 +3532,7 @@ XhcSetInterface ( IfDescActive = NULL; IfDescSet = NULL; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); while ((UINTN) IfDesc < ((UINTN) ConfigDesc + ConfigDesc->TotalLength)) { if ((IfDesc->DescriptorType == USB_DESC_TYPE_INTERFACE) && (IfDesc->Length >= sizeof (USB_INTERFACE_DESCRIPTOR))) { if (IfDesc->InterfaceNumber == (UINT8) Request->Index) { @@ -3734,7 +3734,7 @@ XhcSetInterface64 ( IfDescActive = NULL; IfDescSet = NULL; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); while ((UINTN) IfDesc < ((UINTN) ConfigDesc + ConfigDesc->TotalLength)) { if ((IfDesc->DescriptorType == USB_DESC_TYPE_INTERFACE) && (IfDesc->Length >= sizeof (USB_INTERFACE_DESCRIPTOR))) { if (IfDesc->InterfaceNumber == (UINT8) Request->Index) { diff --git a/FileSystems/FatPkg/EnhancedFatDxe/DirectoryManage.c b/FileSystems/FatPkg/EnhancedFatDxe/DirectoryManage.c index 0a7500e9fd..8f87cac73d 100644 --- a/FileSystems/FatPkg/EnhancedFatDxe/DirectoryManage.c +++ b/FileSystems/FatPkg/EnhancedFatDxe/DirectoryManage.c @@ -979,7 +979,7 @@ Routine Description: { EFI_STATUS Status; FAT_ODIR *ODir; - FAT_DIRENT *TempDirEnt; + FAT_DIRENT *TempDirEnt = NULL; UINT32 NewEndPos; ODir = OFile->ODir; diff --git a/FileSystems/FatPkg/EnhancedFatDxe/Info.c b/FileSystems/FatPkg/EnhancedFatDxe/Info.c index 9972df6a09..b8191cfd51 100644 --- a/FileSystems/FatPkg/EnhancedFatDxe/Info.c +++ b/FileSystems/FatPkg/EnhancedFatDxe/Info.c @@ -312,7 +312,7 @@ Routine Description: CHAR16 NewFileName[EFI_PATH_STRING_LENGTH]; EFI_TIME ZeroTime; FAT_DIRENT *DirEnt; - FAT_DIRENT *TempDirEnt; + FAT_DIRENT *TempDirEnt = NULL; UINT8 NewAttribute; BOOLEAN ReadOnly; diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c index 5cf6c77f33..fb2e6ecc88 100644 --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.c @@ -293,6 +293,30 @@ SataControllerSupported ( EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; PCI_TYPE00 PciData; + EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; + // + // Attempt to open DevicePath Protocol + // + Status = gBS->OpenProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + (VOID *)&ParentDevicePath, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + /// + /// Close the protocol because we don't use it here + /// + gBS->CloseProtocol ( + Controller, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + Controller + ); // // Attempt to open PCI I/O Protocol diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h index 7af3ad855f..97e24c941e 100644 --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataController.h @@ -15,6 +15,7 @@ #include #include +#include #include #include #include diff --git a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf index 488920a68c..e446058e34 100644 --- a/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf +++ b/MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf @@ -45,6 +45,7 @@ [Protocols] gEfiPciIoProtocolGuid ## TO_START gEfiIdeControllerInitProtocolGuid ## BY_START + gEfiDevicePathProtocolGuid [UserExtensions.TianoCore."ExtraFiles"] SataControllerDxeExtra.uni diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index c2906e06fd..c45a50e3a2 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -2808,7 +2808,7 @@ XhcInitializeEndpointContext ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *)(IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); @@ -3007,7 +3007,7 @@ XhcInitializeEndpointContext64 ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *)(IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length); @@ -3213,7 +3213,7 @@ XhcSetConfigCmd ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); @@ -3304,7 +3304,7 @@ XhcSetConfigCmd64 ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)IfDesc + IfDesc->Length); @@ -3588,7 +3588,7 @@ XhcSetInterface ( IfDescActive = NULL; IfDescSet = NULL; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); while ((UINTN)IfDesc < ((UINTN)ConfigDesc + ConfigDesc->TotalLength)) { if ((IfDesc->DescriptorType == USB_DESC_TYPE_INTERFACE) && (IfDesc->Length >= sizeof (USB_INTERFACE_DESCRIPTOR))) { if (IfDesc->InterfaceNumber == (UINT8)Request->Index) { @@ -3794,7 +3794,7 @@ XhcSetInterface64 ( IfDescActive = NULL; IfDescSet = NULL; - IfDesc = (USB_INTERFACE_DESCRIPTOR *)(ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *)((UINTN)ConfigDesc + ConfigDesc->Length); while ((UINTN)IfDesc < ((UINTN)ConfigDesc + ConfigDesc->TotalLength)) { if ((IfDesc->DescriptorType == USB_DESC_TYPE_INTERFACE) && (IfDesc->Length >= sizeof (USB_INTERFACE_DESCRIPTOR))) { if (IfDesc->InterfaceNumber == (UINT8)Request->Index) { diff --git a/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c index 0e21422dd8..092d657d7e 100644 --- a/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c @@ -1708,7 +1708,7 @@ XhcPeiSetConfigCmd ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *) (ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *) ((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *) ((UINTN) IfDesc + IfDesc->Length); @@ -1716,7 +1716,7 @@ XhcPeiSetConfigCmd ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *) (IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *) ((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *) ((UINTN) EpDesc + EpDesc->Length); @@ -1924,7 +1924,7 @@ XhcPeiSetConfigCmd64 ( MaxDci = 0; - IfDesc = (USB_INTERFACE_DESCRIPTOR *) (ConfigDesc + 1); + IfDesc = (USB_INTERFACE_DESCRIPTOR *) ((UINTN)ConfigDesc + ConfigDesc->Length); for (Index = 0; Index < ConfigDesc->NumInterfaces; Index++) { while ((IfDesc->DescriptorType != USB_DESC_TYPE_INTERFACE) || (IfDesc->AlternateSetting != 0)) { IfDesc = (USB_INTERFACE_DESCRIPTOR *) ((UINTN) IfDesc + IfDesc->Length); @@ -1932,7 +1932,7 @@ XhcPeiSetConfigCmd64 ( NumEp = IfDesc->NumEndpoints; - EpDesc = (USB_ENDPOINT_DESCRIPTOR *) (IfDesc + 1); + EpDesc = (USB_ENDPOINT_DESCRIPTOR *) ((UINTN)IfDesc + IfDesc->Length); for (EpIndex = 0; EpIndex < NumEp; EpIndex++) { while (EpDesc->DescriptorType != USB_DESC_TYPE_ENDPOINT) { EpDesc = (USB_ENDPOINT_DESCRIPTOR *) ((UINTN) EpDesc + EpDesc->Length); diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c index bbed6bcc7c..e04972e3b7 100644 --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c @@ -202,6 +202,7 @@ EFI_RUNTIME_SERVICES *gDxeCoreRT = &mEfiRuntimeServicesTableTemplate; EFI_HANDLE gDxeCoreImageHandle = NULL; BOOLEAN gMemoryMapTerminated = FALSE; +static BOOLEAN mExitBootServicesCalled = FALSE; // // EFI Decompress Protocol @@ -755,6 +756,10 @@ CoreExitBootServices ( // Notify other drivers that ExitBootServices fail // CoreNotifySignalList (&gEventExitBootServicesFailedGuid); + if (!mExitBootServicesCalled) { + CoreNotifySignalList (&gEventExitBootServicesFailedGuid); + mExitBootServicesCalled = TRUE; + } return Status; } diff --git a/MdePkg/Include/Protocol/BootManagerPolicy.h b/MdePkg/Include/Protocol/BootManagerPolicy.h index 34032a3293..4d3bfee7b5 100644 --- a/MdePkg/Include/Protocol/BootManagerPolicy.h +++ b/MdePkg/Include/Protocol/BootManagerPolicy.h @@ -5,6 +5,7 @@ to connect devices using platform policy. Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -31,6 +32,11 @@ 0x113B2126, 0xFC8A, 0x11E3, { 0xBD, 0x6C, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA } \ } +#define EFI_BOOT_MANAGER_POLICY_STORAGE_GUID \ + { \ + 0xCD68FE79, 0xD3CB, 0x436E, { 0xA8, 0x50, 0xF4, 0x43, 0xC8, 0x8C, 0xFB, 0x49 } \ + } + typedef struct _EFI_BOOT_MANAGER_POLICY_PROTOCOL EFI_BOOT_MANAGER_POLICY_PROTOCOL; #define EFI_BOOT_MANAGER_POLICY_PROTOCOL_REVISION 0x00010000 @@ -98,6 +104,12 @@ EFI_STATUS EFI_BOOT_SERVICES.ConnectController(). If the Boot Manager has policy associated with connect all UEFI drivers this policy will be used. + If Class is EFI_BOOT_MANAGER_POLICY_STORAGE_GUID then the Boot Manager will + connect the protocols associated with the discoverable storage disks. This may include + EFI_BLOCK_IO_PROTOCOL, EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, or other storage protocols + appropriate to the device. Some platforms may choose to restrict the connected + devices to exclude USB or other peripherals. + A platform can also define platform specific Class values as a properly generated EFI_GUID would never conflict with this specification. @@ -128,5 +140,6 @@ extern EFI_GUID gEfiBootManagerPolicyProtocolGuid; extern EFI_GUID gEfiBootManagerPolicyConsoleGuid; extern EFI_GUID gEfiBootManagerPolicyNetworkGuid; extern EFI_GUID gEfiBootManagerPolicyConnectAllGuid; +extern EFI_GUID gEfiBootManagerPolicyStorageGuid; #endif diff --git a/MdePkg/Include/Register/Amd/Msr.h b/MdePkg/Include/Register/Amd/Msr.h index e74de7a1df..6b34ffafc6 100644 --- a/MdePkg/Include/Register/Amd/Msr.h +++ b/MdePkg/Include/Register/Amd/Msr.h @@ -17,7 +17,8 @@ #ifndef __AMD_MSR_H__ #define __AMD_MSR_H__ -#include +#include +#include #include #endif diff --git a/MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf b/MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf index 729f6a3083..0cd63111ca 100644 --- a/MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf +++ b/MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf @@ -32,6 +32,7 @@ PcdLib DebugLib IoLib + UefiBootServicesTableLib [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress ## CONSUMES diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index ed18026487..8d82904ff5 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -629,6 +629,7 @@ gEfiBootManagerPolicyConsoleGuid = { 0xCAB0E94C, 0xE15F, 0x11E3, { 0x91, 0x8D, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA }} gEfiBootManagerPolicyNetworkGuid = { 0xD04159DC, 0xE15F, 0x11E3, { 0xB2, 0x61, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA }} gEfiBootManagerPolicyConnectAllGuid = { 0x113B2126, 0xFC8A, 0x11E3, { 0xBD, 0x6C, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA }} + gEfiBootManagerPolicyStorageGuid = { 0xCD68FE79, 0xD3CB, 0x436E, { 0xA8, 0x50, 0xF4, 0x43, 0xC8, 0x8C, 0xFB, 0x49 }} ## Include/Protocol/DevicePath.h gEfiVirtualDiskGuid = { 0x77AB535A, 0x45FC, 0x624B, {0x55, 0x60, 0xF7, 0xB2, 0x81, 0xD1, 0xF9, 0x6E }}