Sami,

Do you have these in a PR or somewhere online that is already merged? Obviously i can do that but usually developers already have that (either edk2 PR for ci testing or on their fork).

one comment below.

Thanks
Sean


On 1/22/2021 9:19 AM, Sami Mujawar wrote:
Kvmtool is a virtual machine manager that can be used to launch
guest partitions. ArmVirtPkg already has UEFI (virtual/guest)
firmware support for Kvmtool guest.

Therefore, update the Platform CI script to add support for
building the Kvmtool firmware.

Signed-off-by: Sami Mujawar <sami.muja...@arm.com>
---
  ArmVirtPkg/PlatformCI/PlatformBuild.py | 132 +++++++++++---------
  ArmVirtPkg/PlatformCI/ReadMe.md        |  21 ++--
  2 files changed, 88 insertions(+), 65 deletions(-)

diff --git a/ArmVirtPkg/PlatformCI/PlatformBuild.py 
b/ArmVirtPkg/PlatformCI/PlatformBuild.py
index 
dff653e919eb42391fc56ec44b4043a75f79d162..473f7d58d15c3e26ef5a25e210cb679679b28131
 100644
--- a/ArmVirtPkg/PlatformCI/PlatformBuild.py
+++ b/ArmVirtPkg/PlatformCI/PlatformBuild.py
@@ -2,6 +2,7 @@
  # Script to Build ArmVirtPkg UEFI firmware
  #
  # Copyright (c) Microsoft Corporation.
+# Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
  # SPDX-License-Identifier: BSD-2-Clause-Patent
  ##
  import os
