On 2018-08-20 21:41, Christopher Goldsworthy wrote:
Use helpers defined in pyjailhouse/sysfs_parsers.py to gather the information
needed to determine if a machine can run jailhouse from sysfs.  Make checking
sysfs the default action when running jailhouse-hardware-check (instead of
checking a compiled configuration file).

Minor changes to pyjailhouse import warning.

Signed-off-by: Chris Goldsworthy <[email protected]>
---
  Documentation/pyjailhouse.md   |  4 +--
  tools/jailhouse-cell-linux     |  4 +--
  tools/jailhouse-hardware-check | 73 ++++++++++++++++++++++++++++--------------
  3 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/Documentation/pyjailhouse.md b/Documentation/pyjailhouse.md
index 14fcf7d..5ee8466 100644
--- a/Documentation/pyjailhouse.md
+++ b/Documentation/pyjailhouse.md
@@ -55,6 +55,6 @@ For the example, the following wouldn't work inside of boz.py:
  `
  sys.path[0] = os.path.dirname(os.path.abspath(__file__)) + ""
  from pyjailhouse import

Something is off with this patch indention-wise (one leading blank too much).

-# Imports from directory containing this must be done above
-# import statement, see python documentation on sys.path[0]
+# Imports from directory containing this script must be done above the
+# line setting sys.path[0], see python documentation on sys.path[0]
  `
\ No newline at end of file

That, BTW, could be fixed at this chance.

diff --git a/tools/jailhouse-cell-linux b/tools/jailhouse-cell-linux
index c3cee12..b6c0c75 100755
--- a/tools/jailhouse-cell-linux
+++ b/tools/jailhouse-cell-linux
@@ -19,8 +19,8 @@ import sys
sys.path[0] = os.path.dirname(os.path.abspath(__file__)) + "/.."
  from pyjailhouse.cell import JailhouseCell
-# Imports from directory containing this must be done above
-# import statement, see python documentation on sys.path[0]
+# Imports from directory containing this script must be done above the
+# line setting sys.path[0], see python documentation on sys.path[0]
libexecdir = None diff --git a/tools/jailhouse-hardware-check b/tools/jailhouse-hardware-check
index ae4879d..978a1e4 100755
--- a/tools/jailhouse-hardware-check
+++ b/tools/jailhouse-hardware-check
@@ -16,6 +16,12 @@ import mmap
  import os
  import struct
  import sys
+import argparse
+
+sys.path[0] = os.path.dirname(os.path.abspath(__file__)) + "/.."
+import pyjailhouse.sysfs_parsers as sp

Same naming comment applies.

+# Imports from directory containing this script must be done above the
+# line setting sys.path[0], see python documentation on sys.path[0]
# just a dummy to make python2 happy
  if sys.version_info[0] < 3:
@@ -24,6 +30,7 @@ if sys.version_info[0] < 3:
check_passed = True
  ran_all = True
+iommu = None
def check_feature(msg, ok, optional=False):
      if not (ok or optional):
@@ -155,7 +162,7 @@ class Sysconfig:
                           Sysconfig.PCIISVIRT_SIZE + Sysconfig.PCIDOMAIN_SIZE +
                           Sysconfig.X86_PADDING)
- keys = 'base size amd_bdf amd_base_cap amd_features'
+        keys = 'base_addr mmio_size amd_bdf amd_base_cap amd_features'

This renaming of key base to base_addr seems like it could be handled separately. Would shrink this patch.

          IOMMU = collections.namedtuple('IOMMU', keys)
iommus = []
@@ -166,23 +173,34 @@ class Sysconfig:
          return iommus
-def usage(exit_code):
-    prog = os.path.basename(sys.argv[0]).replace('-', ' ')
-    print('usage: %s SYSCONFIG' % prog)
-    sys.exit(exit_code)
-
-
-if len(sys.argv) != 2:
-    usage(1)
-if sys.argv[1] in ("--help", "-h"):
-    usage(0)
+parser = argparse.ArgumentParser(description="Determine if this machine is "
+                                 "capable of running Jailhouse. By default, "
+                                 "this script pulls information from sysfs "
+                                 "to determine this. You can also provide a "
+                                 "root cell configuration, whose information "
+                                 "will be used instead of what comes from "
+                                 "sysfs.",
+                                 usage="jailhouse hardware check "
+                                 "[--root <dir> | --sysconfig <sysconfig>]")

