qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

firmware.json (23242B)


      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 # @FirmwareFlashType:
    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' ] } }