xref: /openbmc/qemu/docs/interop/firmware.json (revision 86e372ad)
1# -*- Mode: Python -*-
2# vim: filetype=python
3#
4# Copyright (C) 2018 Red Hat, Inc.
5#
6# Authors:
7#  Daniel P. Berrange <berrange@redhat.com>
8#  Laszlo Ersek <lersek@redhat.com>
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
17{ 'include' : 'machine.json' }
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
31#                provide this interface are: OpenBIOS and SLOF.
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/system/i386/amd-memory-encryption.rst".
117#
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/system/i386/amd-memory-encryption.rst".
123#
124# @amd-sev-snp: The firmware supports running under AMD Secure Encrypted
125#               Virtualization - Secure Nested Paging, as specified in the
126#               AMD64 Architecture Programmer's Manual. QEMU command line
127#               options related to this feature are documented in
128#               "docs/system/i386/amd-memory-encryption.rst".
129#
130# @intel-tdx: The firmware supports running under Intel Trust Domain
131#             Extensions (TDX).
132#
133# @enrolled-keys: The variable store (NVRAM) template associated with
134#                 the firmware binary has the UEFI Secure Boot
135#                 operational mode turned on, with certificates
136#                 enrolled.
137#
138# @requires-smm: The firmware requires the platform to emulate SMM
139#                (System Management Mode), as defined in the AMD64
140#                Architecture Programmer's Manual, and in the Intel(R)64
141#                and IA-32 Architectures Software Developer's Manual. On
142#                the "pc-q35-*" machine types of the @i386 and @x86_64
143#                emulation targets, SMM emulation can be enabled with
144#                "-machine smm=on". (On the "pc-q35-*" machine types of
145#                the @i386 emulation target, @requires-smm presents
146#                further CPU requirements; one combination known to work
147#                is "-cpu coreduo,nx=off".) If the firmware is marked as
148#                both @secure-boot and @requires-smm, then write
149#                accesses to the pflash chip (NVRAM) that holds the UEFI
150#                variable store must be restricted to code that executes
151#                in SMM, using the additional option "-global
152#                driver=cfi.pflash01,property=secure,value=on".
153#                Furthermore, a large guest-physical address space
154#                (comprising guest RAM, memory hotplug range, and 64-bit
155#                PCI MMIO aperture), and/or a high VCPU count, may
156#                present high SMRAM requirements from the firmware. On
157#                the "pc-q35-*" machine types of the @i386 and @x86_64
158#                emulation targets, the SMRAM size may be increased
159#                above the default 16MB with the "-global
160#                mch.extended-tseg-mbytes=uint16" option. As a rule of
161#                thumb, the default 16MB size suffices for 1TB of
162#                guest-phys address space and a few tens of VCPUs; for
163#                every further TB of guest-phys address space, add 8MB
164#                of SMRAM. 48MB should suffice for 4TB of guest-phys
165#                address space and 2-3 hundred VCPUs.
166#
167# @secure-boot: The firmware implements the software interfaces for UEFI
168#               Secure Boot, as defined in the UEFI specification. Note
169#               that without @requires-smm, guest code running with
170#               kernel privileges can undermine the security of Secure
171#               Boot.
172#
173# @verbose-dynamic: When firmware log capture is enabled, the firmware
174#                   logs a large amount of debug messages, which may
175#                   impact boot performance. With log capture disabled,
176#                   there is no boot performance impact. On the
177#                   "pc-i440fx-*" and "pc-q35-*" machine types of the
178#                   @i386 and @x86_64 emulation targets, firmware log
179#                   capture can be enabled with the QEMU command line
180#                   options "-chardev file,id=fwdebug,path=LOGFILEPATH
181#                   -device isa-debugcon,iobase=0x402,chardev=fwdebug".
182#                   @verbose-dynamic is mutually exclusive with
183#                   @verbose-static.
184#
185# @verbose-static: The firmware unconditionally produces a large amount
186#                  of debug messages, which may impact boot performance.
187#                  This feature may typically be carried by certain UEFI
188#                  firmware for the "virt-*" machine types of the @arm
189#                  and @aarch64 emulation targets, where the debug
190#                  messages are written to the first (always present)
191#                  PL011 UART. @verbose-static is mutually exclusive
192#                  with @verbose-dynamic.
193#
194# Since: 3.0
195##
196{ 'enum' : 'FirmwareFeature',
197  'data' : [ 'acpi-s3', 'acpi-s4',
198             'amd-sev', 'amd-sev-es', 'amd-sev-snp',
199             'intel-tdx',
200             'enrolled-keys', 'requires-smm', 'secure-boot',
201             'verbose-dynamic', 'verbose-static' ] }
202
203##
204# @FirmwareFlashFile:
205#
206# Defines common properties that are necessary for loading a firmware
207# file into a pflash chip. The corresponding QEMU command line option is
208# "-drive file=@filename,format=@format". Note however that the
209# option-argument shown here is incomplete; it is completed under
210# @FirmwareMappingFlash.
211#
212# @filename: Specifies the filename on the host filesystem where the
213#            firmware file can be found.
214#
215# @format: Specifies the block format of the file pointed-to by
216#          @filename, such as @raw or @qcow2.
217#
218# Since: 3.0
219##
220{ 'struct' : 'FirmwareFlashFile',
221  'data'   : { 'filename' : 'str',
222               'format'   : 'BlockdevDriver' } }
223
224
225##
226# @FirmwareFlashMode:
227#
228# Describes how the firmware build handles code versus variable
229# persistence.
230#
231# @split: the executable file contains code while the NVRAM
232#         template provides variable storage. The executable
233#         must be configured read-only and can be shared between
234#         multiple guests. The NVRAM template must be cloned
235#         for each new guest and configured read-write.
236#
237# @combined: the executable file contains both code and
238#            variable storage. The executable must be cloned
239#            for each new guest and configured read-write.
240#            No NVRAM template will be specified.
241#
242# @stateless: the executable file contains code and variable
243#             storage is not persisted. The executable must
244#             be configured read-only and can be shared
245#             between multiple guests. No NVRAM template
246#             will be specified.
247#
248# Since: 7.0.0
249##
250{ 'enum': 'FirmwareFlashMode',
251  'data': [ 'split', 'combined', 'stateless' ] }
252
253##
254# @FirmwareMappingFlash:
255#
256# Describes loading and mapping properties for the firmware executable
257# and its accompanying NVRAM file, when @FirmwareDevice is @flash.
258#
259# @mode: Describes how the firmware build handles code versus variable
260#        storage. If not present, it must be treated as if it was
261#        configured with value @split. Since: 7.0.0
262#
263# @executable: Identifies the firmware executable. The @mode
264#              indicates whether there will be an associated
265#              NVRAM template present. The preferred
266#              corresponding QEMU command line options are
267#                  -drive if=none,id=pflash0,readonly=on,file=@executable.@filename,format=@executable.@format
268#                  -machine pflash0=pflash0
269#              or equivalent -blockdev instead of -drive. When
270#              @mode is @combined the executable must be
271#              cloned before use and configured with readonly=off.
272#              With QEMU versions older than 4.0, you have to use
273#                  -drive if=pflash,unit=0,readonly=on,file=@executable.@filename,format=@executable.@format
274#
275# @nvram-template: Identifies the NVRAM template compatible with
276#                  @executable, when @mode is set to @split,
277#                  otherwise it should not be present.
278#                  Management software instantiates an
279#                  individual copy -- a specific NVRAM file -- from
280#                  @nvram-template.@filename for each new virtual
281#                  machine definition created. @nvram-template.@filename
282#                  itself is never mapped into virtual machines, only
283#                  individual copies of it are. An NVRAM file is
284#                  typically used for persistently storing the
285#                  non-volatile UEFI variables of a virtual machine
286#                  definition. The preferred corresponding QEMU
287#                  command line options are
288#                      -drive if=none,id=pflash1,readonly=off,file=FILENAME_OF_PRIVATE_NVRAM_FILE,format=@nvram-template.@format
289#                      -machine pflash1=pflash1
290#                  or equivalent -blockdev instead of -drive.
291#                  With QEMU versions older than 4.0, you have to use
292#                      -drive if=pflash,unit=1,readonly=off,file=FILENAME_OF_PRIVATE_NVRAM_FILE,format=@nvram-template.@format
293#
294# Since: 3.0
295##
296{ 'struct' : 'FirmwareMappingFlash',
297  'data'   : { '*mode': 'FirmwareFlashMode',
298               'executable'     : 'FirmwareFlashFile',
299               '*nvram-template' : 'FirmwareFlashFile' } }
300
301##
302# @FirmwareMappingKernel:
303#
304# Describes loading and mapping properties for the firmware executable,
305# when @FirmwareDevice is @kernel.
306#
307# @filename: Identifies the firmware executable. The firmware executable
308#            may be shared by multiple virtual machine definitions. The
309#            corresponding QEMU command line option is "-kernel
310#            @filename".
311#
312# Since: 3.0
313##
314{ 'struct' : 'FirmwareMappingKernel',
315  'data'   : { 'filename' : 'str' } }
316
317##
318# @FirmwareMappingMemory:
319#
320# Describes loading and mapping properties for the firmware executable,
321# when @FirmwareDevice is @memory.
322#
323# @filename: Identifies the firmware executable. The firmware executable
324#            may be shared by multiple virtual machine definitions. The
325#            corresponding QEMU command line option is "-bios
326#            @filename".
327#
328# Since: 3.0
329##
330{ 'struct' : 'FirmwareMappingMemory',
331  'data'   : { 'filename' : 'str' } }
332
333##
334# @FirmwareMapping:
335#
336# Provides a discriminated structure for firmware to describe its
337# loading / mapping properties.
338#
339# @device: Selects the device type that the firmware must be mapped
340#          into.
341#
342# Since: 3.0
343##
344{ 'union'         : 'FirmwareMapping',
345  'base'          : { 'device' : 'FirmwareDevice' },
346  'discriminator' : 'device',
347  'data'          : { 'flash'  : 'FirmwareMappingFlash',
348                      'kernel' : 'FirmwareMappingKernel',
349                      'memory' : 'FirmwareMappingMemory' } }
350
351##
352# @Firmware:
353#
354# Describes a firmware (or a firmware use case) to management software.
355#
356# It is possible for multiple @Firmware elements to match the search
357# criteria of management software. Applications thus need rules to pick
358# one of the many matches, and users need the ability to override distro
359# defaults.
360#
361# It is recommended to create firmware JSON files (each containing a
362# single @Firmware root element) with a double-digit prefix, for example
363# "50-ovmf.json", "50-seabios-256k.json", etc, so they can be sorted in
364# predictable order. The firmware JSON files should be searched for in
365# three directories:
366#
367#   - /usr/share/qemu/firmware -- populated by distro-provided firmware
368#                                 packages (XDG_DATA_DIRS covers
369#                                 /usr/share by default),
370#
371#   - /etc/qemu/firmware -- exclusively for sysadmins' local additions,
372#
373#   - $XDG_CONFIG_HOME/qemu/firmware -- exclusively for per-user local
374#                                       additions (XDG_CONFIG_HOME
375#                                       defaults to $HOME/.config).
376#
377# Top-down, the list of directories goes from general to specific.
378#
379# Management software should build a list of files from all three
380# locations, then sort the list by filename (i.e., last pathname
381# component). Management software should choose the first JSON file on
382# the sorted list that matches the search criteria. If a more specific
383# directory has a file with same name as a less specific directory, then
384# the file in the more specific directory takes effect. If the more
385# specific file is zero length, it hides the less specific one.
386#
387# For example, if a distro ships
388#
389#   - /usr/share/qemu/firmware/50-ovmf.json
390#
391#   - /usr/share/qemu/firmware/50-seabios-256k.json
392#
393# then the sysadmin can prevent the default OVMF being used at all with
394#
395#   $ touch /etc/qemu/firmware/50-ovmf.json
396#
397# The sysadmin can replace/alter the distro default OVMF with
398#
399#   $ vim /etc/qemu/firmware/50-ovmf.json
400#
401# or they can provide a parallel OVMF with higher priority
402#
403#   $ vim /etc/qemu/firmware/10-ovmf.json
404#
405# or they can provide a parallel OVMF with lower priority
406#
407#   $ vim /etc/qemu/firmware/99-ovmf.json
408#
409# @description: Provides a human-readable description of the firmware.
410#               Management software may or may not display @description.
411#
412# @interface-types: Lists the types of interfaces that the firmware can
413#                   expose to the guest OS. This is a non-empty, ordered
414#                   list; entries near the beginning of @interface-types
415#                   are considered more native to the firmware, and/or
416#                   to have a higher quality implementation in the
417#                   firmware, than entries near the end of
418#                   @interface-types.
419#
420# @mapping: Describes the loading / mapping properties of the firmware.
421#
422# @targets: Collects the target architectures (QEMU system emulators)
423#           and their machine types that may execute the firmware.
424#
425# @features: Lists the features that the firmware supports, and the
426#            platform requirements it presents.
427#
428# @tags: A list of auxiliary strings associated with the firmware for
429#        which @description is not appropriate, due to the latter's
430#        possible exposure to the end-user. @tags serves development and
431#        debugging purposes only, and management software shall
432#        explicitly ignore it.
433#
434# Since: 3.0
435#
436# Examples:
437#
438#     {
439#         "description": "SeaBIOS",
440#         "interface-types": [
441#             "bios"
442#         ],
443#         "mapping": {
444#             "device": "memory",
445#             "filename": "/usr/share/seabios/bios-256k.bin"
446#         },
447#         "targets": [
448#             {
449#                 "architecture": "i386",
450#                 "machines": [
451#                     "pc-i440fx-*",
452#                     "pc-q35-*"
453#                 ]
454#             },
455#             {
456#                 "architecture": "x86_64",
457#                 "machines": [
458#                     "pc-i440fx-*",
459#                     "pc-q35-*"
460#                 ]
461#             }
462#         ],
463#         "features": [
464#             "acpi-s3",
465#             "acpi-s4"
466#         ],
467#         "tags": [
468#             "CONFIG_BOOTSPLASH=n",
469#             "CONFIG_ROM_SIZE=256",
470#             "CONFIG_USE_SMM=n"
471#         ]
472#     }
473#
474#     {
475#         "description": "OVMF with SB+SMM, empty varstore",
476#         "interface-types": [
477#             "uefi"
478#         ],
479#         "mapping": {
480#             "device": "flash",
481#             "executable": {
482#                 "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
483#                 "format": "raw"
484#             },
485#             "nvram-template": {
486#                 "filename": "/usr/share/OVMF/OVMF_VARS.fd",
487#                 "format": "raw"
488#             }
489#         },
490#         "targets": [
491#             {
492#                 "architecture": "x86_64",
493#                 "machines": [
494#                     "pc-q35-*"
495#                 ]
496#             }
497#         ],
498#         "features": [
499#             "acpi-s3",
500#             "amd-sev",
501#             "requires-smm",
502#             "secure-boot",
503#             "verbose-dynamic"
504#         ],
505#         "tags": [
506#             "-a IA32",
507#             "-a X64",
508#             "-p OvmfPkg/OvmfPkgIa32X64.dsc",
509#             "-t GCC48",
510#             "-b DEBUG",
511#             "-D SMM_REQUIRE",
512#             "-D SECURE_BOOT_ENABLE",
513#             "-D FD_SIZE_4MB"
514#         ]
515#     }
516#
517#     {
518#         "description": "OVMF with SB+SMM, SB enabled, MS certs enrolled",
519#         "interface-types": [
520#             "uefi"
521#         ],
522#         "mapping": {
523#             "device": "flash",
524#             "executable": {
525#                 "filename": "/usr/share/OVMF/OVMF_CODE.secboot.fd",
526#                 "format": "raw"
527#             },
528#             "nvram-template": {
529#                 "filename": "/usr/share/OVMF/OVMF_VARS.secboot.fd",
530#                 "format": "raw"
531#             }
532#         },
533#         "targets": [
534#             {
535#                 "architecture": "x86_64",
536#                 "machines": [
537#                     "pc-q35-*"
538#                 ]
539#             }
540#         ],
541#         "features": [
542#             "acpi-s3",
543#             "amd-sev",
544#             "enrolled-keys",
545#             "requires-smm",
546#             "secure-boot",
547#             "verbose-dynamic"
548#         ],
549#         "tags": [
550#             "-a IA32",
551#             "-a X64",
552#             "-p OvmfPkg/OvmfPkgIa32X64.dsc",
553#             "-t GCC48",
554#             "-b DEBUG",
555#             "-D SMM_REQUIRE",
556#             "-D SECURE_BOOT_ENABLE",
557#             "-D FD_SIZE_4MB"
558#         ]
559#     }
560#
561#     {
562#         "description": "OVMF with SEV-ES support",
563#         "interface-types": [
564#             "uefi"
565#         ],
566#         "mapping": {
567#             "device": "flash",
568#             "executable": {
569#                 "filename": "/usr/share/OVMF/OVMF_CODE.fd",
570#                 "format": "raw"
571#             },
572#             "nvram-template": {
573#                 "filename": "/usr/share/OVMF/OVMF_VARS.fd",
574#                 "format": "raw"
575#             }
576#         },
577#         "targets": [
578#             {
579#                 "architecture": "x86_64",
580#                 "machines": [
581#                     "pc-q35-*"
582#                 ]
583#             }
584#         ],
585#         "features": [
586#             "acpi-s3",
587#             "amd-sev",
588#             "amd-sev-es",
589#             "verbose-dynamic"
590#         ],
591#         "tags": [
592#             "-a X64",
593#             "-p OvmfPkg/OvmfPkgX64.dsc",
594#             "-t GCC48",
595#             "-b DEBUG",
596#             "-D FD_SIZE_4MB"
597#         ]
598#     }
599#
600#     {
601#         "description": "UEFI firmware for ARM64 virtual machines",
602#         "interface-types": [
603#             "uefi"
604#         ],
605#         "mapping": {
606#             "device": "flash",
607#             "executable": {
608#                 "filename": "/usr/share/AAVMF/AAVMF_CODE.fd",
609#                 "format": "raw"
610#             },
611#             "nvram-template": {
612#                 "filename": "/usr/share/AAVMF/AAVMF_VARS.fd",
613#                 "format": "raw"
614#             }
615#         },
616#         "targets": [
617#             {
618#                 "architecture": "aarch64",
619#                 "machines": [
620#                     "virt-*"
621#                 ]
622#             }
623#         ],
624#         "features": [
625#
626#         ],
627#         "tags": [
628#             "-a AARCH64",
629#             "-p ArmVirtPkg/ArmVirtQemu.dsc",
630#             "-t GCC48",
631#             "-b DEBUG",
632#             "-D DEBUG_PRINT_ERROR_LEVEL=0x80000000"
633#         ]
634#     }
635##
636{ 'struct' : 'Firmware',
637  'data'   : { 'description'     : 'str',
638               'interface-types' : [ 'FirmwareOSInterface' ],
639               'mapping'         : 'FirmwareMapping',
640               'targets'         : [ 'FirmwareTarget' ],
641               'features'        : [ 'FirmwareFeature' ],
642               'tags'            : [ 'str' ] } }
643