I don't see a value in keeping the old "feature" to read information from a sysconfig. This tool requires local hardware access (to read MSRs e.g.), thus there is no "offline" mode. So I would just drop that.

Then the next question is in which case the root dir would not be "/". I don't see one, due to the lacking offline feature, thus also no need for the --root parameter.

+parser.add_argument("--sysconfig",
+                    help="sysconfig file to check")
+parser.add_argument("--root",
+                    help="root directory from which sysfs files should be "
+                         "read",
+                    default="/")
+arg = parser.parse_args()
if os.uname()[4] not in ('x86_64', 'i686'):
      print('Unsupported architecture', file=sys.stderr)
      sys.exit(1)
-config = Sysconfig(sys.argv[1])
-iommu = config.parse_iommus()
+if arg.sysconfig is not None:
+    config = Sysconfig(arg.sysconfig)
+    iommu = config.parse_iommus()
+else:
+    sp.root_dir = arg.root
+    ioapics = sp.parse_madt()
+    pci_devices, _, _ = sp.parse_pcidevices()
(cpu_vendor, cpu_features, cpu_count) = parse_cpuinfo() @@ -198,6 +216,10 @@ check_feature('Number of CPUs > 1', cpu_count > 1)
  check_feature('Long mode', 'lm' in cpu_features)
if cpu_vendor == 'GenuineIntel':
+    if iommu is None:
+        _, dmar_regions = sp.parse_iomem(pci_devices)
+        iommu, _ = sp.parse_dmar(pci_devices, ioapics, dmar_regions)
+
      check_feature('x2APIC', 'x2apic' in cpu_features, True)
      print()
      check_feature('VT-x (VMX)', 'vmx' in cpu_features)
@@ -247,14 +269,14 @@ if cpu_vendor == 'GenuineIntel':
      check_feature('  Activity state HLT',
                    msr.read(MSR.IA32_VMX_MISC) & (1 << 6))
- for n in range(8):
-        if iommu[n].base == 0 and n > 0:
+    for n in range(len(iommu)):
+        if iommu[n].base_addr == 0 and n > 0:
              break
          print()
-        check_feature('VT-d (IOMMU #%d)' % n, iommu[n].base)
-        if iommu[n].base == 0:
+        check_feature('VT-d (IOMMU #%d)' % n, iommu[n].base_addr)
+        if iommu[n].base_addr == 0:
              break
-        mmio = MMIO(iommu[n].base, iommu[n].size)
+        mmio = MMIO(iommu[n].base_addr, iommu[n].mmio_size)
          cap = mmio.read64(0x08)
          if cap is None:
              continue
@@ -269,6 +291,9 @@ if cpu_vendor == 'GenuineIntel':
                        'x2apic' not in cpu_features)
elif cpu_vendor == 'AuthenticAMD':
+    if iommu is None:
+        iommu, _ = sp.parse_ivrs(pci_devices, ioapics)
+
      print()
      check_feature('AMD-V (SVM)', 'svm' in cpu_features)
      check_feature('  NPT', 'npt' in cpu_features)
@@ -276,12 +301,12 @@ elif cpu_vendor == 'AuthenticAMD':
      check_feature('  AVIC', 'avic' in cpu_features, True)
      check_feature('  Flush by ASID', 'flushbyasid' in cpu_features, True)
- for n in range(8):
-        if iommu[n].base == 0 and n > 0:
+    for n in range(len(iommu)):
+        if iommu[n].base_addr == 0 and n > 0:
              break
          print()
-        check_feature('AMD-Vi (IOMMU #%d)' % n, iommu[n].base)
-        if iommu[n].base == 0:
+        check_feature('AMD-Vi (IOMMU #%d)' % n, iommu[n].base_addr)
+        if iommu[n].base_addr == 0:
              break
bdf = iommu[n].amd_bdf
@@ -294,9 +319,9 @@ elif cpu_vendor == 'AuthenticAMD':
          check_feature('  Extended feature register', caps & (1 << 27))
          check_feature('  Valid base register',
                        (base & (1 << 0)) == 0 or
-                      base == (iommu[n].base | (1 << 0)))
+                      base == (iommu[n].base_addr | (1 << 0)))
- mmio = MMIO(iommu[n].base, iommu[n].size)
+        mmio = MMIO(iommu[n].base_addr, iommu[n].mmio_size)
          efr = mmio.read64(0x30)
          if efr is None:
              continue


Very valuable improvement of our tool!

Thanks,
Jan

--
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux

--
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to