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(-)
I'll try to test this and report back, but until then: - Can you please add a note to the commit message about this bug breaking S3 resume? For example: [The PiSmmCpuDxeSmm module makes some assumptions about GDT selectors that are based on the GDT layout from the DxeIplPeim.] For example, the protected mode entry code and (where appropriate) the long mode entry code in the UefiCpuPkg/PiSmmCpuDxeSmm/*/MpFuncs.* assembly files, which are used during S3 resume, open-code segment selector values that depend on DxeIplPeim's GDT layout. [This patch updates the CpuDxe module to use the same GDT layout as the DxeIplPeim.] This enables modules that are dispatched after CpuDxe to find, and potentially save and restore, a GDT layout that matches that of DxeIplPeim. [Using a consistent GDT also...] - Can you please add the following tags (bragging rights are important! ;)) Reported-by: Laszlo Ersek <[email protected]> Analyzed-by: Laszlo Ersek <[email protected]> Link: http://article.gmane.org/gmane.comp.bios.edk2.devel/3568 Thank you, Laszlo > > 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 > }, > }; > > /** > 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) > > #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 > #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

