On 08/12/19 12:31, Dong, Eric wrote: > Signed-off-by: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > --- > .../CpuFeaturesInitialize.c | 112 ++++++++++-------- > 1 file changed, 64 insertions(+), 48 deletions(-) > > diff --git > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c > index fb0535edd6..ef7452e2b8 100644 > --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c > +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c > @@ -744,6 +744,58 @@ LibWaitForSemaphore ( > ) != Value); > } > > +/** > + Read / write CR value. > + > + @param[in] CrIndex The CR index which need to read/write. > + @param[in] Read Read or write. TRUE is read. > + @param[in,out] CrValue CR value. > + > + @retval EFI_SUCCESS means read/write success, else return > EFI_UNSUPPORTED. > +**/ > +UINTN > +ReadWriteCr ( > + IN UINT32 CrIndex, > + IN BOOLEAN Read, > + IN OUT UINTN *CrValue > + ) > +{ > + switch (CrIndex) { > + case 0: > + if (Read) { > + *CrValue = AsmReadCr0 (); > + } else { > + AsmWriteCr0 (*CrValue); > + } > + break; > + case 2: > + if (Read) { > + *CrValue = AsmReadCr2 (); > + } else { > + AsmWriteCr2 (*CrValue); > + } > + break; > + case 3: > + if (Read) { > + *CrValue = AsmReadCr3 (); > + } else { > + AsmWriteCr3 (*CrValue); > + } > + break; > + case 4: > + if (Read) { > + *CrValue = AsmReadCr4 (); > + } else { > + AsmWriteCr4 (*CrValue); > + } > + break; > + default: > + return EFI_UNSUPPORTED;; > + } > + > + return EFI_SUCCESS; > +} > + > /** > Initialize the CPU registers from a register table. > > @@ -773,6 +825,7 @@ ProgramProcessorRegister ( > UINTN ProcessorIndex; > UINTN ValidThreadCount; > UINT32 *ValidCoreCountPerPackage; > + EFI_STATUS Status; > > // > // Traverse Register Table of this logical processor > @@ -791,55 +844,18 @@ ProgramProcessorRegister ( > // The specified register is Control Register > // > case ControlRegister: > - switch (RegisterTableEntry->Index) { > - case 0: > - Value = AsmReadCr0 (); > - Value = (UINTN) BitFieldWrite64 ( > - Value, > - RegisterTableEntry->ValidBitStart, > - RegisterTableEntry->ValidBitStart + > RegisterTableEntry->ValidBitLength - 1, > - RegisterTableEntry->Value > - ); > - AsmWriteCr0 (Value); > - break; > - case 2: > - Value = AsmReadCr2 (); > - Value = (UINTN) BitFieldWrite64 ( > - Value, > - RegisterTableEntry->ValidBitStart, > - RegisterTableEntry->ValidBitStart + > RegisterTableEntry->ValidBitLength - 1, > - RegisterTableEntry->Value > - ); > - AsmWriteCr2 (Value); > - break; > - case 3: > - Value = AsmReadCr3 (); > - Value = (UINTN) BitFieldWrite64 ( > - Value, > - RegisterTableEntry->ValidBitStart, > - RegisterTableEntry->ValidBitStart + > RegisterTableEntry->ValidBitLength - 1, > - RegisterTableEntry->Value > - ); > - AsmWriteCr3 (Value); > - break; > - case 4: > - Value = AsmReadCr4 (); > - Value = (UINTN) BitFieldWrite64 ( > - Value, > - RegisterTableEntry->ValidBitStart, > - RegisterTableEntry->ValidBitStart + > RegisterTableEntry->ValidBitLength - 1, > - RegisterTableEntry->Value > - ); > - AsmWriteCr4 (Value); > - break; > - case 8: > - // > - // Do we need to support CR8? > - // > - break; > - default: > - break; > + Status = ReadWriteCr (RegisterTableEntry->Index, TRUE, &Value); > + if (EFI_ERROR (Status)) { > + continue; > } > + > + Value = (UINTN) BitFieldWrite64 ( > + Value, > + RegisterTableEntry->ValidBitStart, > + RegisterTableEntry->ValidBitStart + > RegisterTableEntry->ValidBitLength - 1, > + RegisterTableEntry->Value > + ); > + ReadWriteCr (RegisterTableEntry->Index, FALSE, &Value); > break; > // > // The specified register is Model Specific Register >
Acked-by: Laszlo Ersek <ler...@redhat.com> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#45519): https://edk2.groups.io/g/devel/message/45519 Mute This Topic: https://groups.io/mt/32839208/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-