REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
Add below new micros which test the current value before write
the new value. Only write new value when current value not
same as new value.
CPU_REGISTER_TABLE_TEST_THEN_WRITE32
CPU_REGISTER_TABLE_TEST_THEN_WRITE64
CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
Also add below API:
CpuRegisterTableTestThenWrite
Signed-off-by: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Star Zeng <star.zeng@intel.com>
---
UefiCpuPkg/Include/AcpiCpuData.h | 1 +
.../Include/Library/RegisterCpuFeaturesLib.h | 91 +++++++++++++++++++
.../RegisterCpuFeaturesLib.c | 45 ++++++++-
3 files changed, 134 insertions(+), 3 deletions(-)
diff --git a/UefiCpuPkg/Include/AcpiCpuData.h b/UefiCpuPkg/Include/AcpiCpuData.h
index b963a2f592..472a1a8070 100644
--- a/UefiCpuPkg/Include/AcpiCpuData.h
+++ b/UefiCpuPkg/Include/AcpiCpuData.h
@@ -81,6 +81,7 @@ typedef struct {
UINT16 Reserved; // offset 10 - 11
UINT32 HighIndex; // offset 12-15, only valid for MemoryMapped
UINT64 Value; // offset 16-23
+ UINT8 TestThenWrite; // 0ffset 24
} CPU_REGISTER_TABLE_ENTRY;
//
diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
index e420e7f075..5bd464b32e 100644
--- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
+++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
@@ -348,6 +348,32 @@ CpuRegisterTableWrite (
IN UINT64 Value
);
+/**
+ Adds an entry in specified register table.
+
+ This function adds an entry in specified register table, with given register type,
+ register index, bit section and value.
+
+ Driver will test the current value before setting new value.
+
+ @param[in] ProcessorNumber The index of the CPU to add a register table entry
+ @param[in] RegisterType Type of the register to program
+ @param[in] Index Index of the register to program
+ @param[in] ValueMask Mask of bits in register to write
+ @param[in] Value Value to write
+
+ @note This service could be called by BSP only.
+**/
+VOID
+EFIAPI
+CpuRegisterTableTestThenWrite (
+ IN UINTN ProcessorNumber,
+ IN REGISTER_TYPE RegisterType,
+ IN UINT64 Index,
+ IN UINT64 ValueMask,
+ IN UINT64 Value
+ );
+
/**
Adds an entry in specified Pre-SMM register table.
@@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, MAX_UINT32, Value); \
} while(FALSE);
+/**
+ Adds a 32-bit register write entry in specified register table.
+
+ This macro adds an entry in specified register table, with given register type,
+ register index, and value.
+
+ Driver will test the current value before setting new value.
+
+ @param[in] ProcessorNumber The index of the CPU to add a register table entry.
+ @param[in] RegisterType Type of the register to program
+ @param[in] Index Index of the register to program
+ @param[in] Value Value to write
+
+ @note This service could be called by BSP only.
+**/
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber, RegisterType, Index, Value) \
+ do { \
+ CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, MAX_UINT32, Value); \
+ } while(FALSE);
+
/**
Adds a 64-bit register write entry in specified register table.
@@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, MAX_UINT64, Value); \
} while(FALSE);
+/**
+ Adds a 64-bit register write entry in specified register table.
+
+ This macro adds an entry in specified register table, with given register type,
+ register index, and value.
+
+ Driver will test the current value before setting new value.
+
+ @param[in] ProcessorNumber The index of the CPU to add a register table entry.
+ @param[in] RegisterType Type of the register to program
+ @param[in] Index Index of the register to program
+ @param[in] Value Value to write
+
+ @note This service could be called by BSP only.
+**/
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber, RegisterType, Index, Value) \
+ do { \
+ CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, MAX_UINT64, Value); \
+ } while(FALSE);
+
/**
Adds a bit field write entry in specified register table.
@@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index, ~ValueMask, Value); \
} while(FALSE);
+/**
+ Adds a bit field write entry in specified register table.
+
+ This macro adds an entry in specified register table, with given register type,
+ register index, bit field section, and value.
+
+ Driver will test the current value before setting new value.
+
+ @param[in] ProcessorNumber The index of the CPU to add a register table entry.
+ @param[in] RegisterType Type of the register to program.
+ @param[in] Index Index of the register to program.
+ @param[in] Type The data type name of a register structure.
+ @param[in] Field The bit fiel name in register structure to write.
+ @param[in] Value Value to write to the bit field.
+
+ @note This service could be called by BSP only.
+**/
+#define CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber, RegisterType, Index, Type, Field, Value) \
+ do { \
+ UINT64 ValueMask; \
+ ValueMask = MAX_UINT64; \
+ ((Type *)(&ValueMask))->Field = 0; \
+ CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index, ~ValueMask, Value); \
+ } while(FALSE);
+
/**
Adds a 32-bit register write entry in specified register table.
diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
index 67885bf69b..e9769882b9 100644
--- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
+++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
@@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
@param[in] ValidBitStart Start of the bit section
@param[in] ValidBitLength Length of the bit section
@param[in] Value Value to write
+ @param[in] TestThenWrite Whether need to test current Value before writing.
+
**/
VOID
CpuRegisterTableWriteWorker (
@@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
IN UINT64 Index,
IN UINT8 ValidBitStart,
IN UINT8 ValidBitLength,
- IN UINT64 Value
+ IN UINT64 Value,
+ IN UINT8 TestThenWrite
)
{
CPU_FEATURES_DATA *CpuFeaturesData;
@@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
RegisterTableEntry[RegisterTable->TableLength].ValidBitStart = ValidBitStart;
RegisterTableEntry[RegisterTable->TableLength].ValidBitLength = ValidBitLength;
RegisterTableEntry[RegisterTable->TableLength].Value = Value;
+ RegisterTableEntry[RegisterTable->TableLength].TestThenWrite = TestThenWrite;
RegisterTable->TableLength++;
}
@@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
Start = (UINT8)LowBitSet64 (ValueMask);
End = (UINT8)HighBitSet64 (ValueMask);
Length = End - Start + 1;
- CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType, Index, Start, Length, Value);
+ CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType, Index, Start, Length, Value, FALSE);
+}
+
+/**
+ Adds an entry in specified register table.
+
+ This function adds an entry in specified register table, with given register type,
+ register index, bit section and value.
+
+ @param[in] ProcessorNumber The index of the CPU to add a register table entry
+ @param[in] RegisterType Type of the register to program
+ @param[in] Index Index of the register to program
+ @param[in] ValueMask Mask of bits in register to write
+ @param[in] Value Value to write
+ @param[in] TestThenWrite Whether need to test current Value before writing.
+
+ @note This service could be called by BSP only.
+**/
+VOID
+EFIAPI
+CpuRegisterTableTestThenWrite (
+ IN UINTN ProcessorNumber,
+ IN REGISTER_TYPE RegisterType,
+ IN UINT64 Index,
+ IN UINT64 ValueMask,
+ IN UINT64 Value
+ )
+{
+ UINT8 Start;
+ UINT8 End;
+ UINT8 Length;
+
+ Start = (UINT8)LowBitSet64 (ValueMask);
+ End = (UINT8)HighBitSet64 (ValueMask);
+ Length = End - Start + 1;
+ CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType, Index, Start, Length, Value, TRUE);
}
/**
@@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
Start = (UINT8)LowBitSet64 (ValueMask);
End = (UINT8)HighBitSet64 (ValueMask);
Length = End - Start + 1;
- CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType, Index, Start, Length, Value);
+ CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType, Index, Start, Length, Value, FALSE);
}
/**
--
2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45657): https://edk2.groups.io/g/devel/message/45657
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
> -----Original Message-----
> From: Dong, Eric
> Sent: Thursday, August 15, 2019 10:51 AM
> To: devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Zeng,
> Star <star.zeng@intel.com>
> Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test Then
> Write" Macros.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
>
> Add below new micros which test the current value before write the new
> value. Only write new value when current value not same as new value.
> CPU_REGISTER_TABLE_TEST_THEN_WRITE32
> CPU_REGISTER_TABLE_TEST_THEN_WRITE64
> CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
>
> Also add below API:
> CpuRegisterTableTestThenWrite
>
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> Cc: Ray Ni <ray.ni@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Star Zeng <star.zeng@intel.com>
> ---
> UefiCpuPkg/Include/AcpiCpuData.h | 1 +
> .../Include/Library/RegisterCpuFeaturesLib.h | 91 +++++++++++++++++++
> .../RegisterCpuFeaturesLib.c | 45 ++++++++-
> 3 files changed, 134 insertions(+), 3 deletions(-)
>
> diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
> b/UefiCpuPkg/Include/AcpiCpuData.h
> index b963a2f592..472a1a8070 100644
> --- a/UefiCpuPkg/Include/AcpiCpuData.h
> +++ b/UefiCpuPkg/Include/AcpiCpuData.h
> @@ -81,6 +81,7 @@ typedef struct {
> UINT16 Reserved; // offset 10 - 11
> UINT32 HighIndex; // offset 12-15, only valid for MemoryMapped
> UINT64 Value; // offset 16-23
> + UINT8 TestThenWrite; // 0ffset 24
Could we use one byte of the Reserved field, but not add new field? And use BOOLEAN type for it?
Thanks,
Star
> } CPU_REGISTER_TABLE_ENTRY;
>
> //
> diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> index e420e7f075..5bd464b32e 100644
> --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
> IN UINT64 Value
> );
>
> +/**
> + Adds an entry in specified register table.
> +
> + This function adds an entry in specified register table, with given
> + register type, register index, bit section and value.
> +
> + Driver will test the current value before setting new value.
> +
> + @param[in] ProcessorNumber The index of the CPU to add a register
> table entry
> + @param[in] RegisterType Type of the register to program
> + @param[in] Index Index of the register to program
> + @param[in] ValueMask Mask of bits in register to write
> + @param[in] Value Value to write
> +
> + @note This service could be called by BSP only.
> +**/
> +VOID
> +EFIAPI
> +CpuRegisterTableTestThenWrite (
> + IN UINTN ProcessorNumber,
> + IN REGISTER_TYPE RegisterType,
> + IN UINT64 Index,
> + IN UINT64 ValueMask,
> + IN UINT64 Value
> + );
> +
> /**
> Adds an entry in specified Pre-SMM register table.
>
> @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
> CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> MAX_UINT32, Value); \
> } while(FALSE);
>
> +/**
> + Adds a 32-bit register write entry in specified register table.
> +
> + This macro adds an entry in specified register table, with given
> + register type, register index, and value.
> +
> + Driver will test the current value before setting new value.
> +
> + @param[in] ProcessorNumber The index of the CPU to add a register
> table entry.
> + @param[in] RegisterType Type of the register to program
> + @param[in] Index Index of the register to program
> + @param[in] Value Value to write
> +
> + @note This service could be called by BSP only.
> +**/
> +#define CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
> RegisterType, Index, Value) \
> + do { \
> + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> +Index, MAX_UINT32, Value); \
> + } while(FALSE);
> +
> /**
> Adds a 64-bit register write entry in specified register table.
>
> @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
> CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> MAX_UINT64, Value); \
> } while(FALSE);
>
> +/**
> + Adds a 64-bit register write entry in specified register table.
> +
> + This macro adds an entry in specified register table, with given
> + register type, register index, and value.
> +
> + Driver will test the current value before setting new value.
> +
> + @param[in] ProcessorNumber The index of the CPU to add a register
> table entry.
> + @param[in] RegisterType Type of the register to program
> + @param[in] Index Index of the register to program
> + @param[in] Value Value to write
> +
> + @note This service could be called by BSP only.
> +**/
> +#define CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
> RegisterType, Index, Value) \
> + do { \
> + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> +Index, MAX_UINT64, Value); \
> + } while(FALSE);
> +
> /**
> Adds a bit field write entry in specified register table.
>
> @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
> CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> ~ValueMask, Value); \
> } while(FALSE);
>
> +/**
> + Adds a bit field write entry in specified register table.
> +
> + This macro adds an entry in specified register table, with given
> + register type, register index, bit field section, and value.
> +
> + Driver will test the current value before setting new value.
> +
> + @param[in] ProcessorNumber The index of the CPU to add a register
> table entry.
> + @param[in] RegisterType Type of the register to program.
> + @param[in] Index Index of the register to program.
> + @param[in] Type The data type name of a register structure.
> + @param[in] Field The bit fiel name in register structure to write.
> + @param[in] Value Value to write to the bit field.
> +
> + @note This service could be called by BSP only.
> +**/
> +#define
> CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
> RegisterType, Index, Type, Field, Value) \
> + do { \
> + UINT64 ValueMask; \
> + ValueMask = MAX_UINT64; \
> + ((Type *)(&ValueMask))->Field = 0; \
> + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType, Index,
> ~ValueMask, Value); \
> + } while(FALSE);
> +
> /**
> Adds a 32-bit register write entry in specified register table.
>
> diff --git
> a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> index 67885bf69b..e9769882b9 100644
> --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> +++
> b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
> @param[in] ValidBitStart Start of the bit section
> @param[in] ValidBitLength Length of the bit section
> @param[in] Value Value to write
> + @param[in] TestThenWrite Whether need to test current Value before
> writing.
> +
> **/
> VOID
> CpuRegisterTableWriteWorker (
> @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
> IN UINT64 Index,
> IN UINT8 ValidBitStart,
> IN UINT8 ValidBitLength,
> - IN UINT64 Value
> + IN UINT64 Value,
> + IN UINT8 TestThenWrite
> )
> {
> CPU_FEATURES_DATA *CpuFeaturesData;
> @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
> RegisterTableEntry[RegisterTable->TableLength].ValidBitStart =
> ValidBitStart;
> RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
> ValidBitLength;
> RegisterTableEntry[RegisterTable->TableLength].Value = Value;
> + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite =
> + TestThenWrite;
>
> RegisterTable->TableLength++;
> }
> @@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
> Start = (UINT8)LowBitSet64 (ValueMask);
> End = (UINT8)HighBitSet64 (ValueMask);
> Length = End - Start + 1;
> - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> Index, Start, Length, Value);
> + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> +Index, Start, Length, Value, FALSE); }
> +
> +/**
> + Adds an entry in specified register table.
> +
> + This function adds an entry in specified register table, with given
> + register type, register index, bit section and value.
> +
> + @param[in] ProcessorNumber The index of the CPU to add a register
> table entry
> + @param[in] RegisterType Type of the register to program
> + @param[in] Index Index of the register to program
> + @param[in] ValueMask Mask of bits in register to write
> + @param[in] Value Value to write
> + @param[in] TestThenWrite Whether need to test current Value before
> writing.
> +
> + @note This service could be called by BSP only.
> +**/
> +VOID
> +EFIAPI
> +CpuRegisterTableTestThenWrite (
> + IN UINTN ProcessorNumber,
> + IN REGISTER_TYPE RegisterType,
> + IN UINT64 Index,
> + IN UINT64 ValueMask,
> + IN UINT64 Value
> + )
> +{
> + UINT8 Start;
> + UINT8 End;
> + UINT8 Length;
> +
> + Start = (UINT8)LowBitSet64 (ValueMask);
> + End = (UINT8)HighBitSet64 (ValueMask);
> + Length = End - Start + 1;
> + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> + Index, Start, Length, Value, TRUE);
> }
>
> /**
> @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
> Start = (UINT8)LowBitSet64 (ValueMask);
> End = (UINT8)HighBitSet64 (ValueMask);
> Length = End - Start + 1;
> - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> Index, Start, Length, Value);
> + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> + Index, Start, Length, Value, FALSE);
> }
>
> /**
> --
> 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45754): https://edk2.groups.io/g/devel/message/45754
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, August 16, 2019 9:15 AM
> To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Zeng,
> Star <star.zeng@intel.com>
> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> Then Write" Macros.
>
>
>
> > -----Original Message-----
> > From: Dong, Eric
> > Sent: Thursday, August 15, 2019 10:51 AM
> > To: devel@edk2.groups.io
> > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > Zeng, Star <star.zeng@intel.com>
> > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> > Then Write" Macros.
> >
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
> >
> > Add below new micros which test the current value before write the new
> > value. Only write new value when current value not same as new value.
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE32
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE64
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
> >
> > Also add below API:
> > CpuRegisterTableTestThenWrite
> >
> > Signed-off-by: Eric Dong <eric.dong@intel.com>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > ---
> > UefiCpuPkg/Include/AcpiCpuData.h | 1 +
> > .../Include/Library/RegisterCpuFeaturesLib.h | 91 +++++++++++++++++++
> > .../RegisterCpuFeaturesLib.c | 45 ++++++++-
> > 3 files changed, 134 insertions(+), 3 deletions(-)
> >
> > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
> > b/UefiCpuPkg/Include/AcpiCpuData.h
> > index b963a2f592..472a1a8070 100644
> > --- a/UefiCpuPkg/Include/AcpiCpuData.h
> > +++ b/UefiCpuPkg/Include/AcpiCpuData.h
> > @@ -81,6 +81,7 @@ typedef struct {
> > UINT16 Reserved; // offset 10 - 11
> > UINT32 HighIndex; // offset 12-15, only valid for MemoryMapped
> > UINT64 Value; // offset 16-23
> > + UINT8 TestThenWrite; // 0ffset 24
>
> Could we use one byte of the Reserved field, but not add new field? And use
> BOOLEAN type for it?
I'm not sure whether use the Reserved field is an correct approach, do you have samples which use the reserved fields?
But I think add new field is a more safe one.
Thanks,
Eric
>
> Thanks,
> Star
>
> > } CPU_REGISTER_TABLE_ENTRY;
> >
> > //
> > diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > index e420e7f075..5bd464b32e 100644
> > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
> > IN UINT64 Value
> > );
> >
> > +/**
> > + Adds an entry in specified register table.
> > +
> > + This function adds an entry in specified register table, with given
> > + register type, register index, bit section and value.
> > +
> > + Driver will test the current value before setting new value.
> > +
> > + @param[in] ProcessorNumber The index of the CPU to add a register
> > table entry
> > + @param[in] RegisterType Type of the register to program
> > + @param[in] Index Index of the register to program
> > + @param[in] ValueMask Mask of bits in register to write
> > + @param[in] Value Value to write
> > +
> > + @note This service could be called by BSP only.
> > +**/
> > +VOID
> > +EFIAPI
> > +CpuRegisterTableTestThenWrite (
> > + IN UINTN ProcessorNumber,
> > + IN REGISTER_TYPE RegisterType,
> > + IN UINT64 Index,
> > + IN UINT64 ValueMask,
> > + IN UINT64 Value
> > + );
> > +
> > /**
> > Adds an entry in specified Pre-SMM register table.
> >
> > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
> > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > MAX_UINT32, Value); \
> > } while(FALSE);
> >
> > +/**
> > + Adds a 32-bit register write entry in specified register table.
> > +
> > + This macro adds an entry in specified register table, with given
> > + register type, register index, and value.
> > +
> > + Driver will test the current value before setting new value.
> > +
> > + @param[in] ProcessorNumber The index of the CPU to add a register
> > table entry.
> > + @param[in] RegisterType Type of the register to program
> > + @param[in] Index Index of the register to program
> > + @param[in] Value Value to write
> > +
> > + @note This service could be called by BSP only.
> > +**/
> > +#define CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
> > RegisterType, Index, Value) \
> > + do { \
> > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > +Index, MAX_UINT32, Value); \
> > + } while(FALSE);
> > +
> > /**
> > Adds a 64-bit register write entry in specified register table.
> >
> > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
> > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > MAX_UINT64, Value); \
> > } while(FALSE);
> >
> > +/**
> > + Adds a 64-bit register write entry in specified register table.
> > +
> > + This macro adds an entry in specified register table, with given
> > + register type, register index, and value.
> > +
> > + Driver will test the current value before setting new value.
> > +
> > + @param[in] ProcessorNumber The index of the CPU to add a register
> > table entry.
> > + @param[in] RegisterType Type of the register to program
> > + @param[in] Index Index of the register to program
> > + @param[in] Value Value to write
> > +
> > + @note This service could be called by BSP only.
> > +**/
> > +#define CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
> > RegisterType, Index, Value) \
> > + do { \
> > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > +Index, MAX_UINT64, Value); \
> > + } while(FALSE);
> > +
> > /**
> > Adds a bit field write entry in specified register table.
> >
> > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
> > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > ~ValueMask, Value); \
> > } while(FALSE);
> >
> > +/**
> > + Adds a bit field write entry in specified register table.
> > +
> > + This macro adds an entry in specified register table, with given
> > + register type, register index, bit field section, and value.
> > +
> > + Driver will test the current value before setting new value.
> > +
> > + @param[in] ProcessorNumber The index of the CPU to add a register
> > table entry.
> > + @param[in] RegisterType Type of the register to program.
> > + @param[in] Index Index of the register to program.
> > + @param[in] Type The data type name of a register structure.
> > + @param[in] Field The bit fiel name in register structure to write.
> > + @param[in] Value Value to write to the bit field.
> > +
> > + @note This service could be called by BSP only.
> > +**/
> > +#define
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
> > RegisterType, Index, Type, Field, Value) \
> > + do { \
> > + UINT64 ValueMask; \
> > + ValueMask = MAX_UINT64; \
> > + ((Type *)(&ValueMask))->Field = 0; \
> > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > + Index,
> > ~ValueMask, Value); \
> > + } while(FALSE);
> > +
> > /**
> > Adds a 32-bit register write entry in specified register table.
> >
> > diff --git
> > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > index 67885bf69b..e9769882b9 100644
> > ---
> > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > +++
> > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
> > @param[in] ValidBitStart Start of the bit section
> > @param[in] ValidBitLength Length of the bit section
> > @param[in] Value Value to write
> > + @param[in] TestThenWrite Whether need to test current Value before
> > writing.
> > +
> > **/
> > VOID
> > CpuRegisterTableWriteWorker (
> > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
> > IN UINT64 Index,
> > IN UINT8 ValidBitStart,
> > IN UINT8 ValidBitLength,
> > - IN UINT64 Value
> > + IN UINT64 Value,
> > + IN UINT8 TestThenWrite
> > )
> > {
> > CPU_FEATURES_DATA *CpuFeaturesData;
> > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
> > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart =
> > ValidBitStart;
> > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
> > ValidBitLength;
> > RegisterTableEntry[RegisterTable->TableLength].Value = Value;
> > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite =
> > + TestThenWrite;
> >
> > RegisterTable->TableLength++;
> > }
> > @@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
> > Start = (UINT8)LowBitSet64 (ValueMask);
> > End = (UINT8)HighBitSet64 (ValueMask);
> > Length = End - Start + 1;
> > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> > Index, Start, Length, Value);
> > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> > +Index, Start, Length, Value, FALSE); }
> > +
> > +/**
> > + Adds an entry in specified register table.
> > +
> > + This function adds an entry in specified register table, with given
> > + register type, register index, bit section and value.
> > +
> > + @param[in] ProcessorNumber The index of the CPU to add a register
> > table entry
> > + @param[in] RegisterType Type of the register to program
> > + @param[in] Index Index of the register to program
> > + @param[in] ValueMask Mask of bits in register to write
> > + @param[in] Value Value to write
> > + @param[in] TestThenWrite Whether need to test current Value before
> > writing.
> > +
> > + @note This service could be called by BSP only.
> > +**/
> > +VOID
> > +EFIAPI
> > +CpuRegisterTableTestThenWrite (
> > + IN UINTN ProcessorNumber,
> > + IN REGISTER_TYPE RegisterType,
> > + IN UINT64 Index,
> > + IN UINT64 ValueMask,
> > + IN UINT64 Value
> > + )
> > +{
> > + UINT8 Start;
> > + UINT8 End;
> > + UINT8 Length;
> > +
> > + Start = (UINT8)LowBitSet64 (ValueMask);
> > + End = (UINT8)HighBitSet64 (ValueMask);
> > + Length = End - Start + 1;
> > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber, RegisterType,
> > + Index, Start, Length, Value, TRUE);
> > }
> >
> > /**
> > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
> > Start = (UINT8)LowBitSet64 (ValueMask);
> > End = (UINT8)HighBitSet64 (ValueMask);
> > Length = End - Start + 1;
> > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> > Index, Start, Length, Value);
> > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> > + Index, Start, Length, Value, FALSE);
> > }
> >
> > /**
> > --
> > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45755): https://edk2.groups.io/g/devel/message/45755
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
> -----Original Message-----
> From: Dong, Eric
> Sent: Friday, August 16, 2019 9:27 AM
> To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>
> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> Then Write" Macros.
>
> > -----Original Message-----
> > From: Zeng, Star
> > Sent: Friday, August 16, 2019 9:15 AM
> > To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > Zeng, Star <star.zeng@intel.com>
> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> > "Test Then Write" Macros.
> >
> >
> >
> > > -----Original Message-----
> > > From: Dong, Eric
> > > Sent: Thursday, August 15, 2019 10:51 AM
> > > To: devel@edk2.groups.io
> > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > > Zeng, Star <star.zeng@intel.com>
> > > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> > > Then Write" Macros.
> > >
> > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
> > >
> > > Add below new micros which test the current value before write the
> > > new value. Only write new value when current value not same as new
> value.
> > > CPU_REGISTER_TABLE_TEST_THEN_WRITE32
> > > CPU_REGISTER_TABLE_TEST_THEN_WRITE64
> > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
> > >
> > > Also add below API:
> > > CpuRegisterTableTestThenWrite
> > >
> > > Signed-off-by: Eric Dong <eric.dong@intel.com>
> > > Cc: Ray Ni <ray.ni@intel.com>
> > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > Cc: Star Zeng <star.zeng@intel.com>
> > > ---
> > > UefiCpuPkg/Include/AcpiCpuData.h | 1 +
> > > .../Include/Library/RegisterCpuFeaturesLib.h | 91
> +++++++++++++++++++
> > > .../RegisterCpuFeaturesLib.c | 45 ++++++++-
> > > 3 files changed, 134 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
> > > b/UefiCpuPkg/Include/AcpiCpuData.h
> > > index b963a2f592..472a1a8070 100644
> > > --- a/UefiCpuPkg/Include/AcpiCpuData.h
> > > +++ b/UefiCpuPkg/Include/AcpiCpuData.h
> > > @@ -81,6 +81,7 @@ typedef struct {
> > > UINT16 Reserved; // offset 10 - 11
> > > UINT32 HighIndex; // offset 12-15, only valid for
> MemoryMapped
> > > UINT64 Value; // offset 16-23
> > > + UINT8 TestThenWrite; // 0ffset 24
> >
> > Could we use one byte of the Reserved field, but not add new field?
> > And use BOOLEAN type for it?
>
> I'm not sure whether use the Reserved field is an correct approach, do you
> have samples which use the reserved fields?
> But I think add new field is a more safe one.
What "more safe" means here? Adding new field extends the structure, from the structure layout view of point, it is an incompatible change, the structure size is not just from 24 to 25 bytes, but to be nature aligned, the structure size will be (24 + 8) 32. Since there is Reserved field can be reused, that size impact can be removed.
FspGlobalData.h:
SHA-1: a2e61f341d26a78751b2f19b5004c6bbfc8b4fa9
* IntelFsp2Pkg: Support FSP Dispatch mode
MemoryProfile.h
SHA-1: 072a3ca1d36a42aec97f871c808776ee7038ca06 (related to 94092aa60341a3e4b1e1ea7c362781b8404ac538)
* MdeModulePkg MemoryProfile.h:two bytes of Reserved[4] as ActionStringOffset
If needed, more comments from Ray, Laszlo, Jiewen, Liming and Mike will be better.
Thanks,
Star
>
> Thanks,
> Eric
> >
> > Thanks,
> > Star
> >
> > > } CPU_REGISTER_TABLE_ENTRY;
> > >
> > > //
> > > diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > index e420e7f075..5bd464b32e 100644
> > > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
> > > IN UINT64 Value
> > > );
> > >
> > > +/**
> > > + Adds an entry in specified register table.
> > > +
> > > + This function adds an entry in specified register table, with
> > > + given register type, register index, bit section and value.
> > > +
> > > + Driver will test the current value before setting new value.
> > > +
> > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > + register
> > > table entry
> > > + @param[in] RegisterType Type of the register to program
> > > + @param[in] Index Index of the register to program
> > > + @param[in] ValueMask Mask of bits in register to write
> > > + @param[in] Value Value to write
> > > +
> > > + @note This service could be called by BSP only.
> > > +**/
> > > +VOID
> > > +EFIAPI
> > > +CpuRegisterTableTestThenWrite (
> > > + IN UINTN ProcessorNumber,
> > > + IN REGISTER_TYPE RegisterType,
> > > + IN UINT64 Index,
> > > + IN UINT64 ValueMask,
> > > + IN UINT64 Value
> > > + );
> > > +
> > > /**
> > > Adds an entry in specified Pre-SMM register table.
> > >
> > > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
> > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > MAX_UINT32, Value); \
> > > } while(FALSE);
> > >
> > > +/**
> > > + Adds a 32-bit register write entry in specified register table.
> > > +
> > > + This macro adds an entry in specified register table, with given
> > > + register type, register index, and value.
> > > +
> > > + Driver will test the current value before setting new value.
> > > +
> > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > + register
> > > table entry.
> > > + @param[in] RegisterType Type of the register to program
> > > + @param[in] Index Index of the register to program
> > > + @param[in] Value Value to write
> > > +
> > > + @note This service could be called by BSP only.
> > > +**/
> > > +#define
> CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
> > > RegisterType, Index, Value) \
> > > + do { \
> > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > +Index, MAX_UINT32, Value); \
> > > + } while(FALSE);
> > > +
> > > /**
> > > Adds a 64-bit register write entry in specified register table.
> > >
> > > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
> > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > MAX_UINT64, Value); \
> > > } while(FALSE);
> > >
> > > +/**
> > > + Adds a 64-bit register write entry in specified register table.
> > > +
> > > + This macro adds an entry in specified register table, with given
> > > + register type, register index, and value.
> > > +
> > > + Driver will test the current value before setting new value.
> > > +
> > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > + register
> > > table entry.
> > > + @param[in] RegisterType Type of the register to program
> > > + @param[in] Index Index of the register to program
> > > + @param[in] Value Value to write
> > > +
> > > + @note This service could be called by BSP only.
> > > +**/
> > > +#define
> CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
> > > RegisterType, Index, Value) \
> > > + do { \
> > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > +Index, MAX_UINT64, Value); \
> > > + } while(FALSE);
> > > +
> > > /**
> > > Adds a bit field write entry in specified register table.
> > >
> > > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
> > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > ~ValueMask, Value); \
> > > } while(FALSE);
> > >
> > > +/**
> > > + Adds a bit field write entry in specified register table.
> > > +
> > > + This macro adds an entry in specified register table, with given
> > > + register type, register index, bit field section, and value.
> > > +
> > > + Driver will test the current value before setting new value.
> > > +
> > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > + register
> > > table entry.
> > > + @param[in] RegisterType Type of the register to program.
> > > + @param[in] Index Index of the register to program.
> > > + @param[in] Type The data type name of a register structure.
> > > + @param[in] Field The bit fiel name in register structure to write.
> > > + @param[in] Value Value to write to the bit field.
> > > +
> > > + @note This service could be called by BSP only.
> > > +**/
> > > +#define
> > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
> > > RegisterType, Index, Type, Field, Value) \
> > > + do { \
> > > + UINT64 ValueMask; \
> > > + ValueMask = MAX_UINT64; \
> > > + ((Type *)(&ValueMask))->Field = 0;
> \
> > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > + Index,
> > > ~ValueMask, Value); \
> > > + } while(FALSE);
> > > +
> > > /**
> > > Adds a 32-bit register write entry in specified register table.
> > >
> > > diff --git
> > > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > > index 67885bf69b..e9769882b9 100644
> > > ---
> > > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > > +++
> > > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
> > > @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
> > > @param[in] ValidBitStart Start of the bit section
> > > @param[in] ValidBitLength Length of the bit section
> > > @param[in] Value Value to write
> > > + @param[in] TestThenWrite Whether need to test current Value
> before
> > > writing.
> > > +
> > > **/
> > > VOID
> > > CpuRegisterTableWriteWorker (
> > > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
> > > IN UINT64 Index,
> > > IN UINT8 ValidBitStart,
> > > IN UINT8 ValidBitLength,
> > > - IN UINT64 Value
> > > + IN UINT64 Value,
> > > + IN UINT8 TestThenWrite
> > > )
> > > {
> > > CPU_FEATURES_DATA *CpuFeaturesData;
> > > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
> > > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart =
> > > ValidBitStart;
> > > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
> > > ValidBitLength;
> > > RegisterTableEntry[RegisterTable->TableLength].Value = Value;
> > > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite =
> > > + TestThenWrite;
> > >
> > > RegisterTable->TableLength++;
> > > }
> > > @@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
> > > Start = (UINT8)LowBitSet64 (ValueMask);
> > > End = (UINT8)HighBitSet64 (ValueMask);
> > > Length = End - Start + 1;
> > > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > RegisterType, Index, Start, Length, Value);
> > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > +RegisterType, Index, Start, Length, Value, FALSE); }
> > > +
> > > +/**
> > > + Adds an entry in specified register table.
> > > +
> > > + This function adds an entry in specified register table, with
> > > + given register type, register index, bit section and value.
> > > +
> > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > + register
> > > table entry
> > > + @param[in] RegisterType Type of the register to program
> > > + @param[in] Index Index of the register to program
> > > + @param[in] ValueMask Mask of bits in register to write
> > > + @param[in] Value Value to write
> > > + @param[in] TestThenWrite Whether need to test current Value
> before
> > > writing.
> > > +
> > > + @note This service could be called by BSP only.
> > > +**/
> > > +VOID
> > > +EFIAPI
> > > +CpuRegisterTableTestThenWrite (
> > > + IN UINTN ProcessorNumber,
> > > + IN REGISTER_TYPE RegisterType,
> > > + IN UINT64 Index,
> > > + IN UINT64 ValueMask,
> > > + IN UINT64 Value
> > > + )
> > > +{
> > > + UINT8 Start;
> > > + UINT8 End;
> > > + UINT8 Length;
> > > +
> > > + Start = (UINT8)LowBitSet64 (ValueMask);
> > > + End = (UINT8)HighBitSet64 (ValueMask);
> > > + Length = End - Start + 1;
> > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > + RegisterType, Index, Start, Length, Value, TRUE);
> > > }
> > >
> > > /**
> > > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
> > > Start = (UINT8)LowBitSet64 (ValueMask);
> > > End = (UINT8)HighBitSet64 (ValueMask);
> > > Length = End - Start + 1;
> > > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> > > Index, Start, Length, Value);
> > > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber, RegisterType,
> > > + Index, Start, Length, Value, FALSE);
> > > }
> > >
> > > /**
> > > --
> > > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45757): https://edk2.groups.io/g/devel/message/45757
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
> -----Original Message-----
> From: Zeng, Star
> Sent: Friday, August 16, 2019 10:08 AM
> To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Yao,
> Jiewen <jiewen.yao@intel.com>; Gao, Liming <liming.gao@intel.com>; Kinney,
> Michael D <michael.d.kinney@intel.com>; Zeng, Star <star.zeng@intel.com>
> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> Then Write" Macros.
>
>
>
> > -----Original Message-----
> > From: Dong, Eric
> > Sent: Friday, August 16, 2019 9:27 AM
> > To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
> > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>
> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> > "Test Then Write" Macros.
> >
> > > -----Original Message-----
> > > From: Zeng, Star
> > > Sent: Friday, August 16, 2019 9:15 AM
> > > To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > > Zeng, Star <star.zeng@intel.com>
> > > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> > > "Test Then Write" Macros.
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Dong, Eric
> > > > Sent: Thursday, August 15, 2019 10:51 AM
> > > > To: devel@edk2.groups.io
> > > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> > > > Zeng, Star <star.zeng@intel.com>
> > > > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> > > > "Test Then Write" Macros.
> > > >
> > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
> > > >
> > > > Add below new micros which test the current value before write the
> > > > new value. Only write new value when current value not same as new
> > value.
> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE32
> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE64
> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
> > > >
> > > > Also add below API:
> > > > CpuRegisterTableTestThenWrite
> > > >
> > > > Signed-off-by: Eric Dong <eric.dong@intel.com>
> > > > Cc: Ray Ni <ray.ni@intel.com>
> > > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > > Cc: Star Zeng <star.zeng@intel.com>
> > > > ---
> > > > UefiCpuPkg/Include/AcpiCpuData.h | 1 +
> > > > .../Include/Library/RegisterCpuFeaturesLib.h | 91
> > +++++++++++++++++++
> > > > .../RegisterCpuFeaturesLib.c | 45 ++++++++-
> > > > 3 files changed, 134 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
> > > > b/UefiCpuPkg/Include/AcpiCpuData.h
> > > > index b963a2f592..472a1a8070 100644
> > > > --- a/UefiCpuPkg/Include/AcpiCpuData.h
> > > > +++ b/UefiCpuPkg/Include/AcpiCpuData.h
> > > > @@ -81,6 +81,7 @@ typedef struct {
> > > > UINT16 Reserved; // offset 10 - 11
> > > > UINT32 HighIndex; // offset 12-15, only valid for
> > MemoryMapped
> > > > UINT64 Value; // offset 16-23
> > > > + UINT8 TestThenWrite; // 0ffset 24
> > >
> > > Could we use one byte of the Reserved field, but not add new field?
> > > And use BOOLEAN type for it?
> >
> > I'm not sure whether use the Reserved field is an correct approach, do
> > you have samples which use the reserved fields?
> > But I think add new field is a more safe one.
>
> What "more safe" means here? Adding new field extends the structure, from
> the structure layout view of point, it is an incompatible change, the structure
> size is not just from 24 to 25 bytes, but to be nature aligned, the structure size
> will be (24 + 8) 32. Since there is Reserved field can be reused, that size impact
> can be removed.
Yes, agree the size impact. I'm just not clear whether the Reserved field can be used. Whether it has compatible impact.
>
> FspGlobalData.h:
> SHA-1: a2e61f341d26a78751b2f19b5004c6bbfc8b4fa9
> * IntelFsp2Pkg: Support FSP Dispatch mode
>
> MemoryProfile.h
> SHA-1: 072a3ca1d36a42aec97f871c808776ee7038ca06 (related to
> 94092aa60341a3e4b1e1ea7c362781b8404ac538)
> * MdeModulePkg MemoryProfile.h:two bytes of Reserved[4] as
> ActionStringOffset
>
If so many examples already did it. I think we can also do it.
>
> If needed, more comments from Ray, Laszlo, Jiewen, Liming and Mike will be
> better.
Yes, I think we need get more comments from them.
Thanks,
Eric
>
>
> Thanks,
> Star
>
> >
> > Thanks,
> > Eric
> > >
> > > Thanks,
> > > Star
> > >
> > > > } CPU_REGISTER_TABLE_ENTRY;
> > > >
> > > > //
> > > > diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > > index e420e7f075..5bd464b32e 100644
> > > > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> > > > @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
> > > > IN UINT64 Value
> > > > );
> > > >
> > > > +/**
> > > > + Adds an entry in specified register table.
> > > > +
> > > > + This function adds an entry in specified register table, with
> > > > + given register type, register index, bit section and value.
> > > > +
> > > > + Driver will test the current value before setting new value.
> > > > +
> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > > + register
> > > > table entry
> > > > + @param[in] RegisterType Type of the register to program
> > > > + @param[in] Index Index of the register to program
> > > > + @param[in] ValueMask Mask of bits in register to write
> > > > + @param[in] Value Value to write
> > > > +
> > > > + @note This service could be called by BSP only.
> > > > +**/
> > > > +VOID
> > > > +EFIAPI
> > > > +CpuRegisterTableTestThenWrite (
> > > > + IN UINTN ProcessorNumber,
> > > > + IN REGISTER_TYPE RegisterType,
> > > > + IN UINT64 Index,
> > > > + IN UINT64 ValueMask,
> > > > + IN UINT64 Value
> > > > + );
> > > > +
> > > > /**
> > > > Adds an entry in specified Pre-SMM register table.
> > > >
> > > > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > > MAX_UINT32, Value); \
> > > > } while(FALSE);
> > > >
> > > > +/**
> > > > + Adds a 32-bit register write entry in specified register table.
> > > > +
> > > > + This macro adds an entry in specified register table, with
> > > > + given register type, register index, and value.
> > > > +
> > > > + Driver will test the current value before setting new value.
> > > > +
> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > > + register
> > > > table entry.
> > > > + @param[in] RegisterType Type of the register to program
> > > > + @param[in] Index Index of the register to program
> > > > + @param[in] Value Value to write
> > > > +
> > > > + @note This service could be called by BSP only.
> > > > +**/
> > > > +#define
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
> > > > RegisterType, Index, Value) \
> > > > + do { \
> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > > +Index, MAX_UINT32, Value); \
> > > > + } while(FALSE);
> > > > +
> > > > /**
> > > > Adds a 64-bit register write entry in specified register table.
> > > >
> > > > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > > MAX_UINT64, Value); \
> > > > } while(FALSE);
> > > >
> > > > +/**
> > > > + Adds a 64-bit register write entry in specified register table.
> > > > +
> > > > + This macro adds an entry in specified register table, with
> > > > + given register type, register index, and value.
> > > > +
> > > > + Driver will test the current value before setting new value.
> > > > +
> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > > + register
> > > > table entry.
> > > > + @param[in] RegisterType Type of the register to program
> > > > + @param[in] Index Index of the register to program
> > > > + @param[in] Value Value to write
> > > > +
> > > > + @note This service could be called by BSP only.
> > > > +**/
> > > > +#define
> > CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
> > > > RegisterType, Index, Value) \
> > > > + do { \
> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > > +Index, MAX_UINT64, Value); \
> > > > + } while(FALSE);
> > > > +
> > > > /**
> > > > Adds a bit field write entry in specified register table.
> > > >
> > > > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> > > > ~ValueMask, Value); \
> > > > } while(FALSE);
> > > >
> > > > +/**
> > > > + Adds a bit field write entry in specified register table.
> > > > +
> > > > + This macro adds an entry in specified register table, with
> > > > + given register type, register index, bit field section, and value.
> > > > +
> > > > + Driver will test the current value before setting new value.
> > > > +
> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > > + register
> > > > table entry.
> > > > + @param[in] RegisterType Type of the register to program.
> > > > + @param[in] Index Index of the register to program.
> > > > + @param[in] Type The data type name of a register structure.
> > > > + @param[in] Field The bit fiel name in register structure to write.
> > > > + @param[in] Value Value to write to the bit field.
> > > > +
> > > > + @note This service could be called by BSP only.
> > > > +**/
> > > > +#define
> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
> > > > RegisterType, Index, Type, Field, Value) \
> > > > + do { \
> > > > + UINT64 ValueMask; \
> > > > + ValueMask = MAX_UINT64;
> \
> > > > + ((Type *)(&ValueMask))->Field = 0;
> > \
> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
> > > > + Index,
> > > > ~ValueMask, Value); \
> > > > + } while(FALSE);
> > > > +
> > > > /**
> > > > Adds a 32-bit register write entry in specified register table.
> > > >
> > > > diff --git
> > > > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> > > > .c
> > > > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> > > > .c index 67885bf69b..e9769882b9 100644
> > > > ---
> > > > a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> > > > .c
> > > > +++
> > > > b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> > > > .c @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
> > > > @param[in] ValidBitStart Start of the bit section
> > > > @param[in] ValidBitLength Length of the bit section
> > > > @param[in] Value Value to write
> > > > + @param[in] TestThenWrite Whether need to test current Value
> > before
> > > > writing.
> > > > +
> > > > **/
> > > > VOID
> > > > CpuRegisterTableWriteWorker (
> > > > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
> > > > IN UINT64 Index,
> > > > IN UINT8 ValidBitStart,
> > > > IN UINT8 ValidBitLength,
> > > > - IN UINT64 Value
> > > > + IN UINT64 Value,
> > > > + IN UINT8 TestThenWrite
> > > > )
> > > > {
> > > > CPU_FEATURES_DATA *CpuFeaturesData;
> > > > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart =
> > > > ValidBitStart;
> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
> > > > ValidBitLength;
> > > > RegisterTableEntry[RegisterTable->TableLength].Value = Value;
> > > > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite =
> > > > + TestThenWrite;
> > > >
> > > > RegisterTable->TableLength++;
> > > > }
> > > > @@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
> > > > Start = (UINT8)LowBitSet64 (ValueMask);
> > > > End = (UINT8)HighBitSet64 (ValueMask);
> > > > Length = End - Start + 1;
> > > > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > > RegisterType, Index, Start, Length, Value);
> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > > +RegisterType, Index, Start, Length, Value, FALSE); }
> > > > +
> > > > +/**
> > > > + Adds an entry in specified register table.
> > > > +
> > > > + This function adds an entry in specified register table, with
> > > > + given register type, register index, bit section and value.
> > > > +
> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> > > > + register
> > > > table entry
> > > > + @param[in] RegisterType Type of the register to program
> > > > + @param[in] Index Index of the register to program
> > > > + @param[in] ValueMask Mask of bits in register to write
> > > > + @param[in] Value Value to write
> > > > + @param[in] TestThenWrite Whether need to test current Value
> > before
> > > > writing.
> > > > +
> > > > + @note This service could be called by BSP only.
> > > > +**/
> > > > +VOID
> > > > +EFIAPI
> > > > +CpuRegisterTableTestThenWrite (
> > > > + IN UINTN ProcessorNumber,
> > > > + IN REGISTER_TYPE RegisterType,
> > > > + IN UINT64 Index,
> > > > + IN UINT64 ValueMask,
> > > > + IN UINT64 Value
> > > > + )
> > > > +{
> > > > + UINT8 Start;
> > > > + UINT8 End;
> > > > + UINT8 Length;
> > > > +
> > > > + Start = (UINT8)LowBitSet64 (ValueMask);
> > > > + End = (UINT8)HighBitSet64 (ValueMask);
> > > > + Length = End - Start + 1;
> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> > > > + RegisterType, Index, Start, Length, Value, TRUE);
> > > > }
> > > >
> > > > /**
> > > > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
> > > > Start = (UINT8)LowBitSet64 (ValueMask);
> > > > End = (UINT8)HighBitSet64 (ValueMask);
> > > > Length = End - Start + 1;
> > > > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
> > > > RegisterType, Index, Start, Length, Value);
> > > > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
> > > > + RegisterType, Index, Start, Length, Value, FALSE);
> > > > }
> > > >
> > > > /**
> > > > --
> > > > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45770): https://edk2.groups.io/g/devel/message/45770
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Eric:
>-----Original Message-----
>From: Dong, Eric
>Sent: Friday, August 16, 2019 10:20 AM
>To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
>Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Yao,
>Jiewen <jiewen.yao@intel.com>; Gao, Liming <liming.gao@intel.com>;
>Kinney, Michael D <michael.d.kinney@intel.com>
>Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
>Then Write" Macros.
>
>
>
>> -----Original Message-----
>> From: Zeng, Star
>> Sent: Friday, August 16, 2019 10:08 AM
>> To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
>> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Yao,
>> Jiewen <jiewen.yao@intel.com>; Gao, Liming <liming.gao@intel.com>;
>Kinney,
>> Michael D <michael.d.kinney@intel.com>; Zeng, Star <star.zeng@intel.com>
>> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
>> Then Write" Macros.
>>
>>
>>
>> > -----Original Message-----
>> > From: Dong, Eric
>> > Sent: Friday, August 16, 2019 9:27 AM
>> > To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
>> > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>
>> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
>> > "Test Then Write" Macros.
>> >
>> > > -----Original Message-----
>> > > From: Zeng, Star
>> > > Sent: Friday, August 16, 2019 9:15 AM
>> > > To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
>> > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>> > > Zeng, Star <star.zeng@intel.com>
>> > > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
>> > > "Test Then Write" Macros.
>> > >
>> > >
>> > >
>> > > > -----Original Message-----
>> > > > From: Dong, Eric
>> > > > Sent: Thursday, August 15, 2019 10:51 AM
>> > > > To: devel@edk2.groups.io
>> > > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
>> > > > Zeng, Star <star.zeng@intel.com>
>> > > > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
>> > > > "Test Then Write" Macros.
>> > > >
>> > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
>> > > >
>> > > > Add below new micros which test the current value before write the
>> > > > new value. Only write new value when current value not same as new
>> > value.
>> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE32
>> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE64
>> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
>> > > >
>> > > > Also add below API:
>> > > > CpuRegisterTableTestThenWrite
>> > > >
>> > > > Signed-off-by: Eric Dong <eric.dong@intel.com>
>> > > > Cc: Ray Ni <ray.ni@intel.com>
>> > > > Cc: Laszlo Ersek <lersek@redhat.com>
>> > > > Cc: Star Zeng <star.zeng@intel.com>
>> > > > ---
>> > > > UefiCpuPkg/Include/AcpiCpuData.h | 1 +
>> > > > .../Include/Library/RegisterCpuFeaturesLib.h | 91
>> > +++++++++++++++++++
>> > > > .../RegisterCpuFeaturesLib.c | 45 ++++++++-
>> > > > 3 files changed, 134 insertions(+), 3 deletions(-)
>> > > >
>> > > > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
>> > > > b/UefiCpuPkg/Include/AcpiCpuData.h
>> > > > index b963a2f592..472a1a8070 100644
>> > > > --- a/UefiCpuPkg/Include/AcpiCpuData.h
>> > > > +++ b/UefiCpuPkg/Include/AcpiCpuData.h
>> > > > @@ -81,6 +81,7 @@ typedef struct {
>> > > > UINT16 Reserved; // offset 10 - 11
>> > > > UINT32 HighIndex; // offset 12-15, only valid for
>> > MemoryMapped
>> > > > UINT64 Value; // offset 16-23
>> > > > + UINT8 TestThenWrite; // 0ffset 24
>> > >
>> > > Could we use one byte of the Reserved field, but not add new field?
>> > > And use BOOLEAN type for it?
>> >
>> > I'm not sure whether use the Reserved field is an correct approach, do
>> > you have samples which use the reserved fields?
>> > But I think add new field is a more safe one.
>>
>> What "more safe" means here? Adding new field extends the structure,
>from
>> the structure layout view of point, it is an incompatible change, the structure
>> size is not just from 24 to 25 bytes, but to be nature aligned, the structure
>size
>> will be (24 + 8) 32. Since there is Reserved field can be reused, that size
>impact
>> can be removed.
>
>Yes, agree the size impact. I'm just not clear whether the Reserved field can
>be used. Whether it has compatible impact.
>
>>
>> FspGlobalData.h:
>> SHA-1: a2e61f341d26a78751b2f19b5004c6bbfc8b4fa9
>> * IntelFsp2Pkg: Support FSP Dispatch mode
>>
>> MemoryProfile.h
>> SHA-1: 072a3ca1d36a42aec97f871c808776ee7038ca06 (related to
>> 94092aa60341a3e4b1e1ea7c362781b8404ac538)
>> * MdeModulePkg MemoryProfile.h:two bytes of Reserved[4] as
>> ActionStringOffset
>>
>
>If so many examples already did it. I think we can also do it.
>
>>
>> If needed, more comments from Ray, Laszlo, Jiewen, Liming and Mike will
>be
>> better.
>
>Yes, I think we need get more comments from them.
I think to reuse the reserved field is a good solution.
Thanks
Liming
>
>Thanks,
>Eric
>>
>>
>> Thanks,
>> Star
>>
>> >
>> > Thanks,
>> > Eric
>> > >
>> > > Thanks,
>> > > Star
>> > >
>> > > > } CPU_REGISTER_TABLE_ENTRY;
>> > > >
>> > > > //
>> > > > diff --git a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
>> > > > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
>> > > > index e420e7f075..5bd464b32e 100644
>> > > > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
>> > > > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
>> > > > @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
>> > > > IN UINT64 Value
>> > > > );
>> > > >
>> > > > +/**
>> > > > + Adds an entry in specified register table.
>> > > > +
>> > > > + This function adds an entry in specified register table, with
>> > > > + given register type, register index, bit section and value.
>> > > > +
>> > > > + Driver will test the current value before setting new value.
>> > > > +
>> > > > + @param[in] ProcessorNumber The index of the CPU to add a
>> > > > + register
>> > > > table entry
>> > > > + @param[in] RegisterType Type of the register to program
>> > > > + @param[in] Index Index of the register to program
>> > > > + @param[in] ValueMask Mask of bits in register to write
>> > > > + @param[in] Value Value to write
>> > > > +
>> > > > + @note This service could be called by BSP only.
>> > > > +**/
>> > > > +VOID
>> > > > +EFIAPI
>> > > > +CpuRegisterTableTestThenWrite (
>> > > > + IN UINTN ProcessorNumber,
>> > > > + IN REGISTER_TYPE RegisterType,
>> > > > + IN UINT64 Index,
>> > > > + IN UINT64 ValueMask,
>> > > > + IN UINT64 Value
>> > > > + );
>> > > > +
>> > > > /**
>> > > > Adds an entry in specified Pre-SMM register table.
>> > > >
>> > > > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
>> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
>> > > > MAX_UINT32, Value); \
>> > > > } while(FALSE);
>> > > >
>> > > > +/**
>> > > > + Adds a 32-bit register write entry in specified register table.
>> > > > +
>> > > > + This macro adds an entry in specified register table, with
>> > > > + given register type, register index, and value.
>> > > > +
>> > > > + Driver will test the current value before setting new value.
>> > > > +
>> > > > + @param[in] ProcessorNumber The index of the CPU to add a
>> > > > + register
>> > > > table entry.
>> > > > + @param[in] RegisterType Type of the register to program
>> > > > + @param[in] Index Index of the register to program
>> > > > + @param[in] Value Value to write
>> > > > +
>> > > > + @note This service could be called by BSP only.
>> > > > +**/
>> > > > +#define
>> > CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
>> > > > RegisterType, Index, Value) \
>> > > > + do { \
>> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
>> > > > +Index, MAX_UINT32, Value); \
>> > > > + } while(FALSE);
>> > > > +
>> > > > /**
>> > > > Adds a 64-bit register write entry in specified register table.
>> > > >
>> > > > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
>> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
>> > > > MAX_UINT64, Value); \
>> > > > } while(FALSE);
>> > > >
>> > > > +/**
>> > > > + Adds a 64-bit register write entry in specified register table.
>> > > > +
>> > > > + This macro adds an entry in specified register table, with
>> > > > + given register type, register index, and value.
>> > > > +
>> > > > + Driver will test the current value before setting new value.
>> > > > +
>> > > > + @param[in] ProcessorNumber The index of the CPU to add a
>> > > > + register
>> > > > table entry.
>> > > > + @param[in] RegisterType Type of the register to program
>> > > > + @param[in] Index Index of the register to program
>> > > > + @param[in] Value Value to write
>> > > > +
>> > > > + @note This service could be called by BSP only.
>> > > > +**/
>> > > > +#define
>> > CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
>> > > > RegisterType, Index, Value) \
>> > > > + do { \
>> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
>> > > > +Index, MAX_UINT64, Value); \
>> > > > + } while(FALSE);
>> > > > +
>> > > > /**
>> > > > Adds a bit field write entry in specified register table.
>> > > >
>> > > > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
>> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
>> > > > ~ValueMask, Value); \
>> > > > } while(FALSE);
>> > > >
>> > > > +/**
>> > > > + Adds a bit field write entry in specified register table.
>> > > > +
>> > > > + This macro adds an entry in specified register table, with
>> > > > + given register type, register index, bit field section, and value.
>> > > > +
>> > > > + Driver will test the current value before setting new value.
>> > > > +
>> > > > + @param[in] ProcessorNumber The index of the CPU to add a
>> > > > + register
>> > > > table entry.
>> > > > + @param[in] RegisterType Type of the register to program.
>> > > > + @param[in] Index Index of the register to program.
>> > > > + @param[in] Type The data type name of a register structure.
>> > > > + @param[in] Field The bit fiel name in register structure to
>write.
>> > > > + @param[in] Value Value to write to the bit field.
>> > > > +
>> > > > + @note This service could be called by BSP only.
>> > > > +**/
>> > > > +#define
>> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
>> > > > RegisterType, Index, Type, Field, Value) \
>> > > > + do { \
>> > > > + UINT64 ValueMask; \
>> > > > + ValueMask = MAX_UINT64;
>> \
>> > > > + ((Type *)(&ValueMask))->Field = 0;
>> > \
>> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber, RegisterType,
>> > > > + Index,
>> > > > ~ValueMask, Value); \
>> > > > + } while(FALSE);
>> > > > +
>> > > > /**
>> > > > Adds a 32-bit register write entry in specified register table.
>> > > >
>> > > > diff --git
>> > > >
>a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
>> > > > .c
>> > > >
>b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
>> > > > .c index 67885bf69b..e9769882b9 100644
>> > > > ---
>> > > >
>a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
>> > > > .c
>> > > > +++
>> > > >
>b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
>> > > > .c @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
>> > > > @param[in] ValidBitStart Start of the bit section
>> > > > @param[in] ValidBitLength Length of the bit section
>> > > > @param[in] Value Value to write
>> > > > + @param[in] TestThenWrite Whether need to test current Value
>> > before
>> > > > writing.
>> > > > +
>> > > > **/
>> > > > VOID
>> > > > CpuRegisterTableWriteWorker (
>> > > > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
>> > > > IN UINT64 Index,
>> > > > IN UINT8 ValidBitStart,
>> > > > IN UINT8 ValidBitLength,
>> > > > - IN UINT64 Value
>> > > > + IN UINT64 Value,
>> > > > + IN UINT8 TestThenWrite
>> > > > )
>> > > > {
>> > > > CPU_FEATURES_DATA *CpuFeaturesData;
>> > > > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
>> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart =
>> > > > ValidBitStart;
>> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
>> > > > ValidBitLength;
>> > > > RegisterTableEntry[RegisterTable->TableLength].Value = Value;
>> > > > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite =
>> > > > + TestThenWrite;
>> > > >
>> > > > RegisterTable->TableLength++;
>> > > > }
>> > > > @@ -1105,7 +1109,42 @@ CpuRegisterTableWrite (
>> > > > Start = (UINT8)LowBitSet64 (ValueMask);
>> > > > End = (UINT8)HighBitSet64 (ValueMask);
>> > > > Length = End - Start + 1;
>> > > > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
>> > > > RegisterType, Index, Start, Length, Value);
>> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
>> > > > +RegisterType, Index, Start, Length, Value, FALSE); }
>> > > > +
>> > > > +/**
>> > > > + Adds an entry in specified register table.
>> > > > +
>> > > > + This function adds an entry in specified register table, with
>> > > > + given register type, register index, bit section and value.
>> > > > +
>> > > > + @param[in] ProcessorNumber The index of the CPU to add a
>> > > > + register
>> > > > table entry
>> > > > + @param[in] RegisterType Type of the register to program
>> > > > + @param[in] Index Index of the register to program
>> > > > + @param[in] ValueMask Mask of bits in register to write
>> > > > + @param[in] Value Value to write
>> > > > + @param[in] TestThenWrite Whether need to test current Value
>> > before
>> > > > writing.
>> > > > +
>> > > > + @note This service could be called by BSP only.
>> > > > +**/
>> > > > +VOID
>> > > > +EFIAPI
>> > > > +CpuRegisterTableTestThenWrite (
>> > > > + IN UINTN ProcessorNumber,
>> > > > + IN REGISTER_TYPE RegisterType,
>> > > > + IN UINT64 Index,
>> > > > + IN UINT64 ValueMask,
>> > > > + IN UINT64 Value
>> > > > + )
>> > > > +{
>> > > > + UINT8 Start;
>> > > > + UINT8 End;
>> > > > + UINT8 Length;
>> > > > +
>> > > > + Start = (UINT8)LowBitSet64 (ValueMask);
>> > > > + End = (UINT8)HighBitSet64 (ValueMask);
>> > > > + Length = End - Start + 1;
>> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
>> > > > + RegisterType, Index, Start, Length, Value, TRUE);
>> > > > }
>> > > >
>> > > > /**
>> > > > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
>> > > > Start = (UINT8)LowBitSet64 (ValueMask);
>> > > > End = (UINT8)HighBitSet64 (ValueMask);
>> > > > Length = End - Start + 1;
>> > > > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
>> > > > RegisterType, Index, Start, Length, Value);
>> > > > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
>> > > > + RegisterType, Index, Start, Length, Value, FALSE);
>> > > > }
>> > > >
>> > > > /**
>> > > > --
>> > > > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45772): https://edk2.groups.io/g/devel/message/45772
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Hi Liming & Star,
> -----Original Message-----
> From: Gao, Liming
> Sent: Friday, August 16, 2019 11:44 AM
> To: Dong, Eric <eric.dong@intel.com>; Zeng, Star <star.zeng@intel.com>;
> devel@edk2.groups.io
> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Yao,
> Jiewen <jiewen.yao@intel.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>
> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add "Test
> Then Write" Macros.
>
> Eric:
>
> >-----Original Message-----
> >From: Dong, Eric
> >Sent: Friday, August 16, 2019 10:20 AM
> >To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
> >Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>; Yao,
> >Jiewen <jiewen.yao@intel.com>; Gao, Liming <liming.gao@intel.com>;
> >Kinney, Michael D <michael.d.kinney@intel.com>
> >Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> >"Test Then Write" Macros.
> >
> >
> >
> >> -----Original Message-----
> >> From: Zeng, Star
> >> Sent: Friday, August 16, 2019 10:08 AM
> >> To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> >> Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >> Yao, Jiewen <jiewen.yao@intel.com>; Gao, Liming
> >> <liming.gao@intel.com>;
> >Kinney,
> >> Michael D <michael.d.kinney@intel.com>; Zeng, Star
> >> <star.zeng@intel.com>
> >> Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> >> "Test Then Write" Macros.
> >>
> >>
> >>
> >> > -----Original Message-----
> >> > From: Dong, Eric
> >> > Sent: Friday, August 16, 2019 9:27 AM
> >> > To: Zeng, Star <star.zeng@intel.com>; devel@edk2.groups.io
> >> > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>
> >> > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> >> > "Test Then Write" Macros.
> >> >
> >> > > -----Original Message-----
> >> > > From: Zeng, Star
> >> > > Sent: Friday, August 16, 2019 9:15 AM
> >> > > To: Dong, Eric <eric.dong@intel.com>; devel@edk2.groups.io
> >> > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek <lersek@redhat.com>;
> >> > > Zeng, Star <star.zeng@intel.com>
> >> > > Subject: RE: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib:
> >> > > Add "Test Then Write" Macros.
> >> > >
> >> > >
> >> > >
> >> > > > -----Original Message-----
> >> > > > From: Dong, Eric
> >> > > > Sent: Thursday, August 15, 2019 10:51 AM
> >> > > > To: devel@edk2.groups.io
> >> > > > Cc: Ni, Ray <ray.ni@intel.com>; Laszlo Ersek
> >> > > > <lersek@redhat.com>; Zeng, Star <star.zeng@intel.com>
> >> > > > Subject: [Patch v3 1/6] UefiCpuPkg/RegisterCpuFeaturesLib: Add
> >> > > > "Test Then Write" Macros.
> >> > > >
> >> > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2040
> >> > > >
> >> > > > Add below new micros which test the current value before write
> >> > > > the new value. Only write new value when current value not same
> >> > > > as new
> >> > value.
> >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE32
> >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE64
> >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD
> >> > > >
> >> > > > Also add below API:
> >> > > > CpuRegisterTableTestThenWrite
> >> > > >
> >> > > > Signed-off-by: Eric Dong <eric.dong@intel.com>
> >> > > > Cc: Ray Ni <ray.ni@intel.com>
> >> > > > Cc: Laszlo Ersek <lersek@redhat.com>
> >> > > > Cc: Star Zeng <star.zeng@intel.com>
> >> > > > ---
> >> > > > UefiCpuPkg/Include/AcpiCpuData.h | 1 +
> >> > > > .../Include/Library/RegisterCpuFeaturesLib.h | 91
> >> > +++++++++++++++++++
> >> > > > .../RegisterCpuFeaturesLib.c | 45 ++++++++-
> >> > > > 3 files changed, 134 insertions(+), 3 deletions(-)
> >> > > >
> >> > > > diff --git a/UefiCpuPkg/Include/AcpiCpuData.h
> >> > > > b/UefiCpuPkg/Include/AcpiCpuData.h
> >> > > > index b963a2f592..472a1a8070 100644
> >> > > > --- a/UefiCpuPkg/Include/AcpiCpuData.h
> >> > > > +++ b/UefiCpuPkg/Include/AcpiCpuData.h
> >> > > > @@ -81,6 +81,7 @@ typedef struct {
> >> > > > UINT16 Reserved; // offset 10 - 11
> >> > > > UINT32 HighIndex; // offset 12-15, only valid for
> >> > MemoryMapped
> >> > > > UINT64 Value; // offset 16-23
> >> > > > + UINT8 TestThenWrite; // 0ffset 24
> >> > >
> >> > > Could we use one byte of the Reserved field, but not add new field?
> >> > > And use BOOLEAN type for it?
> >> >
> >> > I'm not sure whether use the Reserved field is an correct approach,
> >> > do you have samples which use the reserved fields?
> >> > But I think add new field is a more safe one.
> >>
> >> What "more safe" means here? Adding new field extends the structure,
> >from
> >> the structure layout view of point, it is an incompatible change, the
> >> structure size is not just from 24 to 25 bytes, but to be nature
> >> aligned, the structure
> >size
> >> will be (24 + 8) 32. Since there is Reserved field can be reused,
> >> that size
> >impact
> >> can be removed.
> >
> >Yes, agree the size impact. I'm just not clear whether the Reserved
> >field can be used. Whether it has compatible impact.
> >
> >>
> >> FspGlobalData.h:
> >> SHA-1: a2e61f341d26a78751b2f19b5004c6bbfc8b4fa9
> >> * IntelFsp2Pkg: Support FSP Dispatch mode
> >>
> >> MemoryProfile.h
> >> SHA-1: 072a3ca1d36a42aec97f871c808776ee7038ca06 (related to
> >> 94092aa60341a3e4b1e1ea7c362781b8404ac538)
> >> * MdeModulePkg MemoryProfile.h:two bytes of Reserved[4] as
> >> ActionStringOffset
> >>
> >
> >If so many examples already did it. I think we can also do it.
> >
> >>
> >> If needed, more comments from Ray, Laszlo, Jiewen, Liming and Mike
> >> will
> >be
> >> better.
> >
> >Yes, I think we need get more comments from them.
>
> I think to reuse the reserved field is a good solution.
>
Thanks for this valuable input, I will send V4 patch to use Reserved field.
Thanks,
Eric
> Thanks
> Liming
> >
> >Thanks,
> >Eric
> >>
> >>
> >> Thanks,
> >> Star
> >>
> >> >
> >> > Thanks,
> >> > Eric
> >> > >
> >> > > Thanks,
> >> > > Star
> >> > >
> >> > > > } CPU_REGISTER_TABLE_ENTRY;
> >> > > >
> >> > > > //
> >> > > > diff --git
> >> > > > a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> >> > > > b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> >> > > > index e420e7f075..5bd464b32e 100644
> >> > > > --- a/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> >> > > > +++ b/UefiCpuPkg/Include/Library/RegisterCpuFeaturesLib.h
> >> > > > @@ -348,6 +348,32 @@ CpuRegisterTableWrite (
> >> > > > IN UINT64 Value
> >> > > > );
> >> > > >
> >> > > > +/**
> >> > > > + Adds an entry in specified register table.
> >> > > > +
> >> > > > + This function adds an entry in specified register table,
> >> > > > + with given register type, register index, bit section and value.
> >> > > > +
> >> > > > + Driver will test the current value before setting new value.
> >> > > > +
> >> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> >> > > > + register
> >> > > > table entry
> >> > > > + @param[in] RegisterType Type of the register to program
> >> > > > + @param[in] Index Index of the register to program
> >> > > > + @param[in] ValueMask Mask of bits in register to write
> >> > > > + @param[in] Value Value to write
> >> > > > +
> >> > > > + @note This service could be called by BSP only.
> >> > > > +**/
> >> > > > +VOID
> >> > > > +EFIAPI
> >> > > > +CpuRegisterTableTestThenWrite (
> >> > > > + IN UINTN ProcessorNumber,
> >> > > > + IN REGISTER_TYPE RegisterType,
> >> > > > + IN UINT64 Index,
> >> > > > + IN UINT64 ValueMask,
> >> > > > + IN UINT64 Value
> >> > > > + );
> >> > > > +
> >> > > > /**
> >> > > > Adds an entry in specified Pre-SMM register table.
> >> > > >
> >> > > > @@ -390,6 +416,26 @@ PreSmmCpuRegisterTableWrite (
> >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType,
> >> > > > Index, MAX_UINT32, Value); \
> >> > > > } while(FALSE);
> >> > > >
> >> > > > +/**
> >> > > > + Adds a 32-bit register write entry in specified register table.
> >> > > > +
> >> > > > + This macro adds an entry in specified register table, with
> >> > > > + given register type, register index, and value.
> >> > > > +
> >> > > > + Driver will test the current value before setting new value.
> >> > > > +
> >> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> >> > > > + register
> >> > > > table entry.
> >> > > > + @param[in] RegisterType Type of the register to program
> >> > > > + @param[in] Index Index of the register to program
> >> > > > + @param[in] Value Value to write
> >> > > > +
> >> > > > + @note This service could be called by BSP only.
> >> > > > +**/
> >> > > > +#define
> >> > CPU_REGISTER_TABLE_TEST_THEN_WRITE32(ProcessorNumber,
> >> > > > RegisterType, Index, Value) \
> >> > > > + do { \
> >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber,
> >> > > > +RegisterType, Index, MAX_UINT32, Value); \
> >> > > > + } while(FALSE);
> >> > > > +
> >> > > > /**
> >> > > > Adds a 64-bit register write entry in specified register table.
> >> > > >
> >> > > > @@ -408,6 +454,26 @@ PreSmmCpuRegisterTableWrite (
> >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType,
> >> > > > Index, MAX_UINT64, Value); \
> >> > > > } while(FALSE);
> >> > > >
> >> > > > +/**
> >> > > > + Adds a 64-bit register write entry in specified register table.
> >> > > > +
> >> > > > + This macro adds an entry in specified register table, with
> >> > > > + given register type, register index, and value.
> >> > > > +
> >> > > > + Driver will test the current value before setting new value.
> >> > > > +
> >> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> >> > > > + register
> >> > > > table entry.
> >> > > > + @param[in] RegisterType Type of the register to program
> >> > > > + @param[in] Index Index of the register to program
> >> > > > + @param[in] Value Value to write
> >> > > > +
> >> > > > + @note This service could be called by BSP only.
> >> > > > +**/
> >> > > > +#define
> >> > CPU_REGISTER_TABLE_TEST_THEN_WRITE64(ProcessorNumber,
> >> > > > RegisterType, Index, Value) \
> >> > > > + do { \
> >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber,
> >> > > > +RegisterType, Index, MAX_UINT64, Value); \
> >> > > > + } while(FALSE);
> >> > > > +
> >> > > > /**
> >> > > > Adds a bit field write entry in specified register table.
> >> > > >
> >> > > > @@ -431,6 +497,31 @@ PreSmmCpuRegisterTableWrite (
> >> > > > CpuRegisterTableWrite (ProcessorNumber, RegisterType, Index,
> >> > > > ~ValueMask, Value); \
> >> > > > } while(FALSE);
> >> > > >
> >> > > > +/**
> >> > > > + Adds a bit field write entry in specified register table.
> >> > > > +
> >> > > > + This macro adds an entry in specified register table, with
> >> > > > + given register type, register index, bit field section, and value.
> >> > > > +
> >> > > > + Driver will test the current value before setting new value.
> >> > > > +
> >> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> >> > > > + register
> >> > > > table entry.
> >> > > > + @param[in] RegisterType Type of the register to program.
> >> > > > + @param[in] Index Index of the register to program.
> >> > > > + @param[in] Type The data type name of a register structure.
> >> > > > + @param[in] Field The bit fiel name in register structure to
> >write.
> >> > > > + @param[in] Value Value to write to the bit field.
> >> > > > +
> >> > > > + @note This service could be called by BSP only.
> >> > > > +**/
> >> > > > +#define
> >> > > > CPU_REGISTER_TABLE_TEST_THEN_WRITE_FIELD(ProcessorNumber,
> >> > > > RegisterType, Index, Type, Field, Value) \
> >> > > > + do { \
> >> > > > + UINT64 ValueMask; \
> >> > > > + ValueMask = MAX_UINT64;
> >> \
> >> > > > + ((Type *)(&ValueMask))->Field = 0;
> >> > \
> >> > > > + CpuRegisterTableTestThenWrite (ProcessorNumber,
> >> > > > + RegisterType, Index,
> >> > > > ~ValueMask, Value); \
> >> > > > + } while(FALSE);
> >> > > > +
> >> > > > /**
> >> > > > Adds a 32-bit register write entry in specified register table.
> >> > > >
> >> > > > diff --git
> >> > > >
> >a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> >> > > > .c
> >> > > >
> >b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> >> > > > .c index 67885bf69b..e9769882b9 100644
> >> > > > ---
> >> > > >
> >a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> >> > > > .c
> >> > > > +++
> >> > > >
> >b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib
> >> > > > .c @@ -1025,6 +1025,8 @@ EnlargeRegisterTable (
> >> > > > @param[in] ValidBitStart Start of the bit section
> >> > > > @param[in] ValidBitLength Length of the bit section
> >> > > > @param[in] Value Value to write
> >> > > > + @param[in] TestThenWrite Whether need to test current Value
> >> > before
> >> > > > writing.
> >> > > > +
> >> > > > **/
> >> > > > VOID
> >> > > > CpuRegisterTableWriteWorker (
> >> > > > @@ -1034,7 +1036,8 @@ CpuRegisterTableWriteWorker (
> >> > > > IN UINT64 Index,
> >> > > > IN UINT8 ValidBitStart,
> >> > > > IN UINT8 ValidBitLength,
> >> > > > - IN UINT64 Value
> >> > > > + IN UINT64 Value,
> >> > > > + IN UINT8 TestThenWrite
> >> > > > )
> >> > > > {
> >> > > > CPU_FEATURES_DATA *CpuFeaturesData;
> >> > > > @@ -1070,6 +1073,7 @@ CpuRegisterTableWriteWorker (
> >> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitStart
> >> > > > = ValidBitStart;
> >> > > >
> >> > > > RegisterTableEntry[RegisterTable->TableLength].ValidBitLength =
> ValidBitLength;
> >> > > > RegisterTableEntry[RegisterTable->TableLength].Value = Value;
> >> > > > + RegisterTableEntry[RegisterTable->TableLength].TestThenWrite
> >> > > > + = TestThenWrite;
> >> > > >
> >> > > > RegisterTable->TableLength++; } @@ -1105,7 +1109,42 @@
> >> > > > CpuRegisterTableWrite (
> >> > > > Start = (UINT8)LowBitSet64 (ValueMask);
> >> > > > End = (UINT8)HighBitSet64 (ValueMask);
> >> > > > Length = End - Start + 1;
> >> > > > - CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> >> > > > RegisterType, Index, Start, Length, Value);
> >> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> >> > > > +RegisterType, Index, Start, Length, Value, FALSE); }
> >> > > > +
> >> > > > +/**
> >> > > > + Adds an entry in specified register table.
> >> > > > +
> >> > > > + This function adds an entry in specified register table,
> >> > > > + with given register type, register index, bit section and value.
> >> > > > +
> >> > > > + @param[in] ProcessorNumber The index of the CPU to add a
> >> > > > + register
> >> > > > table entry
> >> > > > + @param[in] RegisterType Type of the register to program
> >> > > > + @param[in] Index Index of the register to program
> >> > > > + @param[in] ValueMask Mask of bits in register to write
> >> > > > + @param[in] Value Value to write
> >> > > > + @param[in] TestThenWrite Whether need to test current Value
> >> > before
> >> > > > writing.
> >> > > > +
> >> > > > + @note This service could be called by BSP only.
> >> > > > +**/
> >> > > > +VOID
> >> > > > +EFIAPI
> >> > > > +CpuRegisterTableTestThenWrite (
> >> > > > + IN UINTN ProcessorNumber,
> >> > > > + IN REGISTER_TYPE RegisterType,
> >> > > > + IN UINT64 Index,
> >> > > > + IN UINT64 ValueMask,
> >> > > > + IN UINT64 Value
> >> > > > + )
> >> > > > +{
> >> > > > + UINT8 Start;
> >> > > > + UINT8 End;
> >> > > > + UINT8 Length;
> >> > > > +
> >> > > > + Start = (UINT8)LowBitSet64 (ValueMask);
> >> > > > + End = (UINT8)HighBitSet64 (ValueMask);
> >> > > > + Length = End - Start + 1;
> >> > > > + CpuRegisterTableWriteWorker (FALSE, ProcessorNumber,
> >> > > > + RegisterType, Index, Start, Length, Value, TRUE);
> >> > > > }
> >> > > >
> >> > > > /**
> >> > > > @@ -1139,7 +1178,7 @@ PreSmmCpuRegisterTableWrite (
> >> > > > Start = (UINT8)LowBitSet64 (ValueMask);
> >> > > > End = (UINT8)HighBitSet64 (ValueMask);
> >> > > > Length = End - Start + 1;
> >> > > > - CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
> >> > > > RegisterType, Index, Start, Length, Value);
> >> > > > + CpuRegisterTableWriteWorker (TRUE, ProcessorNumber,
> >> > > > + RegisterType, Index, Start, Length, Value, FALSE);
> >> > > > }
> >> > > >
> >> > > > /**
> >> > > > --
> >> > > > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#45780): https://edk2.groups.io/g/devel/message/45780
Mute This Topic: https://groups.io/mt/32882705/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2026 Red Hat, Inc.