1# -*- Mode: Python -*- 2# 3# This work is licensed under the terms of the GNU GPL, version 2 or later. 4# See the COPYING file in the top-level directory. 5 6## 7# = Machines 8## 9 10{ 'include': 'common.json' } 11 12## 13# @CpuInfoArch: 14# 15# An enumeration of cpu types that enable additional information during 16# @query-cpus and @query-cpus-fast. 17# 18# @s390: since 2.12 19# 20# @riscv: since 2.12 21# 22# Since: 2.6 23## 24{ 'enum': 'CpuInfoArch', 25 'data': ['x86', 'sparc', 'ppc', 'mips', 'tricore', 's390', 'riscv', 'other' ] } 26 27## 28# @CpuInfo: 29# 30# Information about a virtual CPU 31# 32# @CPU: the index of the virtual CPU 33# 34# @current: this only exists for backwards compatibility and should be ignored 35# 36# @halted: true if the virtual CPU is in the halt state. Halt usually refers 37# to a processor specific low power mode. 38# 39# @qom_path: path to the CPU object in the QOM tree (since 2.4) 40# 41# @thread_id: ID of the underlying host thread 42# 43# @props: properties describing to which node/socket/core/thread 44# virtual CPU belongs to, provided if supported by board (since 2.10) 45# 46# @arch: architecture of the cpu, which determines which additional fields 47# will be listed (since 2.6) 48# 49# Since: 0.14.0 50# 51# Notes: @halted is a transient state that changes frequently. By the time the 52# data is sent to the client, the guest may no longer be halted. 53## 54{ 'union': 'CpuInfo', 55 'base': {'CPU': 'int', 'current': 'bool', 'halted': 'bool', 56 'qom_path': 'str', 'thread_id': 'int', 57 '*props': 'CpuInstanceProperties', 'arch': 'CpuInfoArch' }, 58 'discriminator': 'arch', 59 'data': { 'x86': 'CpuInfoX86', 60 'sparc': 'CpuInfoSPARC', 61 'ppc': 'CpuInfoPPC', 62 'mips': 'CpuInfoMIPS', 63 'tricore': 'CpuInfoTricore', 64 's390': 'CpuInfoS390', 65 'riscv': 'CpuInfoRISCV' } } 66 67## 68# @CpuInfoX86: 69# 70# Additional information about a virtual i386 or x86_64 CPU 71# 72# @pc: the 64-bit instruction pointer 73# 74# Since: 2.6 75## 76{ 'struct': 'CpuInfoX86', 'data': { 'pc': 'int' } } 77 78## 79# @CpuInfoSPARC: 80# 81# Additional information about a virtual SPARC CPU 82# 83# @pc: the PC component of the instruction pointer 84# 85# @npc: the NPC component of the instruction pointer 86# 87# Since: 2.6 88## 89{ 'struct': 'CpuInfoSPARC', 'data': { 'pc': 'int', 'npc': 'int' } } 90 91## 92# @CpuInfoPPC: 93# 94# Additional information about a virtual PPC CPU 95# 96# @nip: the instruction pointer 97# 98# Since: 2.6 99## 100{ 'struct': 'CpuInfoPPC', 'data': { 'nip': 'int' } } 101 102## 103# @CpuInfoMIPS: 104# 105# Additional information about a virtual MIPS CPU 106# 107# @PC: the instruction pointer 108# 109# Since: 2.6 110## 111{ 'struct': 'CpuInfoMIPS', 'data': { 'PC': 'int' } } 112 113## 114# @CpuInfoTricore: 115# 116# Additional information about a virtual Tricore CPU 117# 118# @PC: the instruction pointer 119# 120# Since: 2.6 121## 122{ 'struct': 'CpuInfoTricore', 'data': { 'PC': 'int' } } 123 124## 125# @CpuInfoRISCV: 126# 127# Additional information about a virtual RISCV CPU 128# 129# @pc: the instruction pointer 130# 131# Since 2.12 132## 133{ 'struct': 'CpuInfoRISCV', 'data': { 'pc': 'int' } } 134 135## 136# @CpuS390State: 137# 138# An enumeration of cpu states that can be assumed by a virtual 139# S390 CPU 140# 141# Since: 2.12 142## 143{ 'enum': 'CpuS390State', 144 'prefix': 'S390_CPU_STATE', 145 'data': [ 'uninitialized', 'stopped', 'check-stop', 'operating', 'load' ] } 146 147## 148# @CpuInfoS390: 149# 150# Additional information about a virtual S390 CPU 151# 152# @cpu-state: the virtual CPU's state 153# 154# Since: 2.12 155## 156{ 'struct': 'CpuInfoS390', 'data': { 'cpu-state': 'CpuS390State' } } 157 158## 159# @query-cpus: 160# 161# Returns a list of information about each virtual CPU. 162# 163# This command causes vCPU threads to exit to userspace, which causes 164# a small interruption to guest CPU execution. This will have a negative 165# impact on realtime guests and other latency sensitive guest workloads. 166# It is recommended to use @query-cpus-fast instead of this command to 167# avoid the vCPU interruption. 168# 169# Returns: a list of @CpuInfo for each virtual CPU 170# 171# Since: 0.14.0 172# 173# Example: 174# 175# -> { "execute": "query-cpus" } 176# <- { "return": [ 177# { 178# "CPU":0, 179# "current":true, 180# "halted":false, 181# "qom_path":"/machine/unattached/device[0]", 182# "arch":"x86", 183# "pc":3227107138, 184# "thread_id":3134 185# }, 186# { 187# "CPU":1, 188# "current":false, 189# "halted":true, 190# "qom_path":"/machine/unattached/device[2]", 191# "arch":"x86", 192# "pc":7108165, 193# "thread_id":3135 194# } 195# ] 196# } 197# 198# Notes: This interface is deprecated (since 2.12.0), and it is strongly 199# recommended that you avoid using it. Use @query-cpus-fast to 200# obtain information about virtual CPUs. 201# 202## 203{ 'command': 'query-cpus', 'returns': ['CpuInfo'] } 204 205## 206# @CpuInfoFast: 207# 208# Information about a virtual CPU 209# 210# @cpu-index: index of the virtual CPU 211# 212# @qom-path: path to the CPU object in the QOM tree 213# 214# @thread-id: ID of the underlying host thread 215# 216# @props: properties describing to which node/socket/core/thread 217# virtual CPU belongs to, provided if supported by board 218# 219# @arch: base architecture of the cpu; deprecated since 3.0.0 in favor 220# of @target 221# 222# @target: the QEMU system emulation target, which determines which 223# additional fields will be listed (since 3.0) 224# 225# Since: 2.12 226# 227## 228{ 'union' : 'CpuInfoFast', 229 'base' : { 'cpu-index' : 'int', 230 'qom-path' : 'str', 231 'thread-id' : 'int', 232 '*props' : 'CpuInstanceProperties', 233 'arch' : 'CpuInfoArch', 234 'target' : 'SysEmuTarget' }, 235 'discriminator' : 'target', 236 'data' : { 's390x' : 'CpuInfoS390' } } 237 238## 239# @query-cpus-fast: 240# 241# Returns information about all virtual CPUs. This command does not 242# incur a performance penalty and should be used in production 243# instead of query-cpus. 244# 245# Returns: list of @CpuInfoFast 246# 247# Since: 2.12 248# 249# Example: 250# 251# -> { "execute": "query-cpus-fast" } 252# <- { "return": [ 253# { 254# "thread-id": 25627, 255# "props": { 256# "core-id": 0, 257# "thread-id": 0, 258# "socket-id": 0 259# }, 260# "qom-path": "/machine/unattached/device[0]", 261# "arch":"x86", 262# "target":"x86_64", 263# "cpu-index": 0 264# }, 265# { 266# "thread-id": 25628, 267# "props": { 268# "core-id": 0, 269# "thread-id": 0, 270# "socket-id": 1 271# }, 272# "qom-path": "/machine/unattached/device[2]", 273# "arch":"x86", 274# "target":"x86_64", 275# "cpu-index": 1 276# } 277# ] 278# } 279## 280{ 'command': 'query-cpus-fast', 'returns': [ 'CpuInfoFast' ] } 281 282## 283# @cpu-add: 284# 285# Adds CPU with specified ID. 286# 287# @id: ID of CPU to be created, valid values [0..max_cpus) 288# 289# Returns: Nothing on success 290# 291# Since: 1.5 292# 293# Note: This command is deprecated. The `device_add` command should be 294# used instead. See the `query-hotpluggable-cpus` command for 295# details. 296# 297# Example: 298# 299# -> { "execute": "cpu-add", "arguments": { "id": 2 } } 300# <- { "return": {} } 301# 302## 303{ 'command': 'cpu-add', 'data': {'id': 'int'} } 304 305## 306# @MachineInfo: 307# 308# Information describing a machine. 309# 310# @name: the name of the machine 311# 312# @alias: an alias for the machine name 313# 314# @is-default: whether the machine is default 315# 316# @cpu-max: maximum number of CPUs supported by the machine type 317# (since 1.5.0) 318# 319# @hotpluggable-cpus: cpu hotplug via -device is supported (since 2.7.0) 320# 321# @numa-mem-supported: true if '-numa node,mem' option is supported by 322# the machine type and false otherwise (since 4.1) 323# 324# @deprecated: if true, the machine type is deprecated and may be removed 325# in future versions of QEMU according to the QEMU deprecation 326# policy (since 4.1.0) 327# 328# Since: 1.2.0 329## 330{ 'struct': 'MachineInfo', 331 'data': { 'name': 'str', '*alias': 'str', 332 '*is-default': 'bool', 'cpu-max': 'int', 333 'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool', 334 'deprecated': 'bool' } } 335 336## 337# @query-machines: 338# 339# Return a list of supported machines 340# 341# Returns: a list of MachineInfo 342# 343# Since: 1.2.0 344## 345{ 'command': 'query-machines', 'returns': ['MachineInfo'] } 346 347## 348# @CurrentMachineParams: 349# 350# Information describing the running machine parameters. 351# 352# @wakeup-suspend-support: true if the machine supports wake up from 353# suspend 354# 355# Since: 4.0 356## 357{ 'struct': 'CurrentMachineParams', 358 'data': { 'wakeup-suspend-support': 'bool'} } 359 360## 361# @query-current-machine: 362# 363# Return information on the current virtual machine. 364# 365# Returns: CurrentMachineParams 366# 367# Since: 4.0 368## 369{ 'command': 'query-current-machine', 'returns': 'CurrentMachineParams' } 370 371## 372# @NumaOptionsType: 373# 374# @node: NUMA nodes configuration 375# 376# @dist: NUMA distance configuration (since 2.10) 377# 378# @cpu: property based CPU(s) to node mapping (Since: 2.10) 379# 380# Since: 2.1 381## 382{ 'enum': 'NumaOptionsType', 383 'data': [ 'node', 'dist', 'cpu' ] } 384 385## 386# @NumaOptions: 387# 388# A discriminated record of NUMA options. (for OptsVisitor) 389# 390# Since: 2.1 391## 392{ 'union': 'NumaOptions', 393 'base': { 'type': 'NumaOptionsType' }, 394 'discriminator': 'type', 395 'data': { 396 'node': 'NumaNodeOptions', 397 'dist': 'NumaDistOptions', 398 'cpu': 'NumaCpuOptions' }} 399 400## 401# @NumaNodeOptions: 402# 403# Create a guest NUMA node. (for OptsVisitor) 404# 405# @nodeid: NUMA node ID (increase by 1 from 0 if omitted) 406# 407# @cpus: VCPUs belonging to this node (assign VCPUS round-robin 408# if omitted) 409# 410# @mem: memory size of this node; mutually exclusive with @memdev. 411# Equally divide total memory among nodes if both @mem and @memdev are 412# omitted. 413# 414# @memdev: memory backend object. If specified for one node, 415# it must be specified for all nodes. 416# 417# Since: 2.1 418## 419{ 'struct': 'NumaNodeOptions', 420 'data': { 421 '*nodeid': 'uint16', 422 '*cpus': ['uint16'], 423 '*mem': 'size', 424 '*memdev': 'str' }} 425 426## 427# @NumaDistOptions: 428# 429# Set the distance between 2 NUMA nodes. 430# 431# @src: source NUMA node. 432# 433# @dst: destination NUMA node. 434# 435# @val: NUMA distance from source node to destination node. 436# When a node is unreachable from another node, set the distance 437# between them to 255. 438# 439# Since: 2.10 440## 441{ 'struct': 'NumaDistOptions', 442 'data': { 443 'src': 'uint16', 444 'dst': 'uint16', 445 'val': 'uint8' }} 446 447## 448# @X86CPURegister32: 449# 450# A X86 32-bit register 451# 452# Since: 1.5 453## 454{ 'enum': 'X86CPURegister32', 455 'data': [ 'EAX', 'EBX', 'ECX', 'EDX', 'ESP', 'EBP', 'ESI', 'EDI' ] } 456 457## 458# @X86CPUFeatureWordInfo: 459# 460# Information about a X86 CPU feature word 461# 462# @cpuid-input-eax: Input EAX value for CPUID instruction for that feature word 463# 464# @cpuid-input-ecx: Input ECX value for CPUID instruction for that 465# feature word 466# 467# @cpuid-register: Output register containing the feature bits 468# 469# @features: value of output register, containing the feature bits 470# 471# Since: 1.5 472## 473{ 'struct': 'X86CPUFeatureWordInfo', 474 'data': { 'cpuid-input-eax': 'int', 475 '*cpuid-input-ecx': 'int', 476 'cpuid-register': 'X86CPURegister32', 477 'features': 'int' } } 478 479## 480# @DummyForceArrays: 481# 482# Not used by QMP; hack to let us use X86CPUFeatureWordInfoList internally 483# 484# Since: 2.5 485## 486{ 'struct': 'DummyForceArrays', 487 'data': { 'unused': ['X86CPUFeatureWordInfo'] } } 488 489## 490# @NumaCpuOptions: 491# 492# Option "-numa cpu" overrides default cpu to node mapping. 493# It accepts the same set of cpu properties as returned by 494# query-hotpluggable-cpus[].props, where node-id could be used to 495# override default node mapping. 496# 497# Since: 2.10 498## 499{ 'struct': 'NumaCpuOptions', 500 'base': 'CpuInstanceProperties', 501 'data' : {} } 502 503## 504# @HostMemPolicy: 505# 506# Host memory policy types 507# 508# @default: restore default policy, remove any nondefault policy 509# 510# @preferred: set the preferred host nodes for allocation 511# 512# @bind: a strict policy that restricts memory allocation to the 513# host nodes specified 514# 515# @interleave: memory allocations are interleaved across the set 516# of host nodes specified 517# 518# Since: 2.1 519## 520{ 'enum': 'HostMemPolicy', 521 'data': [ 'default', 'preferred', 'bind', 'interleave' ] } 522 523## 524# @Memdev: 525# 526# Information about memory backend 527# 528# @id: backend's ID if backend has 'id' property (since 2.9) 529# 530# @size: memory backend size 531# 532# @merge: enables or disables memory merge support 533# 534# @dump: includes memory backend's memory in a core dump or not 535# 536# @prealloc: enables or disables memory preallocation 537# 538# @host-nodes: host nodes for its memory policy 539# 540# @policy: memory policy of memory backend 541# 542# Since: 2.1 543## 544{ 'struct': 'Memdev', 545 'data': { 546 '*id': 'str', 547 'size': 'size', 548 'merge': 'bool', 549 'dump': 'bool', 550 'prealloc': 'bool', 551 'host-nodes': ['uint16'], 552 'policy': 'HostMemPolicy' }} 553 554## 555# @query-memdev: 556# 557# Returns information for all memory backends. 558# 559# Returns: a list of @Memdev. 560# 561# Since: 2.1 562# 563# Example: 564# 565# -> { "execute": "query-memdev" } 566# <- { "return": [ 567# { 568# "id": "mem1", 569# "size": 536870912, 570# "merge": false, 571# "dump": true, 572# "prealloc": false, 573# "host-nodes": [0, 1], 574# "policy": "bind" 575# }, 576# { 577# "size": 536870912, 578# "merge": false, 579# "dump": true, 580# "prealloc": true, 581# "host-nodes": [2, 3], 582# "policy": "preferred" 583# } 584# ] 585# } 586# 587## 588{ 'command': 'query-memdev', 'returns': ['Memdev'], 'allow-preconfig': true } 589 590## 591# @CpuInstanceProperties: 592# 593# List of properties to be used for hotplugging a CPU instance, 594# it should be passed by management with device_add command when 595# a CPU is being hotplugged. 596# 597# @node-id: NUMA node ID the CPU belongs to 598# @socket-id: socket number within node/board the CPU belongs to 599# @die-id: die number within node/board the CPU belongs to (Since 4.1) 600# @core-id: core number within die the CPU belongs to# @thread-id: thread number within core the CPU belongs to 601# 602# Note: currently there are 5 properties that could be present 603# but management should be prepared to pass through other 604# properties with device_add command to allow for future 605# interface extension. This also requires the filed names to be kept in 606# sync with the properties passed to -device/device_add. 607# 608# Since: 2.7 609## 610{ 'struct': 'CpuInstanceProperties', 611 'data': { '*node-id': 'int', 612 '*socket-id': 'int', 613 '*die-id': 'int', 614 '*core-id': 'int', 615 '*thread-id': 'int' 616 } 617} 618 619## 620# @HotpluggableCPU: 621# 622# @type: CPU object type for usage with device_add command 623# @props: list of properties to be used for hotplugging CPU 624# @vcpus-count: number of logical VCPU threads @HotpluggableCPU provides 625# @qom-path: link to existing CPU object if CPU is present or 626# omitted if CPU is not present. 627# 628# Since: 2.7 629## 630{ 'struct': 'HotpluggableCPU', 631 'data': { 'type': 'str', 632 'vcpus-count': 'int', 633 'props': 'CpuInstanceProperties', 634 '*qom-path': 'str' 635 } 636} 637 638## 639# @query-hotpluggable-cpus: 640# 641# TODO: Better documentation; currently there is none. 642# 643# Returns: a list of HotpluggableCPU objects. 644# 645# Since: 2.7 646# 647# Example: 648# 649# For pseries machine type started with -smp 2,cores=2,maxcpus=4 -cpu POWER8: 650# 651# -> { "execute": "query-hotpluggable-cpus" } 652# <- {"return": [ 653# { "props": { "core": 8 }, "type": "POWER8-spapr-cpu-core", 654# "vcpus-count": 1 }, 655# { "props": { "core": 0 }, "type": "POWER8-spapr-cpu-core", 656# "vcpus-count": 1, "qom-path": "/machine/unattached/device[0]"} 657# ]}' 658# 659# For pc machine type started with -smp 1,maxcpus=2: 660# 661# -> { "execute": "query-hotpluggable-cpus" } 662# <- {"return": [ 663# { 664# "type": "qemu64-x86_64-cpu", "vcpus-count": 1, 665# "props": {"core-id": 0, "socket-id": 1, "thread-id": 0} 666# }, 667# { 668# "qom-path": "/machine/unattached/device[0]", 669# "type": "qemu64-x86_64-cpu", "vcpus-count": 1, 670# "props": {"core-id": 0, "socket-id": 0, "thread-id": 0} 671# } 672# ]} 673# 674# For s390x-virtio-ccw machine type started with -smp 1,maxcpus=2 -cpu qemu 675# (Since: 2.11): 676# 677# -> { "execute": "query-hotpluggable-cpus" } 678# <- {"return": [ 679# { 680# "type": "qemu-s390x-cpu", "vcpus-count": 1, 681# "props": { "core-id": 1 } 682# }, 683# { 684# "qom-path": "/machine/unattached/device[0]", 685# "type": "qemu-s390x-cpu", "vcpus-count": 1, 686# "props": { "core-id": 0 } 687# } 688# ]} 689# 690## 691{ 'command': 'query-hotpluggable-cpus', 'returns': ['HotpluggableCPU'], 692 'allow-preconfig': true } 693 694## 695# @set-numa-node: 696# 697# Runtime equivalent of '-numa' CLI option, available at 698# preconfigure stage to configure numa mapping before initializing 699# machine. 700# 701# Since 3.0 702## 703{ 'command': 'set-numa-node', 'boxed': true, 704 'data': 'NumaOptions', 705 'allow-preconfig': true 706} 707