; ********************************************************** ;; Copyright (C) 2011-2024 Broadcom. All Rights Reserved. ;; Broadcom Confidential. The term "Broadcom" refers to Broadcom Inc. ;; and/or its subsidiaries. ;; **********************************************************/ ; MACHINE GENERATED! DO NOT MODIFY! (define guest-os-list-sorted (list (cons "almaLinux-64" 0x5030) (cons "amazonlinux2-64" 0x508F) (cons "amazonlinux3-64" 0x5090) (cons "arm-almaLinux-64" 0x5031) (cons "arm-CRXPod1-64" 0x5096) (cons "arm-CRXSys1-64" 0x5092) (cons "arm-CRXSys2-64" 0x5094) (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" 0x5079) (cons "arm-vmkernel8" 0x507B) (cons "arm-vmkernel9" 0x507D) (cons "arm-vmware-photon-64" 0x507F) (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" 0x5088) (cons "centos-64" 0x5089) (cons "centos6" 0x508A) (cons "centos6-64" 0x508B) (cons "centos7-64" 0x508C) (cons "centos8-64" 0x508D) (cons "centos9-64" 0x508E) (cons "coreos-64" 0x502C) (cons "CRXPod1-64" 0x5095) (cons "CRXSys1-64" 0x5091) (cons "CRXSys2-64" 0x5093) (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 "darwin24-64" 0x506E) (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 "fusionos-64" 0x502E) (cons "kylinlinux-64" 0x5030) (cons "linux" 0x5025) (cons "linuxMint-64" 0x5097) (cons "longhorn" 0x500C) (cons "longhorn-64" 0x500D) (cons "mandrake" 0x5029) (cons "mandrake-64" 0x502A) (cons "mandriva" 0x5029) (cons "mandriva-64" 0x502A) (cons "miraclelinux-64" 0x5030) (cons "netware4" 0x5071) (cons "netware5" 0x5072) (cons "netware6" 0x5073) (cons "nld9" 0x5029) (cons "nt4" 0x5006) (cons "oes" 0x5029) (cons "openserver5" 0x506F) (cons "openserver6" 0x506F) (cons "opensuse" 0x5029) (cons "opensuse-64" 0x502A) (cons "oraclelinux" 0x5080) (cons "oraclelinux-64" 0x5081) (cons "oraclelinux10-64" 0x5087) (cons "oraclelinux6" 0x5082) (cons "oraclelinux6-64" 0x5083) (cons "oraclelinux7-64" 0x5084) (cons "oraclelinux8-64" 0x5085) (cons "oraclelinux9-64" 0x5086) (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 "pardus-64" 0x509D) (cons "prolinux-64" 0x509C) (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" 0x5070) (cons "vmkernel" 0x5074) (cons "vmkernel5" 0x5075) (cons "vmkernel6" 0x5076) (cons "vmkernel65" 0x5077) (cons "vmkernel7" 0x5078) (cons "vmkernel8" 0x507A) (cons "vmkernel9" 0x507C) (cons "vmware-photon-64" 0x507E) (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 (get-num-pcpus) (hostconfig-getint-checked "num-pcpus")) (define (sw-tiering-enabled) (and true (hostconfig-getbool-checked "sw-tiering-enabled-on-host"))) (define (vmk-build-type) (if false (hostconfig-getint-checked "vmk-build-type") 0)) (define (gphys-hwmmu-tree-in-vmk-enabled) (and false (or (sw-tiering-enabled) (vmconfig-getbool (is-esx-ulm) "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= 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 false (vmconfig-getbool #f "ftcpt.enabled"))) (define (ovhd-pframe-pages region-pages num_regions) (if false (let ((pframe2-used (or (= (vmk-build-type) 0x5) (= (vmk-build-type) 0x2)))) (let ((pframe-size (if pframe2-used (+ 0x8 0x8) 0x8))) (let ((pframe-pages (+ (ceiling (* region-pages pframe-size) 0x1000) (* (if pframe2-used 2 1) num_regions)))) (+ pframe-pages (+ (ceiling (* 0x8 pframe-pages) 0x1000) (* (if pframe2-used 2 1) num_regions)) (ceiling (* 0x8 (+ (ceiling region-pages 0x40000) num_regions)) 0x1000))))) 0)) (define (ovhd-bmf-pages size-in-pages) (ceiling size-in-pages (/ 0x1000 0x4))) (define (asi-enabled) (and true (is-esx-ulm) (vmconfig-getbool #t "asi.enable"))) (define (ovhd-klm-allocated-pages n is-intel msr-bitmap-pages) (let ((klm-apic 1) (klm-vmcb (if is-intel 0 1))) (* n (+ klm-apic klm-vmcb msr-bitmap-pages)))) (define (asi-pagetables n num-pcpus is-intel shared-area-pages msr-bitmap-pages) (let ((asi-shared-area (ovhd-page-tables shared-area-pages)) (asi-special-stacks (ovhd-page-tables (* num-pcpus 0))) (asi-prda (ovhd-page-tables (* num-pcpus (bytes-2-pages VMK_PCPU_REGION_SIZE)))) (asi-arch-gdt-tss (if true (+ 1 1) 0)) (asi-arch-apic (if true (+ 1 1 1) 0)) (asi-world-store-l3 1) (asi-world-store-l2 (ovhd-page-tables2 (* (+ 1 n) 0))) (asi-world-stacks-l1 (+ 1 n n)) (asi-world-handles-l1 (+ 1 n)) (asi-htsched (if is-intel (+ (+ 1 1 1) (+ 1 1 1)) 0)) (asi-klm (+ 1 (ovhd-page-tables2 (ovhd-klm-allocated-pages n is-intel msr-bitmap-pages))))) (+ 1 0 0 asi-shared-area asi-special-stacks asi-prda asi-arch-gdt-tss asi-arch-apic asi-world-store-l3 asi-world-store-l2 asi-world-stacks-l1 asi-world-handles-l1 asi-htsched asi-klm))) (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 (arithmetic-shift (+ 1 m 0x1e440) -27) (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 (is-esx-ulm) (and false (or (not true) (vmconfig-getbool (sw-tiering-enabled) "monitor.ulm")))) (define (ovhd-num-pframe-pages var-reg-pages) (if (or false false) 0 (+ (bytes-2-pages (* (+ var-reg-pages 0x1e440) 0x8)) 0x3ce))) (define (ovhd-num-bmf-pages var-reg-pages) (if (or false false (is-esx-ulm)) (+ (bytes-2-pages (* (+ var-reg-pages 0x1e440) 0x4)) 0x3ce) 0)) (define (ovhd-num-statvar-pages n) (if (is-esx-ulm) (+ (* n 0) 0) (* n 0))) (define (ovhd-num-msr-bitmap-pages n msr-bitmap-pages) (if (is-esx-ulm) (* n msr-bitmap-pages) msr-bitmap-pages)) (define (platform-monas-overhead var-reg-pages) (if false 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-num-spaces n vhv-enab) (if (and (is-esx-ulm) vhv-enab) (+ (max 2 n) 1) 1)) (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 false) (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 (vmconfig-getbool false "mks.sandbox.enableDriverVM") (or enable3d (= 1 (vmconfig-gettristate -1 "mks.allowAcceleratedRenderers"))))) (define (sbx-shm-size) (mbytes-2-bytes (vmconfig-getlong (* 16 1024) "sbx.shmSizeMB"))) (define (sbx-chunk-size) (mbytes-2-bytes 256)) (define (sbx-num-chunks) (/ (sbx-shm-size) (sbx-chunk-size))) (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 false (* 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 true "svga.autodetect") (max auto-detect-size (if enable3d 0x8000000 0)) (if (vmconfig-notset "svga.vramSize") (if enable3d 0x8000000 0x1000000) (roundup-bits (vmconfig-getlong 0x1000000 "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) (+ (if enable3d (svga-get-overhead-sizePG is-restoring enableGBObjects) 0) (if (or enable3d enableGBObjects) svga-primary-size 0) (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 true "svga.autodetect") 0 (- (min (vmconfig-getlong 0x1000000 "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 0x30000000 "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 1 (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 false 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-tables2 x) (+ 1 (arithmetic-shift x -18))) (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-monas-overhead ftcpt-vmm-vmx-pages) (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 false (min (get-num-numa-vmk) 0x10) 0))) (* (+ 1 vmk-sets) 0x40)) 0)) (define (lbr-configured-ulm) (and (is-esx-ulm) (vmconfig-getbool #f "guest_lbr.enable"))) (define (lbr-shared-byte-size n) (if (lbr-configured-ulm) (* n 0x1000) 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 1256) 64) (roundup (* passthru-fpt 6392) 64) (roundup (* passthru-mpt 320) 64) (roundup (* passthru-mpt 6376) 64) (roundup (* passthru-dvx 32888) 64) (roundup (* passthru-dvx 7808) 64) (roundup (* e1000 3784) 64) (roundup (* vmxnet3 1200) 64) (roundup (* vmxnet3 3604) 64) (roundup (* vrdma 208) 64) (roundup (* vrdma 2264) 64) (roundup (* qat 531) 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) (lbr-shared-byte-size n) (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) (+ 0x77 (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 false (not true) (vmconfig-getbool false "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 (vmxnet3-net-worlds devname typePerDev) (let ((defQs (if (vmconfig-getbool #f (string-append devname ".realtime")) 1 8))) (let ((txqueues (vmconfig-getlong defQs (string-append devname ".maxTxQueues")))) (let ((txworlds (vmconfig-getlong 8 (string-append devname ".maxTxWorlds")))) (cond ((= typePerDev 3) (min (get-num-vcpus) txqueues txworlds)) ((= typePerDev 1) 1) (else 0)))))) (define (vmxnet3-num-ctx-work 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") (let ((typePerDev (vmconfig-getlong 0 (string-append devname ".ctxPerDev")))) (let ((count (vmxnet3-net-worlds devname typePerDev))) (* count 0 ))) 0)) 0))) (define (vmxnet3-num-ctx i) (if (< i 0) 0 (+ (vmxnet3-num-ctx-work i) (vmxnet3-num-ctx (- i 1))))) (define (ovhd-vprobe vprobe-enable n) (if vprobe-enable (+ 0x100 0x60 (* n 0x22)) 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")) (esx-ulm (is-esx-ulm))) (let ((shared-area-pages (ovhd-shared-area n is-intel is-amd-arch pvscsi ahci passthru-fpt passthru-mpt passthru-dvx e1000 vmxnet3 vrdma nvme qat)) (klm-num-bitmaps (if is-intel 2 1)) (msr-bitmap-pages (if is-intel 0x1 0x2))) (list (list 0 (* n 0x62) 0x1) (list 0x1 (if (asi-enabled) (asi-pagetables n (get-num-pcpus) is-intel shared-area-pages (* msr-bitmap-pages klm-num-bitmaps)) 0) 0x1) (list 0x2 (ovhd-bmf-pages busmem-pages) 0x1) (list 0x5 (ovhd-inuse-pages mem-reg-pages 0x1) 0x1) (list 0x3 (ovhd-2mi-pages mem-reg-pages 0x20) 0x1) (list 0x4 (ovhd-1gi-pages mem-reg-pages 0x8) 0x1) (list 0x6 1 0x1) (list 0x8 (* n 0x1) 0x1) (list 0x9 (* n 40) 0x1) (list 0xa (* n (+ 512 1)) 0x1) (list 0x7 (ovhd-busmem-preval n) 0x1) (list 0xb (busmem-monas-overhead mem-reg-pages busmem-pages) 0x1) (list 0x21 (ovhd-pframe-pages (if esx-ulm busmem-pages mem-reg-pages) (if esx-ulm 0x3ce 0x42)) 0x1) (list 0xc (platform-monas-overhead var-reg-pages) 0x1) (list 0xd (* n 2) 0x1) (list 0xe (+ (if ftcpt-enable (* n 2) n) (if is-intel 0 (* n 2)) (if (tdx-enabled is-intel) n 0)) 0x1) (list 0xf (ovhd-num-msr-bitmap-pages n msr-bitmap-pages) 0x1) (list 0x11 (* n 3) 0x1) (list 0x10 (* n msr-bitmap-pages) 0x1) (list 0x12 (if (not esx-ulm) (vnpt-shadow-overhead n m vhv-enab) 0) 0x1) (list 0x13 (if (not esx-ulm) (vnpt-shadow-cache-overhead n m vhv-enab) 0) 0x1) (list 0x14 (if (not esx-ulm) (vnpt-backmap-overhead busmem-pages vhv-enab) 0) 0x1) (list 0x15 (if is-amd-arch n 0) 0x1) (list 0x16 (* n (callstack-anon-pervcpu)) 0x1) (list 0x17 (+ (* n 0x6) 0xe 0x4) 0x1) (list 0x18 (+ 0xa3 0x24) 0x1) (list 0x19 (* n (+ 0x31 0)) 0x1) (list 0x1a (+ (* n 0) 0) 0x1) (list 0x1b 0 0x1) (list 0x1c (* n 0x1d) 0x1) (list 0x1d (+ 0x1 0x1 0x1 0x8fc) 0x1) (list 0x1e (+ (gphys-traced-overhead var-reg-pages is-intel) (gphys-traced-slack n is-intel)) 0x1) (list 0x1f (+ (* (gphys-num-spaces n vhv-enab) (gphys-hwmmu-overhead var-reg-pages is-intel)) (gphys-hwmmu-slack n)) 0x1) (list 0x20 (+ (gphys-notrace-overhead var-reg-pages) (gphys-notrace-slack n)) 0x1) (list 0x31 (tdx-sept-overhead var-reg-pages is-intel) 0x1) (list 0x32 (tdx-2minfo-overhead mem-reg-pages is-intel) 0x1) (list 0x22 (+ 0x8 (* 0x30 2)) 0x1) (list 0x23 (+ n 5) 0x1) (list 0x24 (if false 32 0) 0x1) (list 0x25 (if false 4 0) 0x1) (list 0x2e (if false 2 0) 0x1) (list 0x26 (if false vmxnet2 0) 0x1) (list 0x27 (if false 0x4 0) 0x1) (list 0x28 (if false (* ahci 32) 0) 0x1) (list 0x29 (if false nvme 0) 0x1) (list 0x2b (if false (* 0x20 pvscsi) 0) 0x1) (list 0x2c (if false (* lsilogic (+ 0x4 0x4)) 0) 0x1) (list 0x2a (if false (* nvme (+ (* 0x60 16) (* 0x60 16))) 0) 0x1) (list 0x2d (if ftcpt-enable (ovhd-ftcpt-monas-overhead ftcpt-vmm-vmx-pages) 0) 0x1) (list 0x2f 1 0x1) (list 0x30 (if pasid-trans-capable (if (and false (viommu-first-level-is-intel-configured) (not nested-vm)) 66 2) 0) 0x1) (list 0x33 shared-area-pages 0) (list 0xa6 70 0) (list 0x35 (if (not false) (ovhd-bmt-pages busmem-pages) 0) 0) (list 0x36 (if false (* n 3) 0) 0x4) (list 0x37 (* n 2) 0x4) (list 0x38 (if false n 0) 0x4) (list 0x39 n 0x4) (list 0x3a (if false n 0) 0x4) (list 0x3b (ovhd-num-pframe-pages var-reg-pages) 0) (list 0x3c (ovhd-num-bmf-pages busmem-pages) 0) (list 0x3d (ovhd-vprobe vprobe-enable n) 0) (list 0x3e 16 0) (list 0x3f 64 0) (list 0x40 1 0) (list 0x41 (if false 0 3) 0) (list 0x42 (if false 0 3) 0) (list 0x43 n 0x2) (list 0x44 8 0x2) (list 0x45 (+ (vmxnet3-num-ctx (- 0xa 1)) (* 16 (min (+ vmxnet2 vmxnet3) 0xa))) 0x2) (list 0x47 (* 4 lsilogic) 0x2) (list 0x48 (* 0x4 lsilogic) 0) (list 0x49 (* 128 passthru-all) 0x2) (list 0x4a (* 16 pvscsi) 0x2) (list 0x4b (if false (* 4 pvscsi) 0) 0x2) (list 0x4c (* 0x1 pvscsi) 0x2) (list 0x4f (* 16 ahci) 0x2) (list 0x50 (* 0x1 ahci) 0x2) (list 0x51 (* 2 nvme) 0x2) (list 0x4d (* 4 lsilogic) 0x2) (list 0x4e 16 0x2) (list 0x52 (bytes-2-pages (flash-ram-get-size)) 0x2) (list 0x53 (car iofilters-ovhd) 0x4) (list 0x54 (car (cdr iofilters-ovhd)) 0) (list 0x55 (iofilters-global-overhead (car (cdr (cdr iofilters-ovhd)))) 0) (list 0x56 (smm-get-overhead-size n) 0x2) (list 0x57 svga-fb-size 0x2) (list 0x58 (vg-get-fb-size-pages) 0x2) (list 0x59 (svga-svgamem-size svga-present) 0x2) (list 0x5a (sbx-device-mem) 0x4) (list 0x5c 3 0x2) (list 0x5d 1 0x2) (list 0x5e 1 0x2) (list 0x5f (mbytes-2-pages (vmconfig-getlong 0 "usb.disk-mem.maxMB")) 0x4) (list 0x60 (if false 2 0) 0x2) (list 0x46 (if false (* 21 testdev) 0) 0x2) (list 0x61 2 0x2) (list 0x71 1 0x2) (list 0x62 4 0x2) (list 0x63 m 0x3) (list 0x65 n 0) (list 0x66 n 0) (list 0x67 (if amx-capable (if false (* 3 n) (* 6 n)) 0) 0) (list 0x68 (if esx-ulm 0 n) 0) (list 0x69 (* passthru-all 2 9) 0x2) (list 0x6c (+ (* n 0x12) 0x11) 0) (list 0x6d (+ 0xa3 0x24 (* n (+ 0x31 0))) 0) (list 0x6e (+ (* n 0) 0) 0) (list 0x34 (ovhd-num-statvar-pages n) 0) (list 0x64 sev-es-pages 0) (list 0x6f (if ftcpt-enable (ovhd-ftcpt-user ftcpt-vmm-vmx-pages is-restoring) 0) 0) (list 0x70 (+ (mbytes-2-pages (* 3 4)) 3) 0x4) (list 0x72 (svga-surface-table-size enable3d enableGBObjects) 0x4) (list 0x73 (svga-hb-tables-size enable3d enableGBObjects) 0x4) (list 0x74 (svga-hb-mob-list-table-size enable3d enableGBObjects) 0x4) (list 0x75 96 0x4) (list 0x76 (if enable3d 1000 0) 0x4) (list 0x77 (if enable3d (mbytes-2-pages 9) 0) 0x4) (list 0x78 (if enable3d 1405 0) 0x4) (list 0x79 (if enable3d 31 0) 0x4) (list 0x7a (if enable3d 16 0) 0x4) (list 0x7b (if enable3d 1021 0) 0x4) (list 0x7c (if enable3d 70 0) 0x4) (list 0x7d (if enable3d 31 0) 0x4) (list 0x7e (if enable3d 199 0) 0x4) (list 0x7f (if enable3d 19 0) 0x4) (list 0x80 (if enable3d 19 0) 0x4) (list 0x81 (if enable3d 141 0) 0x4) (list 0x82 (if enable3d 1472 0) 0x4) (list 0x83 (if enable3d 241 0) 0x4) (list 0x84 (if enable3d (mbytes-2-pages 17) 0) 0x4) (list 0x85 (if enable3d 516 0) 0x4) (list 0x86 (if enable3d 132 0) 0x4) (list 0x87 (if enable3d 1 0) 0x4) (list 0x88 (if enable3d 1 0) 0x4) (list 0x89 (svga-svgacursor-size) 0x4) (list 0x5b (svga-mobfallback-size is-restoring guestosid vga-only enable3d enableGBObjects) 0x4) (list 0x8a (svga-ppn-list-max-pages is-restoring guestosid vga-only enable3d enableGBObjects) 0x4) (list 0x92 49 0x4) (list 0x93 (if enable3d 3494 678) 0x4) (list 0x94 (mks-get-3d-ovhdPG is-restoring svga-primary-size enable3d enableGBObjects) 0x4) (list 0x95 (mks-get-hbmobs-ovhd svga-primary-size enable3d enableGBObjects) 0x4) (list 0x97 (mks-get-llvm-ovhd enable3d) 0x4) (list 0x9b (mks-get-svgavo-ovhd) 0x4) (list 0x98 (mks-get-screentemp-ovhd svga-primary-size) 0x4) (list 0x9c (mks-swbcursor-size) 0x4) (list 0x99 (+ (/ (* 112 svga-primary-size) 100) 1536) 0x4) (list 0x9a (mks-get-shadowfb-ovhd svga-primary-size) 0x4) (list 0x9e (mpt-get-alloc-ovhd mpt-fb-size) 0x4) (list 0x8b (ovhd-vmx-alloctrack) 0x4) (list 0x8c (ovhd-vmx-asan) 0x4) (list 0x90 (ovhd-vmxheap n is-restoring enable3d vprobe-enable max-pvscsi-targets passthru-mpt mpt-fb-size) 0x4) (list 0x91 0 0x4) (list 0x8d (callstack-vmx n) 0x4) (list 0x8e (+ (if false (+ 2450 0 0) 10240) (if false (mbytes-2-pages 13) 0)) 0x5) (list 0x8f (+ 3584 0) 0x5) (list 0x9f (if false (mbytes-2-pages 10) 0) 0x4) (list 0xa0 0xa 0x4) (list 0xa1 (if ftcpt-enable 0x2000 0) 0x4) (list 0xa2 128 0x4) (list 0xa3 (+ (mbytes-2-pages 31) 0 0) 0x6) (list 0xa4 17408 0x6) (list 0xa5 (* (+ 1 1 (if enable3d 4 2) n 0x40 (* 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 false (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 "_pfId" 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-modulename) (if (hostconfig-getbool-checked "FSS-DualDpuNetwork-enabled") "dpuVf" "pciPassthru")) (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" (get-vmxnet3-modulename))) (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)))))