/* * capabilities.h: hypervisor capabilities * * Copyright (C) 2006-2019 Red Hat, Inc. * Copyright (C) 2006-2008 Daniel P. Berrange * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #pragma once #include "internal.h" #include "virconftypes.h" #include "virbuffer.h" #include "cpu_conf.h" #include "virarch.h" #include "virmacaddr.h" #include "virobject.h" #include "virresctrl.h" #include typedef enum { VIR_CAPS_GUEST_FEATURE_TYPE_PAE = 0, VIR_CAPS_GUEST_FEATURE_TYPE_NONPAE, VIR_CAPS_GUEST_FEATURE_TYPE_IA64_BE, VIR_CAPS_GUEST_FEATURE_TYPE_ACPI, VIR_CAPS_GUEST_FEATURE_TYPE_APIC, VIR_CAPS_GUEST_FEATURE_TYPE_CPUSELECTION, VIR_CAPS_GUEST_FEATURE_TYPE_DEVICEBOOT, VIR_CAPS_GUEST_FEATURE_TYPE_DISKSNAPSHOT, VIR_CAPS_GUEST_FEATURE_TYPE_HAP, VIR_CAPS_GUEST_FEATURE_TYPE_LAST } virCapsGuestFeatureType; struct _virCapsGuestFeature { bool present; virTristateSwitch defaultOn; virTristateBool toggle; }; struct _virCapsGuestMachine { char *name; char *canonical; unsigned int maxCpus; }; struct _virCapsGuestDomainInfo { char *emulator; char *loader; int nmachines; virCapsGuestMachinePtr *machines; }; struct _virCapsGuestDomain { int type; /* virDomainVirtType */ virCapsGuestDomainInfo info; }; struct _virCapsGuestArch { virArch id; unsigned int wordsize; virCapsGuestDomainInfo defaultInfo; size_t ndomains; size_t ndomains_max; virCapsGuestDomainPtr *domains; }; struct _virCapsGuest { int ostype; virCapsGuestArch arch; virCapsGuestFeature features[VIR_CAPS_GUEST_FEATURE_TYPE_LAST]; }; struct _virCapsHostNUMACellCPU { unsigned int id; unsigned int socket_id; unsigned int core_id; virBitmapPtr siblings; }; struct _virCapsHostNUMACellSiblingInfo { int node; /* foreign NUMA node */ unsigned int distance; /* distance to the node */ }; struct _virCapsHostNUMACellPageInfo { unsigned int size; /* page size in kibibytes */ unsigned long long avail; /* the size of pool */ }; struct _virCapsHostNUMACell { int num; int ncpus; unsigned long long mem; /* in kibibytes */ virCapsHostNUMACellCPUPtr cpus; int nsiblings; virCapsHostNUMACellSiblingInfoPtr siblings; int npageinfo; virCapsHostNUMACellPageInfoPtr pageinfo; }; struct _virCapsHostNUMA { gint refs; GPtrArray *cells; }; struct _virCapsHostSecModelLabel { char *type; char *label; }; struct _virCapsHostSecModel { char *model; char *doi; size_t nlabels; virCapsHostSecModelLabelPtr labels; }; struct _virCapsHostCacheBank { unsigned int id; unsigned int level; /* 1=L1, 2=L2, 3=L3, etc. */ unsigned long long size; /* B */ virCacheType type; /* Data, Instruction or Unified */ virBitmapPtr cpus; /* All CPUs that share this bank */ size_t ncontrols; virResctrlInfoPerCachePtr *controls; }; struct _virCapsHostCache { size_t nbanks; virCapsHostCacheBankPtr *banks; virResctrlInfoMonPtr monitor; }; struct _virCapsHostMemBWNode { unsigned int id; virBitmapPtr cpus; /* All CPUs that belong to this node*/ virResctrlInfoMemBWPerNode control; }; struct _virCapsHostMemBW { size_t nnodes; virCapsHostMemBWNodePtr *nodes; virResctrlInfoMonPtr monitor; }; struct _virCapsHost { virArch arch; size_t nfeatures; size_t nfeatures_max; char **features; unsigned int powerMgmt; /* Bitmask of the PM capabilities. * See enum virHostPMCapability. */ bool offlineMigrate; bool liveMigrate; size_t nmigrateTrans; size_t nmigrateTrans_max; char **migrateTrans; virCapsHostNUMAPtr numa; virResctrlInfoPtr resctrl; virCapsHostCache cache; virCapsHostMemBW memBW; size_t nsecModels; virCapsHostSecModelPtr secModels; char *netprefix; virCPUDefPtr cpu; int nPagesSize; /* size of pagesSize array */ unsigned int *pagesSize; /* page sizes support on the system */ unsigned char host_uuid[VIR_UUID_BUFLEN]; bool iommu; }; struct _virCapsStoragePool { int type; }; struct _virCaps { virObject parent; virCapsHost host; size_t nguests; size_t nguests_max; virCapsGuestPtr *guests; size_t npools; size_t npools_max; virCapsStoragePoolPtr *pools; }; G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCaps, virObjectUnref); struct _virCapsDomainData { int ostype; int arch; int domaintype; /* virDomainVirtType */ const char *emulator; const char *machinetype; }; virCapsPtr virCapabilitiesNew(virArch hostarch, bool offlineMigrate, bool liveMigrate); void virCapabilitiesHostNUMAUnref(virCapsHostNUMAPtr caps); void virCapabilitiesHostNUMARef(virCapsHostNUMAPtr caps); G_DEFINE_AUTOPTR_CLEANUP_FUNC(virCapsHostNUMA, virCapabilitiesHostNUMAUnref); int virCapabilitiesAddHostFeature(virCapsPtr caps, const char *name); int virCapabilitiesAddHostMigrateTransport(virCapsPtr caps, const char *name); int virCapabilitiesSetNetPrefix(virCapsPtr caps, const char *prefix); void virCapabilitiesHostNUMAAddCell(virCapsHostNUMAPtr caps, int num, unsigned long long mem, int ncpus, virCapsHostNUMACellCPUPtr cpus, int nsiblings, virCapsHostNUMACellSiblingInfoPtr siblings, int npageinfo, virCapsHostNUMACellPageInfoPtr pageinfo); int virCapabilitiesSetHostCPU(virCapsPtr caps, virCPUDefPtr cpu); virCapsGuestMachinePtr * virCapabilitiesAllocMachines(const char *const *names, int nnames); void virCapabilitiesFreeMachines(virCapsGuestMachinePtr *machines, int nmachines); void virCapabilitiesFreeGuest(virCapsGuestPtr guest); virCapsGuestPtr virCapabilitiesAddGuest(virCapsPtr caps, int ostype, virArch arch, const char *emulator, const char *loader, int nmachines, virCapsGuestMachinePtr *machines); virCapsGuestDomainPtr virCapabilitiesAddGuestDomain(virCapsGuestPtr guest, int hvtype, const char *emulator, const char *loader, int nmachines, virCapsGuestMachinePtr *machines); void virCapabilitiesAddGuestFeature(virCapsGuestPtr guest, virCapsGuestFeatureType feature); void virCapabilitiesAddGuestFeatureWithToggle(virCapsGuestPtr guest, virCapsGuestFeatureType feature, bool defaultOn, bool toggle); int virCapabilitiesAddStoragePool(virCapsPtr caps, int poolType); int virCapabilitiesHostSecModelAddBaseLabel(virCapsHostSecModelPtr secmodel, const char *type, const char *label); virCapsDomainDataPtr virCapabilitiesDomainDataLookup(virCapsPtr caps, int ostype, virArch arch, int domaintype, const char *emulator, const char *machinetype); bool virCapabilitiesDomainSupported(virCapsPtr caps, int ostype, virArch arch, int domaintype); void virCapabilitiesClearHostNUMACellCPUTopology(virCapsHostNUMACellCPUPtr cpu, size_t ncpus); char * virCapabilitiesFormatXML(virCapsPtr caps); virBitmapPtr virCapabilitiesHostNUMAGetCpus(virCapsHostNUMAPtr caps, virBitmapPtr nodemask); int virCapabilitiesGetNodeInfo(virNodeInfoPtr nodeinfo); int virCapabilitiesInitPages(virCapsPtr caps); virCapsHostNUMAPtr virCapabilitiesHostNUMANew(void); virCapsHostNUMAPtr virCapabilitiesHostNUMANewHost(void); bool virCapsHostCacheBankEquals(virCapsHostCacheBankPtr a, virCapsHostCacheBankPtr b); void virCapsHostCacheBankFree(virCapsHostCacheBankPtr ptr); int virCapabilitiesInitCaches(virCapsPtr caps); void virCapabilitiesHostInitIOMMU(virCapsPtr caps);