public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Dong, Eric" <eric.dong@intel.com>
To: "Ni, Ray" <ray.ni@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [PATCH] UefiCpuPkg/MtrrLib: Fix a bug that may wrongly set memory <1MB to UC
Date: Tue, 19 Feb 2019 05:33:34 +0000	[thread overview]
Message-ID: <ED077930C258884BBCB450DB737E662259DB173B@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <20190121151643.47824-1-ruiyu.ni@intel.com>

Hi Ray,

Sorry for later response.  

Reviewed-by: Eric Dong <eric.dong@intel.com>

Thanks,
Eric
> -----Original Message-----
> From: Ni, Ray
> Sent: Monday, January 21, 2019 11:17 PM
> To: edk2-devel@lists.01.org
> Cc: Ni, Ray <ray.ni@intel.com>; Dong, Eric <eric.dong@intel.com>; Chiu,
> Chasel <chasel.chiu@intel.com>
> Subject: [PATCH] UefiCpuPkg/MtrrLib: Fix a bug that may wrongly set
> memory <1MB to UC
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1481
> 
> Today's MtrrLib contains a bug, for example:
>  when the original cache setting is WB for [0xF_0000, 0xF_8000) and,  a new
> request to set [0xF_0000, 0xF_4000) to WP,  the cache setting for [0xF_4000,
> 0xF_8000) is reset to UC.
> 
> The reason is when MtrrLibSetBelow1MBMemoryAttribute() is called the
> WorkingFixedSettings doesn't contain the actual MSR value stored in
> hardware, but when writing the fixed MTRRs, the code logic assumes
> WorkingFixedSettings contains the actual MSR value.
> 
> The new fix is to change MtrrLibSetBelow1MBMemoryAttribute() to
> calculate the correct ClearMasks[] and OrMasks[], and use them directly
> when writing the fixed MTRRs.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ray Ni <ray.ni@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> ---
>  UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 59 +++++++++-------------------
>  1 file changed, 18 insertions(+), 41 deletions(-)
> 
> diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
> b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
> index 086f7ad8f0..2cf7d092e8 100644
> --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
> +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
> @@ -5,7 +5,7 @@
>      Most of services in this library instance are suggested to be invoked by BSP
> only,
>      except for MtrrSetAllMtrrs() which is used to sync BSP's MTRR setting to
> APs.
> 
> -  Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2008 - 2019, Intel Corporation. All rights
> + reserved.<BR>
>    This program and the accompanying materials
>    are licensed and made available under the terms and conditions of the BSD
> License
>    which accompanies this distribution.  The full text of the license may be
> found at @@ -2099,8 +2099,8 @@ MtrrLibSetMemoryRanges (
>    Set the below-1MB memory attribute to fixed MTRR buffer.
>    Modified flag array indicates which fixed MTRR is modified.
> 
> -  @param [in, out] FixedSettings Fixed MTRR buffer.
> -  @param [out]     Modified      Flag array indicating which MTRR is modified.
> +  @param [in, out] ClearMasks    The bits to clear in the fixed MTRR MSR.
> +  @param [in, out] OrMasks       The bits to set in the fixed MTRR MSR.
>    @param [in]      BaseAddress   Base address.
>    @param [in]      Length        Length.
>    @param [in]      Type          Memory type.
> @@ -2111,8 +2111,8 @@ MtrrLibSetMemoryRanges (  **/  RETURN_STATUS
> MtrrLibSetBelow1MBMemoryAttribute (
> -  IN OUT MTRR_FIXED_SETTINGS     *FixedSettings,
> -  OUT BOOLEAN                    *Modified,
> +  IN OUT UINT64                  *ClearMasks,
> +  IN OUT UINT64                  *OrMasks,
>    IN PHYSICAL_ADDRESS            BaseAddress,
>    IN UINT64                      Length,
>    IN MTRR_MEMORY_CACHE_TYPE      Type
> @@ -2122,36 +2122,17 @@ MtrrLibSetBelow1MBMemoryAttribute (
>    UINT32                    MsrIndex;
>    UINT64                    ClearMask;
>    UINT64                    OrMask;
> -  UINT64                    ClearMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
> -  UINT64                    OrMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
> -  BOOLEAN                   LocalModified[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
> 
>    ASSERT (BaseAddress < BASE_1MB);
> 
> -  SetMem (LocalModified, sizeof (LocalModified), FALSE);
> -
> -  //
> -  // (Value & ~0 | 0) still equals to (Value)
> -  //
> -  SetMem (ClearMasks, sizeof (ClearMasks), 0);
> -  SetMem (OrMasks, sizeof (OrMasks), 0);
> -
>    MsrIndex = (UINT32)-1;
>    while ((BaseAddress < BASE_1MB) && (Length != 0)) {
>      Status = MtrrLibProgramFixedMtrr (Type, &BaseAddress, &Length,
> &MsrIndex, &ClearMask, &OrMask);
>      if (RETURN_ERROR (Status)) {
>        return Status;
>      }
> -    ClearMasks[MsrIndex]    = ClearMask;
> -    OrMasks[MsrIndex]       = OrMask;
> -    Modified[MsrIndex]      = TRUE;
> -    LocalModified[MsrIndex] = TRUE;
> -  }
> -
> -  for (MsrIndex = 0; MsrIndex < ARRAY_SIZE (mMtrrLibFixedMtrrTable);
> MsrIndex++) {
> -    if (LocalModified[MsrIndex]) {
> -      FixedSettings->Mtrr[MsrIndex] = (FixedSettings->Mtrr[MsrIndex] &
> ~ClearMasks[MsrIndex]) | OrMasks[MsrIndex];
> -    }
> +    ClearMasks[MsrIndex] = ClearMasks[MsrIndex] | ClearMask;
> +    OrMasks[MsrIndex]    = (OrMasks[MsrIndex] & ~ClearMask) | OrMask;
>    }
>    return RETURN_SUCCESS;
>  }
> @@ -2213,8 +2194,8 @@ MtrrSetMemoryAttributesInMtrrSettings (
>    MTRR_MEMORY_RANGE         WorkingVariableMtrr[ARRAY_SIZE
> (MtrrSetting->Variables.Mtrr)];
>    BOOLEAN                   VariableSettingModified[ARRAY_SIZE (MtrrSetting-
> >Variables.Mtrr)];
> 
> -  BOOLEAN                   FixedSettingsModified[ARRAY_SIZE
> (mMtrrLibFixedMtrrTable)];
> -  MTRR_FIXED_SETTINGS       WorkingFixedSettings;
> +  UINT64                    ClearMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
> +  UINT64                    OrMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
> 
>    MTRR_CONTEXT              MtrrContext;
>    BOOLEAN                   MtrrContextValid;
> @@ -2226,10 +2207,6 @@ MtrrSetMemoryAttributesInMtrrSettings (
>    // TRUE indicating the accordingly Variable setting needs modificaiton in
> OriginalVariableMtrr.
>    //
>    SetMem (VariableSettingModified, ARRAY_SIZE (VariableSettingModified),
> FALSE);
> -  //
> -  // TRUE indicating the accordingly Fixed setting needs modification in
> WorkingFixedSettings.
> -  //
> -  SetMem (FixedSettingsModified, ARRAY_SIZE (FixedSettingsModified),
> FALSE);
> 
>    //
>    // TRUE indicating the caller requests to set variable MTRRs.
> @@ -2405,14 +2382,17 @@ MtrrSetMemoryAttributesInMtrrSettings (
>    //
>    // 3. Apply the below-1MB memory attribute settings.
>    //
> -  ZeroMem (WorkingFixedSettings.Mtrr, sizeof
> (WorkingFixedSettings.Mtrr));
> +  // (Value & ~0 | 0) still equals to (Value)  //  ZeroMem (ClearMasks,
> + sizeof (ClearMasks));  ZeroMem (OrMasks, sizeof (OrMasks));
>    for (Index = 0; Index < RangeCount; Index++) {
>      if (Ranges[Index].BaseAddress >= BASE_1MB) {
>        continue;
>      }
> 
>      Status = MtrrLibSetBelow1MBMemoryAttribute (
> -               &WorkingFixedSettings, FixedSettingsModified,
> +               ClearMasks, OrMasks,
>                 Ranges[Index].BaseAddress, Ranges[Index].Length,
> Ranges[Index].Type
>                 );
>      if (RETURN_ERROR (Status)) {
> @@ -2424,19 +2404,16 @@ MtrrSetMemoryAttributesInMtrrSettings (
>    //
>    // 4. Write fixed MTRRs that have been modified
>    //
> -  for (Index = 0; Index < ARRAY_SIZE (FixedSettingsModified); Index++) {
> -    if (FixedSettingsModified[Index]) {
> +  for (Index = 0; Index < ARRAY_SIZE (ClearMasks); Index++) {
> +    if (ClearMasks[Index] != 0) {
>        if (MtrrSetting != NULL) {
> -        MtrrSetting->Fixed.Mtrr[Index] = WorkingFixedSettings.Mtrr[Index];
> +        MtrrSetting->Fixed.Mtrr[Index] =
> + (MtrrSetting->Fixed.Mtrr[Index] & ~ClearMasks[Index]) |
> + OrMasks[Index];
>        } else {
>          if (!MtrrContextValid) {
>            MtrrLibPreMtrrChange (&MtrrContext);
>            MtrrContextValid = TRUE;
>          }
> -        AsmWriteMsr64 (
> -          mMtrrLibFixedMtrrTable[Index].Msr,
> -          WorkingFixedSettings.Mtrr[Index]
> -        );
> +        AsmMsrAndThenOr64 (mMtrrLibFixedMtrrTable[Index].Msr,
> + ~ClearMasks[Index], OrMasks[Index]);
>        }
>      }
>    }
> --
> 2.20.1.windows.1



      parent reply	other threads:[~2019-02-19  5:33 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-21 15:16 [PATCH] UefiCpuPkg/MtrrLib: Fix a bug that may wrongly set memory <1MB to UC Ruiyu Ni
2019-01-22  1:17 ` Chiu, Chasel
2019-02-19  5:33 ` Dong, Eric [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ED077930C258884BBCB450DB737E662259DB173B@shsmsx102.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox