public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg
@ 2020-11-12  5:31 Rebecca Cran
  2020-11-12  5:31 ` [PATCH v2 1/2] OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes Rebecca Cran
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Rebecca Cran @ 2020-11-12  5:31 UTC (permalink / raw)
  To: devel
  Cc: Rebecca Cran, Jordan Justen, Laszlo Ersek, Ard Biesheuvel,
	Peter Grehan

Fix Bhyve following breaking changes in OvmfPkg.
Follows suggestions from Laszlo in the v1 patch set.
I also changed the INF version in ResetVector.inf to 1.29.

Rebecca Cran (2):
  OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes
  OvmfPkg/Bhyve: fix build breakage after SEV-ES changes

 OvmfPkg/Bhyve/BhyveX64.dsc                    |   3 +-
 OvmfPkg/Bhyve/BhyveX64.fdf                    |   2 +-
 OvmfPkg/Bhyve/ResetVector/ResetVector.inf     |  38 +++++
 .../Bhyve/ResetVector/Ia32/PageTables64.asm   | 149 ++++++++++++++++++
 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb   |  68 ++++++++
 5 files changed, 258 insertions(+), 2 deletions(-)
 create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.inf
 create mode 100644 OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
 create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb

-- 
2.29.2



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes
  2020-11-12  5:31 [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Rebecca Cran
@ 2020-11-12  5:31 ` Rebecca Cran
  2020-11-12  5:31 ` [PATCH v2 2/2] OvmfPkg/Bhyve: fix build breakage after " Rebecca Cran
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Rebecca Cran @ 2020-11-12  5:31 UTC (permalink / raw)
  To: devel
  Cc: Rebecca Cran, Jordan Justen, Laszlo Ersek, Ard Biesheuvel,
	Peter Grehan

Commits 6995a1b79bab, 8a2732186a53 and 30937f2f98c4 modified all four
regular files under "OvmfPkg/ResetVector" with SEV-ES dependencies.
These are not relevant for Bhyve. Detach the pre-SEV-ES version of
ResetVector for Bhyve.

Signed-off-by: Rebecca Cran <rebecca@bsdio.com>
---
 OvmfPkg/Bhyve/ResetVector/ResetVector.inf     |  38 +++++
 .../Bhyve/ResetVector/Ia32/PageTables64.asm   | 149 ++++++++++++++++++
 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb   |  68 ++++++++
 3 files changed, 255 insertions(+)
 create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.inf
 create mode 100644 OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
 create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb

diff --git a/OvmfPkg/Bhyve/ResetVector/ResetVector.inf b/OvmfPkg/Bhyve/ResetVector/ResetVector.inf
new file mode 100644
index 000000000000..772dda540490
--- /dev/null
+++ b/OvmfPkg/Bhyve/ResetVector/ResetVector.inf
@@ -0,0 +1,38 @@
+## @file
+#  Reset Vector
+#
+#  Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com>
+#  Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 1.29
+  BASE_NAME                      = ResetVector
+  FILE_GUID                      = 1BA0062E-C779-4582-8566-336AE8F78F09
+  MODULE_TYPE                    = SEC
+  VERSION_STRING                 = 1.1
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64
+#
+
+[Sources]
+  ResetVector.nasmb
+
+[Packages]
+  OvmfPkg/OvmfPkg.dec
+  MdePkg/MdePkg.dec
+  UefiCpuPkg/UefiCpuPkg.dec
+
+[BuildOptions]
+   *_*_IA32_NASMB_FLAGS = -I$(WORKSPACE)/UefiCpuPkg/ResetVector/Vtf0/
+   *_*_X64_NASMB_FLAGS = -I$(WORKSPACE)/UefiCpuPkg/ResetVector/Vtf0/
+
+[Pcd]
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesSize
diff --git a/OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm b/OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
new file mode 100644
index 000000000000..d60cbfd8a30c
--- /dev/null
+++ b/OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
@@ -0,0 +1,149 @@
+;------------------------------------------------------------------------------
+; @file
+; Sets the CR3 register for 64-bit paging
+;
+; Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com>
+; Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+;
+;------------------------------------------------------------------------------
+
+BITS    32
+
+%define PAGE_PRESENT            0x01
+%define PAGE_READ_WRITE         0x02
+%define PAGE_USER_SUPERVISOR    0x04
+%define PAGE_WRITE_THROUGH      0x08
+%define PAGE_CACHE_DISABLE     0x010
+%define PAGE_ACCESSED          0x020
+%define PAGE_DIRTY             0x040
+%define PAGE_PAT               0x080
+%define PAGE_GLOBAL           0x0100
+%define PAGE_2M_MBO            0x080
+%define PAGE_2M_PAT          0x01000
+
+%define PAGE_2M_PDE_ATTR (PAGE_2M_MBO + \
+                          PAGE_ACCESSED + \
+                          PAGE_DIRTY + \
+                          PAGE_READ_WRITE + \
+                          PAGE_PRESENT)
+
+%define PAGE_PDP_ATTR (PAGE_ACCESSED + \
+                       PAGE_READ_WRITE + \
+                       PAGE_PRESENT)
+
+; Check if Secure Encrypted Virtualization (SEV) feature is enabled
+;
+; If SEV is enabled then EAX will be at least 32
+; If SEV is disabled then EAX will be zero.
+;
+CheckSevFeature:
+    ; Check if we have a valid (0x8000_001F) CPUID leaf
+    mov       eax, 0x80000000
+    cpuid
+
+    ; This check should fail on Intel or Non SEV AMD CPUs. In future if
+    ; Intel CPUs supports this CPUID leaf then we are guranteed to have exact
+    ; same bit definition.
+    cmp       eax, 0x8000001f
+    jl        NoSev
+
+    ; Check for memory encryption feature:
+    ;  CPUID  Fn8000_001F[EAX] - Bit 1
+    ;
+    mov       eax,  0x8000001f
+    cpuid
+    bt        eax, 1
+    jnc       NoSev
+
+    ; Check if memory encryption is enabled
+    ;  MSR_0xC0010131 - Bit 0 (SEV enabled)
+    mov       ecx, 0xc0010131
+    rdmsr
+    bt        eax, 0
+    jnc       NoSev
+
+    ; Get pte bit position to enable memory encryption
+    ; CPUID Fn8000_001F[EBX] - Bits 5:0
+    ;
+    mov       eax, ebx
+    and       eax, 0x3f
+    jmp       SevExit
+
+NoSev:
+    xor       eax, eax
+
+SevExit:
+    OneTimeCallRet CheckSevFeature
+
+;
+; Modified:  EAX, EBX, ECX, EDX
+;
+SetCr3ForPageTables64:
+
+    OneTimeCall   CheckSevFeature
+    xor     edx, edx
+    test    eax, eax
+    jz      SevNotActive
+
+    ; If SEV is enabled, C-bit is always above 31
+    sub     eax, 32
+    bts     edx, eax
+
+SevNotActive:
+
+    ;
+    ; For OVMF, build some initial page tables at
+    ; PcdOvmfSecPageTablesBase - (PcdOvmfSecPageTablesBase + 0x6000).
+    ;
+    ; This range should match with PcdOvmfSecPageTablesSize which is
+    ; declared in the FDF files.
+    ;
+    ; At the end of PEI, the pages tables will be rebuilt into a
+    ; more permanent location by DxeIpl.
+    ;
+
+    mov     ecx, 6 * 0x1000 / 4
+    xor     eax, eax
+clearPageTablesMemoryLoop:
+    mov     dword[ecx * 4 + PT_ADDR (0) - 4], eax
+    loop    clearPageTablesMemoryLoop
+
+    ;
+    ; Top level Page Directory Pointers (1 * 512GB entry)
+    ;
+    mov     dword[PT_ADDR (0)], PT_ADDR (0x1000) + PAGE_PDP_ATTR
+    mov     dword[PT_ADDR (4)], edx
+
+    ;
+    ; Next level Page Directory Pointers (4 * 1GB entries => 4GB)
+    ;
+    mov     dword[PT_ADDR (0x1000)], PT_ADDR (0x2000) + PAGE_PDP_ATTR
+    mov     dword[PT_ADDR (0x1004)], edx
+    mov     dword[PT_ADDR (0x1008)], PT_ADDR (0x3000) + PAGE_PDP_ATTR
+    mov     dword[PT_ADDR (0x100C)], edx
+    mov     dword[PT_ADDR (0x1010)], PT_ADDR (0x4000) + PAGE_PDP_ATTR
+    mov     dword[PT_ADDR (0x1014)], edx
+    mov     dword[PT_ADDR (0x1018)], PT_ADDR (0x5000) + PAGE_PDP_ATTR
+    mov     dword[PT_ADDR (0x101C)], edx
+
+    ;
+    ; Page Table Entries (2048 * 2MB entries => 4GB)
+    ;
+    mov     ecx, 0x800
+pageTableEntriesLoop:
+    mov     eax, ecx
+    dec     eax
+    shl     eax, 21
+    add     eax, PAGE_2M_PDE_ATTR
+    mov     [ecx * 8 + PT_ADDR (0x2000 - 8)], eax
+    mov     [(ecx * 8 + PT_ADDR (0x2000 - 8)) + 4], edx
+    loop    pageTableEntriesLoop
+
+    ;
+    ; Set CR3 now that the paging structures are available
+    ;
+    mov     eax, PT_ADDR (0)
+    mov     cr3, eax
+
+    OneTimeCallRet SetCr3ForPageTables64
diff --git a/OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb b/OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb
new file mode 100644
index 000000000000..ec869e84099b
--- /dev/null
+++ b/OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb
@@ -0,0 +1,68 @@
+;------------------------------------------------------------------------------
+; @file
+; This file includes all other code files to assemble the reset vector code
+;
+; Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com>.
+; Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
+; SPDX-License-Identifier: BSD-2-Clause-Patent
+;
+;------------------------------------------------------------------------------
+
+;
+; If neither ARCH_IA32 nor ARCH_X64 are defined, then try to include
+; Base.h to use the C pre-processor to determine the architecture.
+;
+%ifndef ARCH_IA32
+  %ifndef ARCH_X64
+    #include <Base.h>
+    #if defined (MDE_CPU_IA32)
+      %define ARCH_IA32
+    #elif defined (MDE_CPU_X64)
+      %define ARCH_X64
+    #endif
+  %endif
+%endif
+
+%ifdef ARCH_IA32
+  %ifdef ARCH_X64
+    %error "Only one of ARCH_IA32 or ARCH_X64 can be defined."
+  %endif
+%elifdef ARCH_X64
+%else
+  %error "Either ARCH_IA32 or ARCH_X64 must be defined."
+%endif
+
+%include "CommonMacros.inc"
+
+%include "PostCodes.inc"
+
+%ifdef DEBUG_PORT80
+  %include "Port80Debug.asm"
+%elifdef DEBUG_SERIAL
+  %include "SerialDebug.asm"
+%else
+  %include "DebugDisabled.asm"
+%endif
+
+%include "Ia32/SearchForBfvBase.asm"
+%include "Ia32/SearchForSecEntry.asm"
+
+%ifdef ARCH_X64
+  #include <AutoGen.h>
+
+  %if (FixedPcdGet32 (PcdOvmfSecPageTablesSize) != 0x6000)
+    %error "This implementation inherently depends on PcdOvmfSecPageTablesSize"
+  %endif
+
+  %define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset))
+%include "Ia32/Flat32ToFlat64.asm"
+%include "Ia32/PageTables64.asm"
+%endif
+
+%include "Ia16/Real16ToFlat32.asm"
+%include "Ia16/Init16.asm"
+
+%include "Main.asm"
+
+%include "Ia16/ResetVectorVtf0.asm"
+
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] OvmfPkg/Bhyve: fix build breakage after SEV-ES changes
  2020-11-12  5:31 [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Rebecca Cran
  2020-11-12  5:31 ` [PATCH v2 1/2] OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes Rebecca Cran
