Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0.
On 27/11/2015 02:14, Yao, Jiewen wrote: > [Jiewen] Do you mean KVM reject SMM write BIT16 of CR0 ? It is odd, > because my patch sets W+P bit page table entries. That's odd indeed. All common OSes run with CR0.WP=1. I'll try to reproduce... Paolo ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0.
On 11/25/15 22:56, Yao, Jiewen wrote: > Hi Mike > Thanks for the suggestion. > Previously, I just want to *ADD* without touch old logic. I will use your way > to do it. > > -Original Message- > From: Kinney, Michael D > Sent: Thursday, November 26, 2015 2:01 AM > To: Yao, Jiewen; edk2-de...@ml01.01.org; Kinney, Michael D > Cc: Fan, Jeff > Subject: RE: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. > > Jiewen, > > For IA32 assembly, can we combine into a single OR instruction that sets both > page enable and WP? > For X64, does it make sense to use single OR instruction instead of 2 BTS > instructions as well? > > With those updates, > > Reviewed-by: Michael Kinney> > Thanks, > > Mike > >> -Original Message- >> From: Yao, Jiewen >> Sent: Wednesday, November 25, 2015 4:35 AM >> To: edk2-de...@ml01.01.org >> Cc: Yao, Jiewen ; Fan, Jeff ; >> Kinney, Michael D >> Subject: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. >> >> So that we can use write-protection for code later. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: "Yao, Jiewen" >> Cc: "Fan, Jeff" >> Cc: "Kinney, Michael D" >> --- >> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S| 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 1 + >> 4 files changed, 4 insertions(+) >> >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> index 7e1787c..8e64ce8 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> @@ -142,6 +142,7 @@ L13: >> >> movl%cr0, %ebx >> orl $0x08000, %ebx # enable paging >> +orl $0x1, %ebx # set WP >> movl%ebx, %cr0 >> lealDSC_OFFSET(%edi),%ebx >> movwDSC_DS(%ebx),%ax >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> index e6af344..a955785 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> @@ -148,6 +148,7 @@ gSmiCr3 DD ? >> >> mov ebx, cr0 >> or ebx, 08000h ; enable paging >> +or ebx, 1h ; set WP >> mov cr0, ebx >> lea ebx, [edi + DSC_OFFSET] >> mov ax, [ebx + DSC_DS] >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> index 1d40819..8050a00 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> @@ -163,6 +163,7 @@ NxeDone: >> wrmsr >> movq%cr0, %rbx >> btsl$31, %ebx >> +btsl$16, %ebx # set WP >> movq%rbx, %cr0 >> retf >> LongMode: # long mode (64-bit code) starts >> here >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> index 6e1d3f1..db170d6 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> @@ -159,6 +159,7 @@ Base: >> wrmsr >> mov rbx, cr0 >> bts ebx, 31 >> +bts ebx, 16; set WP >> mov cr0, rbx >> retf >> @LongMode: ; long mode (64-bit code) starts >> here >> -- >> 1.9.5.msysgit.0 This patch (= SVN r18960) breaks the 32-bit (Ia32) build of the OVMF SMM series. KVM "rejects" the guest soon after the SMBASE relocation. These are the last messages from the OVMF debug log: > Loading SMM driver at 0x0007FFD2000 EntryPoint=0x0007FFD2253 > PiSmmCpuDxeSmm.efi > SMRR Base: 0x7F80, SMRR Size: 0x80 > PcdCpuSmmCodeAccessCheckEnable = 1 > SMRAM TileSize = 0x2000 (0x1000, 0x1000) > SMRAM SaveState Buffer (0x7FFC4000, 0xE000) > CPU[000] APIC ID= SMBASE=7FFBC000 SaveState=7FFCBC00 Size=0400 > CPU[001] APIC ID=0002 SMBASE=7FFBE000 SaveState=7FFCDC00 Size=0400 > CPU[002] APIC ID=0003 SMBASE=7FFC SaveState=7FFCFC00 Size=0400 > CPU[003] APIC ID=0001 SMBASE=7FFC2000 SaveState=7FFD1C00 Size=0400 > InstallProtocolInterface: 26EEB3DE-B689-492E-80F0-BE8BD7DA4BA7 7FFE0FD0 > SMM IPL registered SMM Entry Point address 7FFF19AE > SmmInstallProtocolInterface: EB346B97-975F-4A9F-8B22-F8E92BB3D569 7FFE0F68 > SmmInstallProtocolInterface: 1D202CAB-C8AB-4D5C-94F7-3CFCC0D3D335 7FFE0FDC > SMM S3 SMRAM Structure = 7F5816C0 > SMM S3 Structure = 7F80 > SMM CPU Module exit from SMRAM with EFI_SUCCESS > SMM IPL closed SMRAM window QEMU logs the following: > KVM: entry failed, hardware error 0x8021 > > If
Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0.
Hi Laszlo Comments below: -Original Message- From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Laszlo Ersek Sent: Friday, November 27, 2015 5:57 AM To: Yao, Jiewen; Kinney, Michael D; edk2-de...@ml01.01.org Cc: Paolo Bonzini; Fan, Jeff Subject: Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. On 11/25/15 22:56, Yao, Jiewen wrote: > Hi Mike > Thanks for the suggestion. > Previously, I just want to *ADD* without touch old logic. I will use your way > to do it. > > -Original Message- > From: Kinney, Michael D > Sent: Thursday, November 26, 2015 2:01 AM > To: Yao, Jiewen; edk2-de...@ml01.01.org; Kinney, Michael D > Cc: Fan, Jeff > Subject: RE: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. > > Jiewen, > > For IA32 assembly, can we combine into a single OR instruction that sets both > page enable and WP? > For X64, does it make sense to use single OR instruction instead of 2 BTS > instructions as well? > > With those updates, > > Reviewed-by: Michael Kinney <michael.d.kin...@intel.com> > > Thanks, > > Mike > >> -Original Message- >> From: Yao, Jiewen >> Sent: Wednesday, November 25, 2015 4:35 AM >> To: edk2-de...@ml01.01.org >> Cc: Yao, Jiewen <jiewen@intel.com>; Fan, Jeff >> <jeff@intel.com>; Kinney, Michael D <michael.d.kin...@intel.com> >> Subject: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. >> >> So that we can use write-protection for code later. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: "Yao, Jiewen" <jiewen@intel.com> >> Cc: "Fan, Jeff" <jeff@intel.com> >> Cc: "Kinney, Michael D" <michael.d.kin...@intel.com> >> --- >> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S| 1 + >> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 1 + >> 4 files changed, 4 insertions(+) >> >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> index 7e1787c..8e64ce8 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >> @@ -142,6 +142,7 @@ L13: >> >> movl%cr0, %ebx >> orl $0x08000, %ebx # enable paging >> +orl $0x1, %ebx # set WP >> movl%ebx, %cr0 >> lealDSC_OFFSET(%edi),%ebx >> movwDSC_DS(%ebx),%ax >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> index e6af344..a955785 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >> @@ -148,6 +148,7 @@ gSmiCr3 DD ? >> >> mov ebx, cr0 >> or ebx, 08000h ; enable paging >> +or ebx, 1h ; set WP >> mov cr0, ebx >> lea ebx, [edi + DSC_OFFSET] >> mov ax, [ebx + DSC_DS] >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> index 1d40819..8050a00 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >> @@ -163,6 +163,7 @@ NxeDone: >> wrmsr >> movq%cr0, %rbx >> btsl$31, %ebx >> +btsl$16, %ebx # set WP >> movq%rbx, %cr0 >> retf >> LongMode: # long mode (64-bit code) starts >> here >> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> index 6e1d3f1..db170d6 100644 >> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >> @@ -159,6 +159,7 @@ Base: >> wrmsr >> mov rbx, cr0 >> bts ebx, 31 >> +bts ebx, 16; set WP >> mov cr0, rbx >> retf >> @LongMode: ; long mode (64-bit code) starts >> here >> -- >> 1.9.5.msysgit.0 This patch (= SVN r18960) breaks the 32-bit (Ia32) build of the OVMF SMM series. KVM "rejects" the guest soon after the SMBASE relocation. These are the last messages from the OVMF debug log: > Loading SMM driver at 0x0007FFD2000 EntryPoint=0x0007FFD2253 > PiSmmCpuDxeSmm.efi SMRR Base: 0x7F80, SMRR
Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0.
On 11/27/15 02:14, Yao, Jiewen wrote: > Hi Laszlo > Comments below: > > -Original Message- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Laszlo > Ersek > Sent: Friday, November 27, 2015 5:57 AM > To: Yao, Jiewen; Kinney, Michael D; edk2-de...@ml01.01.org > Cc: Paolo Bonzini; Fan, Jeff > Subject: Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. > > On 11/25/15 22:56, Yao, Jiewen wrote: >> Hi Mike >> Thanks for the suggestion. >> Previously, I just want to *ADD* without touch old logic. I will use your >> way to do it. >> >> -Original Message- >> From: Kinney, Michael D >> Sent: Thursday, November 26, 2015 2:01 AM >> To: Yao, Jiewen; edk2-de...@ml01.01.org; Kinney, Michael D >> Cc: Fan, Jeff >> Subject: RE: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. >> >> Jiewen, >> >> For IA32 assembly, can we combine into a single OR instruction that sets >> both page enable and WP? >> For X64, does it make sense to use single OR instruction instead of 2 BTS >> instructions as well? >> >> With those updates, >> >> Reviewed-by: Michael Kinney <michael.d.kin...@intel.com> >> >> Thanks, >> >> Mike >> >>> -Original Message- >>> From: Yao, Jiewen >>> Sent: Wednesday, November 25, 2015 4:35 AM >>> To: edk2-de...@ml01.01.org >>> Cc: Yao, Jiewen <jiewen@intel.com>; Fan, Jeff >>> <jeff@intel.com>; Kinney, Michael D <michael.d.kin...@intel.com> >>> Subject: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. >>> >>> So that we can use write-protection for code later. >>> >>> Contributed-under: TianoCore Contribution Agreement 1.0 >>> Signed-off-by: "Yao, Jiewen" <jiewen@intel.com> >>> Cc: "Fan, Jeff" <jeff@intel.com> >>> Cc: "Kinney, Michael D" <michael.d.kin...@intel.com> >>> --- >>> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 1 + >>> UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 1 + >>> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S| 1 + >>> UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 1 + >>> 4 files changed, 4 insertions(+) >>> >>> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >>> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >>> index 7e1787c..8e64ce8 100644 >>> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >>> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S >>> @@ -142,6 +142,7 @@ L13: >>> >>> movl%cr0, %ebx >>> orl $0x08000, %ebx # enable paging >>> +orl $0x1, %ebx # set WP >>> movl%ebx, %cr0 >>> lealDSC_OFFSET(%edi),%ebx >>> movwDSC_DS(%ebx),%ax >>> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >>> b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >>> index e6af344..a955785 100644 >>> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >>> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm >>> @@ -148,6 +148,7 @@ gSmiCr3 DD ? >>> >>> mov ebx, cr0 >>> or ebx, 08000h ; enable paging >>> +or ebx, 1h ; set WP >>> mov cr0, ebx >>> lea ebx, [edi + DSC_OFFSET] >>> mov ax, [ebx + DSC_DS] >>> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >>> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >>> index 1d40819..8050a00 100644 >>> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >>> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S >>> @@ -163,6 +163,7 @@ NxeDone: >>> wrmsr >>> movq%cr0, %rbx >>> btsl$31, %ebx >>> +btsl$16, %ebx # set WP >>> movq%rbx, %cr0 >>> retf >>> LongMode: # long mode (64-bit code) starts >>> here >>> diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >>> b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >>> index 6e1d3f1..db170d6 100644 >>> --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >>> +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm >>> @@ -159,6 +159,7 @@ Base: >>> wrmsr >>> mov rbx, cr0 >>> bts ebx, 31 >>> +bts ebx, 16; set WP >>> mov cr
Re: [edk2] [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0.
Hi Mike Thanks for the suggestion. Previously, I just want to *ADD* without touch old logic. I will use your way to do it. -Original Message- From: Kinney, Michael D Sent: Thursday, November 26, 2015 2:01 AM To: Yao, Jiewen; edk2-de...@ml01.01.org; Kinney, Michael D Cc: Fan, Jeff Subject: RE: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. Jiewen, For IA32 assembly, can we combine into a single OR instruction that sets both page enable and WP? For X64, does it make sense to use single OR instruction instead of 2 BTS instructions as well? With those updates, Reviewed-by: Michael KinneyThanks, Mike > -Original Message- > From: Yao, Jiewen > Sent: Wednesday, November 25, 2015 4:35 AM > To: edk2-de...@ml01.01.org > Cc: Yao, Jiewen ; Fan, Jeff ; > Kinney, Michael D > Subject: [patch 2/2] UefiCpuPkg/PiSmmCpu: Always set WP in CR0. > > So that we can use write-protection for code later. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: "Yao, Jiewen" > Cc: "Fan, Jeff" > Cc: "Kinney, Michael D" > --- > UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S | 1 + > UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm | 1 + > UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S| 1 + > UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm | 1 + > 4 files changed, 4 insertions(+) > > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S > b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S > index 7e1787c..8e64ce8 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S > @@ -142,6 +142,7 @@ L13: > > movl%cr0, %ebx > orl $0x08000, %ebx # enable paging > +orl $0x1, %ebx # set WP > movl%ebx, %cr0 > lealDSC_OFFSET(%edi),%ebx > movwDSC_DS(%ebx),%ax > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm > b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm > index e6af344..a955785 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm > @@ -148,6 +148,7 @@ gSmiCr3 DD ? > > mov ebx, cr0 > or ebx, 08000h ; enable paging > +or ebx, 1h ; set WP > mov cr0, ebx > lea ebx, [edi + DSC_OFFSET] > mov ax, [ebx + DSC_DS] > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S > b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S > index 1d40819..8050a00 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S > @@ -163,6 +163,7 @@ NxeDone: > wrmsr > movq%cr0, %rbx > btsl$31, %ebx > +btsl$16, %ebx # set WP > movq%rbx, %cr0 > retf > LongMode: # long mode (64-bit code) starts here > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm > b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm > index 6e1d3f1..db170d6 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm > @@ -159,6 +159,7 @@ Base: > wrmsr > mov rbx, cr0 > bts ebx, 31 > +bts ebx, 16; set WP > mov cr0, rbx > retf > @LongMode: ; long mode (64-bit code) starts here > -- > 1.9.5.msysgit.0 ___ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel