From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=212.61.153.67; helo=mail.prodrive-technologies.com; envelope-from=hristo.mihaylov@prodrive-technologies.com; receiver=edk2-devel@lists.01.org Received: from mail.prodrive-technologies.com (mail.prodrive-technologies.com [212.61.153.67]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id A542D21B02822 for ; Thu, 4 Oct 2018 03:56:24 -0700 (PDT) Received: from mail.prodrive-technologies.com (localhost.localdomain [127.0.0.1]) by localhost (Email Security Appliance) with SMTP id 15A6432FF3_BB5F1D6B for ; Thu, 4 Oct 2018 10:56:22 +0000 (GMT) Received: from mail.prodrive-technologies.com (mdb-dag.prodrive.nl [10.1.1.212]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (Client CN "mail.prodrive-technologies.com", Issuer "Prodrive Technologies B.V. OV SSL Issuing CA" (verified OK)) by mail.prodrive-technologies.com (Sophos Email Appliance) with ESMTPS id 9BE22306C1_BB5F1D5F for ; Thu, 4 Oct 2018 10:56:21 +0000 (GMT) Received: from EXC04.bk.prodrive.nl (10.1.1.213) by EXC03.bk.prodrive.nl (10.1.1.212) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1261.35; Thu, 4 Oct 2018 12:56:18 +0200 Received: from EXC04.bk.prodrive.nl ([fe80::652c:6b39:fe91:49c8]) by EXC04.bk.prodrive.nl ([fe80::652c:6b39:fe91:49c8%15]) with mapi id 15.01.1261.035; Thu, 4 Oct 2018 12:56:18 +0200 From: Hristo Mihaylov To: "edk2-devel@lists.01.org" Thread-Topic: RuntimeDXE unable to save variables to flash Thread-Index: AdRb0OAOM9LmzENHTFmm0N1V+JNYZA== Date: Thu, 4 Oct 2018 10:56:18 +0000 Message-ID: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.1.2.1] MIME-Version: 1.0 X-SASI-RCODE: 200 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: RuntimeDXE unable to save variables to flash X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Oct 2018 10:56:25 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello, I have an issue that I don't know how to fix. I'm building a BIOS for a cus= tom x86_64 platform. The first part of the problem is: the BIOS boots to the end of DXE where it crashes with a General Protection exception. ``` !!!! X64 Exception Type - 0D(#GP - General Protection) CPU Apic ID - 00000= 027 !!!! RIP - 0000000077ADE823, CS - 0000000000000038, RFLAGS - 0000000000010047 ExceptionData - 0000000000000000 RAX - 00000000FFFFFFFF, RCX - 00000000000001FE, RDX - 0000000000000000 RBX - 00000000FFFFFFFF, RSP - 0000000075B443C0, RBP - 00000000800FD000 RSI - 0000000000000001, RDI - 0000000077AFC520 R8 - 0000000077AFC618, R9 - 0000000000000001, R10 - 0000000070000000 R11 - 00000000758B7F10, R12 - 0000000077AFC510, R13 - 0000000000000001 R14 - 0000000080000000, R15 - 0000000002C30064 DS - 0000000000000020, ES - 0000000000000020, FS - 0000000000000020 GS - 0000000000000020, SS - 0000000000000020 CR0 - 0000000080000033, CR2 - 0000000000000000, CR3 - 0000000075977000 CR4 - 0000000000000668, CR8 - 0000000000000000 DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000 DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400 GDTR - 0000000075986928 000000000000004F, LDTR - 0000000000000000 IDTR - 0000000077ACF400 00000000000001FF, TR - 0000000000000040 FXSAVE_STATE - 0000000075B44020 ``` This exception occurs when the BIOS is enabling or disabling the write protection of the SPI. It only crashes when it's doing the protection in SM= M. The code responsible for that is: ``` EFI_STATUS EFIAPI DisableBiosWriteProtect ( VOID ) { UINTN SpiBaseAddress; UINT32 Data32; SpiBaseAddress =3D MmPciBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SPI, PCI_FUNCTION_NUMBER_PCH_SPI ); // Write clear BC_SYNC_SS prior to change WPD from 0 to 1. // MmioOr8 ( SpiBaseAddress + R_PCH_SPI_BC + 1, (B_PCH_SPI_BC_SYNC_SS >> 8) ); /// /// Set BIOSWE bit (SPI PCI Offset DCh [0]) =3D 1b /// Enable the access to the BIOS space for both read and write cycles /// MmioOr8 ( SpiBaseAddress + R_PCH_SPI_BC, B_PCH_SPI_BC_WPD ); /// /// PCH BIOS Spec Section 3.7 BIOS Region SMM Protection Enabling /// If the following steps are implemented: /// - Set the EISS bit (SPI PCI Offset DCh [5]) =3D 1b /// - Follow the 1st recommendation in section 3.6 /// the BIOS Region can only be updated by following the steps bellow: /// - Once all threads enter SMM /// - Read memory location FED30880h OR with 00000001h, place the result= in EAX, /// and write data to lower 32 bits of MSR 1FEh (sample code available= ) /// - Set BIOSWE bit (SPI PCI Offset DCh [0]) =3D 1b /// - Modify BIOS Region /// - Clear BIOSWE bit (SPI PCI Offset DCh [0]) =3D 0b /// if ((MmioRead8 (SpiBaseAddress + R_PCH_SPI_BC) & B_PCH_SPI_BC_EISS) !=3D = 0) { /// /// Read memory location FED30880h OR with 00000001h, place the result = in EAX, /// and write data to lower 32 bits of MSR 1FEh (sample code available) /// Data32 =3D MmioRead32 ((UINTN) (0xFED30880)) | BIT0; // crash occurs here AsmWriteMsr32 (0x1FE, Data32); } return EFI_SUCCESS; } VOID EFIAPI EnableBiosWriteProtect ( VOID ) { UINTN SpiBaseAddress; UINT32 Data32; SpiBaseAddress =3D MmPciBase ( DEFAULT_PCI_BUS_NUMBER_PCH, PCI_DEVICE_NUMBER_PCH_SPI, PCI_FUNCTION_NUMBER_PCH_SPI ); /// /// Clear BIOSWE bit (SPI PCI Offset DCh [0]) =3D 0b /// Disable the access to the BIOS space for write cycles /// MmioAnd8 ( SpiBaseAddress + R_PCH_SPI_BC, (UINT8) (~B_PCH_SPI_BC_WPD) ); /// /// Check if EISS bit is set /// if (((MmioRead8 (SpiBaseAddress + R_PCH_SPI_BC)) & B_PCH_SPI_BC_EISS) =3D= =3D B_PCH_SPI_BC_EISS) { /// /// Read memory location FED30880h AND with FFFFFFFEh, place the result= in EAX, /// and write data to lower 32 bits of MSR 1FEh (sample code available) /// Data32 =3D MmioRead32 ((UINTN) (0xFED30880)) & (~BIT0); // crash occurs here //AsmWriteMsr32 (0x1FE, Data32); } } ``` I can work around the crash by hardcoding the values 0x0 and 0x1, or commen= ting out the writes. The second part is that variables cannot be saved or updated: ``` Variable driver flush the HOB variable to flash: {guid} TCG2_CONFIGURATION = Invalid Parameter Variable driver flush the HOB variable to flash: {guid} Setup Invalid Param= eter Variable driver flush the HOB variable to flash: {guid} PchRcConfiguration = Invalid Parameter Variable driver flush the HOB variable to flash: {guid} MeRcConfiguration I= nvalid Parameter Variable driver flush the HOB variable to flash: {guid} IeRcConfiguration I= nvalid Parameter Variable driver flush the HOB variable to flash: {guid} SocketIioConfig Inv= alid Parameter Variable driver flush the HOB variable to flash: {guid} SocketCommonRcConfi= g Invalid Parameter Variable driver flush the HOB variable to flash: {guid} SocketMpLinkConfig = Invalid Parameter Variable driver flush the HOB variable to flash: {guid} SocketMemoryConfig = Invalid Parameter Variable driver flush the HOB variable to flash: {guid} SocketPowerManageme= ntConfig Invalid Parameter Variable driver flush the HOB variable to flash: {guid} SocketProcessorCore= Config Invalid Parameter Variable driver flush the HOB variable to flash: {guid} FpgaSocketConfig In= valid Parameter ``` I can't save variables to non-volatile storage, I can save some to volatile storage, but others I cannot save at all. I tracked the failure down to here: https://github.com/tianocore/edk2/blob/= master/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c#L338 and I'm not sure how to proceed. The platform is based on UDK2015. Any advice? --- Regards, Hristo Mihaylov