public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch 0/4] Add "Test then Set" mechanism.
@ 2019-08-09  6:11 Dong, Eric
  2019-08-09  6:11 ` [Patch 1/4] UefiCpuPkg/RegisterCpuFeaturesLib: Add "detect before set" Micros Dong, Eric
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Dong, Eric @ 2019-08-09  6:11 UTC (permalink / raw)
  To: devel; +Cc: Ray Ni, Laszlo Ersek

Below code is current implementation:
  if (MsrRegister[ProcessorNumber].Bits.Lock == 0) {
    CPU_REGISTER_TABLE_WRITE_FIELD (
      ProcessorNumber,
      Msr,
      MSR_IA32_FEATURE_CONTROL,
      MSR_IA32_FEATURE_CONTROL_REGISTER,
      Bits.Lock,
      1
    );
  }

With below steps, the Bits.Lock bit will lose its value:
1. Trig normal boot, the Bits.Lock is 0. 1 will be added
   into the register table and then will set to the MSR.
2. Trig warm reboot, MSR value preserves. After normal boot phase,
   the Bits.Lock is 1, so it will not be added into the register
   table during the warm reboot phase.
3. Trig S3 then resume, the Bits.Lock change to 0 and Bits.Lock is
   not added in register table during normal boot phase. so it's
   still 0 after resume. 
This is not an expect behavior. The expect result is the value should
always 1 after booting or resuming from S3.

The root cause for this issue is
1. driver bases on current value to insert the "set value action" to
   the register table.
2. Some MSRs may reserve their value during warm reboot. So the insert
   action may be skip after warm reboot.

The solution for this issue is:
1. Always add "Test then Set" action for above referred MSRs.
2. Detect current value before set new value. Only set new value when
   current value not same as new value.

Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>

Eric Dong (4):
  UefiCpuPkg/RegisterCpuFeaturesLib: Add "detect before set" Micros.
  UefiCpuPkg/RegisterCpuFeaturesLib: Supports detect before set new
    value logic.
  UefiCpuPkg/PiSmmCpuDxeSmm: Supports detect before set new value logic.
  UefiCpuPkg/CpuCommonFeaturesLib: Use new micros.

 UefiCpuPkg/Include/AcpiCpuData.h              |   1 +
 .../Include/Library/RegisterCpuFeaturesLib.h  |  77 +++++++++-
 .../CpuCommonFeaturesLib/CpuCommonFeatures.h  |  15 --
 .../CpuCommonFeaturesLib.c                    |   8 +-
 .../CpuCommonFeaturesLib/FeatureControl.c     | 141 ++++++------------
 .../CpuCommonFeaturesLib/MachineCheck.c       |  23 ++-
 .../CpuFeaturesInitialize.c                   | 141 ++++++++++++------
 .../RegisterCpuFeaturesLib.c                  |  14 +-
 UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c             | 135 +++++++++++------
 9 files changed, 323 insertions(+), 232 deletions(-)

-- 
2.21.0.windows.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2019-08-12 13:01 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-08-09  6:11 [Patch 0/4] Add "Test then Set" mechanism Dong, Eric
2019-08-09  6:11 ` [Patch 1/4] UefiCpuPkg/RegisterCpuFeaturesLib: Add "detect before set" Micros Dong, Eric
2019-08-09 15:14   ` Laszlo Ersek
2019-08-12  7:46     ` [edk2-devel] " Dong, Eric
2019-08-12 13:01       ` Laszlo Ersek
2019-08-09 15:31   ` Laszlo Ersek
2019-08-12  8:05     ` Dong, Eric
2019-08-09  6:11 ` [Patch 2/4] UefiCpuPkg/RegisterCpuFeaturesLib: Supports detect before set new value logic Dong, Eric
2019-08-09  6:11 ` [Patch 3/4] UefiCpuPkg/PiSmmCpuDxeSmm: " Dong, Eric
2019-08-09 15:30   ` Laszlo Ersek
2019-08-12  8:37     ` [edk2-devel] " Dong, Eric
2019-08-09  6:11 ` [Patch 4/4] UefiCpuPkg/CpuCommonFeaturesLib: Use "Test then set" action Dong, Eric

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox