comments below On 10/29/15 21:35, Michael Kinney wrote: > The PiSmmCpuDxeSmm module makes some assumptions about GDT selectors > that are based on the GDT layout from the DxeIplPeim. This updates the > CpuDxe module to use the same GDT layout as the DxeIplPeim. > > Using a consistent GDT also improves debug experience. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Michael Kinney <[email protected]> > --- > UefiCpuPkg/CpuDxe/CpuGdt.c | 83 > ++++++++++++++++++++++++++-------------------- > UefiCpuPkg/CpuDxe/CpuGdt.h | 10 +++--- > 2 files changed, 53 insertions(+), 40 deletions(-) > > diff --git a/UefiCpuPkg/CpuDxe/CpuGdt.c b/UefiCpuPkg/CpuDxe/CpuGdt.c > index 35a87a6..9ef2fdf 100644 > --- a/UefiCpuPkg/CpuDxe/CpuGdt.c > +++ b/UefiCpuPkg/CpuDxe/CpuGdt.c > @@ -1,10 +1,10 @@ > /** @file > C based implemention of IA32 interrupt handling only > requiring a minimal assembly interrupt entry point. > > - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -33,82 +33,93 @@ STATIC GDT_ENTRIES GdtTemplate = { > }, > // > // LINEAR_SEL > // > { > - 0x0FFFF, // limit 0xFFFFF > - 0x0, // base 0 > - 0x0, > - 0x092, // present, ring 0, data, expand-up, writable > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x092, // present, ring 0, data, read/write > 0x0CF, // page-granular, 32-bit > 0x0, > }, > // > // LINEAR_CODE_SEL > // > { > - 0x0FFFF, // limit 0xFFFFF > - 0x0, // base 0 > - 0x0, > - 0x09A, // present, ring 0, data, expand-up, writable > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x09F, // present, ring 0, code, execute/read, conforming, > accessed > 0x0CF, // page-granular, 32-bit > 0x0, > }, > // > // SYS_DATA_SEL > // > { > - 0x0FFFF, // limit 0xFFFFF > - 0x0, // base 0 > - 0x0, > - 0x092, // present, ring 0, data, expand-up, writable > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x093, // present, ring 0, data, read/write, accessed > 0x0CF, // page-granular, 32-bit > 0x0, > }, > // > // SYS_CODE_SEL > // > { > - 0x0FFFF, // limit 0xFFFFF > - 0x0, // base 0 > - 0x0, > - 0x09A, // present, ring 0, data, expand-up, writable > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x09A, // present, ring 0, code, execute/read > 0x0CF, // page-granular, 32-bit > 0x0, > }, > // > - // LINEAR_CODE64_SEL > + // SPARE4_SEL > // > { > - 0x0FFFF, // limit 0xFFFFF > - 0x0, // base 0 > - 0x0, > - 0x09B, // present, ring 0, code, expand-up, writable > - 0x0AF, // LimitHigh (CS.L=1, CS.D=0) > - 0x0, // base (high) > + 0x0, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x0, // type > + 0x0, // limit 19:16, flags > + 0x0, // base 31:24 > }, > // > - // SPARE4_SEL > + // LINEAR_DATA64_SEL > // > { > - 0x0, // limit 0 > - 0x0, // base 0 > - 0x0, > - 0x0, // present, ring 0, data, expand-up, writable > - 0x0, // page-granular, 32-bit > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x092, // present, ring 0, data, read/write > + 0x0CF, // page-granular, 32-bit > 0x0, > }, > // > + // LINEAR_CODE64_SEL > + // > + { > + 0x0FFFF, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x09A, // present, ring 0, code, execute/read > + 0x0AF, // page-granular, 64-bit code > + 0x0, // base (high) > + }, > + // > // SPARE5_SEL > // > { > - 0x0, // limit 0 > - 0x0, // base 0 > - 0x0, > - 0x0, // present, ring 0, data, expand-up, writable > - 0x0, // page-granular, 32-bit > - 0x0, > + 0x0, // limit 15:0 > + 0x0, // base 15:0 > + 0x0, // base 23:16 > + 0x0, // type > + 0x0, // limit 19:16, flags > + 0x0, // base 31:24 > }, > };
I wrote a script to convert gGdtEntries from "MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c" to the format visible above (i.e., from IA32_GDT to GDT_ENTRY). I didn't try to verify the semantics (i.e., the comments column) of the various bits here, but I confirm that the post-patch numeric values and the ordering in GdtTemplate are identical to those in gGdtEntries. > > /** > Initialize Global Descriptor Table. > diff --git a/UefiCpuPkg/CpuDxe/CpuGdt.h b/UefiCpuPkg/CpuDxe/CpuGdt.h > index 7ecec5d..2a00751 100644 > --- a/UefiCpuPkg/CpuDxe/CpuGdt.h > +++ b/UefiCpuPkg/CpuDxe/CpuGdt.h > @@ -1,10 +1,10 @@ > /** @file > C based implemention of IA32 interrupt handling only > requiring a minimal assembly interrupt entry point. > > - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR> > + Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> > This program and the accompanying materials > are licensed and made available under the terms and conditions of the BSD > License > which accompanies this distribution. The full text of the license may be > found at > http://opensource.org/licenses/bsd-license.php > > @@ -40,32 +40,34 @@ struct _GDT_ENTRIES { > GDT_ENTRY Null; > GDT_ENTRY Linear; > GDT_ENTRY LinearCode; > GDT_ENTRY SysData; > GDT_ENTRY SysCode; > - GDT_ENTRY LinearCode64; > GDT_ENTRY Spare4; > + GDT_ENTRY LinearData64; > + GDT_ENTRY LinearCode64; > GDT_ENTRY Spare5; > } GDT_ENTRIES; > > #pragma pack () > > #define NULL_SEL OFFSET_OF (GDT_ENTRIES, Null) > #define LINEAR_SEL OFFSET_OF (GDT_ENTRIES, Linear) > #define LINEAR_CODE_SEL OFFSET_OF (GDT_ENTRIES, LinearCode) > #define SYS_DATA_SEL OFFSET_OF (GDT_ENTRIES, SysData) > #define SYS_CODE_SEL OFFSET_OF (GDT_ENTRIES, SysCode) > -#define LINEAR_CODE64_SEL OFFSET_OF (GDT_ENTRIES, LinearCode64) > #define SPARE4_SEL OFFSET_OF (GDT_ENTRIES, Spare4) > +#define LINEAR_DATA64_SEL OFFSET_OF (GDT_ENTRIES, LinearData64) > +#define LINEAR_CODE64_SEL OFFSET_OF (GDT_ENTRIES, LinearCode64) > #define SPARE5_SEL OFFSET_OF (GDT_ENTRIES, Spare5) Yes, these are consistent with the comments in "MdeModulePkg/Core/DxeIplPeim/Ia32/DxeLoadFunc.c", and also with the new comments in GdtTemplate. > > #if defined (MDE_CPU_IA32) > #define CPU_CODE_SEL LINEAR_CODE_SEL > #define CPU_DATA_SEL LINEAR_SEL > #elif defined (MDE_CPU_X64) > #define CPU_CODE_SEL LINEAR_CODE64_SEL > -#define CPU_DATA_SEL LINEAR_SEL > +#define CPU_DATA_SEL LINEAR_DATA64_SEL This gave me a little pause, but it is correct after all, considering that the segment descriptor *contents* for selector LINEAR_SEL (= 0x08) are fully identical to those for selector LINEAR_DATA64_SEL (= 0x30). So in the X64 build the CPU_DATA_SEL selector value will change (from 0x08 to 0x30) wherever it is used, but the effect will be the same. I think that this (cosmetic) change *might* deserve a mention in the commit message too. Summary (of my other email too): - please consider adding the S3 language I proposed there - please add the three tags I asked for there - please consider mentioning that the CPU_DATA_SEL change makes no observable difference With those in place: Reviewed-by: Laszlo Ersek <[email protected]> Clearly, I also tested the patch. SMM S3 works with it in the Ia32 and Ia32X64 cases both. :) Tested-by: Laszlo Ersek <[email protected]> Thank you very much! Laszlo > #else > #error CPU type not supported for CPU GDT initialization! > #endif > > #endif // _CPU_GDT_H_ > _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