@ 2020-11-12  5:31 ` Rebecca Cran
  2020-11-12  8:40 ` [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Peter Grehan
  2020-11-13 23:18 ` [edk2-devel] " Laszlo Ersek
  3 siblings, 0 replies; 5+ messages in thread
From: Rebecca Cran @ 2020-11-12  5:31 UTC (permalink / raw)
  To: devel
  Cc: Rebecca Cran, Jordan Justen, Laszlo Ersek, Ard Biesheuvel,
	Peter Grehan

Consume the SEV-ES-independent reset vector restored in the previous
patch. Use the Null instance of VmgExitLib.

Signed-off-by: Rebecca Cran <rebecca@bsdio.com>
---
 OvmfPkg/Bhyve/BhyveX64.dsc | 3 ++-
 OvmfPkg/Bhyve/BhyveX64.fdf | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc
index 16d2233d7788..ba79ceef5563 100644
--- a/OvmfPkg/Bhyve/BhyveX64.dsc
+++ b/OvmfPkg/Bhyve/BhyveX64.dsc
@@ -225,6 +225,7 @@ [LibraryClasses]
 
 [LibraryClasses.common]
   BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
+  VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf
 
 [LibraryClasses.common.SEC]
 !ifdef $(DEBUG_ON_SERIAL_PORT)
@@ -571,7 +572,7 @@ [PcdsDynamicHii]
 #
 ################################################################################
 [Components]
-  OvmfPkg/ResetVector/ResetVector.inf
+  OvmfPkg/Bhyve/ResetVector/ResetVector.inf
 
   #
   # SEC Phase modules
diff --git a/OvmfPkg/Bhyve/BhyveX64.fdf b/OvmfPkg/Bhyve/BhyveX64.fdf
index 5d2586ae141a..f4050c4934b7 100644
--- a/OvmfPkg/Bhyve/BhyveX64.fdf
+++ b/OvmfPkg/Bhyve/BhyveX64.fdf
@@ -117,7 +117,7 @@ [FV.SECFV]
 #
 INF  OvmfPkg/Sec/SecMain.inf
 
-INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/ResetVector.inf
+INF  RuleOverride=RESET_VECTOR OvmfPkg/Bhyve/ResetVector/ResetVector.inf
 
 ################################################################################
 [FV.PEIFV]
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg
  2020-11-12  5:31 [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Rebecca Cran
  2020-11-12  5:31 ` [PATCH v2 1/2] OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes Rebecca Cran
  2020-11-12  5:31 ` [PATCH v2 2/2] OvmfPkg/Bhyve: fix build breakage after " Rebecca Cran
@ 2020-11-12  8:40 ` Peter Grehan
  2020-11-13 23:18 ` [edk2-devel] " Laszlo Ersek
  3 siblings, 0 replies; 5+ messages in thread
From: Peter Grehan @ 2020-11-12  8:40 UTC (permalink / raw)
  To: devel

Acked-by: Peter Grehan <grehan@freebsd.org>

> Fix Bhyve following breaking changes in OvmfPkg.
> Follows suggestions from Laszlo in the v1 patch set.
> I also changed the INF version in ResetVector.inf to 1.29.
> 
> Rebecca Cran (2):
>    OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes
>    OvmfPkg/Bhyve: fix build breakage after SEV-ES changes
> 
>   OvmfPkg/Bhyve/BhyveX64.dsc                    |   3 +-
>   OvmfPkg/Bhyve/BhyveX64.fdf                    |   2 +-
>   OvmfPkg/Bhyve/ResetVector/ResetVector.inf     |  38 +++++
>   .../Bhyve/ResetVector/Ia32/PageTables64.asm   | 149 ++++++++++++++++++
>   OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb   |  68 ++++++++
>   5 files changed, 258 insertions(+), 2 deletions(-)
>   create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.inf
>   create mode 100644 OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
>   create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [edk2-devel] [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg
  2020-11-12  5:31 [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Rebecca Cran
                   ` (2 preceding siblings ...)
  2020-11-12  8:40 ` [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Peter Grehan
@ 2020-11-13 23:18 ` Laszlo Ersek
  3 siblings, 0 replies; 5+ messages in thread
From: Laszlo Ersek @ 2020-11-13 23:18 UTC (permalink / raw)
  To: rebecca; +Cc: devel, Jordan Justen, Ard Biesheuvel, Peter Grehan

On 11/12/20 06:31, Rebecca Cran wrote:
> Fix Bhyve following breaking changes in OvmfPkg.
> Follows suggestions from Laszlo in the v1 patch set.
> I also changed the INF version in ResetVector.inf to 1.29.
> 
> Rebecca Cran (2):
>   OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes
>   OvmfPkg/Bhyve: fix build breakage after SEV-ES changes
> 
>  OvmfPkg/Bhyve/BhyveX64.dsc                    |   3 +-
>  OvmfPkg/Bhyve/BhyveX64.fdf                    |   2 +-
>  OvmfPkg/Bhyve/ResetVector/ResetVector.inf     |  38 +++++
>  .../Bhyve/ResetVector/Ia32/PageTables64.asm   | 149 ++++++++++++++++++
>  OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb   |  68 ++++++++
>  5 files changed, 258 insertions(+), 2 deletions(-)
>  create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.inf
>  create mode 100644 OvmfPkg/Bhyve/ResetVector/Ia32/PageTables64.asm
>  create mode 100644 OvmfPkg/Bhyve/ResetVector/ResetVector.nasmb
> 

series
Reviewed-by: Laszlo Ersek <lersek@redhat.com>

Merged as commit range 662b42db76a5..5e9a8a6dfb15, via
<https://github.com/tianocore/edk2/pull/1125>.

Thanks,
Laszlo


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-11-13 23:18 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-12  5:31 [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Rebecca Cran
2020-11-12  5:31 ` [PATCH v2 1/2] OvmfPkg/Bhyve: detach ResetVector from before the SEV-ES changes Rebecca Cran
2020-11-12  5:31 ` [PATCH v2 2/2] OvmfPkg/Bhyve: fix build breakage after " Rebecca Cran
2020-11-12  8:40 ` [PATCH v2 0/2] OvmfPkg/Bhyve: Fix Bhyve build following breaking changes in OvmfPkg Peter Grehan
2020-11-13 23:18 ` [edk2-devel] " Laszlo Ersek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox