;; **********************************************************
;; Copyright (c) 2011-2023 VMware, Inc. All rights reserved.
;; -- VMware Confidential
;; **********************************************************
; MACHINE GENERATED! DO NOT MODIFY!
(define guest-os-list-sorted (list
   (cons "almaLinux-64" 0x5030)
   (cons "amazonlinux2-64" 0x508C)
   (cons "amazonlinux3-64" 0x508D)
   (cons "arm-almaLinux-64" 0x5031)
   (cons "arm-CRXPod1-64" 0x5093)
   (cons "arm-CRXSys1-64" 0x508F)
   (cons "arm-CRXSys2-64" 0x5091)
   (cons "arm-debian10-64" 0x5040)
   (cons "arm-debian11-64" 0x5040)
   (cons "arm-debian12-64" 0x5040)
   (cons "arm-debian13-64" 0x5040)
   (cons "arm-Fedora-64" 0x5031)
   (cons "arm-freeBSD13-64" 0x504F)
   (cons "arm-freeBSD14-64" 0x5052)
   (cons "arm-freeBSD15-64" 0x5055)
   (cons "arm-other-64" 0x503A)
   (cons "arm-other5xlinux-64" 0x5031)
   (cons "arm-other6xlinux-64" 0x5034)
   (cons "arm-other7xlinux-64" 0x5037)
   (cons "arm-rhel10-64" 0x5046)
   (cons "arm-rhel9-64" 0x5044)
   (cons "arm-rockyLinux-64" 0x5031)
   (cons "arm-ubuntu-64" 0x5031)
   (cons "arm-vmkernel7" 0x5078)
   (cons "arm-vmkernel8" 0x507A)
   (cons "arm-vmware-photon-64" 0x507C)
   (cons "arm-windows10-64" 0x5016)
   (cons "arm-windows11-64" 0x5018)
   (cons "arm-windows12-64" 0x501A)
   (cons "asianux3" 0x5029)
   (cons "asianux3-64" 0x502A)
   (cons "asianux4" 0x5029)
   (cons "asianux4-64" 0x502A)
   (cons "asianux5-64" 0x502C)
   (cons "asianux7-64" 0x502C)
   (cons "asianux8-64" 0x502C)
   (cons "asianux9-64" 0x5030)
   (cons "centos" 0x5085)
   (cons "centos-64" 0x5086)
   (cons "centos6" 0x5087)
   (cons "centos6-64" 0x5088)
   (cons "centos7-64" 0x5089)
   (cons "centos8-64" 0x508A)
   (cons "centos9-64" 0x508B)
   (cons "coreos-64" 0x502C)
   (cons "CRXPod1-64" 0x5092)
   (cons "CRXSys1-64" 0x508E)
   (cons "CRXSys2-64" 0x5090)
   (cons "darwin" 0x505C)
   (cons "darwin-64" 0x505D)
   (cons "darwin10" 0x505E)
   (cons "darwin10-64" 0x505F)
   (cons "darwin11" 0x5060)
   (cons "darwin11-64" 0x5061)
   (cons "darwin12-64" 0x5062)
   (cons "darwin13-64" 0x5063)
   (cons "darwin14-64" 0x5064)
   (cons "darwin15-64" 0x5065)
   (cons "darwin16-64" 0x5066)
   (cons "darwin17-64" 0x5067)
   (cons "darwin18-64" 0x5068)
   (cons "darwin19-64" 0x5069)
   (cons "darwin20-64" 0x506A)
   (cons "darwin21-64" 0x506B)
   (cons "darwin22-64" 0x506C)
   (cons "darwin23-64" 0x506D)
   (cons "debian10" 0x503E)
   (cons "debian10-64" 0x503F)
   (cons "debian11" 0x503E)
   (cons "debian11-64" 0x503F)
   (cons "debian12" 0x503E)
   (cons "debian12-64" 0x503F)
   (cons "debian13" 0x503E)
   (cons "debian13-64" 0x503F)
   (cons "debian4" 0x503E)
   (cons "debian4-64" 0x503F)
   (cons "debian5" 0x503E)
   (cons "debian5-64" 0x503F)
   (cons "debian6" 0x503E)
   (cons "debian6-64" 0x503F)
   (cons "debian7" 0x503E)
   (cons "debian7-64" 0x503F)
   (cons "debian8" 0x503E)
   (cons "debian8-64" 0x503F)
   (cons "debian9" 0x503E)
   (cons "debian9-64" 0x503F)
   (cons "dos" 0x5001)
   (cons "eComStation" 0x5023)
   (cons "eComStation2" 0x5024)
   (cons "Fedora" 0x5029)
   (cons "Fedora-64" 0x502A)
   (cons "flatcar-64" 0x5030)
   (cons "freeBSD" 0x5047)
   (cons "freeBSD-64" 0x5048)
   (cons "freeBSD11" 0x5049)
   (cons "freeBSD11-64" 0x504A)
   (cons "freeBSD12" 0x504B)
   (cons "freeBSD12-64" 0x504C)
   (cons "freeBSD13" 0x504D)
   (cons "freeBSD13-64" 0x504E)
   (cons "freeBSD14" 0x5050)
   (cons "freeBSD14-64" 0x5051)
   (cons "freeBSD15" 0x5053)
   (cons "freeBSD15-64" 0x5054)
   (cons "linux" 0x5025)
   (cons "linuxMint-64" 0x5094)
   (cons "longhorn" 0x500C)
   (cons "longhorn-64" 0x500D)
   (cons "mandrake" 0x5029)
   (cons "mandrake-64" 0x502A)
   (cons "mandriva" 0x5029)
   (cons "mandriva-64" 0x502A)
   (cons "netware4" 0x5070)
   (cons "netware5" 0x5071)
   (cons "netware6" 0x5072)
   (cons "nld9" 0x5029)
   (cons "nt4" 0x5006)
   (cons "oes" 0x5029)
   (cons "openserver5" 0x506E)
   (cons "openserver6" 0x506E)
   (cons "opensuse" 0x5029)
   (cons "opensuse-64" 0x502A)
   (cons "oraclelinux" 0x507D)
   (cons "oraclelinux-64" 0x507E)
   (cons "oraclelinux10-64" 0x5084)
   (cons "oraclelinux6" 0x507F)
   (cons "oraclelinux6-64" 0x5080)
   (cons "oraclelinux7-64" 0x5081)
   (cons "oraclelinux8-64" 0x5082)
   (cons "oraclelinux9-64" 0x5083)
   (cons "os2" 0x5022)
   (cons "os2experimental" 0x5022)
   (cons "other" 0x5038)
   (cons "other-64" 0x5039)
   (cons "other24xlinux" 0x5027)
   (cons "other24xlinux-64" 0x5028)
   (cons "other26xlinux" 0x5029)
   (cons "other26xlinux-64" 0x502A)
   (cons "other3xlinux" 0x502B)
   (cons "other3xlinux-64" 0x502C)
   (cons "other4xlinux" 0x502D)
   (cons "other4xlinux-64" 0x502E)
   (cons "other5xlinux" 0x502F)
   (cons "other5xlinux-64" 0x5030)
   (cons "other6xlinux" 0x5032)
   (cons "other6xlinux-64" 0x5033)
   (cons "other7xlinux" 0x5035)
   (cons "other7xlinux-64" 0x5036)
   (cons "otherlinux" 0x5025)
   (cons "otherlinux-64" 0x5026)
   (cons "redhat" 0x5029)
   (cons "rhel10-64" 0x5045)
   (cons "rhel2" 0x5027)
   (cons "rhel3" 0x5027)
   (cons "rhel3-64" 0x5028)
   (cons "rhel4" 0x5029)
   (cons "rhel4-64" 0x502A)
   (cons "rhel5" 0x5029)
   (cons "rhel5-64" 0x502A)
   (cons "rhel6" 0x5041)
   (cons "rhel6-64" 0x5042)
   (cons "rhel7" 0x5041)
   (cons "rhel7-64" 0x5042)
   (cons "rhel8-64" 0x5042)
   (cons "rhel9-64" 0x5043)
   (cons "rockyLinux-64" 0x5030)
   (cons "sjds" 0x5027)
   (cons "sles" 0x5029)
   (cons "sles-64" 0x502A)
   (cons "sles10" 0x5029)
   (cons "sles10-64" 0x502A)
   (cons "sles11" 0x5029)
   (cons "sles11-64" 0x502A)
   (cons "sles12" 0x5029)
   (cons "sles12-64" 0x502A)
   (cons "sles15-64" 0x502C)
   (cons "sles16-64" 0x5030)
   (cons "solaris10" 0x5059)
   (cons "solaris10-64" 0x505A)
   (cons "solaris11-64" 0x505B)
   (cons "solaris6" 0x5056)
   (cons "solaris7" 0x5056)
   (cons "solaris8" 0x5057)
   (cons "solaris9" 0x5058)
   (cons "suse" 0x5029)
   (cons "suse-64" 0x502A)
   (cons "turbolinux" 0x5029)
   (cons "turbolinux-64" 0x502A)
   (cons "ubuntu" 0x503B)
   (cons "ubuntu-64" 0x502A)
   (cons "unixware7" 0x506F)
   (cons "vmkernel" 0x5073)
   (cons "vmkernel5" 0x5074)
   (cons "vmkernel6" 0x5075)
   (cons "vmkernel65" 0x5076)
   (cons "vmkernel7" 0x5077)
   (cons "vmkernel8" 0x5079)
   (cons "vmware-photon-64" 0x507B)
   (cons "whistler" 0x5008)
   (cons "win2000" 0x5007)
   (cons "win2000AdvServ" 0x5007)
   (cons "win2000Pro" 0x5007)
   (cons "win2000Serv" 0x5007)
   (cons "win31" 0x5002)
   (cons "win95" 0x5003)
   (cons "win98" 0x5004)
   (cons "windows11-64" 0x5017)
   (cons "windows12-64" 0x5019)
   (cons "windows2019srv-64" 0x501E)
   (cons "windows2019srvNext-64" 0x501F)
   (cons "windows2022srvNext-64" 0x5020)
   (cons "windows7" 0x5010)
   (cons "windows7-64" 0x5011)
   (cons "windows7srv-64" 0x501B)
   (cons "windows8" 0x5012)
   (cons "windows8-64" 0x5013)
   (cons "windows8srv-64" 0x501C)
   (cons "windows9" 0x5014)
   (cons "windows9-64" 0x5015)
   (cons "windows9srv-64" 0x501D)
   (cons "winHyperV" 0x5021)
   (cons "winMe" 0x5005)
   (cons "winNetBusiness" 0x500A)
   (cons "winNetDatacenter" 0x500A)
   (cons "winNetDatacenter-64" 0x500B)
   (cons "winNetEnterprise" 0x500A)
   (cons "winNetEnterprise-64" 0x500B)
   (cons "winNetStandard" 0x500A)
   (cons "winNetStandard-64" 0x500B)
   (cons "winNetWeb" 0x500A)
   (cons "winNT" 0x5006)
   (cons "winServer2008Cluster-32" 0x500C)
   (cons "winServer2008Cluster-64" 0x500D)
   (cons "winServer2008Datacenter-32" 0x500C)
   (cons "winServer2008Datacenter-64" 0x500D)
   (cons "winServer2008DatacenterCore-32" 0x500C)
   (cons "winServer2008DatacenterCore-64" 0x500D)
   (cons "winServer2008Enterprise-32" 0x500C)
   (cons "winServer2008Enterprise-64" 0x500D)
   (cons "winServer2008EnterpriseCore-32" 0x500C)
   (cons "winServer2008EnterpriseCore-64" 0x500D)
   (cons "winServer2008SmallBusiness-32" 0x500C)
   (cons "winServer2008SmallBusiness-64" 0x500D)
   (cons "winServer2008SmallBusinessPremium-32" 0x500C)
   (cons "winServer2008SmallBusinessPremium-64" 0x500D)
   (cons "winServer2008Standard-32" 0x500C)
   (cons "winServer2008Standard-64" 0x500D)
   (cons "winServer2008StandardCore-32" 0x500C)
   (cons "winServer2008StandardCore-64" 0x500D)
   (cons "winServer2008Web-32" 0x500C)
   (cons "winServer2008Web-64" 0x500D)
   (cons "winVista" 0x500E)
   (cons "winVista-64" 0x500F)
   (cons "winXPHome" 0x5008)
   (cons "winXPPro" 0x5008)
   (cons "winXPPro-64" 0x5009)
))
(define (roundup x y)
  (* (/ (+ x y -1) y) y))
(define (ceiling x y)
  (/ (+ x y -1) y))
(define (mbytes-2-pages nbytes)
  (arithmetic-shift nbytes (- 20 0xc)))
(define (gbytes-2-pages nbytes)
  (arithmetic-shift nbytes (- 30 0xc)))
(define (bytes-2-pages n)
  (/ n 0x1000))
(define (bytes-2-pages-4kb n)
  (/ n 0x1000))
(define (bytes-2-pages-roundup n)
  (/ (+ n 0x1000 -1) 0x1000))
(define (kbytes-2-pages-roundup n)
  (/ (+ n 4 -1) 4))
(define (mbytes-2-bytes n)
  (* n 1024 1024))
(define (roundup-bits x bits)
  (let ((mask (- (arithmetic-shift 1 bits) 1)))
    (bitwise-and (+ x mask) (bitwise-not mask))))
(define (hostconfig-getint-checked keyStr)
  (let ((val (hostconfig-getint keyStr)))
    (if (and false (null? val))
        (begin
          (log "Missing integer host parameter: " keyStr "\n")
          (assert #f))
        val)))
(define (hostconfig-getbool-checked keyStr)
  (let ((val (hostconfig-getbool keyStr)))
    (if (and false (null? val))
        (begin
          (log "Missing boolean host parameter: " keyStr "\n")
          (assert #f))
        val)))
(define (get-num-numa-vmk) (hostconfig-getint-checked "num-numa-vmk"))
(define (gphys-hwmmu-tree-in-vmk-enabled)
  (and true
       true
       (or (hostconfig-getbool-checked "gphys-hwmmu-tree-in-vmk-on-host")
           (and (hostconfig-getbool-checked "FSS-NestedPTsInVMKernel-enabled")
                (vmconfig-getbool #f "gphys.hwmmuTreeInVMK")))))
(define (get-num-vcpus) (vmconfig-getlong 1 "numVCPUs"))
(define (get-sched-mem-vmxmin) (vmconfig-getlong 0 "sched.mem.vmxMin"))
(define (get-mainmem-size) (mbytes-2-pages (vmconfig-getlong 32 "memsize")))
(define (get-one-nvdimm-size devNum)
  (let ((pfx (string-append "nvdimm0:" (tostring devNum))))
    (if (vmconfig-getbool #f (string-append pfx ".present"))
        (mbytes-2-pages (vmconfig-getlong 0 (string-append pfx ".size")))
        0)))
(define (count-nvdimm-pages i max)
  (if (= i max)
      0
      (+ (get-one-nvdimm-size i) (count-nvdimm-pages (+ i 1) max))))
(define (get-nvdimm-size)
  (if (vmconfig-getbool #f "nvdimm0.present")
      (count-nvdimm-pages 0 0x40)
      0))
(define (epc-config-size-in-pages)
  (mbytes-2-pages (vmconfig-getlong 0 "sgx.epcSize")))
(define (get-epc-size)
  (if (sgx-enabled)
      (epc-config-size-in-pages)
      0))
(define (length lst) (if (null? lst) 0 (+ 1 (length (cdr lst)))))
(define (list-tail lst n) (if (= 0 n) lst (list-tail (cdr lst) (- n 1))))
(define (tree-node elm left right) (list elm left right))
(define (elm-key elm) (car elm))
(define (elm-val elm) (cdr elm))
(define (tree-elm tree) (car tree))
(define (tree-key tree) (elm-key (tree-elm tree)))
(define (tree-val tree) (elm-val (tree-elm tree)))
(define (tree-left tree) (car (cdr tree)))
(define (tree-right tree) (car (cdr (cdr tree))))
(define (tree-balance-work lst len)
  (if (<= len 0)
      ()
      (let ((mid (/ len 2)))
       (let ((lst2 (list-tail lst mid)))
        (tree-node (car lst2)
                   (tree-balance-work lst mid)
                   (tree-balance-work (cdr lst2) (- len mid 1)))))))
(define (tree-balance lst) (tree-balance-work lst (length lst)))
(define guest-os-tree (tree-balance guest-os-list-sorted))
(define (tree-lookup tree key)
  (if (null? tree) 0x5038
      (let ((k (tree-key tree)))
       (cond ((string-ci<? key k) (tree-lookup (tree-left tree) key))
             ((string-ci=? key k) (tree-val tree))
             (else (tree-lookup (tree-right tree) key))))))
(define (get-guestos-str)
  (let ((str (vmconfig-getstr () "guestOS")))
    (if (null? str)
        (let ((str1 (vmconfig-getstr () "hint.guestOS")))
          (if (null? str1) "" str1))
        str)))
(define (get-guestosid) (tree-lookup guest-os-tree (get-guestos-str)))
(define (gos-is-member x set)
  (cond
    ((= 0 (car set)) #f)
    ((= 0x5000 (car set)) #t)
    ((= x (car set)) #t)
    (else (gos-is-member x (cdr set)))))
(define (check-guestosid guestosid guest_set)
  (assert (>= guestosid 0x5000))
  (gos-is-member guestosid guest_set))
(define (is-guestosid-win9x guestosid)
  (check-guestosid guestosid (list 0x5003 0x5004 0x5005 0)))
(define (is-guestosid-os2 guestosid)
  (check-guestosid guestosid (list 0x5022 0x5023 0x5024 0)))
(define (is-guestosid-win7 guestosid)
  (check-guestosid guestosid (list 0x5010 0x5011 0)))
(define (is-guestosid-win2008r2 guestosid)
  (check-guestosid guestosid (list 0x501b 0)))
(define (is-guestosid-hyper-v guestosid)
  (check-guestosid guestosid (list 0x5021 0)))
(define (guestos-get-default config guestosid)
  (cond ((string-ci=? config "svga.maxVRAM16MB")
         (or (= guestosid 0x5001)
             (= guestosid 0x5002)
             (is-guestosid-win9x guestosid)
             (= guestosid 0x5006)
             (is-guestosid-os2 guestosid)))
        ((string-ci=? config "svga.minVRAM8MB")
         (or (is-guestosid-win7 guestosid)
             (is-guestosid-win2008r2 guestosid)
             (= guestosid 0x5041)
             (= guestosid 0x5042)))
        ((string-ci=? config "vhv.enable")
         (is-guestosid-hyper-v guestosid))
        (else #f)))
(define (guestos-get-bool config guestosid)
  (if (vmconfig-notset config)
      (guestos-get-default config guestosid)
      (vmconfig-getbool #f config)))
(define (hwversion-get)
  (vmconfig-getlong 0x1 "virtualHW.version"))
(define (hwversion-get-option hwVersion option)
  (let ((minVer
         (hostconfig-getint (string-append "hwm." option))))
    (cond ((not (null? minVer)) (>= hwVersion minVer))
          (false
           (log "Missing option in hwversion-get-option: " option "\n")
           (assert #f))
          (else #f))))
(define (hwversion-get-bool opt)
  (if (vmconfig-notset opt)
      (hwversion-get-option (hwversion-get) opt)
      (vmconfig-getbool #f opt)))
(define (vbs-enabled)
  (and true
       (hwversion-get-bool "windows.vbs.available")
       (vmconfig-getbool #f "windows.vbs.enabled")))
(define (sgx-enabled)
  (and true
       (hwversion-get-bool "sgx.available")
       (> (epc-config-size-in-pages) 0)
       (hostconfig-getbool-checked "sgx-capable")))
(define (tdx-enabled is-intel)
  (and true
       is-intel
       (hwversion-get-bool "tdx.supported")
       (or (vmconfig-getbool #f "tdx.enable")
           (vmconfig-getbool #f "monitor_control.enable_tdx_testing"))))
(define (simMBX-enabled)
  (and true
       (hostconfig-getbool-checked "has-VMX")
       (hwversion-get-bool "vvt.simMBX.available")
       (vmconfig-getbool (vbs-enabled) "vvt.simMBX.permitted")
       (vmconfig-getbool #f "vhv.enable")
       (not (sgx-enabled))
       (or (not (hostconfig-getbool-checked "mbx-capable"))
           (vmconfig-getbool #f "monitor_control.disable_hw_mbx"))))
(define (ftcpt-config-enabled)
  (and true (vmconfig-getbool #f "ftcpt.enabled")))
(define (ovhd-bmf-pages size-in-pages)
  (ceiling size-in-pages (/ 0x1000 0x4)))
(define (dvx-mmio-size-device devNum)
  (let ((devname (string-append "pciPassthru" (tostring devNum))))
    (if (and (vmconfig-getbool #f (string-append devname ".present"))
             (string=? "dvx"
                       (vmconfig-getstr "pciExpress"
                           (string-append devname ".virtualDev"))))
        (let ((devClass
               (vmconfig-getstr ()
                   (string-append devname ".dvx.deviceClass"))))
          (cond ((null? devClass) 0)
;; dvxc.py MMIO size generated code goes here
                (else 0)))
        0)))
(define (dvx-mmio-size-work devNum maxNum size)
  (if (= devNum maxNum)
      size
      (dvx-mmio-size-work (+ 1 devNum) maxNum
                          (+ size (dvx-mmio-size-device devNum)))))
(define (dvx-mmio-size)
  (dvx-mmio-size-work 0 0x80 0))
(define (passthru-region-pages passthru-all passthru-fpt
                               passthru-mpt passthru-dvx)
  (if (> passthru-all 0)
      (+ 0xe0000
         (if (> passthru-dvx 0) (bytes-2-pages (dvx-mmio-size)) 0)
         (if (or (and (> passthru-fpt 0)
                      (vmconfig-getbool #f "pciPassthru.use64bitMMIO"))
                 (> passthru-mpt 0))
             (gbytes-2-pages (vmconfig-getlong 0x20
                                               "pciPassthru.64bitMMIOSizeGB"))
             0))
      0))
(define (num-mappings n) (+ 0x400 n n))
(define (ovhd-gphys-one n m)
  (+ 1
     8
     (arithmetic-shift (+ 1 m 0x1e440) -18) (num-mappings n)
     (arithmetic-shift (+ 1 m 0x1e440) -9) (num-mappings n)))
(define (ovhd-gphys-one-approx m)
  (+ 1
     8
     (arithmetic-shift (+ 1 m 0x1e440) -18)
     (arithmetic-shift (+ 1 m 0x1e440) -9)))
(define (ovhd-busmem-preval n)
  (if (gphys-hwmmu-tree-in-vmk-enabled)
      0
      (* 0x4
         (min n 0x10))))
(define (busmem-monas-overhead mem-reg-pages busmem-pages)
  (let ((ovhd-inuse-with-guard (if (gphys-hwmmu-tree-in-vmk-enabled)
                                   (+ (ovhd-inuse-pages mem-reg-pages
                                                        0x1)
                                      1)
                                   0)))
    (+ (ovhd-page-tables12 (ovhd-bmt-pages busmem-pages))
       (ovhd-page-tables12 (+ (ovhd-bmf-pages busmem-pages)
                              (ovhd-2mi-pages mem-reg-pages 0x20)
                              (ovhd-1gi-pages mem-reg-pages 0x8)
                              ovhd-inuse-with-guard
                              4)))))
(define (server-use-ulm-mode) (or (not true)
                                  (vmconfig-getbool #f "monitor.ulm")))
(define (ovhd-num-pframe-pages var-reg-pages)
  (if (or true false)
      0
      (+ (bytes-2-pages (* (+ var-reg-pages 0x1e440) 0x8))
         0x3ce)))
(define (ovhd-num-bmf-pages var-reg-pages)
  (if (or false false
          (and true (server-use-ulm-mode)))
      (+ (bytes-2-pages (* (+ var-reg-pages 0x1e440)
                           0x4)) 0x3ce)
      0))
(define (ovhd-num-statvar-pages n)
  (if (and true (server-use-ulm-mode))
      (+ (* n 0) 0)
      (* n 0)))
(define (ovhd-num-msr-bitmap-pages n is-intel)
  (if (and true (server-use-ulm-mode))
      (* n (if is-intel 1 2))
      (* 1 (if is-intel 1 2))))
(define (platform-monas-overhead var-reg-pages)
  (if true
      0
      (ovhd-page-tables (ovhd-num-pframe-pages var-reg-pages))))
(define (vhv-enabled guestosid)
  (guestos-get-bool "vhv.enable" guestosid))
(define (vnpt-num-cache-entry n m)
  (min (ovhd-gphys-one n (if (simMBX-enabled) (* m 2) m))
       (- (arithmetic-shift 1 23) 2)))
(define (vnpt-shadow-overhead n m vhv-enab)
  (if vhv-enab
      (let ((num-cache-entry (vnpt-num-cache-entry n m)))
        (+ (ovhd-page-tables12 (+ num-cache-entry n))
           num-cache-entry
           n))
      0))
(define (vnpt-shadow-cache-overhead n m vhv-enab)
  (if vhv-enab
      (let ((pages (ceiling (* 32 (vnpt-num-cache-entry n m)) 0x1000)))
        (+ (ovhd-page-tables12 pages) pages))
      0))
(define (vnpt-backmap-overhead vnpt-backmap-pages vhv-enab)
  (if vhv-enab
      (let ((num-entries (* 2 vnpt-backmap-pages)))
        (let ((num-pages (ceiling (* num-entries 0x4) 0x1000)))
          (+ num-pages (ovhd-page-tables12 num-pages))))
      0))
(define (gphys-share-npt)
  (let ((default (not (hostconfig-getbool-checked "in-any-vm"))))
    (let ((default2 (if (and false
                             (vmconfig-getbool #f
                              "stress.flag.GPhysToggleNPTSharing"))
                        (not default)
                        default)))
      (and (not (gphys-hwmmu-tree-in-vmk-enabled))
           (vmconfig-getbool default2 "gphys.shareNPT")))))
(define (gphys-quota-overhead n npt) (* (+ 2 (* 2 npt)) n))
(define (gphys-hwmmu-slack n)
   (gphys-quota-overhead n 0))
(define (gphys-traced-slack n is-intel)
   (if (or is-intel (not (gphys-share-npt)))
      (gphys-quota-overhead n 0)
      0))
(define (gphys-notrace-slack n)
   (gphys-quota-overhead n 0))
(define (gphys-traced-overhead var-reg-pages is-intel)
  (let ((percent (let ((config (vmconfig-getlong 0 "gphys.quota.traced")))
                   (if (= config 0)
                       (if is-intel
                           0x14
                           (if (gphys-share-npt)
                               0
                               0x14))
                       config))))
    (max (/ (* (ovhd-gphys-one-approx var-reg-pages)
               percent) 100)
         (if (or is-intel (not (gphys-share-npt)))
             0x106
             0))))
(define (gphys-notrace-overhead var-reg-pages)
  (let ((percent (let ((config (vmconfig-getlong 0 "gphys.quota.notrace")))
                   (if (= config 0)
                       0x5
                       config))))
    (max (/ (* (ovhd-gphys-one-approx var-reg-pages)
               percent) 100)
         0x106)))
(define (ovhd-gphys-npt-approx m)
  (+ (ovhd-gphys-one-approx m)
     (arithmetic-shift (ovhd-gphys-one-approx m) -9)
     5))
(define (ovhd-gphys-hwmmu-class var-reg-pages quota-option quota)
  (let ((percent (let ((config (vmconfig-getlong 0 quota-option)))
                   (if (= config 0)
                     quota
                     config))))
    (max (/ (* (ovhd-gphys-npt-approx var-reg-pages)
               percent) 100)
         0x106)))
(define (gphys-hwmmu-overhead var-reg-pages is-intel)
  (if (tdx-enabled is-intel)
      (ovhd-gphys-hwmmu-class var-reg-pages "gphys.quota.hwmmu"
                              0x14)
      (ovhd-gphys-hwmmu-class var-reg-pages "gphys.quota.hwmmu"
                              0x64)))
(define (tdx-sept-overhead var-reg-pages is-intel)
  (if (tdx-enabled is-intel)
      (ovhd-gphys-hwmmu-class var-reg-pages "tdx.quota.sept"
                              0x64)
      0))
(define (tdx-2minfo-overhead mem-reg-pages is-intel)
  (if (tdx-enabled is-intel)
      (let ((2mi-pages (ovhd-2mi-pages mem-reg-pages
                                       0x40)))
        (+ (ovhd-page-tables12 2mi-pages) 2mi-pages))
      0))
(define (count-present-devices type virtualDevMatch i max)
  (if (= i max)
      0
      (+ (if (and (vmconfig-getbool #f (string-append type (tostring i)
                                                           ".present"))
                  (virtualDevMatch i))
             1
             0)
         (count-present-devices type virtualDevMatch (+ i 1) max))))
(define (increment-vdev-count vd vdlist clist)
  (cond ((null? vdlist) clist)
        ((string-ci=? vd (car vdlist)) (cons (+ 1 (car clist)) (cdr clist)))
        (else (cons (car clist) (increment-vdev-count vd (cdr vdlist)
                                                      (cdr clist))))))
(define (count-devices-by-vdev dev default vdlist clist i max)
  (if (= i max)
      clist
      (let ((crtdev (string-append dev (tostring i))))
           (if (not (vmconfig-getbool #f (string-append crtdev ".present")))
               (count-devices-by-vdev dev default vdlist clist (+ i 1) max)
               (let ((vd (vmconfig-getstr default
                                          (string-append crtdev
                                                         ".virtualDev"))))
                 (let ((newclist (increment-vdev-count vd vdlist clist)))
                   (count-devices-by-vdev dev default vdlist newclist
                                          (+ i 1) max)))))))
(define (get-num-nics)
  (let ((counts (count-devices-by-vdev
                  "ethernet" "vlance"
                  (list "e1000" "e1000e" "vmxnet" "vlance" "vmxnet3" "vrdma")
                  (list 0 0 0 0 0 0)
                  0 0xa)))
    (let ((e1 (car counts))
          (e1e (car (cdr counts)))
          (vmxnet (car (cdr (cdr counts))))
          (vlance (car (cdr (cdr (cdr counts)))))
          (vmxnet3 (car (cdr (cdr (cdr (cdr counts))))))
          (vrdma (car (cdr (cdr (cdr (cdr (cdr counts))))))))
      (list (+ e1 e1e) (+ vmxnet vlance) (+ vmxnet3 vrdma) vrdma))))
(define (get-total-num-nics)
  (let ((nics (get-num-nics)))
    (+ (car nics)
       (car (cdr nics))
       (car (cdr (cdr nics)))
       (car (cdr (cdr (cdr nics)))))))
(define (get-max-targets dev)
  (let ((maxtargets (vmconfig-getlong 16 (string-append dev ".maxTargets"))))
    (cond ((> maxtargets 255) 255)
          ((< maxtargets 16) 16)
          (else maxtargets))))
(define (count-scsi i max ls pv pvtgts)
  (if (= i max)
      (list ls pv pvtgts)
      (let ((dev (string-append "scsi" (tostring i))))
           (if (not (vmconfig-getbool #f (string-append dev ".present")))
               (count-scsi (+ i 1) max ls pv pvtgts)
               (let ((vd (vmconfig-getstr "buslogic"
                                          (string-append dev ".virtualDev"))))
                    (cond ((or (string-ci=? vd "vmxlsilogic")
                               (string-ci=? vd "lsilogic")
                               (string-ci=? vd "lsisas1068"))
                           (count-scsi (+ i 1) max (+ ls 1) pv pvtgts))
                          ((string-ci=? vd "pvscsi")
                           (count-scsi (+ i 1) max ls (+ pv 1)
                                       (+ pvtgts (get-max-targets dev))))
                          (else (count-scsi (+ i 1) max ls pv pvtgts))))))))
(define (get-num-scsi) (count-scsi 0 0x4 0 0 0))
(define (get-num-pci-passthru)
  (let ((counts (count-devices-by-vdev "pciPassthru" "pciExpress"
                                       (list "pciExpress" "pci" "vmiop" "dvx")
                                       (list 0 0 0 0)
                                       0 0x80)))
    (cons (+ (car counts) (car (cdr counts)))
          (cdr (cdr counts)))))
(define (get-scsi-adapter-type i)
  (vmconfig-getstr "buslogic" (string-append "scsi" (tostring i)
                                             ".virtualDev")))
(define (get-sata-adapter-type i)
  (vmconfig-getstr "ahci" (string-append "sata" (tostring i) ".virtualDev")))
(define (get-num-nvme)
  (count-present-devices "nvme" (lambda (i) #t)
                         0 0x4))
(define (get-num-ahci)
  (count-present-devices "sata"
                         (lambda (i)
                           (let ((type (get-sata-adapter-type i)))
                             (string-ci=? type "ahci")))
                         0 0x4))
(define (get-num-qat)
  (count-present-devices "qat" (lambda (i) #t)
                         0 0x4))
(define (get-num-testdev)
  (count-present-devices "testDev" (lambda (i) #t)
                         0 0x80))
(define (get-extra-pvscsidisks-overhead max-pvscsi-targets)
  (if (> max-pvscsi-targets 60)
      (* (- max-pvscsi-targets 60) 110)
      0))
(define (svga-is-svga3-enabled)
  (and (hwversion-get-bool "svga.allowSVGA3")
       (or false false)
       (vmconfig-getbool false "svga.enableSVGA3")))
(define (svga-is-efi-only vga-only)
  (and (not vga-only)
       false
       (vmconfig-getbool #f "svga.efiOnly")
       (svga-is-svga3-enabled)))
(define (svga-is-arm-feature-set)
  (or false
      (and false
           (vmconfig-getbool #f "svga.ARMFeatureSet"))))
(define (svga-is-devel-arm-feature-set)
  (and false
       false
       (vmconfig-getbool #f "svga.arm.develARMFeatures")))
(define (mks-is-3d-enabled vga-only)
  (and (not vga-only)
       (hwversion-get-bool "mks.enable3d.available")
       (vmconfig-getbool #f "mks.enable3d")
       (not (svga-is-efi-only vga-only))))
(define (svga-is-GBObjects-enabled vga-only)
  (and (not vga-only)
       (hwversion-get-bool "svga.enableGBObjects")))
(define (mks-is-GLRenderer-capable enable3d)
  (and (not (= 0 (vmconfig-gettristate -1 "mks.enableGLRenderer")))
       (or enable3d
           (= 1 (vmconfig-gettristate -1 "mks.allowAcceleratedRenderers")))))
(define (mks-is-VKRenderer-capable enable3d)
  (and (= 1 (vmconfig-gettristate -1 "mks.enableVulkanRenderer"))
       (not true)
       (or enable3d
           (= 1 (vmconfig-gettristate -1 "mks.allowAcceleratedRenderers")))))
(define (mks-is-SWRenderer-capable enable3d)
  (and (not (= 0 (vmconfig-gettristate -1 "mks.enableSoftwareRenderer")))
       (or enable3d
           (= 1 (vmconfig-gettristate -1 "mks.prefer3dRenderer")))))
(define (mks-is-DriverVM-capable enable3d)
  (and (and false
            (vmconfig-getbool #f "mks.sandbox.enableDriverVM"))
       (or enable3d
           (= 1 (vmconfig-gettristate -1 "mks.allowAcceleratedRenderers")))))
(define (sbx-shm-size)
  (mbytes-2-bytes (vmconfig-getlong (* 32 1024) "sbx.shmSizeMB")))
(define (sbx-num-chunks)
  (/ (sbx-shm-size) (mbytes-2-bytes 512)))
(define (sbx-chunk-info-size)
  (+ (* (mbytes-2-pages 512) 8) 8))
(define (sbx-chunk-info-pages)
  (+ (bytes-2-pages-roundup (* (sbx-num-chunks) (sbx-chunk-info-size)))
     10))
(define (sbx-device-mem)
  (if (vmconfig-getbool #f "sbx.present")
      (sbx-chunk-info-pages)
      0))
(define (sbx-shm-pages)
  (if (vmconfig-getbool #f "sbx.present")
      (bytes-2-pages (sbx-shm-size))
      0))
(define (svga-get-max-size-for-hwversion isPrimary)
  (if (and isPrimary (hwversion-get-bool "svga.enableNoBBRestriction"))
      (* 256 1024 1024)
      0x8000000))
(define (svga-auto-detect-size)
  (roundup-bits (if true
                    (* 0xa00 0x640 4)
                    (svga-get-max-size-for-hwversion #t))
                22))
(define (svga-get-max-size guestosid isPrimary)
   (if (guestos-get-bool "svga.maxVRAM16MB" guestosid)
       (* 16 1024 1024)
       (svga-get-max-size-for-hwversion isPrimary)))
(define (svga-get-min-size enable3d use-small-size guestosid)
  (max (if (guestos-get-bool "svga.minVRAM8MB" guestosid)
           (* 8 1024 1024)
           0)
       (if (and enable3d (not use-small-size))
           0x1000000
           (roundup-bits 0x12c000 16))))
(define (svga-get-fb-size-desired enable3d use-small-size auto-detect-size)
   (min (if use-small-size 0x400000 0x7fffffffffffffff)
       (if (vmconfig-getbool false "svga.autodetect")
           (max auto-detect-size (if enable3d 0x4000000 0))
           (if (vmconfig-notset "svga.vramSize")
               (if enable3d 0x4000000 0x400000)
               (roundup-bits (vmconfig-getlong 0x400000 "svga.vramSize")
                             16)))))
(define (vg-get-fb-size-pages)
    (if (and false (vmconfig-getbool #f "vg.present"))
        (bytes-2-pages (* 1024 768 4))
        0))
(define (svga-is-adapter-present)
  (or (not (hwversion-get-bool "svga.notAlwaysPresent"))
      (vmconfig-getbool #t "svga.present")))
(define (svga-is-vga-only)
  (and (hwversion-get-bool "svga.allowVgaOnlyMode")
       (vmconfig-getbool #f "svga.vgaOnly")))
(define (svga-svgamem-size svga-present)
  (if svga-present (bytes-2-pages 0x200000) 0))
(define (svga-svgacursor-size)
  (bytes-2-pages-roundup 0xa000))
(define (mks-swbcursor-size)
  (bytes-2-pages-roundup (* 16 (* 1024 1024))))
(define (svga-mob-max-max-size)
  (if (hwversion-get-bool "svga.mobMaxSize1GB")
      (mbytes-2-bytes 1024)
      (mbytes-2-bytes 128)))
(define (svga-calculated-mob-max mob-max-max enable3d primary-mem)
  (if enable3d
      mob-max-max
      (min (* 8192 8192 4) primary-mem)))
(define (svga-config-mob-max mob-max-max is-restoring enable3d primary-mem)
  (if (not (hwversion-get-bool "svga.flexibleMobMax"))
      mob-max-max
      (let ((mob-max-config (vmconfig-getlong 0 "svga.mobMaxSize")))
        (if (not (= mob-max-config 0))
            mob-max-config
            (svga-calculated-mob-max mob-max-max enable3d primary-mem)))))
(define (svga-mob-max is-restoring enable3d primary-mem)
  (let ((mob-max-max (svga-mob-max-max-size)))
    (let ((mob-max (svga-config-mob-max mob-max-max is-restoring enable3d
                                        primary-mem)))
      (max (min mob-max mob-max-max) (mbytes-2-bytes 4)))))
(define (svga-ppn-list-max-bytes is-restoring enable3d primary-mem)
  (let ((max-pages-per-mob (bytes-2-pages-4kb (svga-mob-max is-restoring
                                                            enable3d
                                                            primary-mem))))
    (* max-pages-per-mob 8 2)))
(define (svga-ppn-list-max-pages is-restoring guestosid vga-only
                                 enable3d enableGBObjects)
  (if (not enableGBObjects)
      0
      (let ((primary-mem (svga-get-primary-size-in-bytes is-restoring
                                                         guestosid #t
                                                         vga-only enable3d
                                                         enableGBObjects
                                                         (svga-auto-detect-size))))
        (+ (bytes-2-pages (svga-ppn-list-max-bytes is-restoring
                                                   enable3d
                                                   primary-mem))
           2))))
(define (svga-mobfallback-size is-restoring guestosid vga-only
                               enable3d enableGBObjects)
  (if (not enableGBObjects)
      0
      (let ((primary-mem
             (svga-get-primary-size-in-bytes is-restoring guestosid #t
                                             vga-only enable3d
                                             enableGBObjects
                                             (svga-auto-detect-size))))
        (let ((num-fallbacks (if enable3d 4 3)))
           (* num-fallbacks
              (bytes-2-pages-roundup
                (svga-mob-max is-restoring enable3d primary-mem)))))))
(define (svga-get-fb-size-in-bytes-work is-restoring isPrimary guestosid
                                        svga-present vga-only enable3d
                                        enableGBObjects auto-detect-size)
  (let ((use-small-size
         (and (not isPrimary)
              enableGBObjects
              (vmconfig-getbool #f "svga.guestBackedPrimaryAware"))))
    (cond
        ((or (not svga-present) vga-only) 0)
        (is-restoring
          (vmconfig-getlong 0x8000000 "vmotion.checkpointFBSize"))
        (else (let ((max-size (svga-get-max-size guestosid isPrimary))
                    (min-size (svga-get-min-size enable3d use-small-size
                               guestosid))
                    (desired-size (svga-get-fb-size-desired enable3d
                                   use-small-size auto-detect-size)))
                    (min max-size (max min-size desired-size)))))))
(define (svga-get-fb-size-in-bytes is-restoring guestosid svga-present
                                   vga-only enable3d enableGBObjects
                                   auto-detect-size)
  (svga-get-fb-size-in-bytes-work is-restoring #f guestosid
                                  svga-present vga-only enable3d enableGBObjects
                                  auto-detect-size))
(define (svga-get-fb-size is-restoring guestosid svga-present vga-only enable3d
                          enableGBObjects)
  ( / (svga-get-fb-size-in-bytes is-restoring guestosid svga-present
                                 vga-only enable3d enableGBObjects
                                 (svga-auto-detect-size))
      0x1000))
(define (svga-get-primary-size-in-bytes is-restoring guestosid
                                        svga-present vga-only enable3d
                                        enableGBObjects
                                        auto-detect-size)
  (cond ((or (not svga-present) vga-only) 0)
        ((and is-restoring enableGBObjects)
         (vmconfig-getlong (svga-get-max-size guestosid #t)
                           "vmotion.checkpointSVGAPrimarySize"))
        (else (svga-get-fb-size-in-bytes-work is-restoring #t guestosid
                                              svga-present vga-only enable3d
                                              enableGBObjects
                                              auto-detect-size))))
(define (svga-get-primary-size is-restoring guestosid svga-present vga-only
                               enable3d enableGBObjects)
  (/ (svga-get-primary-size-in-bytes is-restoring guestosid
                                     svga-present vga-only enable3d
                                     enableGBObjects
                                     (svga-auto-detect-size))
     0x1000))
(define (svga-get-gb-overhead-config-maxKB)
   (if (hwversion-get-bool "svga.maxGraphicsMemory8GB")
      0x800000
      (if (hwversion-get-bool "svga.maxGraphicsMemory4GB")
         0x400000
         (if (hwversion-get-bool "svga.maxGraphicsMemory3GB")
            0x300000
            0x200000))))
(define (svga-get-3d-renderer-surface-ovhdPG is-restoring svga-primary-size
                                             enable3d enableGBObjects)
  (+ (svga-get-overhead-sizePG is-restoring enableGBObjects)
     svga-primary-size
     (if enable3d svga-primary-size 0)
     (svga-arcache-size enable3d))
)
(define (svga-get-overhead-sizePG is-restoring enableGBObjects)
   (let ((hb-config-sizePG (ceiling (if (vmconfig-getbool false
                                                          "svga.autodetect")
                                         0
                                         (- (min (vmconfig-getlong 0x400000
                                                                   "svga.vramSize")
                                                 0x40000000)
                                            0x8000000))
                                    0x1000))
         (gb-config-sizePG (kbytes-2-pages-roundup
                                (min (svga-get-gb-overhead-config-maxKB)
                                     (max 0x8000
                                          (vmconfig-getlong
                                           0x40000
                                           "svga.graphicsMemoryKB")))))
         (restoring-sizePG (kbytes-2-pages-roundup
                                (min (svga-get-gb-overhead-config-maxKB)
                                     (vmconfig-getlong 0 "vmotion.svga.graphicsMemoryKB"))))
         (hb-min-sizePG (ceiling (min (vmconfig-getlong 0xa000000
                                                        "svga.hostMinimumMemorySize")
                                      0x40000000)
                                 0x1000))
         (gb-min-sizePG 0))
        (if (and is-restoring (hwversion-get-bool "svga.flexibleGraphicsMemory"))
            restoring-sizePG
            (roundup-bits (max 0
                               (if enableGBObjects gb-min-sizePG hb-min-sizePG)
                               (if enableGBObjects gb-config-sizePG hb-config-sizePG))
                          4))
   )
)
(define (smm-get-overhead-size vcpus)
   (cond ((and (hwversion-get-bool "cpu.canDisableSMM")
               (hwversion-get-bool "chipset.smramLock")
               (not (flash-ram-always-requires-smram))
               (not (vmconfig-getbool #f "efi.legacyBoot.enabled"))) 0)
         ((and (hwversion-get-bool "chipset.devBackedSmram")
               (or (> vcpus 64)
                   (vmconfig-getbool #f "vcpu.hotadd"))) 63)
         (else 0)))
(define (list-contains _elem _list)
  (cond ((null? _list) #f)
        ((string=? _elem (car _list)) #t)
        (else (list-contains _elem (cdr _list)))))
(define (merge_unique listA listB)
  (cond ((null? listA) listB)
        ((null? listB) listA)
        ((list-contains (car listA) listB) (merge_unique (cdr listA) listB))
        (else (cons (car listA) (merge_unique (cdr listA) listB)))))
(define (strip-prefix str prefix delimiter)
   (let ((str-components (string-tokenize str delimiter)))
      (if (and (= (length str-components) 2)
               (string-ci=? (car str-components) prefix))
          (car (cdr str-components))
          str)))
(define (strip-list-prefix str-list prefix delimiter)
    (if (null? str-list)
        ()
        (cons (strip-prefix (car str-list) prefix delimiter)
              (strip-list-prefix (cdr str-list) prefix delimiter))))
(define (sanitize-iofilters iofilters-list)
    (strip-list-prefix iofilters-list "spif" ":"))
(define (iterate-diskiofilters-mmap iofilters disk-sizeMB)
   (if (null? iofilters)
       0
       (let ((iofilter-name (car iofilters)))
          (let ((ovhd-per-mb (hostconfig-getint
                             (string-append iofilter-name ".per-mb")))
                (ovhd-per-io (hostconfig-getint
                             (string-append iofilter-name ".per-io")))
                (ovhd-static (hostconfig-getint
                             (string-append iofilter-name ".static"))))
            (+ (if (null? ovhd-per-mb) 0 (* disk-sizeMB ovhd-per-mb))
               (if (null? ovhd-static) 0 ovhd-static)
               (if (null? ovhd-per-io) 0 (* ovhd-per-io
                                            0x1800))
               (iterate-diskiofilters-mmap (cdr iofilters) disk-sizeMB))))))
(define (disk-iofilters-overhead-malloc iofilters)
  (* 0x150 (length iofilters)))
(define (disk-iofilter-overhead diskPrefix diskLabel
                                malloc-ovhd mmap-ovhd unique-filters)
  (if (vmconfig-getbool #f (string-append diskLabel ".present"))
      (let ((iofilters (vmconfig-getstr () (string-append diskPrefix
                                                          ".ddb.iofilters"))))
        (if (null? iofilters)
            (list malloc-ovhd mmap-ovhd unique-filters)
            (let ((disk-sizeMB (vmconfig-getlong
                                0 (string-append diskPrefix ".capacityMB")))
                  (filters-list (sanitize-iofilters
                                 (string-tokenize iofilters "," "\040\t"))))
              (list (+ (disk-iofilters-overhead-malloc filters-list)
                       0x3a00 malloc-ovhd)
                    (+ (iterate-diskiofilters-mmap filters-list disk-sizeMB)
                       0x3a00 0x100000
                       mmap-ovhd)
                    (merge_unique filters-list unique-filters)))))
      (list malloc-ovhd mmap-ovhd unique-filters)))
(define (iofilters-iterate-disks disk-number max-number
                                 malloc-ovhd mmap-ovhd unique-filters)
  (if (>= disk-number max-number)
      (list malloc-ovhd mmap-ovhd unique-filters)
      (let ((diskPrefix (string-append "#disk" (tostring disk-number))))
        (let ((diskLabel (vmconfig-getstr ()
                                          (string-append diskPrefix ".label"))))
          (if (null? diskLabel)
              (list malloc-ovhd mmap-ovhd unique-filters)
              (let ((results (disk-iofilter-overhead diskPrefix diskLabel
                                                     malloc-ovhd mmap-ovhd
                                                     unique-filters)))
                (iofilters-iterate-disks (+ disk-number 1) max-number
                                         (car results) (car (cdr results))
                                         (car (cdr (cdr results))))))))))
(define (iofilters-iterate-disksets disk-number set-size max-number
                                    malloc-ovhd mmap-ovhd unique-filters)
  (if (>= disk-number max-number)
      (list malloc-ovhd mmap-ovhd unique-filters)
      (let ((results
             (iofilters-iterate-disks disk-number
                                      (min (+ disk-number set-size) max-number)
                                      malloc-ovhd mmap-ovhd unique-filters)))
        (iofilters-iterate-disksets (+ disk-number set-size) set-size max-number
                                    (car results) (car (cdr results))
                                    (car (cdr (cdr results)))))))
(define (iofilters-overhead)
  (let ((results (iofilters-iterate-disksets 0 100 1000 0 0 ())))
    (let ((malloc-pages (ceiling (car results) 0x1000))
          (mmap-pages (ceiling (car (cdr results)) 0x1000)))
      (list malloc-pages mmap-pages (car (cdr (cdr results)))))))
(define (iofilter-global-overhead iofilters-unique-list)
   (if (null? iofilters-unique-list)
       0
       (+ (let ((ovhd-global (hostconfig-getint
                              (string-append (car iofilters-unique-list) ".global"))))
            (if (null? ovhd-global)
                0
                ovhd-global))
          (iofilter-global-overhead (cdr iofilters-unique-list)))))
(define (iofilters-global-overhead unique-filters)
   (ceiling (iofilter-global-overhead unique-filters) 0x1000))
(define (mks-get-GLRenderer-3d-ovhdPG svga-primary-size)
  (+ (mbytes-2-pages 384)
     (mbytes-2-pages 1024)
     (mbytes-2-pages 96)
  )
)
(define (mks-get-VKRenderer-3d-ovhdPG svga-primary-size)
  (+ (mbytes-2-pages 384)
  )
)
(define (mks-get-SWRenderer-3d-ovhdPG)
  (mbytes-2-pages 256)
)
(define (mks-get-DriverVM-3d-ovhdPG svga-primary-size)
  (+ (mbytes-2-pages 1)
  )
)
(define (mks-get-3d-ovhdPG is-restoring svga-primary-size enable3d
                           enableGBObjects)
  (+ (svga-get-3d-renderer-surface-ovhdPG is-restoring svga-primary-size
                                          enable3d enableGBObjects)
     (max (if (mks-is-DriverVM-capable enable3d)
              (mks-get-DriverVM-3d-ovhdPG svga-primary-size) 0)
          (if (mks-is-GLRenderer-capable enable3d)
              (mks-get-GLRenderer-3d-ovhdPG svga-primary-size) 0)
          (if (mks-is-VKRenderer-capable enable3d)
              (mks-get-VKRenderer-3d-ovhdPG svga-primary-size) 0)
          (if (mks-is-SWRenderer-capable enable3d)
              (mks-get-SWRenderer-3d-ovhdPG) 0))
   )
)
(define (svga-emulate-hb-enabled enable3d enableGBObjects)
   (and enable3d (not enableGBObjects)))
(define (mks-get-hbmobs-ovhd svga-primary-size enable3d enableGBObjects)
   (if (svga-emulate-hb-enabled enable3d enableGBObjects)
       (+ (mks-get-3d-ovhdPG #f svga-primary-size enable3d enableGBObjects)
          (mbytes-2-pages 128))
       0))
(define (mks-get-llvm-ovhd enable3d)
   (if (mks-is-SWRenderer-capable enable3d)
       (bytes-2-pages (vmconfig-getlong 0x3000000 "mks.sw.llvmMemory"))
       0))
(define (mks-get-primary-size svga-primary-size)
   (+ (max svga-primary-size 347) 1))
(define (mks-get-shadowfb-ovhd svga-primary-size)
   (+ (* 2 (mks-get-primary-size svga-primary-size)) 1))
(define (mks-get-svgavo-ovhd) 4096)
(define (svga-arcache-size enable3d)
  (if (and enable3d (vmconfig-getbool #t "svga.allowAsyncReadback"))
      (mbytes-2-pages (vmconfig-getlong 384 "svga.asyncReadbackCacheSizeMB"))
      0))
(define (mks-get-screentemp-ovhd svga-primary-size)
  (+ (mks-get-primary-size svga-primary-size) (mks-get-svgavo-ovhd) 1 256))
(define (svga-surface-table-size enable3d enableGBObjects)
  (cond
   (enable3d 2944)
   (enableGBObjects 6)
   (else 0)))
(define (svga-hb-tables-size enable3d enableGBObjects)
   (if (svga-emulate-hb-enabled enable3d enableGBObjects) 993 0))
(define (svga-hb-mob-list-table-size enable3d enableGBObjects)
   (if (svga-emulate-hb-enabled enable3d enableGBObjects) 69 0))
(define (mpt-get-fb-size-work i maxDevice mptSize)
  (if (= i maxDevice)
      mptSize
      (let ((pfx (string-append "pciPassthru" (tostring i))))
        (let ((vd (vmconfig-getstr "pciExpress"
                                   (string-append pfx ".virtualDev"))))
          (let ((fbSizeMB
                  (if (and (vmconfig-getbool #f (string-append pfx ".present"))
                           (string-ci=? vd "vmiop"))
                      (vmconfig-getlong 0
                                        (string-append pfx ".fbSizeMB"))
                      0)))
            (mpt-get-fb-size-work (+ i 1) maxDevice (+ mptSize fbSizeMB)))))))
(define (mpt-get-restore-ovhd is-restoring passthru-mpt mpt-fb-size)
  (if (and is-restoring
           (> mpt-fb-size 0)
           (vmconfig-getbool #t "vmx.plugin.vmiop.checkpointAllowed"))
      (+ (* 64 passthru-mpt) mpt-fb-size (/ mpt-fb-size 8))
      0))
(define (mpt-get-fbsize-portion mpt-fb-size)
  (let ((thousandths (let ((config (vmconfig-getlong 8
                                    "vmiop.mem.fbSize.thousandths")))
                   (if (> config 1000) 1000 config))))
    (/ (* mpt-fb-size thousandths) 1000)))
(define (mpt-get-alloc-ovhd mpt-fb-size)
  (if (> mpt-fb-size 0)
       (mbytes-2-pages (max (mpt-get-fbsize-portion mpt-fb-size) 256))
       0))
(define (callstack-enabled)
  (and false
       (vmconfig-getbool false "monitor.callstack")
       (not false)))
(define (callstack-anon-pervcpu)
  (if (callstack-enabled)
      (+ 8 (if true 5 0))
      0))
(define (callstack-vmx n)
  (if (callstack-enabled)
      (let ((val (vmconfig-getlong 0x20
                                   "vmx.callstackMaxFootprintMB")))
        (let ((max-footprint (if (or (< val 0x2)
                                     (> val 0x3e8))
                                 0x20
                                 val)))
          (mbytes-2-pages
           (+ (* n (+ max-footprint
                      0x5))
              0x8))))
      0))
(define (ovhd-inuse-pages m size)
  (if (gphys-hwmmu-tree-in-vmk-enabled)
     (ceiling (ceiling m 8)
              (/ 0x1000 size))
     0))
(define (ovhd-2mi-pages m size)
  (ceiling (ceiling m (mbytes-2-pages 2))
           (/ 0x1000 size)))
(define (ovhd-1gi-pages m size)
  (ceiling (ceiling m (mbytes-2-pages 1024))
           (/ 0x1000 size)))
(define (ovhd-lev1-trace-bytes m)
  (+ (ceiling m 8) 0x3ce))
(define (ovhd-lev2-trace-bytes m)
  (+ (ceiling (ceiling m (mbytes-2-pages 2)) 8) 0x3ce))
(define (ovhd-lev3-trace-bytes m)
  (+ (ceiling (ceiling m (mbytes-2-pages 1024)) 8) 0x3ce))
(define (ovhd-large-traces m)
   (if (vmconfig-getbool #t "monitor.busmem.largeTraces")
      (+ (ovhd-lev2-trace-bytes m) (ovhd-lev3-trace-bytes m))
      0))
(define (ovhd-bmt-pages all-reg-pages)
  (ceiling (+ (ovhd-lev1-trace-bytes all-reg-pages)
              (ovhd-large-traces all-reg-pages))
           0x1000))
(define (ovhd-page-tables12 x)
  (+ 2 (arithmetic-shift x -9) (arithmetic-shift x -18)))
(define (ovhd-page-tables x)
  (+ 1 (ovhd-page-tables12 x) (arithmetic-shift x -27)))
(define (ovhd-ftcpt-dmap m)
  (let ((maxupn (get-ftcpt-maxupn m)))
    (+ (ceiling maxupn (* 8 0x1000)) (ceiling maxupn (* 0x1000 8 64)))))
(define (ovhd-ftcpt-vmm-vmx m)
  (+ (ovhd-ftcpt-dmap m)
     0x40
     0x1))
(define (ovhd-ftcpt-sas n ftcpt-vmm-vmx-pages)
  (* n (ovhd-page-tables12 (+ 2 ftcpt-vmm-vmx-pages))))
(define (ovhd-ftcpt-user ftcpt-vmm-vmx-pages is-restoring)
  (+ ftcpt-vmm-vmx-pages
     0x2000
     (if is-restoring
        (ceiling (vmconfig-getlong 0x8000000
                  "vmotion.checkpointFBSize") 0x1000) 0)
     (if false 0x100 0)
     (if false 0x400 0)
     (if (or false false) 1 0)))
(define (ovhd-shared-per-vcpu n)
  (* n 0xb))
(define (max-defined-ports n)
  (+ 0x2ee (* n 0x1)))
(define (iospace-byte-size n)
  (+ 0xfd0 (* (max-defined-ports n) 0x20)))
(define (viommu-is-intel-configured)
  (and (vmconfig-getbool #f "vvtd.enable")
       (hwversion-get-bool "vvtd.supportsDMAR")))
(define (viommu-is-amd-configured)
  (and (vmconfig-getbool #f "vvtd.enable")
       (hwversion-get-bool "amd.viommu.supported")))
(define (viommu-first-level-is-intel-configured)
  (and (viommu-is-intel-configured)
       (hwversion-get-bool "vvtd.supportsFirstLevel")
       (vmconfig-getbool #f "vvtd.enableFirstLevel")))
(define (viommu-configured is-intel is-amd-arch)
  (or (and is-intel (viommu-is-intel-configured))
      (and is-amd-arch (viommu-is-amd-configured))))
(define (viommu-counters-byte-size is-intel is-amd-arch)
  (if (viommu-configured is-intel is-amd-arch)
      (let ((vmk-sets (if true
                          (min (get-num-numa-vmk) 0x10)
                          0)))
        (* (+ 1 vmk-sets) 0x40))
      0))
(define (tdx-vmm-exts-size is-intel)
  (if (tdx-enabled is-intel) 0x41 0))
(define (vmm-exts-size n is-intel)
  (+ (tdx-vmm-exts-size is-intel) (* n 16)))
(define (ovhd-shared-area-exts n is-intel is-amd-arch pvscsi ahci
                               passthru-fpt passthru-mpt passthru-dvx
                               e1000 vmxnet3 vrdma nvme qat)
  (ceiling (+ 1
            (roundup (* pvscsi 4116) 64)
            (roundup (* nvme 14672) 64)
            (roundup (* ahci 9416) 64)
            (roundup (* 0x4 80) 64)
            (roundup (* passthru-fpt 1280) 64)
            (roundup (* passthru-fpt 6384) 64)
            (roundup (* passthru-mpt 284) 64)
            (roundup (* passthru-mpt 6376) 64)
            (roundup (* passthru-dvx 32848) 64)
            (roundup (* passthru-dvx 7768) 64)
            (roundup (* e1000 3784) 64)
            (roundup (* vmxnet3 720) 64)
            (roundup (* vmxnet3 3604) 64)
            (roundup (* vrdma 208) 64)
            (roundup (* vrdma 2264) 64)
            (roundup (* qat 772) 64)
            (roundup (* qat 104) 64)
            (roundup (vmm-exts-size n is-intel) 64)
            (roundup (* n (if false 36 32)) 64)
            (roundup (iospace-byte-size n) 64)
            (viommu-counters-byte-size is-intel
                                       is-amd-arch))
           0x1000))
(define (ovhd-shared-area n is-intel is-amd-arch
                          pvscsi ahci passthru-fpt passthru-mpt passthru-dvx
                          e1000 vmxnet3 vrdma nvme qat)
  (+ 0x7f
     (ovhd-shared-area-exts n is-intel is-amd-arch
                            pvscsi ahci passthru-fpt passthru-mpt passthru-dvx
                            e1000 vmxnet3 vrdma nvme qat)
     (ovhd-shared-per-vcpu n)))
(define (flash-ram-uses-ubios)
  (let ((image (vmconfig-getstr () "directBoot.linux")))
    (and (not (null? image))
         (hwversion-get-bool "directBoot.supported"))))
(define (flash-ram-config-is-bios)
  (let ((firmware (vmconfig-getstr "bios" "firmware")))
    (or (null? firmware)
        (not (string-ci=? firmware "efi")))))
(define (flash-ram-get-size)
   (cond ((flash-ram-uses-ubios) 0x10000)
         ((flash-ram-config-is-bios) 0x80000)
         ((hwversion-get-bool "flashram.allowExpandedROMSize")
                                      0x1000000)
         (else 0x200000)))
(define (flash-ram-always-requires-smram)
   (cond ((flash-ram-uses-ubios) #f)
         ((flash-ram-config-is-bios) #t)
         (else #f)))
(define (vmx-alloctrack-mode)
  (let ((m (vmconfig-getlong 0
                             "vmx.allocTrack.mode")))
    (if (or (= m 0)
            (= m 0x1)
            (= m 0x2)
            (= m 0x3))
        m 0x2)))
(define (ovhd-vmx-alloctrack)
  (if (and true
           (not true)
           (vmconfig-getbool true
                             "vmx.allocTrack.enabled"))
      (let ((m (vmx-alloctrack-mode)))
        (cond ((or (= m 0x3)
                   (= m 0x2))
               (mbytes-2-pages 800))
              ((or (= m 0x1)
                   (= m 0))
               (mbytes-2-pages 80))
              (else (log "ovhd-vmx-alloctrack: unknown allocTrack mode!\n")
                    (assert #f))))
      0))
(define (ovhd-vmx-asan)
  (if (> 0 0)
      (+ (mbytes-2-pages 1024)
         (/ (get-mainmem-size) 8))
      0))
(define (ovhd-vmxheap n is-restoring enable3d vprobe-enable max-pvscsi-targets
         passthru-mpt mpt-fb-size)
  (mbytes-2-pages
    (+ 26
       8
       (/ (get-extra-pvscsidisks-overhead max-pvscsi-targets) 1024)
       (if enable3d 8 0)
       (if vprobe-enable 15 0)
       (/ n 16)
       (mpt-get-restore-ovhd is-restoring passthru-mpt mpt-fb-size))))
(define (ovhd-vprobe vprobe-enable n)
  (if vprobe-enable
      (+ 0x100 0x60 (* n 0x32))
      0))
(define (get-itemized-vmx-overheads-work m nvdimm-pages epc-pages
         is-restoring guestosid ftcpt-enable
         svga-present vga-only enable3d enableGBObjects
         svga-fb-size svga-primary-size sbx-mem-size mpt-fb-size
         passthru-fpt passthru-mpt passthru-dvx passthru-all num-nics num-scsi)
  (let ((n (get-num-vcpus))
        (is-intel (and true
                                  (hostconfig-getbool-checked "is-intel")))
        (is-amd-arch (and true
                                  (hostconfig-getbool-checked "is-amd-arch")))
        (ahci (get-num-ahci))
        (nvme (get-num-nvme))
        (lsilogic (car num-scsi))
        (pvscsi (car (cdr num-scsi)))
        (max-pvscsi-targets (car (cdr (cdr num-scsi))))
        (e1000 (car num-nics))
        (vmxnet2 (car (cdr num-nics)))
        (vmxnet3 (car (cdr (cdr num-nics))))
        (vrdma (car (cdr (cdr (cdr num-nics)))))
        (qat (get-num-qat))
        (testdev (get-num-testdev))
        (vprobe-enable (vmconfig-getbool #f "vprobe.enable"))
        (sev-es-pages (if (vmconfig-getbool #f "sev.enable")
                                 (get-num-vcpus) 0))
        (iofilters-ovhd (iofilters-overhead))
        (var-reg-pages (+ m svga-fb-size sbx-mem-size nvdimm-pages
                                epc-pages))
        (mem-reg-pages (+ m nvdimm-pages epc-pages))
        (busmem-pages (+ m 0x1e440 svga-fb-size sbx-mem-size
                                nvdimm-pages epc-pages
                                (passthru-region-pages passthru-all passthru-fpt
                                                       passthru-mpt passthru-dvx)))
        (ftcpt-vmm-vmx-pages (if ftcpt-enable (ovhd-ftcpt-vmm-vmx m) 0))
        (vhv-enab (vhv-enabled guestosid))
        (amx-capable (and true
                                  (hostconfig-getbool-checked "amx-capable")))
        (pasid-trans-capable (and true
                                  (hostconfig-getbool-checked "pasid-trans-capable")))
        (nested-vm (hostconfig-getbool-checked "in-any-vm")))
    (list
      (list 0 (* n 0x4f) 0x1)
      (list 0x1 (ovhd-bmf-pages busmem-pages) 0x1)
      (list 0x4 (ovhd-inuse-pages mem-reg-pages 0x1)
                                                                                0x1)
      (list 0x2 (ovhd-2mi-pages mem-reg-pages 0x20)
                                                                                0x1)
      (list 0x3 (ovhd-1gi-pages mem-reg-pages 0x8)
                                                                                0x1)
      (list 0x5 1 0x1)
      (list 0x7 (* n 0x1) 0x1)
      (list 0x8 (* n 40) 0x1)
      (list 0x9 (* n (+ 512
                                                1))
                                                                                0x1)
      (list 0x6 (ovhd-busmem-preval n)
                                                                                0x1)
      (list 0xa (busmem-monas-overhead mem-reg-pages
                                         busmem-pages) 0x1)
      (list 0xb (platform-monas-overhead var-reg-pages)
                                                                                0x1)
      (list 0xc (* n 2) 0x1)
      (list 0xd (+ (if ftcpt-enable (* n 2) n)
                                           (if is-intel 0 (* n 2))
                                           (if (tdx-enabled is-intel) n 0)) 0x1)
      (list 0xe (ovhd-num-msr-bitmap-pages n is-intel) 0x1)
      (list 0x10 (* n 3) 0x1)
      (list 0xf (* n (if is-intel 1 2)) 0x1)
      (list 0x11 (vnpt-shadow-overhead n m vhv-enab) 0x1)
      (list 0x12 (vnpt-shadow-cache-overhead n m
                                                                    vhv-enab) 0x1)
      (list 0x13 (vnpt-backmap-overhead busmem-pages vhv-enab)
                                                                                0x1)
      (list 0x14 (if is-amd-arch n 0) 0x1)
      (list 0x15 (* n (callstack-anon-pervcpu)) 0x1)
      (list 0x16 (+ (* n 0x7)
                                           0xe
                                           0x4) 0x1)
      (list 0x17 (+ 0xb6
                                           0x2b) 0x1)
      (list 0x18 (* n (+ 0x1b
                                                0)) 0x1)
      (list 0x19 (+ (* n 0)
                                           0) 0x1)
      (list 0x1a 0 0x1)
      (list 0x1b (* n 0x11) 0x1)
      (list 0x1c (+ 0x1
                                           0x1
                                           0x1
                                           0x8fc) 0x1)
      (list 0x1d (+ (gphys-traced-overhead var-reg-pages is-intel)
                                           (gphys-traced-slack n is-intel)) 0x1)
      (list 0x1e (+ (gphys-hwmmu-overhead var-reg-pages is-intel)
                                           (gphys-hwmmu-slack n)) 0x1)
      (list 0x1f (+ (gphys-notrace-overhead var-reg-pages)
                                           (gphys-notrace-slack n)) 0x1)
      (list 0x2f (tdx-sept-overhead var-reg-pages
                                                           is-intel) 0x1)
      (list 0x30 (tdx-2minfo-overhead mem-reg-pages
                                                             is-intel) 0x1)
      (list 0x20 (+ 0x8
                                           (* 0x30 2)) 0x1)
      (list 0x21 (+ n 5) 0x1)
      (list 0x22 (if false 32 0) 0x1)
      (list 0x23 (if true 4 0) 0x1)
      (list 0x2c (if true 2 0) 0x1)
      (list 0x24 (if true vmxnet2 0) 0x1)
      (list 0x25 (if true
                                            0x4 0) 0x1)
      (list 0x26 (if true (* ahci 32) 0) 0x1)
      (list 0x27 (if true nvme 0) 0x1)
      (list 0x29 (if true
                                            (* 0x20
                                               pvscsi) 0) 0x1)
      (list 0x2a (if true
                                            (* lsilogic
                                               (+ 0x4
                                                  0x4)) 0) 0x1)
      (list 0x28 (if true
                                            (* nvme
                                               (+ (* 0x60 16)
                                                  (* 0x60
                                                     16))) 0) 0x1)
      (list 0x2b (if ftcpt-enable
                                            (ovhd-ftcpt-sas n ftcpt-vmm-vmx-pages)
                                            0) 0x1)
      (list 0x2d 1 0x1)
      (list 0x2e (if pasid-trans-capable
                                            (if (and true
                                                     (viommu-first-level-is-intel-configured)
                                                     (not nested-vm))
                                                66 2)
                                            0) 0x1)
      (list 0x31 (ovhd-shared-area n is-intel is-amd-arch
                                                          pvscsi ahci passthru-fpt
                                                          passthru-mpt passthru-dvx
                                                          e1000 vmxnet3 vrdma nvme
                                                          qat) 0)
      (list 0xa4 70 0)
      (list 0x33 (if (not true)
                                           (ovhd-bmt-pages busmem-pages) 0) 0)
      (list 0x34 (if false (* n 3) 0) 0x4)
      (list 0x35 (* n 2) 0x4)
      (list 0x36 (if false n 0) 0x4)
      (list 0x37 n 0x4)
      (list 0x38 (if false n 0) 0x4)
      (list 0x39 (ovhd-num-pframe-pages var-reg-pages) 0)
      (list 0x3a (ovhd-num-bmf-pages busmem-pages) 0)
      (list 0x3b (ovhd-vprobe vprobe-enable n) 0)
      (list 0x3c 16 0)
      (list 0x3d 64 0)
      (list 0x3e 1 0)
      (list 0x3f (if true 0 3) 0)
      (list 0x40 (if true 0 3) 0)
      (list 0x41 n 0x2)
      (list 0x42 8 0x2)
      (list 0x43 (* 16 (min (+ vmxnet2 vmxnet3)
                                                   0xa)) 0x2)
      (list 0x45 (* 4 lsilogic) 0x2)
      (list 0x46 (* 0x4 lsilogic) 0)
      (list 0x47 (* 128 passthru-all) 0x2)
      (list 0x48 (* 16 pvscsi) 0x2)
      (list 0x49 (if true (* 4 pvscsi) 0) 0x2)
      (list 0x4a (* 0x1 pvscsi)
                                                                                0x2)
      (list 0x4d (* 16 ahci) 0x2)
      (list 0x4e (* 0x1 ahci)
                                                                                0x2)
      (list 0x4f (* 2 nvme) 0x2)
      (list 0x4b (* 4 lsilogic) 0x2)
      (list 0x4c 16 0x2)
      (list 0x50 (bytes-2-pages (flash-ram-get-size)) 0x2)
      (list 0x51 (car iofilters-ovhd) 0x4)
      (list 0x52 (car (cdr iofilters-ovhd)) 0)
      (list 0x53 (iofilters-global-overhead
                                         (car (cdr (cdr iofilters-ovhd)))) 0)
      (list 0x54 (smm-get-overhead-size n) 0x2)
      (list 0x55 svga-fb-size 0x2)
      (list 0x56 (vg-get-fb-size-pages) 0x2)
      (list 0x57 (svga-svgamem-size svga-present) 0x2)
      (list 0x58 (sbx-device-mem) 0x4)
      (list 0x5a 3 0x2)
      (list 0x5b 1 0x2)
      (list 0x5c 1 0x2)
      (list 0x5d (mbytes-2-pages (vmconfig-getlong
                                                         0 "usb.disk-mem.maxMB"))
                                                                                0x4)
      (list 0x5e (if false 2 0) 0x2)
      (list 0x44 (if false (* 21 testdev) 0)
                                                                                0x2)
      (list 0x5f 2 0x2)
      (list 0x6f 1 0x2)
      (list 0x60 4 0x2)
      (list 0x61 m 0x3)
      (list 0x63 n 0)
      (list 0x64 n 0)
      (list 0x65 (if amx-capable
                                            (if true (* 3 n) (* 6 n))
                                            0) 0)
      (list 0x66 n 0)
      (list 0x67 (* passthru-all 2 9) 0x2)
      (list 0x6a (+ (* n 0)
                                           0) 0)
      (list 0x6b (+ 0xb6
                                           0x2b
                                           (* n (+ 0x1b
                                                   0))) 0)
      (list 0x6c (+ (* n 0)
                                           0) 0)
      (list 0x32 (ovhd-num-statvar-pages n) 0)
      (list 0x62 sev-es-pages 0)
      (list 0x6d (if ftcpt-enable
                                            (ovhd-ftcpt-user ftcpt-vmm-vmx-pages is-restoring)
                                            0) 0)
      (list 0x6e (+ (mbytes-2-pages (* 3 4)) 3) 0x4)
      (list 0x70 (svga-surface-table-size
                                            enable3d enableGBObjects) 0x4)
      (list 0x71 (svga-hb-tables-size enable3d
                                                              enableGBObjects) 0x4)
      (list 0x72 (svga-hb-mob-list-table-size
                                             enable3d enableGBObjects) 0x4)
      (list 0x73 96 0x4)
      (list 0x74 (if enable3d 1000 0) 0x4)
      (list 0x75 (if enable3d (mbytes-2-pages 9) 0) 0x4)
      (list 0x76 (if enable3d 1405 0) 0x4)
      (list 0x77 (if enable3d 31 0) 0x4)
      (list 0x78 (if enable3d 16 0) 0x4)
      (list 0x79 (if enable3d 1021 0) 0x4)
      (list 0x7a (if enable3d 70 0) 0x4)
      (list 0x7b (if enable3d 31 0) 0x4)
      (list 0x7c (if enable3d 199 0) 0x4)
      (list 0x7d (if enable3d 19 0) 0x4)
      (list 0x7e (if enable3d 19 0) 0x4)
      (list 0x7f (if enable3d 141 0) 0x4)
      (list 0x80 (if enable3d 1472 0) 0x4)
      (list 0x81 (if enable3d 241 0) 0x4)
      (list 0x82 (if enable3d (mbytes-2-pages 17) 0) 0x4)
      (list 0x83 (if enable3d 516 0) 0x4)
      (list 0x84 (if enable3d 132 0) 0x4)
      (list 0x85 (if enable3d 1 0) 0x4)
      (list 0x86 (if enable3d 1 0) 0x4)
      (list 0x87 (svga-svgacursor-size) 0x4)
      (list 0x59 (svga-mobfallback-size
                                            is-restoring guestosid
                                            vga-only enable3d enableGBObjects) 0x4)
      (list 0x88 (svga-ppn-list-max-pages
                                            is-restoring guestosid
                                            vga-only enable3d enableGBObjects) 0x4)
      (list 0x90 33 0x4)
      (list 0x91 (if enable3d 3494 678) 0x4)
      (list 0x92 (mks-get-3d-ovhdPG is-restoring
                                                           svga-primary-size
                                                           enable3d
                                                           enableGBObjects) 0x4)
      (list 0x93 (mks-get-hbmobs-ovhd svga-primary-size
                                                             enable3d
                                                             enableGBObjects) 0x4)
      (list 0x95 (mks-get-llvm-ovhd enable3d) 0x4)
      (list 0x99 (mks-get-svgavo-ovhd) 0x4)
      (list 0x96 (mks-get-screentemp-ovhd
                                         svga-primary-size) 0x4)
      (list 0x9a (mks-swbcursor-size) 0x4)
      (list 0x97 (+ (/ (* 112 svga-primary-size) 100)
                                           1536) 0x4)
      (list 0x98 (mks-get-shadowfb-ovhd
                                         svga-primary-size) 0x4)
      (list 0x9c (mpt-get-alloc-ovhd mpt-fb-size) 0x4)
      (list 0x89 (ovhd-vmx-alloctrack) 0x4)
      (list 0x8a (ovhd-vmx-asan) 0x4)
      (list 0x8e (ovhd-vmxheap n is-restoring
                                                      enable3d
                                                      vprobe-enable
                                                      max-pvscsi-targets
                                                      passthru-mpt
                                                      mpt-fb-size) 0x4)
      (list 0x8f 0 0x4)
      (list 0x8b (callstack-vmx n) 0x4)
      (list 0x8c (+ (if true
                                               (+ 2450
                                                  0
                                                  0)
                                               10240)
                                           (if false
                                               (mbytes-2-pages 13)
                                               0)) 0x5)
      (list 0x8d (+ 3584 0) 0x5)
      (list 0x9d (if false (mbytes-2-pages 10) 0) 0x4)
      (list 0x9e 0xa 0x4)
      (list 0x9f (if ftcpt-enable
                                            0x2000
                                            0) 0x4)
      (list 0xa0 128 0x4)
      (list 0xa1 (+ (mbytes-2-pages 30)
                                           0
                                           0) 0x6)
      (list 0xa2 17408 0x6)
      (list 0xa3 (* (+ 1 1 (if enable3d 4 2)
                                              n 0x20 (* passthru-mpt 2))
                                           0x200) 0x5)
      )))
(define (get-itemized-vmx-overheads is-restoring)
  (let ((guestosid (get-guestosid))
        (vga-only (svga-is-vga-only))
        (svga-present (svga-is-adapter-present))
        (num-passthru (get-num-pci-passthru)))
    (let ((enable3d (mks-is-3d-enabled vga-only))
          (enableGBObjects (svga-is-GBObjects-enabled vga-only))
          (passthru-fpt (car num-passthru))
          (passthru-mpt (car (cdr num-passthru)))
          (passthru-dvx (car (cdr (cdr num-passthru)))))
      (let ((svga-fb-size (svga-get-fb-size is-restoring guestosid
                                            svga-present vga-only enable3d
                                            enableGBObjects))
            (svga-primary-size (svga-get-primary-size is-restoring guestosid
                                                      svga-present vga-only
                                                      enable3d
                                                      enableGBObjects))
            (sbx-mem-size (sbx-shm-pages))
            (mpt-fb-size (if true
                             (mpt-get-fb-size-work 0 0x80 0)
                             0))
            (passthru-all (+ passthru-fpt passthru-mpt passthru-dvx)))
        (get-itemized-vmx-overheads-work (get-mainmem-size)
                                         (get-nvdimm-size)
                                         (get-epc-size)
                                         is-restoring
                                         guestosid
                                         (ftcpt-config-enabled)
                                         svga-present
                                         vga-only
                                         enable3d
                                         enableGBObjects
                                         svga-fb-size
                                         svga-primary-size
                                         sbx-mem-size
                                         mpt-fb-size
                                         passthru-fpt
                                         passthru-mpt
                                         passthru-dvx
                                         passthru-all
                                         (get-num-nics)
                                         (get-num-scsi))))))
(define (get-vmx-overheads is-restoring)
  (define (sum-overheads anon paged non-paged lst)
    (if (null? lst)
        (list anon paged non-paged)
        (let ((val (car (cdr (car lst))))
              (type (arithmetic-shift 1 (car (cdr (cdr (car lst))))))
              (rest (cdr lst)))
          (cond ((not (= (bitwise-and type 0x2) 0))
                 (sum-overheads (+ anon val) paged non-paged rest))
                ((not (= (bitwise-and type 0x30) 0))
                 (sum-overheads anon (+ paged val) non-paged rest))
                ((not (= (bitwise-and type 0x5) 0))
                 (sum-overheads anon paged
                    (+ non-paged (if (vmconfig-notset "sched.mem.vmxMin")
                                     val 0)) rest))
                (else (sum-overheads anon paged non-paged rest))))))
   (sum-overheads 0 0 (mbytes-2-pages (+ 0x5
                                         (get-sched-mem-vmxmin)))
      (get-itemized-vmx-overheads is-restoring)))
(define (count-nvdimm-pages-aligned i max alignment)
  (if (= i max)
      0
      (let ((cnt (count-nvdimm-pages-aligned (+ i 1) max alignment))
            (pgs (get-one-nvdimm-size i)))
          (+ cnt (if (= cnt 0) pgs (roundup pgs alignment))))))
(define (get-ftcpt-maxupn m)
   (let ((maxupn
           (if (vmconfig-getbool #f "nvdimm0.present")
               (count-nvdimm-pages-aligned 0 0x40 0x40000)
               0)))
     (if (= maxupn 0)
         m
         (+ maxupn (roundup m 0x40000)))))
(define (get-ftcpt-vmk-overheads is-restoring)
  (define (get-vmconfig-with-bounds name default lb ub)
    (min ub (max lb (vmconfig-getlong default name))))
  (let ((vga-only (svga-is-vga-only))
        (nvdimmPages (get-nvdimm-size))
        (m (get-mainmem-size)))
    (let ((memRegPages (+ m nvdimmPages))
          (maxUPN (get-ftcpt-maxupn m))
          (svgaGFBInPages (svga-get-fb-size is-restoring
                                              (get-guestosid)
                                              (svga-is-adapter-present)
                                              vga-only
                                              (mks-is-3d-enabled vga-only)
                                              (svga-is-GBObjects-enabled
                                                  vga-only))))
      (let ((maxDiffablePagesPerVcpu
                              (get-vmconfig-with-bounds
                                "ftcpt.maxDiffablePagesPerVcpu"
                                0x10000
                                0x1000
                                memRegPages))
            (maxDirtyPages (get-vmconfig-with-bounds
                                "ftcpt.maxDirtyPages"
                                0x40000
                                0x8000
                                memRegPages))
            (maxDiskBufferPages
                              (get-vmconfig-with-bounds
                                "ftcpt.maxDiskBufferPages"
                                0x10000
                                0x2000
                                0x100000))
            (encryptBufferPages
                              (get-vmconfig-with-bounds
                                "ftcpt.encryptBufferPages"
                                0x4000
                                0x100
                                0x10000))
            (cfgChecksumPages (get-vmconfig-with-bounds
                                "ftcpt.checksumTargetPages"
                                0x1
                                0
                                memRegPages))
            (maxDvsPages (max 0x1
                                   (* (get-total-num-nics)
                                      (get-vmconfig-with-bounds
                                        "ftcpt.maxDvsPagesPerNic"
                                        0x20
                                        0
                                        0x80))))
            (maxDirtyPageChunk (min 0x20000 memRegPages)))
        (let ((checksumTargetPages
                (if (= cfgChecksumPages 0x1)
                    (if false 0x4e20 0)
                    cfgChecksumPages))
              (maxChunkChangeMapPages
                (bytes-2-pages-roundup
                  (* 0x4 maxDirtyPageChunk)))
              (maxPageBufferPages
                (+ (bytes-2-pages-roundup 0x60010)
                   maxDirtyPageChunk))
              (maxDiskPagesOnPri (/ maxDiskBufferPages 2))
              (maxDiskPagesOnSnd maxDiskBufferPages)
              (maxDiffablePages
                (min (* (get-num-vcpus) maxDiffablePagesPerVcpu)
                     memRegPages))
              (encHdrBufPages
                (bytes-2-pages-roundup
                  (* 0x24
                    (+ (ceiling 0x20000 0x8)
                       (ceiling
                        (+ (bytes-2-pages-roundup 0x8000000)
                           0x2000
                           maxDvsPages) 0x10))))))
          (let ((var-src-ovhd-pages
                  (bytes-2-pages-roundup
                    (* maxUPN 0x8)))
                (var-dst-ovhd-pages
                  (bytes-2-pages-roundup
                    (* maxUPN 0x1)))
                (fixed-src-ovhd-pages
                  (+ (bytes-2-pages-roundup
                       (* 0x4 maxDiffablePages))
                     maxDiffablePages
                     (bytes-2-pages-roundup
                       (* 0x4 0x8ca0))
                     maxPageBufferPages
                     maxDiskPagesOnPri
                     maxDirtyPageChunk
                     maxChunkChangeMapPages
                     maxChunkChangeMapPages
                     maxDvsPages
                     (bytes-2-pages-roundup
                       0xc070)
                     maxChunkChangeMapPages
                     encryptBufferPages
                     encHdrBufPages))
                (fixed-dst-ovhd-pages
                  (+ 0x2000
                     (bytes-2-pages-roundup
                       (* 0x4 0x8ca0))
                     0x40
                     svgaGFBInPages
                     svgaGFBInPages
                     (* maxDvsPages 2)
                     maxDiskPagesOnSnd
                     maxDirtyPages
                     (bytes-2-pages-roundup
                       (* 0x4 maxDirtyPages))
                     (bytes-2-pages-roundup
                       (* 0x8 checksumTargetPages))
                     encHdrBufPages)))
            (if (ftcpt-config-enabled)
                (max (+ var-src-ovhd-pages fixed-src-ovhd-pages)
                     (+ var-dst-ovhd-pages fixed-dst-ovhd-pages))
                0)))))))
(define (mk-ah-conj predList)
  (if (null? (cdr predList))
      (car predList)
      (cons 0x14 predList)))
(define (mk-ah-disj predList)
  (if (null? (cdr predList))
      (car predList)
      (cons 0x15 predList)))
(define (is-sriov-nic devname)
  (not (vmconfig-notset (string-append devname ".pfId"))))
(define (get-passthru-pcislotinfo devname)
  (let ((id (vmconfig-getstr () (string-append devname ".id"))))
    (let ((idSbdf (if (null? id) () (parse-dec-sbdf id))))
      (cond ((and (not (null? idSbdf)) idSbdf)
             (list 0 "_id" idSbdf))
            (else #f)))))
(define (parse-hex-id hexIdStr)
  (let ((id (hexstr->number hexIdStr)))
    (if (and (not (null? id)) (>= id 0) (<= id 0xffff)) id #f)))
(define (get-passthru-id devname idname)
  (let ((idStr (vmconfig-getstr () (string-append devname idname))))
    (if (null? idStr) #f (parse-hex-id idStr))))
(define (get-passthru-legacy-preds devname)
  (let ((systemId (vmconfig-getstr () (string-append devname ".systemId")))
        (vendorId (get-passthru-id devname ".vendorId"))
        (deviceId (get-passthru-id devname ".deviceId"))
        (slotInfoPred (get-passthru-pcislotinfo devname)))
    (if (and (not (null? systemId)) vendorId deviceId slotInfoPred)
        (let ((preds0
               (if (= deviceId 0) (list slotInfoPred)
                   (list (list 0
                               "_deviceId" deviceId)
                         slotInfoPred))))
          (let ((preds1
                 (if (= vendorId 0) preds0
                     (cons (list 0
                                 "_vendorId" vendorId)
                           preds0))))
            (let ((preds2
                   (if (string=? systemId "BYPASS") preds1
                       (cons (list 0
                                   "_systemId" systemId)
                             preds1))))
              (mk-ah-conj (cons (list 0
                                      "_moduleName"
                                      "pciPassthru")
                                preds2))))) #f)))
(define (id-char-to-id-str charStr)
  (cond ((string=? charStr "r") "_revisionId")
        ((string=? charStr "s") "_subVendorId")
        ((string=? charStr "t") "_subDeviceId")
        (else #f)))
(define (mk-one-optional-pred predStr)
  (let ((strList (string-tokenize predStr "=")))
    (if (= (length strList) 2)
        (let ((idStr (id-char-to-id-str (car strList)))
              (idVal (parse-hex-id (car (cdr strList)))))
          (if (and idStr idVal)
              (list 0 idStr idVal) #f)) #f)))
(define (handle-optional-props predStrList predList)
  (if (null? predStrList)
      predList
      (let ((pred (mk-one-optional-pred (car predStrList))))
        (if pred
            (cons pred
                  (handle-optional-props (cdr predStrList) predList)) #f))))
(define (mk-allowed-devices-preds allowedDevices predicates)
  (if (null? allowedDevices)
      predicates
      (let ((predStrList (string-tokenize (car allowedDevices) ":")))
        (if (>= (length predStrList) 2)
            (let ((vId (parse-hex-id (car predStrList)))
                  (dId (parse-hex-id (car (cdr predStrList))))
                  (predList (handle-optional-props (cdr (cdr predStrList)) ())))
              (if (and vId dId predList)
                  (let ((vdPredList
                         (cons (list 0
                                     "_vendorId" vId)
                               (cons (list 0
                                           "_deviceId" dId)
                                     predList))))
                    (mk-allowed-devices-preds
                     (cdr allowedDevices)
                     (cons (cons 0x14 vdPredList)
                           predicates))) #f)) #f))))
(define (get-passthru-allowed-devices devname)
  (let ((allowedDevicesStr
         (vmconfig-getstr () (string-append devname ".allowedDevices"))))
    (if (null? allowedDevicesStr) ()
        (let ((preds (mk-allowed-devices-preds
                      (string-tokenize allowedDevicesStr "," "\040\t") ())))
          (if (and preds (not (null? preds)))
              (let ((disjPreds (mk-ah-disj preds))
                    (customLabel (vmconfig-getstr
                                  () (string-append devname ".customLabel")))
                    (moduleNamePred (list 0
                                          "_moduleName"
                                          "pciPassthru")))
                (if (null? customLabel)
                    (list 0x14 moduleNamePred disjPreds)
                    (list 0x14
                          moduleNamePred
                          (list 0 "_customLabel"
                                customLabel) disjPreds))) #f)))))
(define (get-vgpu-vmotion-preds devname keyprefix)
  (let ((guestVer (vmconfig-getlong 0 "vmiop.guestVgpuVersion"))
        (guestStr (vmconfig-getstr () (string-append devname ".pgpu"))))
    (let ((verPreds (if (= guestVer 0)
                        ()
                        (list (list 0x4
                                    (string-append
                                      keyprefix "minVersion")
                                    guestVer)
                              (list 0x6
                                    (string-append
                                      keyprefix "maxVersion")
                                    guestVer)))))
      (if (null? guestStr)
          verPreds
          (cons (list 0
                      (string-append keyprefix
                                     "deviceMetadata")
                      guestStr)
                verPreds)))))
(define (get-vgpu-override-pred devname)
  (let ((pciOverride (vmconfig-getstr () (string-append devname
                                                        ".cfg.gpu-pci-id"))))
    (if (null? pciOverride)
        ()
        (let ((sbdf (parse-hex-sbdf pciOverride)))
          (if sbdf
              (list 0 "_id" sbdf) #f)))))
(define (get-vgpu-predtree-work is-restoring devname profile)
  (let ((modNamePred (list 0
                           "_moduleName" "nvidia"))
        (profilePred (list 0x2
                           "_vgpu" profile))
        (overridePred (get-vgpu-override-pred devname)))
    (if (not overridePred) #f
        (if is-restoring
            (let ((vmotionPreds (get-vgpu-vmotion-preds devname "_")))
              (cons 0x14
                    (cons modNamePred
                          (cons profilePred
                                (if (null? overridePred)
                                    vmotionPreds
                                    (cons overridePred vmotionPreds))))))
            (if (null? overridePred)
                (list 0x14 modNamePred profilePred)
                (list 0x14 modNamePred profilePred
                      overridePred))))))
(define (get-dvx-predtree devname is-restoring devNum)
  (let ((devClass (vmconfig-getstr () (string-append devname ".dvx.deviceClass")))
        (netpred (if (is-sriov-nic devname)
                     (let ((switchpred (mk-switch-pred devname "_")))
                       (if (null? switchpred)
                           (list 0x7 #f)
                           switchpred))
                     (list 0x7 #t))))
    (cond ((null? devClass)
           (list "pciPassthru" devNum #f))
;; dvxc.py generated code goes here
          (else (list "pciPassthru" devNum #f)))))
(define (mk-switchid-predicate switchidList keyprefix)
  (cons 0
        (cons (string-append keyprefix "switchId")
              switchidList)))
(define (mk-netname-predicate devname keyprefix)
  (let ((netname (vmconfig-getstr () (string-append devname ".networkName"))))
    (if (null? netname)
        ()
        (mk-switchid-predicate (list (string-append "::" netname)
                                     "NetIdMapper") keyprefix))))
(define (mk-externalid-predicate devname keyprefix)
  (let ((externalid (vmconfig-getstr () (string-append devname ".externalId")))
        (netid (vmconfig-getstr ()
                                (string-append devname ".opaqueNetwork.Id"))))
    (if (or (null? externalid) (null? netid))
        (mk-netname-predicate devname keyprefix)
        (let ((idstr (string-append netid ":" externalid ":")))
          (mk-switchid-predicate (list idstr "NetIdMapper") keyprefix)))))
(define (mk-switch-pred devname keyprefix)
  (let ((switchid (vmconfig-getstr () (string-append devname ".dvs.switchId"))))
    (if (null? switchid)
        (mk-externalid-predicate devname keyprefix)
        (mk-switchid-predicate (list switchid) keyprefix))))
(define (mk-pfid-pred pfid)
  (list 0x14
        (list 0
              "_moduleName"
              "pciPassthru")
        (list 0 "_pfId" pfid)))
(define (mk-vfid-pred pfid vfid)
  (if (or (not vfid) (= vfid 0) (= vfid pfid))
      (mk-pfid-pred pfid)
      (list 0x14
            (list 0
                  "_moduleName"
                  "pciPassthru")
            (list 0 "_pfId" pfid)
            (list 0 "_id" vfid))))
(define (mk-legacy-pfid-pred devname pfidstr)
  (let ((vfidstr (vmconfig-getstr () (string-append devname ".id")))
        (pfid (parse-dec-sbdf pfidstr))
        (allowOverride (hostconfig-getbool-checked "passthru-allow-override")))
    (if (not pfid) #f
        (if (or (null? vfidstr) (and (not (null? allowOverride)) allowOverride))
            (mk-pfid-pred pfid)
            (mk-vfid-pred pfid (parse-dec-sbdf vfidstr))))))
(define (get-legacy-sriov-predtree devname pfidstr i)
  (list "pciPassthru" i (mk-legacy-pfid-pred devname pfidstr)))
(define (get-virt-sriov-predtree devname pfidstr i)
  (let ((switchpred (mk-switch-pred devname "_")))
    (if (null? switchpred)
        (get-legacy-sriov-predtree devname pfidstr i)
        (let ((modpred (list 0
                             "_moduleName"
                             "pciPassthru")))
          (list "pciPassthru" i
                (list 0x14 modpred switchpred))))))
(define (get-sriovnic-predtree devname i)
  (let ((pfidstr (vmconfig-getstr () (string-append devname ".pfId"))))
    (let ((strList (string-tokenize pfidstr "-")))
      (if (and (= (length strList) 2) (string-ci=? (car strList) "Automatic"))
          (get-virt-sriov-predtree devname pfidstr i)
          (get-legacy-sriov-predtree devname pfidstr i)))))
(define (get-passthru-predtree-work devname is-restoring i)
  (if (vmconfig-getbool #f (string-append devname ".present"))
      (let ((virtDev (vmconfig-getstr "pciExpress"
                                      (string-append devname ".virtualDev"))))
        (cond ((or (string=? virtDev "pci")
                   (string=? virtDev "pciExpress"))
               (if is-restoring
                   (list "pciPassthru" i (list 0x7 #f))
                   (let ((allowedDevices
                          (if (hwversion-get-bool
                               "pciPassthru.enableAllowedDevices")
                              (get-passthru-allowed-devices devname)
                              ())))
                     (if (not (null? allowedDevices))
                         (list "pciPassthru" i allowedDevices)
                         (if (is-sriov-nic devname)
                             (get-sriovnic-predtree devname i)
                             (list "pciPassthru" i
                                   (get-passthru-legacy-preds devname)))))))
              ((string=? virtDev "vmiop")
               (let ((profile
                       (vmconfig-getstr () (string-append devname ".vgpu"))))
                 (if (not (null? profile))
                     (list "pciPassthru" i
                           (get-vgpu-predtree-work is-restoring devname
                                                   profile))
                     ())))
              ((string=? virtDev "dvx")
               (get-dvx-predtree devname is-restoring i))
              (else ())))
    ()))
(define (get-passthru-predtree is-restoring i)
  (let ((devname (string-append "pciPassthru" (tostring i))))
    (if (and (vmconfig-notset (string-append devname ".group"))
             (not (vmconfig-getbool #f
                                    (string-append devname ".driverVMDevice"))))
        (get-passthru-predtree-work devname is-restoring i)
        ())))
(define (get-passthru-validation-predtree is-restoring i)
  (get-passthru-predtree-work (string-append "pciPassthru" (tostring i))
                              is-restoring i))
(define (get-qat-predtree is-restoring i)
  (let ((devname (string-append "qat" (tostring i))))
    (if (vmconfig-getbool #f (string-append devname ".present"))
        (let ((deviceType
               (vmconfig-getstr "C62XVF"
                                (string-append devname ".deviceType"))))
          (list "qat" i
                (list 0x14
                      (list 0
                            "_moduleName" "qat")
                      (list 0
                            "_deviceType" deviceType))))
        ())))
(define (mk-component-vmotion-preds compDevName compNumStr)
  (let ((virtDev (vmconfig-getstr "pciExpress"
                                  (string-append compDevName ".virtualDev")))
        (profile (vmconfig-getstr () (string-append compDevName ".vgpu"))))
    (cond ((or (string=? virtDev "pci")
               (string=? virtDev "pciExpress"))
           (list (list 0x7 #f)))
          ((and (not (null? profile)) (string=? virtDev "vmiop"))
           (get-vgpu-vmotion-preds compDevName
                                   (string-append
                                     "_component"
                                     compNumStr ".")))
          ((string=? virtDev "dvx")
           ())
          (else (list (list 0x7 #f))))))
(define (mk-component-normal-preds compDevName compNumStr)
  (let ((virtDev (vmconfig-getstr "pciExpress"
                                  (string-append compDevName ".virtualDev")))
        (profile (vmconfig-getstr () (string-append compDevName ".vgpu")))
        (compKey (string-append "_component" compNumStr
                                ".")))
    (cond ((or (string=? virtDev "pci")
               (string=? virtDev "pciExpress"))
           (if (is-sriov-nic compDevName)
               (let ((switchPred (mk-switch-pred compDevName compKey)))
                 (if (null? switchPred) #f
                     (list switchPred)))
               ()))
          ((and (not (null? profile)) (string=? virtDev "vmiop"))
           ())
          ((string=? virtDev "dvx")
           ())
          (else ()))))
(define (list-append listA listB)
  (if (null? listA)
      listB
      (cons (car listA) (list-append (cdr listA) listB))))
(define (mk-devicegroup-component-preds compList get-preds-fn)
  (if (null? compList)
    ()
    (let ((compInfo (car compList)))
      (let ((compDevName (car compInfo))
            (compNumStr (cdr compInfo)))
        (let ((compPreds (get-preds-fn compDevName compNumStr)))
          (if (not compPreds) #f
              (list-append compPreds
                           (mk-devicegroup-component-preds (cdr compList)
                                                           get-preds-fn))))))))
(define (mk-devicegroup-component-list groupName className classDevNum compList)
  (if (< classDevNum 0)
    compList
    (let ((compName (string-append className (tostring classDevNum))))
      (let ((groupStr (vmconfig-getstr () (string-append compName ".group"))))
        (if (null? groupStr)
            (mk-devicegroup-component-list groupName className (- classDevNum 1)
                                           compList)
            (let ((tokenList (string-tokenize groupStr ":")))
              (if (not (= (length tokenList) 2)) #f
                  (if (string-ci=? groupName (car tokenList))
                      (mk-devicegroup-component-list
                        groupName className (- classDevNum 1)
                        (cons (cons compName (car (cdr tokenList))) compList))
                      (mk-devicegroup-component-list groupName className
                                                     (- classDevNum 1)
                                                     compList)))))))))
(define (get-devicegroup-predtree-work devname groupname is-restoring)
  (let ((modNamePred (list 0
                           "_moduleName"
                           "deviceGroup"))
        (groupNamePred (list 0
                             "_deviceGroupName"
                             groupname))
        (compList (mk-devicegroup-component-list devname "pciPassthru"
                                                 (- 0x80 1)
                                                 ())))
    (if (or (not compList) (null? compList)) #f
        (if is-restoring
            (let ((class (vmconfig-getstr
                           () (string-append devname ".vMotionCompatClass")))
                  (compPreds (mk-devicegroup-component-preds
                               compList mk-component-vmotion-preds)))
              (if (null? class)
                  (cons 0x14
                          (cons modNamePred
                                (cons groupNamePred compPreds)))
                  (let ((classPred (list 0
                                         "_vmotionClass" class)))
                    (cons 0x14
                          (cons modNamePred
                                (cons groupNamePred
                                      (cons classPred compPreds)))))))
            (let ((compPreds (mk-devicegroup-component-preds
                              compList mk-component-normal-preds)))
              (if (not compPreds) #f
                  (cons 0x14
                        (cons modNamePred
                              (cons groupNamePred compPreds)))))))))
(define (get-devicegroup-predtree is-restoring i)
  (let ((devname (string-append "deviceGroup" (tostring i))))
    (if (vmconfig-getbool #f (string-append devname ".present"))
        (let ((groupname
               (vmconfig-getstr () (string-append devname ".name"))))
          (if (null? groupname)
              (list "deviceGroup" i #f)
              (list "deviceGroup" i
                    (get-devicegroup-predtree-work devname groupname
                                                   is-restoring))))
        ())))
(define (get-vmxnet3-predtree is-restoring i)
  (let ((devname (string-append "ethernet" (tostring i))))
    (if (vmconfig-getbool #f (string-append devname ".present"))
        (let ((virtDev (vmconfig-getstr "vlance"
                                        (string-append devname ".virtualDev"))))
          (if (string=? virtDev "vmxnet3")
              (if (vmconfig-getbool #f (string-append devname ".upt"))
                  (let ((switchpred (mk-switch-pred devname "_")))
                    (if (null? switchpred)
                        (list "ethernet" i #f)
                        (let ((modpred (list 0
                                             "_moduleName"
                                             "pciPassthru"))
                               (uptpred (list 0
                                              "_uptSupported" #t)))
                          (list "ethernet" i
                                (list 0x14
                                      modpred uptpred switchpred)))))
                  ())
              ()))
        ())))
(define (get-ah-preds-work get-preds-fn is-restoring i ptlist)
  (if (or (< i 0) (not ptlist))
      ptlist
      (let ((pt (get-preds-fn is-restoring i)))
        (get-ah-preds-work get-preds-fn is-restoring
                           (- i 1) (if (null? pt) ptlist (cons pt ptlist))))))
(define (get-ah-preds is-restoring)
  (let ((net-preds (get-ah-preds-work get-vmxnet3-predtree is-restoring
                                      (- 0xa 1) ())))
    (let ((qat-preds
           (get-ah-preds-work get-qat-predtree is-restoring
                              (- 0x4 1) net-preds)))
      (let ((passthru-preds
             (get-ah-preds-work get-passthru-predtree is-restoring
                                (- 0x80 1) qat-preds)))
        (get-ah-preds-work get-devicegroup-predtree is-restoring
                           (- 0x4 1) passthru-preds)))))
(define (vmiop-stun-time-secs migration-mbytes
                              vmotion-mbytes-sec
                              streaming-restore)
  (let ((migration-time (ceiling migration-mbytes vmotion-mbytes-sec)))
    (if streaming-restore
        migration-time
        (* 2 migration-time))))
(define (get-vmiop-stun-time-secs-work devname migrate-type
                                       vmotion-mbytes-sec
                                       streaming-device-restore)
  (let ((migration-mbytes
          (vmconfig-getlong 0
                            (string-append devname ".fbSizeMB"))))
    (if (= migration-mbytes 0)
        (0xffffffff)
        (vmiop-stun-time-secs migration-mbytes
                              vmotion-mbytes-sec
                              (and (= migrate-type 0x1)
                                   streaming-device-restore)))))
(define (get-vmiop-stun-time-secs migration-mbytes migrate-type
                                  vmotion-devcpt-mbytes-sec)
  (let ((vmiop-devcpt-max-send-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-max-send-rate"))
        (vmiop-devcpt-max-recv-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-max-recv-rate"))
        (vmiop-devcpt-save-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-save-rate"))
        (vmiop-devcpt-restore-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-restore-rate"))
        (vmiop-streaming-device-restore
          (hostconfig-getint "vmiop-streaming-device-restore")))
    (if (or (null? vmiop-devcpt-max-send-mbytes-sec)
            (null? vmiop-devcpt-max-recv-mbytes-sec)
            (null? vmiop-devcpt-save-mbytes-sec)
            (null? vmiop-devcpt-restore-mbytes-sec)
            (null? vmiop-streaming-device-restore))
        (vmiop-stun-time-secs migration-mbytes
                              (min 700
                                   vmotion-devcpt-mbytes-sec) #f)
        (vmiop-stun-time-secs migration-mbytes
                              (min vmotion-devcpt-mbytes-sec
                                   vmiop-devcpt-max-send-mbytes-sec
                                   vmiop-devcpt-max-recv-mbytes-sec
                                   vmiop-devcpt-save-mbytes-sec
                                   vmiop-devcpt-restore-mbytes-sec)
                              (and (= migrate-type 0x1)
                                   (= vmiop-streaming-device-restore 1))))))
(define (dvx-cpt-size devname)
  (let ((devClass (vmconfig-getstr ()
                      (string-append devname ".dvx.deviceClass"))))
    (cond ((null? devClass) 0)
;; dvxc.py checkpoint size generated code goes here
          (else 0))))
(define (get-dvx-stun-time-secs devname vmotion-nic-mbytes-sec)
  (ceiling (dvx-cpt-size devname)
           (mbytes-2-bytes vmotion-nic-mbytes-sec)))
(define (get-pt-stun-time-work i migrate-type
                               vmotion-nic-mbytes-sec
                               vmiop-vmotion-mbytes-sec
                               vmiop-streaming-device-restore)
  (let ((devname (string-append "pciPassthru" (tostring i))))
    (if (vmconfig-getbool #f (string-append devname ".present"))
      (let ((virtDev (vmconfig-getstr "pciExpress"
                                      (string-append devname ".virtualDev")))
            (profile (vmconfig-getstr () (string-append devname ".vgpu"))))
        (cond ((or (string=? virtDev "pci")
                   (string=? virtDev "pciExpress"))
               0)
              ((and (not (null? profile)) (string=? virtDev "vmiop"))
               (get-vmiop-stun-time-secs-work devname migrate-type
                 vmiop-vmotion-mbytes-sec vmiop-streaming-device-restore))
              ((string=? virtDev "dvx")
               (get-dvx-stun-time-secs devname vmotion-nic-mbytes-sec))
              (else 0)))
      0)))
(define (get-pt-stun-time-secs i migrate-type vmotion-nic-mbytes-sec
                               vmiop-vmotion-mbytes-sec
                               vmiop-streaming-device-restore)
  (if (< i 0)
      0
      (+ (get-pt-stun-time-work i migrate-type
                                vmotion-nic-mbytes-sec
                                vmiop-vmotion-mbytes-sec
                                vmiop-streaming-device-restore)
         (get-pt-stun-time-secs (- i 1) migrate-type
                                vmotion-nic-mbytes-sec
                                vmiop-vmotion-mbytes-sec
                                vmiop-streaming-device-restore))))
(define (get-vmdevs-stun-time-secs migrate-type vmotion-nic-mbytes-sec
                                   vmotion-devcpt-mbytes-sec)
  (let ((vmiop-devcpt-max-send-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-max-send-rate"))
        (vmiop-devcpt-max-recv-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-max-recv-rate"))
        (vmiop-devcpt-save-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-save-rate"))
        (vmiop-devcpt-restore-mbytes-sec
          (hostconfig-getint "vmiop-devcpt-restore-rate"))
        (vmiop-streaming-device-restore
          (hostconfig-getint "vmiop-streaming-device-restore")))
    (if (or (null? vmiop-devcpt-max-send-mbytes-sec)
            (null? vmiop-devcpt-max-recv-mbytes-sec)
            (null? vmiop-devcpt-save-mbytes-sec)
            (null? vmiop-devcpt-restore-mbytes-sec)
            (null? vmiop-streaming-device-restore))
        (get-pt-stun-time-secs (- 0x80 1) migrate-type
                               vmotion-nic-mbytes-sec
                               (min 700
                                    vmotion-devcpt-mbytes-sec
                                    vmotion-nic-mbytes-sec) #f)
        (get-pt-stun-time-secs (- 0x80 1) migrate-type
                               vmotion-nic-mbytes-sec
                               (min vmiop-devcpt-max-send-mbytes-sec
                                    vmiop-devcpt-max-recv-mbytes-sec
                                    vmiop-devcpt-restore-mbytes-sec
                                    vmotion-devcpt-mbytes-sec
                                    vmotion-nic-mbytes-sec
                                    vmiop-devcpt-save-mbytes-sec)
                               (= vmiop-streaming-device-restore 1)))))