]> Git Repo - qemu.git/blame - docs/interop/firmware.json
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
[qemu.git] / docs / interop / firmware.json
CommitLineData
3a0adfc9 1# -*- Mode: Python -*-
f7160f32 2# vim: filetype=python
3a0adfc9
LE
3#
4# Copyright (C) 2018 Red Hat, Inc.
5#
6# Authors:
7# Daniel P. Berrange <[email protected]>
8# Laszlo Ersek <[email protected]>
9#
10# This work is licensed under the terms of the GNU GPL, version 2 or
11# later. See the COPYING file in the top-level directory.
12
13##
14# = Firmware
15##
16
ffaee83b 17{ 'include' : 'machine.json' }
3a0adfc9
LE
18{ 'include' : 'block-core.json' }
19
20##
21# @FirmwareOSInterface:
22#
23# Lists the firmware-OS interface types provided by various firmware
24# that is commonly used with QEMU virtual machines.
25#
26# @bios: Traditional x86 BIOS interface. For example, firmware built
27# from the SeaBIOS project usually provides this interface.
28#
29# @openfirmware: The interface is defined by the (historical) IEEE
30# 1275-1994 standard. Examples for firmware projects that
b2ce76a0 31# provide this interface are: OpenBIOS and SLOF.
3a0adfc9
LE
32#
33# @uboot: Firmware interface defined by the U-Boot project.
34#
35# @uefi: Firmware interface defined by the UEFI specification. For
36# example, firmware built from the edk2 (EFI Development Kit II)
37# project usually provides this interface.
38#
39# Since: 3.0
40##
41{ 'enum' : 'FirmwareOSInterface',
42 'data' : [ 'bios', 'openfirmware', 'uboot', 'uefi' ] }
43
44##
45# @FirmwareDevice:
46#
47# Defines the device types that firmware can be mapped into.
48#
49# @flash: The firmware executable and its accompanying NVRAM file are to
50# be mapped into a pflash chip each.
51#
52# @kernel: The firmware is to be loaded like a Linux kernel. This is
53# similar to @memory but may imply additional processing that
54# is specific to the target architecture and machine type.
55#
56# @memory: The firmware is to be mapped into memory.
57#
58# Since: 3.0
59##
60{ 'enum' : 'FirmwareDevice',
61 'data' : [ 'flash', 'kernel', 'memory' ] }
62
63##
64# @FirmwareTarget:
65#
66# Defines the machine types that firmware may execute on.
67#
68# @architecture: Determines the emulation target (the QEMU system
69# emulator) that can execute the firmware.
70#
71# @machines: Lists the machine types (known by the emulator that is
72# specified through @architecture) that can execute the
73# firmware. Elements of @machines are supposed to be concrete
74# machine types, not aliases. Glob patterns are understood,
75# which is especially useful for versioned machine types.
76# (For example, the glob pattern "pc-i440fx-*" matches
77# "pc-i440fx-2.12".) On the QEMU command line, "-machine
78# type=..." specifies the requested machine type (but that
79# option does not accept glob patterns).
80#
81# Since: 3.0
82##
83{ 'struct' : 'FirmwareTarget',
84 'data' : { 'architecture' : 'SysEmuTarget',
85 'machines' : [ 'str' ] } }
86
87##
88# @FirmwareFeature:
89#
90# Defines the features that firmware may support, and the platform
91# requirements that firmware may present.
92#
93# @acpi-s3: The firmware supports S3 sleep (suspend to RAM), as defined
94# in the ACPI specification. On the "pc-i440fx-*" machine
95# types of the @i386 and @x86_64 emulation targets, S3 can be
96# enabled with "-global PIIX4_PM.disable_s3=0" and disabled
97# with "-global PIIX4_PM.disable_s3=1". On the "pc-q35-*"
98# machine types of the @i386 and @x86_64 emulation targets, S3
99# can be enabled with "-global ICH9-LPC.disable_s3=0" and
100# disabled with "-global ICH9-LPC.disable_s3=1".
101#
102# @acpi-s4: The firmware supports S4 hibernation (suspend to disk), as
103# defined in the ACPI specification. On the "pc-i440fx-*"
104# machine types of the @i386 and @x86_64 emulation targets, S4
105# can be enabled with "-global PIIX4_PM.disable_s4=0" and
106# disabled with "-global PIIX4_PM.disable_s4=1". On the
107# "pc-q35-*" machine types of the @i386 and @x86_64 emulation
108# targets, S4 can be enabled with "-global
109# ICH9-LPC.disable_s4=0" and disabled with "-global
110# ICH9-LPC.disable_s4=1".
111#
112# @amd-sev: The firmware supports running under AMD Secure Encrypted
113# Virtualization, as specified in the AMD64 Architecture
114# Programmer's Manual. QEMU command line options related to
115# this feature are documented in
116# "docs/amd-memory-encryption.txt".
117#
d44df1d7
TL
118# @amd-sev-es: The firmware supports running under AMD Secure Encrypted
119# Virtualization - Encrypted State, as specified in the AMD64
120# Architecture Programmer's Manual. QEMU command line options
121# related to this feature are documented in
122# "docs/amd-memory-encryption.txt".
123#
3a0adfc9
LE
124# @enrolled-keys: The variable store (NVRAM) template associated with
125# the firmware binary has the UEFI Secure Boot
126# operational mode turned on, with certificates
127# enrolled.
128#
129# @requires-smm: The firmware requires the platform to emulate SMM
130# (System Management Mode), as defined in the AMD64
131# Architecture Programmer's Manual, and in the Intel(R)64
132# and IA-32 Architectures Software Developer's Manual. On
133# the "pc-q35-*" machine types of the @i386 and @x86_64
134# emulation targets, SMM emulation can be enabled with
135# "-machine smm=on". (On the "pc-q35-*" machine types of
136# the @i386 emulation target, @requires-smm presents
137# further CPU requirements; one combination known to work
1bd39ea9 138# is "-cpu coreduo,nx=off".) If the firmware is marked as
3a0adfc9
LE
139# both @secure-boot and @requires-smm, then write
140# accesses to the pflash chip (NVRAM) that holds the UEFI
141# variable store must be restricted to code that executes
142# in SMM, using the additional option "-global
143# driver=cfi.pflash01,property=secure,value=on".
144# Furthermore, a large guest-physical address space
145# (comprising guest RAM, memory hotplug range, and 64-bit
146# PCI MMIO aperture), and/or a high VCPU count, may
147# present high SMRAM requirements from the firmware. On
148# the "pc-q35-*" machine types of the @i386 and @x86_64
149# emulation targets, the SMRAM size may be increased
150# above the default 16MB with the "-global
151# mch.extended-tseg-mbytes=uint16" option. As a rule of
152# thumb, the default 16MB size suffices for 1TB of
153# guest-phys address space and a few tens of VCPUs; for
154# every further TB of guest-phys address space, add 8MB
155# of SMRAM. 48MB should suffice for 4TB of guest-phys
156# address space and 2-3 hundred VCPUs.
157#
158# @secure-boot: The firmware implements the software interfaces for UEFI
159# Secure Boot, as defined in the UEFI specification. Note
160# that without @requires-smm, guest code running with
161# kernel privileges can undermine the security of Secure
162# Boot.
163#
164# @verbose-dynamic: When firmware log capture is enabled, the firmware
165# logs a large amount of debug messages, which may
166# impact boot performance. With log capture disabled,
167# there is no boot performance impact. On the
168# "pc-i440fx-*" and "pc-q35-*" machine types of the
169# @i386 and @x86_64 emulation targets, firmware log
170# capture can be enabled with the QEMU command line
171# options "-chardev file,id=fwdebug,path=LOGFILEPATH
172# -device isa-debugcon,iobase=0x402,chardev=fwdebug".
173# @verbose-dynamic is mutually exclusive with
174# @verbose-static.
175#
176# @verbose-static: The firmware unconditionally produces a large amount
177# of debug messages, which may impact boot performance.
178# This feature may typically be carried by certain UEFI
179# firmware for the "virt-*" machine types of the @arm
180# and @aarch64 emulation targets, where the debug
181# messages are written to the first (always present)
182# PL011 UART. @verbose-static is mutually exclusive
183# with @verbose-dynamic.
184#
185# Since: 3.0
186##
187{ 'enum' : 'FirmwareFeature',
d44df1d7 188 'data' : [ 'acpi-s3', 'acpi-s4', 'amd-sev', 'amd-sev-es', 'enrolled-keys',
3a0adfc9
LE
189 'requires-smm', 'secure-boot', 'verbose-dynamic',
190 'verbose-static' ] }
191
192##
193# @FirmwareFlashFile:
194#
195# Defines common properties that are necessary for loading a firmware
196# file into a pflash chip. The corresponding QEMU command line option is
197# "-drive file=@filename,format=@format". Note however that the
198# option-argument shown here is incomplete; it is completed under
199# @FirmwareMappingFlash.
200#
201# @filename: Specifies the filename on the host filesystem where the
202# firmware file can be found.
203#
204# @format: Specifies the block format of the file pointed-to by
205# @filename, such as @raw or @qcow2.
206#
207# Since: 3.0
208##
209{ 'struct' : 'FirmwareFlashFile',
210 'data' : { 'filename' : 'str',
211 'format' : 'BlockdevDriver' } }
212
213##
214# @FirmwareMappingFlash:
215#
216# Describes loading and mapping properties for the firmware executable
217# and its accompanying NVRAM file, when @FirmwareDevice is @flash.
218#
219# @executable: Identifies the firmware executable. The firmware
220# executable may be shared by multiple virtual machine
e33763be
MA
221# definitions. The preferred corresponding QEMU command
222# line options are
223# -drive if=none,id=pflash0,readonly=on,file=@executable.@filename,format=@executable.@format
224# -machine pflash0=pflash0
225# or equivalent -blockdev instead of -drive.
226# With QEMU versions older than 4.0, you have to use
227# -drive if=pflash,unit=0,readonly=on,file=@executable.@filename,format=@executable.@format
3a0adfc9
LE
228#
229# @nvram-template: Identifies the NVRAM template compatible with
230# @executable. Management software instantiates an
231# individual copy -- a specific NVRAM file -- from
232# @nvram-template.@filename for each new virtual
233# machine definition created. @nvram-template.@filename
234# itself is never mapped into virtual machines, only
235# individual copies of it are. An NVRAM file is
236# typically used for persistently storing the
237# non-volatile UEFI variables of a virtual machine
e33763be
MA
238# definition. The preferred corresponding QEMU
239# command line options are
240# -drive if=none,id=pflash1,readonly=off,file=FILENAME_OF_PRIVATE_NVRAM_FILE,format=@nvram-template.@format
241# -machine pflash1=pflash1
242# or equivalent -blockdev instead of -drive.
243# With QEMU versions older than 4.0, you have to use
244# -drive if=pflash,unit=1,readonly=off,file=FILENAME_OF_PRIVATE_NVRAM_FILE,format=@nvram-template.@format
3a0adfc9
LE
245#
246# Since: 3.0
247##
248{ 'struct' : 'FirmwareMappingFlash',
249 'data' : { 'executable' : 'FirmwareFlashFile',
250 'nvram-template' : 'FirmwareFlashFile' } }
251
252##
253# @FirmwareMappingKernel:
254#
255# Describes loading and mapping properties for the firmware executable,
256# when @FirmwareDevice is @kernel.
257#
258# @filename: Identifies the firmware executable. The firmware executable
259# may be shared by multiple virtual machine definitions. The
260# corresponding QEMU command line option is "-kernel
261# @filename".
262#
263# Since: 3.0
264##
265{ 'struct' : 'FirmwareMappingKernel',
266 'data' : { 'filename' : 'str' } }
267
268##
269# @FirmwareMappingMemory:
270#
271# Describes loading and mapping properties for the firmware executable,
272# when @FirmwareDevice is @memory.
273#
274# @filename: Identifies the firmware executable. The firmware executable
275# may be shared by multiple virtual machine definitions. The
276# corresponding QEMU command line option is "-bios
277# @filename".
278#
279# Since: 3.0
280##
281{ 'struct' : 'FirmwareMappingMemory',
282 'data' : { 'filename' : 'str' } }
283
284##
285# @FirmwareMapping:
286#
287# Provides a discriminated structure for firmware to describe its
288# loading / mapping properties.
289#
290# @device: Selects the device type that the firmware must be mapped
291# into.
292#
293# Since: 3.0
294##
295{ 'union' : 'FirmwareMapping',
296 'base' : { 'device' : 'FirmwareDevice' },
297 'discriminator' : 'device',
298 'data' : { 'flash' : 'FirmwareMappingFlash',
299 'kernel' : 'FirmwareMappingKernel',
300 'memory' : 'FirmwareMappingMemory' } }
301
302##
303# @Firmware:
304#
305# Describes a firmware (or a firmware use case) to management software.
306#
307# It is possible for multiple @Firmware elements to match the search
308# criteria of management software. Applications thus need rules to pick
309# one of the many matches, and users need the ability to override distro
310# defaults.
311#
312# It is recommended to create firmware JSON files (each containing a
313# single @Firmware root element) with a double-digit prefix, for example
314# "50-ovmf.json", "50-seabios-256k.json", etc, so they can be sorted in
315# predictable order. The firmware JSON files should be searched for in
316# three directories:
317#
318# - /usr/share/qemu/firmware -- populated by distro-provided firmware
319# packages (XDG_DATA_DIRS covers
320# /usr/share by default),
321#
322# - /etc/qemu/firmware -- exclusively for sysadmins' local additions,
323#
324# - $XDG_CONFIG_HOME/qemu/firmware -- exclusively for per-user local
325# additions (XDG_CONFIG_HOME
326# defaults to $HOME/.config).
327#
328# Top-down, the list of directories goes from general to specific.
329#
330# Management software should build a list of files from all three
331# locations, then sort the list by filename (i.e., last pathname
332# component). Management software should choose the first JSON file on
333# the sorted list that matches the search criteria. If a more specific
334# directory has a file with same name as a less specific directory, then
335# the file in the more specific directory takes effect. If the more
336# specific file is zero length, it hides the less specific one.
337#
338# For example, if a distro ships
339#
340# - /usr/share/qemu/firmware/50-ovmf.json
341#
342# - /usr/share/qemu/firmware/50-seabios-256k.json
343#
344# then the sysadmin can prevent the default OVMF being used at all with
345#
346# $ touch /etc/qemu/firmware/50-ovmf.json
347#
348# The sysadmin can replace/alter the distro default OVMF with
349#
350# $ vim /etc/qemu/firmware/50-ovmf.json
351#
352# or they can provide a parallel OVMF with higher priority
353#
354# $ vim /etc/qemu/firmware/10-ovmf.json
355#
356# or they can provide a parallel OVMF with lower priority
357#
358# $ vim /etc/qemu/firmware/99-ovmf.json
359#
360# @description: Provides a human-readable description of the firmware.
361# Management software may or may not display @description.
362#
363# @interface-types: Lists the types of interfaces that the firmware can
364# expose to the guest OS. This is a non-empty, ordered
365# list; entries near the beginning of @interface-types
366# are considered more native to the firmware, and/or
367# to have a higher quality implementation in the
368# firmware, than entries near the end of
369# @interface-types.
370#
371# @mapping: Describes the loading / mapping properties of the firmware.
372#
373# @targets: Collects the target architectures (QEMU system emulators)
374# and their machine types that may execute the firmware.
375#
376# @features: Lists the features that the firmware supports, and the
377# platform requirements it presents.
378#
379# @tags: A list of auxiliary strings associated with the firmware for
380# which @description is not appropriate, due to the latter's
381# possible exposure to the end-user. @tags serves development and
382# debugging purposes only, and management software shall
383# explicitly ignore it.
384#
385# Since: 3.0
386#
387# Examples:
388#
389# {
390# "description": "SeaBIOS",
391# "interface-types": [
392# "bios"
393# ],
394# "mapping": {
395# "device": "memory",
396# "filename": "/usr/share/seabios/bios-256k.bin"
397# },
398# "targets": [
399# {
400# "architecture": "i386",
401# "machines": [
402# "pc-i440fx-*",
403# "pc-q35-*"
404# ]
405# },
406# {
407# "architecture": "x86_64",
408# "machines": [
409# "pc-i440fx-*",
410# "pc-q35-*"
411# ]
412# }
413# ],
414# "features": [
415# "acpi-s3",
416# "acpi-s4"
417# ],
418# "tags": [
419# "CONFIG_BOOTSPLASH=n",
420# "CONFIG_ROM_SIZE=256",
421# "CONFIG_USE_SMM=n"
422# ]
423# }
424#
425# {
426# "description": "OVMF with SB+SMM, empty varstore",
427# "interface-types": [
428# "uefi"
429# ],
430# "mapping": {
431# "device": "flash",
432# "executable": {
433# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
434# "format": "raw"
435# },
436# "nvram-template": {
437# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
438# "format": "raw"
439# }
440# },
441# "targets": [
442# {
443# "architecture": "x86_64",
444# "machines": [
445# "pc-q35-*"
446# ]
447# }
448# ],
449# "features": [
450# "acpi-s3",
451# "amd-sev",
452# "requires-smm",
453# "secure-boot",
454# "verbose-dynamic"
455# ],
456# "tags": [
457# "-a IA32",
458# "-a X64",
459# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
460# "-t GCC48",
461# "-b DEBUG",
462# "-D SMM_REQUIRE",
463# "-D SECURE_BOOT_ENABLE",
464# "-D FD_SIZE_4MB"
465# ]
466# }
467#
468# {
469# "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled",
470# "interface-types": [
471# "uefi"
472# ],
473# "mapping": {
474# "device": "flash",
475# "executable": {
476# "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
477# "format": "raw"
478# },
479# "nvram-template": {
480# "filename": "/usr/share/OVMF/OVMF_VARS.secboot.fd",
481# "format": "raw"
482# }
483# },
484# "targets": [
485# {
486# "architecture": "x86_64",
487# "machines": [
488# "pc-q35-*"
489# ]
490# }
491# ],
492# "features": [
493# "acpi-s3",
494# "amd-sev",
495# "enrolled-keys",
496# "requires-smm",
497# "secure-boot",
498# "verbose-dynamic"
499# ],
500# "tags": [
501# "-a IA32",
502# "-a X64",
503# "-p OvmfPkg/OvmfPkgIa32X64.dsc",
504# "-t GCC48",
505# "-b DEBUG",
506# "-D SMM_REQUIRE",
507# "-D SECURE_BOOT_ENABLE",
508# "-D FD_SIZE_4MB"
509# ]
510# }
511#
512# {
d44df1d7
TL
513# "description": "OVMF with SEV-ES support",
514# "interface-types": [
515# "uefi"
516# ],
517# "mapping": {
518# "device": "flash",
519# "executable": {
520# "filename": "/usr/share/OVMF/OVMF_CODE.fd",
521# "format": "raw"
522# },
523# "nvram-template": {
524# "filename": "/usr/share/OVMF/OVMF_VARS.fd",
525# "format": "raw"
526# }
527# },
528# "targets": [
529# {
530# "architecture": "x86_64",
531# "machines": [
532# "pc-q35-*"
533# ]
534# }
535# ],
536# "features": [
537# "acpi-s3",
538# "amd-sev",
539# "amd-sev-es",
540# "verbose-dynamic"
541# ],
542# "tags": [
543# "-a X64",
544# "-p OvmfPkg/OvmfPkgX64.dsc",
545# "-t GCC48",
546# "-b DEBUG",
547# "-D FD_SIZE_4MB"
548# ]
549# }
550#
551# {
3a0adfc9
LE
552# "description": "UEFI firmware for ARM64 virtual machines",
553# "interface-types": [
554# "uefi"
555# ],
556# "mapping": {
557# "device": "flash",
558# "executable": {
559# "filename": "/usr/share/AAVMF/AAVMF_CODE.fd",
560# "format": "raw"
561# },
562# "nvram-template": {
563# "filename": "/usr/share/AAVMF/AAVMF_VARS.fd",
564# "format": "raw"
565# }
566# },
567# "targets": [
568# {
569# "architecture": "aarch64",
570# "machines": [
571# "virt-*"
572# ]
573# }
574# ],
575# "features": [
576#
577# ],
578# "tags": [
579# "-a AARCH64",
580# "-p ArmVirtPkg/ArmVirtQemu.dsc",
581# "-t GCC48",
582# "-b DEBUG",
583# "-D DEBUG_PRINT_ERROR_LEVEL=0x80000000"
584# ]
585# }
586##
587{ 'struct' : 'Firmware',
588 'data' : { 'description' : 'str',
589 'interface-types' : [ 'FirmwareOSInterface' ],
590 'mapping' : 'FirmwareMapping',
591 'targets' : [ 'FirmwareTarget' ],
592 'features' : [ 'FirmwareFeature' ],
593 'tags' : [ 'str' ] } }
This page took 0.25826 seconds and 4 git commands to generate.