@@ -139,7 +140,8 @@ class SettingsManager(UpdateSettingsManager, 
SetupSettingsManager, PrEvalSetting
The tuple should be (<workspace relative path to dsc file>, <input dictionary of dsc key value pairs>)
          '''

This doesn't look right. When returning the dsc to use it should only return 1 dsc file. The second parameter of the tuple is for key=value pairs to process the DSC file.


-        return (os.path.join("ArmVirtPkg", "ArmVirtQemu.dsc"), {})
+        return (os.path.join("ArmVirtPkg", "ArmVirtQemu.dsc"),
+                os.path.join("ArmVirtPkg", "ArmVirtKvmTool.dsc"), {})
# ####################################################################################### #
@@ -150,11 +152,15 @@ class SettingsManager(UpdateSettingsManager, 
SetupSettingsManager, PrEvalSetting
  class PlatformBuilder(UefiBuilder, BuildSettingsManager):
      def __init__(self):
          UefiBuilder.__init__(self)
+        self.PlatformList = [os.path.join("ArmVirtPkg", "ArmVirtQemu.dsc"),
+                        os.path.join("ArmVirtPkg", "ArmVirtKvmTool.dsc")]
def AddCommandLineOptions(self, parserObj):
          ''' Add command line options to the argparser '''
          parserObj.add_argument('-a', "--arch", dest="build_arch", type=str, 
default="AARCH64",
                                 help="Optional - Architecture to build.  Default = 
AARCH64")
+        parserObj.add_argument('-d', "--dsc", dest="active_platform", 
type=str, default=self.PlatformList[0],
+                               help="Optional - Platform to build.  Default = 
" + self.PlatformList[0])
def RetrieveCommandLineOptions(self, args):
          '''  Retrieve command line options from the argparser '''
@@ -162,8 +168,12 @@ class PlatformBuilder(UefiBuilder, BuildSettingsManager):
          shell_environment.GetBuildVars().SetValue(
              "TARGET_ARCH", args.build_arch.upper(), "From CmdLine")
- shell_environment.GetBuildVars().SetValue(
-            "ACTIVE_PLATFORM", "ArmVirtPkg/ArmVirtQemu.dsc", "From CmdLine")
+        if (args.active_platform == self.PlatformList[1]):
+            shell_environment.GetBuildVars().SetValue(
+                "ACTIVE_PLATFORM", self.PlatformList[1], "From CmdLine")
+        else:
+            shell_environment.GetBuildVars().SetValue(
+                "ACTIVE_PLATFORM", self.PlatformList[0], "From CmdLine")
def GetWorkspaceRoot(self):
          ''' get WorkspacePath '''
@@ -207,9 +217,12 @@ class PlatformBuilder(UefiBuilder, BuildSettingsManager):
def SetPlatformEnv(self):
          logging.debug("PlatformBuilder SetPlatformEnv")
-        self.env.SetValue("PRODUCT_NAME", "ArmVirtQemu", "Platform Hardcoded")
          self.env.SetValue("MAKE_STARTUP_NSH", "FALSE", "Default to false")
          self.env.SetValue("QEMU_HEADLESS", "FALSE", "Default to false")
+        if (self.env.GetValue("ACTIVE_PLATFORM") == self.PlatformList[1]):
+            self.env.SetValue("PRODUCT_NAME", "ArmVirtKvmtool", "Platform 
Hardcoded")
+        else:
+            self.env.SetValue("PRODUCT_NAME", "ArmVirtQemu", "Platform 
Hardcoded")
          return 0
def PlatformPreBuild(self):
@@ -219,58 +232,61 @@ class PlatformBuilder(UefiBuilder, BuildSettingsManager):
          return 0
def FlashRomImage(self):
-        VirtualDrive = os.path.join(self.env.GetValue(
-            "BUILD_OUTPUT_BASE"), "VirtualDrive")
-        os.makedirs(VirtualDrive, exist_ok=True)
-        OutputPath_FV = os.path.join(
-            self.env.GetValue("BUILD_OUTPUT_BASE"), "FV")
-        Built_FV = os.path.join(OutputPath_FV, "QEMU_EFI.fd")
-
-        # pad fd to 64mb
-        with open(Built_FV, "ab") as fvfile:
-            fvfile.seek(0, os.SEEK_END)
-            additional = b'\0' * ((64 * 1024 * 1024)-fvfile.tell())
-            fvfile.write(additional)
-
-        # QEMU must be on that path
-
-        # Unique Command and Args parameters per ARCH
-        if (self.env.GetValue("TARGET_ARCH").upper() == "AARCH64"):
-            cmd = "qemu-system-aarch64"
-            args = "-M virt"
-            args += " -cpu cortex-a57"                                         
 # emulate cpu
-        elif(self.env.GetValue("TARGET_ARCH").upper() == "ARM"):
-            cmd = "qemu-system-arm"
-            args = "-M virt"
-            args += " -cpu cortex-a15"                                         
 # emulate cpu
+        if (self.env.GetValue("ACTIVE_PLATFORM") == self.PlatformList[1]):
+              return 0
          else:
-            raise NotImplementedError()
-
-        # Common Args
-        args += " -pflash " + Built_FV                                     # 
path to fw
-        args += " -m 1024"                                                  # 
1gb memory
-        # turn off network
-        args += " -net none"
-        # Serial messages out
-        args += " -serial stdio"
-        # Mount disk with startup.nsh
-        args += f" -drive file=fat:rw:{VirtualDrive},format=raw,media=disk"
-
-        # Conditional Args
-        if (self.env.GetValue("QEMU_HEADLESS").upper() == "TRUE"):
-            args += " -display none"  # no graphics
-
-        if (self.env.GetValue("MAKE_STARTUP_NSH").upper() == "TRUE"):
-            f = open(os.path.join(VirtualDrive, "startup.nsh"), "w")
-            f.write("BOOT SUCCESS !!! \n")
-            # add commands here
-            f.write("reset -s\n")
-            f.close()
-
-        ret = RunCmd(cmd, args)
-
-        if ret == 0xc0000005:
-            # for some reason getting a c0000005 on successful return
-            return 0
-
-        return ret
+              VirtualDrive = os.path.join(self.env.GetValue(
+                  "BUILD_OUTPUT_BASE"), "VirtualDrive")
+              os.makedirs(VirtualDrive, exist_ok=True)
+              OutputPath_FV = os.path.join(
+                  self.env.GetValue("BUILD_OUTPUT_BASE"), "FV")
+              Built_FV = os.path.join(OutputPath_FV, "QEMU_EFI.fd")
+
+              # pad fd to 64mb
+              with open(Built_FV, "ab") as fvfile:
+                  fvfile.seek(0, os.SEEK_END)
+                  additional = b'\0' * ((64 * 1024 * 1024)-fvfile.tell())
+                  fvfile.write(additional)
+
+              # QEMU must be on that path
+
+              # Unique Command and Args parameters per ARCH
+              if (self.env.GetValue("TARGET_ARCH").upper() == "AARCH64"):
+                  cmd = "qemu-system-aarch64"
+                  args = "-M virt"
+                  args += " -cpu cortex-a57"                                   
       # emulate cpu
+              elif(self.env.GetValue("TARGET_ARCH").upper() == "ARM"):
+                  cmd = "qemu-system-arm"
+                  args = "-M virt"
+                  args += " -cpu cortex-a15"                                   
       # emulate cpu
+              else:
+                  raise NotImplementedError()
+
+              # Common Args
+              args += " -pflash " + Built_FV                                   
  # path to fw
+              args += " -m 1024"                                               
   # 1gb memory
+              # turn off network
+              args += " -net none"
+              # Serial messages out
+              args += " -serial stdio"
+              # Mount disk with startup.nsh
+              args += f" -drive 
file=fat:rw:{VirtualDrive},format=raw,media=disk"
+
+              # Conditional Args
+              if (self.env.GetValue("QEMU_HEADLESS").upper() == "TRUE"):
+                  args += " -display none"  # no graphics
+
+              if (self.env.GetValue("MAKE_STARTUP_NSH").upper() == "TRUE"):
+                  f = open(os.path.join(VirtualDrive, "startup.nsh"), "w")
+                  f.write("BOOT SUCCESS !!! \n")
+                  # add commands here
+                  f.write("reset -s\n")
+                  f.close()
+
+              ret = RunCmd(cmd, args)
+
+              if ret == 0xc0000005:
+                  # for some reason getting a c0000005 on successful return
+                  return 0
+
+              return ret
diff --git a/ArmVirtPkg/PlatformCI/ReadMe.md b/ArmVirtPkg/PlatformCI/ReadMe.md
index 
7c11d925f59ede4717d4b210df9d2b97f755ebd8..98a3ca91f40c075bf1a2069edd99e9680a1252e9
 100644
--- a/ArmVirtPkg/PlatformCI/ReadMe.md
+++ b/ArmVirtPkg/PlatformCI/ReadMe.md
@@ -6,13 +6,14 @@ to use the same Pytools based build infrastructure locally.
  ## Supported Configuration Details
This solution for building and running ArmVirtPkg has only been validated with Ubuntu
-18.04 and the GCC5 toolchain. Two different firmware builds are supported and 
are
-described below.
+18.04 and the GCC5 toolchain. The supported firmware builds are described 
below.
-| Configuration name | Architecture | DSC File |Additional Flags |
-| :----------             | :-----             | :-----           | :----      
     |
-| AARCH64                 | AARCH64            | ArmVirtQemu.dsc  | None       
     |
-| ARM                     | ARM                | ArmVirtQemu.dsc  | None       
     |
+| Configuration name      | Architecture       | DSC File            
|Additional Flags |
+| :----------             | :-----             | :-----              | :----   
        |
+| AARCH64                 | AARCH64            | ArmVirtQemu.dsc     | None    
        |
+| ARM                     | ARM                | ArmVirtQemu.dsc     | None    
        |
+| AARCH64                 | AARCH64            | ArmVirtKvmTool.dsc  | None    
        |
+| ARM                     | ARM                | ArmVirtKvmTool.dsc  | None    
        |
## EDK2 Developer environment @@ -79,7 +80,13 @@ Pytools build system.
      ```
- use `stuart_build -c ArmVirtPkg/PlatformCI/PlatformBuild.py -h` option to see additional
-    options like `--clean`
+    options like `--clean`, `--dsc`, etc.
+
+    Example: The `--dsc` option can be used to specify the platform to build.
+
+      ``` bash
+      stuart_build -c ArmVirtPkg/PlatformCI/PlatformBuild.py 
TOOL_CHAIN_TAG=<TOOL_CHAIN_TAG> -a <TARGET_ARCH> --dsc 
ArmVirtPkg/ArmVirtKvmTool.dsc
+      ```
8. Running Emulator
      - You can add `--FlashRom` to the end of your build command and the 
emulator will run after the



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#72118): https://edk2.groups.io/g/devel/message/72118
Mute This Topic: https://groups.io/mt/80035810/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to