cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

fw_cfg.c (42078B)


      1/*
      2 * QEMU Firmware configuration device emulation
      3 *
      4 * Copyright (c) 2008 Gleb Natapov
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to deal
      8 * in the Software without restriction, including without limitation the rights
      9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 * copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 * THE SOFTWARE.
     23 */
     24
     25#include "qemu/osdep.h"
     26#include "qemu-common.h"
     27#include "qemu/datadir.h"
     28#include "sysemu/sysemu.h"
     29#include "sysemu/dma.h"
     30#include "sysemu/reset.h"
     31#include "hw/boards.h"
     32#include "hw/nvram/fw_cfg.h"
     33#include "hw/qdev-properties.h"
     34#include "hw/sysbus.h"
     35#include "migration/qemu-file-types.h"
     36#include "migration/vmstate.h"
     37#include "trace.h"
     38#include "qemu/error-report.h"
     39#include "qemu/option.h"
     40#include "qemu/config-file.h"
     41#include "qemu/cutils.h"
     42#include "qapi/error.h"
     43#include "hw/acpi/aml-build.h"
     44#include "hw/pci/pci_bus.h"
     45
     46#define FW_CFG_FILE_SLOTS_DFLT 0x20
     47
     48/* FW_CFG_VERSION bits */
     49#define FW_CFG_VERSION      0x01
     50#define FW_CFG_VERSION_DMA  0x02
     51
     52/* FW_CFG_DMA_CONTROL bits */
     53#define FW_CFG_DMA_CTL_ERROR   0x01
     54#define FW_CFG_DMA_CTL_READ    0x02
     55#define FW_CFG_DMA_CTL_SKIP    0x04
     56#define FW_CFG_DMA_CTL_SELECT  0x08
     57#define FW_CFG_DMA_CTL_WRITE   0x10
     58
     59#define FW_CFG_DMA_SIGNATURE 0x51454d5520434647ULL /* "QEMU CFG" */
     60
     61struct FWCfgEntry {
     62    uint32_t len;
     63    bool allow_write;
     64    uint8_t *data;
     65    void *callback_opaque;
     66    FWCfgCallback select_cb;
     67    FWCfgWriteCallback write_cb;
     68};
     69
     70/**
     71 * key_name:
     72 *
     73 * @key: The uint16 selector key.
     74 *
     75 * Returns: The stringified name if the selector refers to a well-known
     76 *          numerically defined item, or NULL on key lookup failure.
     77 */
     78static const char *key_name(uint16_t key)
     79{
     80    static const char *fw_cfg_wellknown_keys[FW_CFG_FILE_FIRST] = {
     81        [FW_CFG_SIGNATURE] = "signature",
     82        [FW_CFG_ID] = "id",
     83        [FW_CFG_UUID] = "uuid",
     84        [FW_CFG_RAM_SIZE] = "ram_size",
     85        [FW_CFG_NOGRAPHIC] = "nographic",
     86        [FW_CFG_NB_CPUS] = "nb_cpus",
     87        [FW_CFG_MACHINE_ID] = "machine_id",
     88        [FW_CFG_KERNEL_ADDR] = "kernel_addr",
     89        [FW_CFG_KERNEL_SIZE] = "kernel_size",
     90        [FW_CFG_KERNEL_CMDLINE] = "kernel_cmdline",
     91        [FW_CFG_INITRD_ADDR] = "initrd_addr",
     92        [FW_CFG_INITRD_SIZE] = "initdr_size",
     93        [FW_CFG_BOOT_DEVICE] = "boot_device",
     94        [FW_CFG_NUMA] = "numa",
     95        [FW_CFG_BOOT_MENU] = "boot_menu",
     96        [FW_CFG_MAX_CPUS] = "max_cpus",
     97        [FW_CFG_KERNEL_ENTRY] = "kernel_entry",
     98        [FW_CFG_KERNEL_DATA] = "kernel_data",
     99        [FW_CFG_INITRD_DATA] = "initrd_data",
    100        [FW_CFG_CMDLINE_ADDR] = "cmdline_addr",
    101        [FW_CFG_CMDLINE_SIZE] = "cmdline_size",
    102        [FW_CFG_CMDLINE_DATA] = "cmdline_data",
    103        [FW_CFG_SETUP_ADDR] = "setup_addr",
    104        [FW_CFG_SETUP_SIZE] = "setup_size",
    105        [FW_CFG_SETUP_DATA] = "setup_data",
    106        [FW_CFG_FILE_DIR] = "file_dir",
    107    };
    108
    109    if (key & FW_CFG_ARCH_LOCAL) {
    110        return fw_cfg_arch_key_name(key);
    111    }
    112    if (key < FW_CFG_FILE_FIRST) {
    113        return fw_cfg_wellknown_keys[key];
    114    }
    115
    116    return NULL;
    117}
    118
    119static inline const char *trace_key_name(uint16_t key)
    120{
    121    const char *name = key_name(key);
    122
    123    return name ? name : "unknown";
    124}
    125
    126#define JPG_FILE 0
    127#define BMP_FILE 1
    128
    129static char *read_splashfile(char *filename, gsize *file_sizep,
    130                             int *file_typep)
    131{
    132    GError *err = NULL;
    133    gchar *content;
    134    int file_type;
    135    unsigned int filehead;
    136    int bmp_bpp;
    137
    138    if (!g_file_get_contents(filename, &content, file_sizep, &err)) {
    139        error_report("failed to read splash file '%s': %s",
    140                     filename, err->message);
    141        g_error_free(err);
    142        return NULL;
    143    }
    144
    145    /* check file size */
    146    if (*file_sizep < 30) {
    147        goto error;
    148    }
    149
    150    /* check magic ID */
    151    filehead = lduw_le_p(content);
    152    if (filehead == 0xd8ff) {
    153        file_type = JPG_FILE;
    154    } else if (filehead == 0x4d42) {
    155        file_type = BMP_FILE;
    156    } else {
    157        goto error;
    158    }
    159
    160    /* check BMP bpp */
    161    if (file_type == BMP_FILE) {
    162        bmp_bpp = lduw_le_p(&content[28]);
    163        if (bmp_bpp != 24) {
    164            goto error;
    165        }
    166    }
    167
    168    /* return values */
    169    *file_typep = file_type;
    170
    171    return content;
    172
    173error:
    174    error_report("splash file '%s' format not recognized; must be JPEG "
    175                 "or 24 bit BMP", filename);
    176    g_free(content);
    177    return NULL;
    178}
    179
    180static void fw_cfg_bootsplash(FWCfgState *s)
    181{
    182    const char *boot_splash_filename = NULL;
    183    const char *boot_splash_time = NULL;
    184    char *filename, *file_data;
    185    gsize file_size;
    186    int file_type;
    187
    188    /* get user configuration */
    189    QemuOptsList *plist = qemu_find_opts("boot-opts");
    190    QemuOpts *opts = QTAILQ_FIRST(&plist->head);
    191    boot_splash_filename = qemu_opt_get(opts, "splash");
    192    boot_splash_time = qemu_opt_get(opts, "splash-time");
    193
    194    /* insert splash time if user configurated */
    195    if (boot_splash_time) {
    196        int64_t bst_val = qemu_opt_get_number(opts, "splash-time", -1);
    197        uint16_t bst_le16;
    198
    199        /* validate the input */
    200        if (bst_val < 0 || bst_val > 0xffff) {
    201            error_report("splash-time is invalid,"
    202                         "it should be a value between 0 and 65535");
    203            exit(1);
    204        }
    205        /* use little endian format */
    206        bst_le16 = cpu_to_le16(bst_val);
    207        fw_cfg_add_file(s, "etc/boot-menu-wait",
    208                        g_memdup(&bst_le16, sizeof bst_le16), sizeof bst_le16);
    209    }
    210
    211    /* insert splash file if user configurated */
    212    if (boot_splash_filename) {
    213        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, boot_splash_filename);
    214        if (filename == NULL) {
    215            error_report("failed to find file '%s'", boot_splash_filename);
    216            return;
    217        }
    218
    219        /* loading file data */
    220        file_data = read_splashfile(filename, &file_size, &file_type);
    221        if (file_data == NULL) {
    222            g_free(filename);
    223            return;
    224        }
    225        g_free(boot_splash_filedata);
    226        boot_splash_filedata = (uint8_t *)file_data;
    227
    228        /* insert data */
    229        if (file_type == JPG_FILE) {
    230            fw_cfg_add_file(s, "bootsplash.jpg",
    231                            boot_splash_filedata, file_size);
    232        } else {
    233            fw_cfg_add_file(s, "bootsplash.bmp",
    234                            boot_splash_filedata, file_size);
    235        }
    236        g_free(filename);
    237    }
    238}
    239
    240static void fw_cfg_reboot(FWCfgState *s)
    241{
    242    const char *reboot_timeout = NULL;
    243    uint64_t rt_val = -1;
    244    uint32_t rt_le32;
    245
    246    /* get user configuration */
    247    QemuOptsList *plist = qemu_find_opts("boot-opts");
    248    QemuOpts *opts = QTAILQ_FIRST(&plist->head);
    249    reboot_timeout = qemu_opt_get(opts, "reboot-timeout");
    250
    251    if (reboot_timeout) {
    252        rt_val = qemu_opt_get_number(opts, "reboot-timeout", -1);
    253
    254        /* validate the input */
    255        if (rt_val > 0xffff && rt_val != (uint64_t)-1) {
    256            error_report("reboot timeout is invalid,"
    257                         "it should be a value between -1 and 65535");
    258            exit(1);
    259        }
    260    }
    261
    262    rt_le32 = cpu_to_le32(rt_val);
    263    fw_cfg_add_file(s, "etc/boot-fail-wait", g_memdup(&rt_le32, 4), 4);
    264}
    265
    266static void fw_cfg_write(FWCfgState *s, uint8_t value)
    267{
    268    /* nothing, write support removed in QEMU v2.4+ */
    269}
    270
    271static inline uint16_t fw_cfg_file_slots(const FWCfgState *s)
    272{
    273    return s->file_slots;
    274}
    275
    276/* Note: this function returns an exclusive limit. */
    277static inline uint32_t fw_cfg_max_entry(const FWCfgState *s)
    278{
    279    return FW_CFG_FILE_FIRST + fw_cfg_file_slots(s);
    280}
    281
    282static int fw_cfg_select(FWCfgState *s, uint16_t key)
    283{
    284    int arch, ret;
    285    FWCfgEntry *e;
    286
    287    s->cur_offset = 0;
    288    if ((key & FW_CFG_ENTRY_MASK) >= fw_cfg_max_entry(s)) {
    289        s->cur_entry = FW_CFG_INVALID;
    290        ret = 0;
    291    } else {
    292        s->cur_entry = key;
    293        ret = 1;
    294        /* entry successfully selected, now run callback if present */
    295        arch = !!(key & FW_CFG_ARCH_LOCAL);
    296        e = &s->entries[arch][key & FW_CFG_ENTRY_MASK];
    297        if (e->select_cb) {
    298            e->select_cb(e->callback_opaque);
    299        }
    300    }
    301
    302    trace_fw_cfg_select(s, key, trace_key_name(key), ret);
    303    return ret;
    304}
    305
    306static uint64_t fw_cfg_data_read(void *opaque, hwaddr addr, unsigned size)
    307{
    308    FWCfgState *s = opaque;
    309    int arch = !!(s->cur_entry & FW_CFG_ARCH_LOCAL);
    310    FWCfgEntry *e = (s->cur_entry == FW_CFG_INVALID) ? NULL :
    311                    &s->entries[arch][s->cur_entry & FW_CFG_ENTRY_MASK];
    312    uint64_t value = 0;
    313
    314    assert(size > 0 && size <= sizeof(value));
    315    if (s->cur_entry != FW_CFG_INVALID && e->data && s->cur_offset < e->len) {
    316        /* The least significant 'size' bytes of the return value are
    317         * expected to contain a string preserving portion of the item
    318         * data, padded with zeros on the right in case we run out early.
    319         * In technical terms, we're composing the host-endian representation
    320         * of the big endian interpretation of the fw_cfg string.
    321         */
    322        do {
    323            value = (value << 8) | e->data[s->cur_offset++];
    324        } while (--size && s->cur_offset < e->len);
    325        /* If size is still not zero, we *did* run out early, so continue
    326         * left-shifting, to add the appropriate number of padding zeros
    327         * on the right.
    328         */
    329        value <<= 8 * size;
    330    }
    331
    332    trace_fw_cfg_read(s, value);
    333    return value;
    334}
    335
    336static void fw_cfg_data_mem_write(void *opaque, hwaddr addr,
    337                                  uint64_t value, unsigned size)
    338{
    339    FWCfgState *s = opaque;
    340    unsigned i = size;
    341
    342    do {
    343        fw_cfg_write(s, value >> (8 * --i));
    344    } while (i);
    345}
    346
    347static void fw_cfg_dma_transfer(FWCfgState *s)
    348{
    349    dma_addr_t len;
    350    FWCfgDmaAccess dma;
    351    int arch;
    352    FWCfgEntry *e;
    353    int read = 0, write = 0;
    354    dma_addr_t dma_addr;
    355
    356    /* Reset the address before the next access */
    357    dma_addr = s->dma_addr;
    358    s->dma_addr = 0;
    359
    360    if (dma_memory_read(s->dma_as, dma_addr, &dma, sizeof(dma))) {
    361        stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control),
    362                   FW_CFG_DMA_CTL_ERROR);
    363        return;
    364    }
    365
    366    dma.address = be64_to_cpu(dma.address);
    367    dma.length = be32_to_cpu(dma.length);
    368    dma.control = be32_to_cpu(dma.control);
    369
    370    if (dma.control & FW_CFG_DMA_CTL_SELECT) {
    371        fw_cfg_select(s, dma.control >> 16);
    372    }
    373
    374    arch = !!(s->cur_entry & FW_CFG_ARCH_LOCAL);
    375    e = (s->cur_entry == FW_CFG_INVALID) ? NULL :
    376        &s->entries[arch][s->cur_entry & FW_CFG_ENTRY_MASK];
    377
    378    if (dma.control & FW_CFG_DMA_CTL_READ) {
    379        read = 1;
    380        write = 0;
    381    } else if (dma.control & FW_CFG_DMA_CTL_WRITE) {
    382        read = 0;
    383        write = 1;
    384    } else if (dma.control & FW_CFG_DMA_CTL_SKIP) {
    385        read = 0;
    386        write = 0;
    387    } else {
    388        dma.length = 0;
    389    }
    390
    391    dma.control = 0;
    392
    393    while (dma.length > 0 && !(dma.control & FW_CFG_DMA_CTL_ERROR)) {
    394        if (s->cur_entry == FW_CFG_INVALID || !e->data ||
    395                                s->cur_offset >= e->len) {
    396            len = dma.length;
    397
    398            /* If the access is not a read access, it will be a skip access,
    399             * tested before.
    400             */
    401            if (read) {
    402                if (dma_memory_set(s->dma_as, dma.address, 0, len)) {
    403                    dma.control |= FW_CFG_DMA_CTL_ERROR;
    404                }
    405            }
    406            if (write) {
    407                dma.control |= FW_CFG_DMA_CTL_ERROR;
    408            }
    409        } else {
    410            if (dma.length <= (e->len - s->cur_offset)) {
    411                len = dma.length;
    412            } else {
    413                len = (e->len - s->cur_offset);
    414            }
    415
    416            /* If the access is not a read access, it will be a skip access,
    417             * tested before.
    418             */
    419            if (read) {
    420                if (dma_memory_write(s->dma_as, dma.address,
    421                                    &e->data[s->cur_offset], len)) {
    422                    dma.control |= FW_CFG_DMA_CTL_ERROR;
    423                }
    424            }
    425            if (write) {
    426                if (!e->allow_write ||
    427                    len != dma.length ||
    428                    dma_memory_read(s->dma_as, dma.address,
    429                                    &e->data[s->cur_offset], len)) {
    430                    dma.control |= FW_CFG_DMA_CTL_ERROR;
    431                } else if (e->write_cb) {
    432                    e->write_cb(e->callback_opaque, s->cur_offset, len);
    433                }
    434            }
    435
    436            s->cur_offset += len;
    437        }
    438
    439        dma.address += len;
    440        dma.length  -= len;
    441
    442    }
    443
    444    stl_be_dma(s->dma_as, dma_addr + offsetof(FWCfgDmaAccess, control),
    445                dma.control);
    446
    447    trace_fw_cfg_read(s, 0);
    448}
    449
    450static uint64_t fw_cfg_dma_mem_read(void *opaque, hwaddr addr,
    451                                    unsigned size)
    452{
    453    /* Return a signature value (and handle various read sizes) */
    454    return extract64(FW_CFG_DMA_SIGNATURE, (8 - addr - size) * 8, size * 8);
    455}
    456
    457static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
    458                                 uint64_t value, unsigned size)
    459{
    460    FWCfgState *s = opaque;
    461
    462    if (size == 4) {
    463        if (addr == 0) {
    464            /* FWCfgDmaAccess high address */
    465            s->dma_addr = value << 32;
    466        } else if (addr == 4) {
    467            /* FWCfgDmaAccess low address */
    468            s->dma_addr |= value;
    469            fw_cfg_dma_transfer(s);
    470        }
    471    } else if (size == 8 && addr == 0) {
    472        s->dma_addr = value;
    473        fw_cfg_dma_transfer(s);
    474    }
    475}
    476
    477static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
    478                                 unsigned size, bool is_write,
    479                                 MemTxAttrs attrs)
    480{
    481    return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
    482                         (size == 8 && addr == 0));
    483}
    484
    485static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
    486                                  unsigned size, bool is_write,
    487                                  MemTxAttrs attrs)
    488{
    489    return addr == 0;
    490}
    491
    492static uint64_t fw_cfg_ctl_mem_read(void *opaque, hwaddr addr, unsigned size)
    493{
    494    return 0;
    495}
    496
    497static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
    498                                 uint64_t value, unsigned size)
    499{
    500    fw_cfg_select(opaque, (uint16_t)value);
    501}
    502
    503static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
    504                                 unsigned size, bool is_write,
    505                                 MemTxAttrs attrs)
    506{
    507    return is_write && size == 2;
    508}
    509
    510static void fw_cfg_comb_write(void *opaque, hwaddr addr,
    511                              uint64_t value, unsigned size)
    512{
    513    switch (size) {
    514    case 1:
    515        fw_cfg_write(opaque, (uint8_t)value);
    516        break;
    517    case 2:
    518        fw_cfg_select(opaque, (uint16_t)value);
    519        break;
    520    }
    521}
    522
    523static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
    524                              unsigned size, bool is_write,
    525                              MemTxAttrs attrs)
    526{
    527    return (size == 1) || (is_write && size == 2);
    528}
    529
    530static const MemoryRegionOps fw_cfg_ctl_mem_ops = {
    531    .read = fw_cfg_ctl_mem_read,
    532    .write = fw_cfg_ctl_mem_write,
    533    .endianness = DEVICE_BIG_ENDIAN,
    534    .valid.accepts = fw_cfg_ctl_mem_valid,
    535};
    536
    537static const MemoryRegionOps fw_cfg_data_mem_ops = {
    538    .read = fw_cfg_data_read,
    539    .write = fw_cfg_data_mem_write,
    540    .endianness = DEVICE_BIG_ENDIAN,
    541    .valid = {
    542        .min_access_size = 1,
    543        .max_access_size = 1,
    544        .accepts = fw_cfg_data_mem_valid,
    545    },
    546};
    547
    548static const MemoryRegionOps fw_cfg_comb_mem_ops = {
    549    .read = fw_cfg_data_read,
    550    .write = fw_cfg_comb_write,
    551    .endianness = DEVICE_LITTLE_ENDIAN,
    552    .valid.accepts = fw_cfg_comb_valid,
    553};
    554
    555static const MemoryRegionOps fw_cfg_dma_mem_ops = {
    556    .read = fw_cfg_dma_mem_read,
    557    .write = fw_cfg_dma_mem_write,
    558    .endianness = DEVICE_BIG_ENDIAN,
    559    .valid.accepts = fw_cfg_dma_mem_valid,
    560    .valid.max_access_size = 8,
    561    .impl.max_access_size = 8,
    562};
    563
    564static void fw_cfg_reset(DeviceState *d)
    565{
    566    FWCfgState *s = FW_CFG(d);
    567
    568    /* we never register a read callback for FW_CFG_SIGNATURE */
    569    fw_cfg_select(s, FW_CFG_SIGNATURE);
    570}
    571
    572/* Save restore 32 bit int as uint16_t
    573   This is a Big hack, but it is how the old state did it.
    574   Or we broke compatibility in the state, or we can't use struct tm
    575 */
    576
    577static int get_uint32_as_uint16(QEMUFile *f, void *pv, size_t size,
    578                                const VMStateField *field)
    579{
    580    uint32_t *v = pv;
    581    *v = qemu_get_be16(f);
    582    return 0;
    583}
    584
    585static int put_unused(QEMUFile *f, void *pv, size_t size,
    586                      const VMStateField *field, JSONWriter *vmdesc)
    587{
    588    fprintf(stderr, "uint32_as_uint16 is only used for backward compatibility.\n");
    589    fprintf(stderr, "This functions shouldn't be called.\n");
    590
    591    return 0;
    592}
    593
    594static const VMStateInfo vmstate_hack_uint32_as_uint16 = {
    595    .name = "int32_as_uint16",
    596    .get  = get_uint32_as_uint16,
    597    .put  = put_unused,
    598};
    599
    600#define VMSTATE_UINT16_HACK(_f, _s, _t)                                    \
    601    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_hack_uint32_as_uint16, uint32_t)
    602
    603
    604static bool is_version_1(void *opaque, int version_id)
    605{
    606    return version_id == 1;
    607}
    608
    609bool fw_cfg_dma_enabled(void *opaque)
    610{
    611    FWCfgState *s = opaque;
    612
    613    return s->dma_enabled;
    614}
    615
    616static bool fw_cfg_acpi_mr_restore(void *opaque)
    617{
    618    FWCfgState *s = opaque;
    619    bool mr_aligned;
    620
    621    mr_aligned = QEMU_IS_ALIGNED(s->table_mr_size, qemu_real_host_page_size) &&
    622                 QEMU_IS_ALIGNED(s->linker_mr_size, qemu_real_host_page_size) &&
    623                 QEMU_IS_ALIGNED(s->rsdp_mr_size, qemu_real_host_page_size);
    624    return s->acpi_mr_restore && !mr_aligned;
    625}
    626
    627static void fw_cfg_update_mr(FWCfgState *s, uint16_t key, size_t size)
    628{
    629    MemoryRegion *mr;
    630    ram_addr_t offset;
    631    int arch = !!(key & FW_CFG_ARCH_LOCAL);
    632    void *ptr;
    633
    634    key &= FW_CFG_ENTRY_MASK;
    635    assert(key < fw_cfg_max_entry(s));
    636
    637    ptr = s->entries[arch][key].data;
    638    mr = memory_region_from_host(ptr, &offset);
    639
    640    memory_region_ram_resize(mr, size, &error_abort);
    641}
    642
    643static int fw_cfg_acpi_mr_restore_post_load(void *opaque, int version_id)
    644{
    645    FWCfgState *s = opaque;
    646    int i, index;
    647
    648    assert(s->files);
    649
    650    index = be32_to_cpu(s->files->count);
    651
    652    for (i = 0; i < index; i++) {
    653        if (!strcmp(s->files->f[i].name, ACPI_BUILD_TABLE_FILE)) {
    654            fw_cfg_update_mr(s, FW_CFG_FILE_FIRST + i, s->table_mr_size);
    655        } else if (!strcmp(s->files->f[i].name, ACPI_BUILD_LOADER_FILE)) {
    656            fw_cfg_update_mr(s, FW_CFG_FILE_FIRST + i, s->linker_mr_size);
    657        } else if (!strcmp(s->files->f[i].name, ACPI_BUILD_RSDP_FILE)) {
    658            fw_cfg_update_mr(s, FW_CFG_FILE_FIRST + i, s->rsdp_mr_size);
    659        }
    660    }
    661
    662    return 0;
    663}
    664
    665static const VMStateDescription vmstate_fw_cfg_dma = {
    666    .name = "fw_cfg/dma",
    667    .needed = fw_cfg_dma_enabled,
    668    .fields = (VMStateField[]) {
    669        VMSTATE_UINT64(dma_addr, FWCfgState),
    670        VMSTATE_END_OF_LIST()
    671    },
    672};
    673
    674static const VMStateDescription vmstate_fw_cfg_acpi_mr = {
    675    .name = "fw_cfg/acpi_mr",
    676    .version_id = 1,
    677    .minimum_version_id = 1,
    678    .needed = fw_cfg_acpi_mr_restore,
    679    .post_load = fw_cfg_acpi_mr_restore_post_load,
    680    .fields = (VMStateField[]) {
    681        VMSTATE_UINT64(table_mr_size, FWCfgState),
    682        VMSTATE_UINT64(linker_mr_size, FWCfgState),
    683        VMSTATE_UINT64(rsdp_mr_size, FWCfgState),
    684        VMSTATE_END_OF_LIST()
    685    },
    686};
    687
    688static const VMStateDescription vmstate_fw_cfg = {
    689    .name = "fw_cfg",
    690    .version_id = 2,
    691    .minimum_version_id = 1,
    692    .fields = (VMStateField[]) {
    693        VMSTATE_UINT16(cur_entry, FWCfgState),
    694        VMSTATE_UINT16_HACK(cur_offset, FWCfgState, is_version_1),
    695        VMSTATE_UINT32_V(cur_offset, FWCfgState, 2),
    696        VMSTATE_END_OF_LIST()
    697    },
    698    .subsections = (const VMStateDescription*[]) {
    699        &vmstate_fw_cfg_dma,
    700        &vmstate_fw_cfg_acpi_mr,
    701        NULL,
    702    }
    703};
    704
    705static void fw_cfg_add_bytes_callback(FWCfgState *s, uint16_t key,
    706                                      FWCfgCallback select_cb,
    707                                      FWCfgWriteCallback write_cb,
    708                                      void *callback_opaque,
    709                                      void *data, size_t len,
    710                                      bool read_only)
    711{
    712    int arch = !!(key & FW_CFG_ARCH_LOCAL);
    713
    714    key &= FW_CFG_ENTRY_MASK;
    715
    716    assert(key < fw_cfg_max_entry(s) && len < UINT32_MAX);
    717    assert(s->entries[arch][key].data == NULL); /* avoid key conflict */
    718
    719    s->entries[arch][key].data = data;
    720    s->entries[arch][key].len = (uint32_t)len;
    721    s->entries[arch][key].select_cb = select_cb;
    722    s->entries[arch][key].write_cb = write_cb;
    723    s->entries[arch][key].callback_opaque = callback_opaque;
    724    s->entries[arch][key].allow_write = !read_only;
    725}
    726
    727static void *fw_cfg_modify_bytes_read(FWCfgState *s, uint16_t key,
    728                                              void *data, size_t len)
    729{
    730    void *ptr;
    731    int arch = !!(key & FW_CFG_ARCH_LOCAL);
    732
    733    key &= FW_CFG_ENTRY_MASK;
    734
    735    assert(key < fw_cfg_max_entry(s) && len < UINT32_MAX);
    736
    737    /* return the old data to the function caller, avoid memory leak */
    738    ptr = s->entries[arch][key].data;
    739    s->entries[arch][key].data = data;
    740    s->entries[arch][key].len = len;
    741    s->entries[arch][key].callback_opaque = NULL;
    742    s->entries[arch][key].allow_write = false;
    743
    744    return ptr;
    745}
    746
    747void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
    748{
    749    trace_fw_cfg_add_bytes(key, trace_key_name(key), len);
    750    fw_cfg_add_bytes_callback(s, key, NULL, NULL, NULL, data, len, true);
    751}
    752
    753void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value)
    754{
    755    size_t sz = strlen(value) + 1;
    756
    757    trace_fw_cfg_add_string(key, trace_key_name(key), value);
    758    fw_cfg_add_bytes(s, key, g_memdup(value, sz), sz);
    759}
    760
    761void fw_cfg_modify_string(FWCfgState *s, uint16_t key, const char *value)
    762{
    763    size_t sz = strlen(value) + 1;
    764    char *old;
    765
    766    old = fw_cfg_modify_bytes_read(s, key, g_memdup(value, sz), sz);
    767    g_free(old);
    768}
    769
    770void fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value)
    771{
    772    uint16_t *copy;
    773
    774    copy = g_malloc(sizeof(value));
    775    *copy = cpu_to_le16(value);
    776    trace_fw_cfg_add_i16(key, trace_key_name(key), value);
    777    fw_cfg_add_bytes(s, key, copy, sizeof(value));
    778}
    779
    780void fw_cfg_modify_i16(FWCfgState *s, uint16_t key, uint16_t value)
    781{
    782    uint16_t *copy, *old;
    783
    784    copy = g_malloc(sizeof(value));
    785    *copy = cpu_to_le16(value);
    786    old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value));
    787    g_free(old);
    788}
    789
    790void fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value)
    791{
    792    uint32_t *copy;
    793
    794    copy = g_malloc(sizeof(value));
    795    *copy = cpu_to_le32(value);
    796    trace_fw_cfg_add_i32(key, trace_key_name(key), value);
    797    fw_cfg_add_bytes(s, key, copy, sizeof(value));
    798}
    799
    800void fw_cfg_modify_i32(FWCfgState *s, uint16_t key, uint32_t value)
    801{
    802    uint32_t *copy, *old;
    803
    804    copy = g_malloc(sizeof(value));
    805    *copy = cpu_to_le32(value);
    806    old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value));
    807    g_free(old);
    808}
    809
    810void fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value)
    811{
    812    uint64_t *copy;
    813
    814    copy = g_malloc(sizeof(value));
    815    *copy = cpu_to_le64(value);
    816    trace_fw_cfg_add_i64(key, trace_key_name(key), value);
    817    fw_cfg_add_bytes(s, key, copy, sizeof(value));
    818}
    819
    820void fw_cfg_modify_i64(FWCfgState *s, uint16_t key, uint64_t value)
    821{
    822    uint64_t *copy, *old;
    823
    824    copy = g_malloc(sizeof(value));
    825    *copy = cpu_to_le64(value);
    826    old = fw_cfg_modify_bytes_read(s, key, copy, sizeof(value));
    827    g_free(old);
    828}
    829
    830void fw_cfg_set_order_override(FWCfgState *s, int order)
    831{
    832    assert(s->fw_cfg_order_override == 0);
    833    s->fw_cfg_order_override = order;
    834}
    835
    836void fw_cfg_reset_order_override(FWCfgState *s)
    837{
    838    assert(s->fw_cfg_order_override != 0);
    839    s->fw_cfg_order_override = 0;
    840}
    841
    842/*
    843 * This is the legacy order list.  For legacy systems, files are in
    844 * the fw_cfg in the order defined below, by the "order" value.  Note
    845 * that some entries (VGA ROMs, NIC option ROMS, etc.) go into a
    846 * specific area, but there may be more than one and they occur in the
    847 * order that the user specifies them on the command line.  Those are
    848 * handled in a special manner, using the order override above.
    849 *
    850 * For non-legacy, the files are sorted by filename to avoid this kind
    851 * of complexity in the future.
    852 *
    853 * This is only for x86, other arches don't implement versioning so
    854 * they won't set legacy mode.
    855 */
    856static struct {
    857    const char *name;
    858    int order;
    859} fw_cfg_order[] = {
    860    { "etc/boot-menu-wait", 10 },
    861    { "bootsplash.jpg", 11 },
    862    { "bootsplash.bmp", 12 },
    863    { "etc/boot-fail-wait", 15 },
    864    { "etc/smbios/smbios-tables", 20 },
    865    { "etc/smbios/smbios-anchor", 30 },
    866    { "etc/e820", 40 },
    867    { "etc/reserved-memory-end", 50 },
    868    { "genroms/kvmvapic.bin", 55 },
    869    { "genroms/linuxboot.bin", 60 },
    870    { }, /* VGA ROMs from pc_vga_init come here, 70. */
    871    { }, /* NIC option ROMs from pc_nic_init come here, 80. */
    872    { "etc/system-states", 90 },
    873    { }, /* User ROMs come here, 100. */
    874    { }, /* Device FW comes here, 110. */
    875    { "etc/extra-pci-roots", 120 },
    876    { "etc/acpi/tables", 130 },
    877    { "etc/table-loader", 140 },
    878    { "etc/tpm/log", 150 },
    879    { "etc/acpi/rsdp", 160 },
    880    { "bootorder", 170 },
    881    { "etc/msr_feature_control", 180 },
    882
    883#define FW_CFG_ORDER_OVERRIDE_LAST 200
    884};
    885
    886/*
    887 * Any sub-page size update to these table MRs will be lost during migration,
    888 * as we use aligned size in ram_load_precopy() -> qemu_ram_resize() path.
    889 * In order to avoid the inconsistency in sizes save them seperately and
    890 * migrate over in vmstate post_load().
    891 */
    892static void fw_cfg_acpi_mr_save(FWCfgState *s, const char *filename, size_t len)
    893{
    894    if (!strcmp(filename, ACPI_BUILD_TABLE_FILE)) {
    895        s->table_mr_size = len;
    896    } else if (!strcmp(filename, ACPI_BUILD_LOADER_FILE)) {
    897        s->linker_mr_size = len;
    898    } else if (!strcmp(filename, ACPI_BUILD_RSDP_FILE)) {
    899        s->rsdp_mr_size = len;
    900    }
    901}
    902
    903static int get_fw_cfg_order(FWCfgState *s, const char *name)
    904{
    905    int i;
    906
    907    if (s->fw_cfg_order_override > 0) {
    908        return s->fw_cfg_order_override;
    909    }
    910
    911    for (i = 0; i < ARRAY_SIZE(fw_cfg_order); i++) {
    912        if (fw_cfg_order[i].name == NULL) {
    913            continue;
    914        }
    915
    916        if (strcmp(name, fw_cfg_order[i].name) == 0) {
    917            return fw_cfg_order[i].order;
    918        }
    919    }
    920
    921    /* Stick unknown stuff at the end. */
    922    warn_report("Unknown firmware file in legacy mode: %s", name);
    923    return FW_CFG_ORDER_OVERRIDE_LAST;
    924}
    925
    926void fw_cfg_add_file_callback(FWCfgState *s,  const char *filename,
    927                              FWCfgCallback select_cb,
    928                              FWCfgWriteCallback write_cb,
    929                              void *callback_opaque,
    930                              void *data, size_t len, bool read_only)
    931{
    932    int i, index, count;
    933    size_t dsize;
    934    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
    935    int order = 0;
    936
    937    if (!s->files) {
    938        dsize = sizeof(uint32_t) + sizeof(FWCfgFile) * fw_cfg_file_slots(s);
    939        s->files = g_malloc0(dsize);
    940        fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, s->files, dsize);
    941    }
    942
    943    count = be32_to_cpu(s->files->count);
    944    assert(count < fw_cfg_file_slots(s));
    945
    946    /* Find the insertion point. */
    947    if (mc->legacy_fw_cfg_order) {
    948        /*
    949         * Sort by order. For files with the same order, we keep them
    950         * in the sequence in which they were added.
    951         */
    952        order = get_fw_cfg_order(s, filename);
    953        for (index = count;
    954             index > 0 && order < s->entry_order[index - 1];
    955             index--);
    956    } else {
    957        /* Sort by file name. */
    958        for (index = count;
    959             index > 0 && strcmp(filename, s->files->f[index - 1].name) < 0;
    960             index--);
    961    }
    962
    963    /*
    964     * Move all the entries from the index point and after down one
    965     * to create a slot for the new entry.  Because calculations are
    966     * being done with the index, make it so that "i" is the current
    967     * index and "i - 1" is the one being copied from, thus the
    968     * unusual start and end in the for statement.
    969     */
    970    for (i = count; i > index; i--) {
    971        s->files->f[i] = s->files->f[i - 1];
    972        s->files->f[i].select = cpu_to_be16(FW_CFG_FILE_FIRST + i);
    973        s->entries[0][FW_CFG_FILE_FIRST + i] =
    974            s->entries[0][FW_CFG_FILE_FIRST + i - 1];
    975        s->entry_order[i] = s->entry_order[i - 1];
    976    }
    977
    978    memset(&s->files->f[index], 0, sizeof(FWCfgFile));
    979    memset(&s->entries[0][FW_CFG_FILE_FIRST + index], 0, sizeof(FWCfgEntry));
    980
    981    pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name), filename);
    982    for (i = 0; i <= count; i++) {
    983        if (i != index &&
    984            strcmp(s->files->f[index].name, s->files->f[i].name) == 0) {
    985            error_report("duplicate fw_cfg file name: %s",
    986                         s->files->f[index].name);
    987            exit(1);
    988        }
    989    }
    990
    991    fw_cfg_add_bytes_callback(s, FW_CFG_FILE_FIRST + index,
    992                              select_cb, write_cb,
    993                              callback_opaque, data, len,
    994                              read_only);
    995
    996    s->files->f[index].size   = cpu_to_be32(len);
    997    s->files->f[index].select = cpu_to_be16(FW_CFG_FILE_FIRST + index);
    998    s->entry_order[index] = order;
    999    trace_fw_cfg_add_file(s, index, s->files->f[index].name, len);
   1000
   1001    s->files->count = cpu_to_be32(count+1);
   1002    fw_cfg_acpi_mr_save(s, filename, len);
   1003}
   1004
   1005void fw_cfg_add_file(FWCfgState *s,  const char *filename,
   1006                     void *data, size_t len)
   1007{
   1008    fw_cfg_add_file_callback(s, filename, NULL, NULL, NULL, data, len, true);
   1009}
   1010
   1011void *fw_cfg_modify_file(FWCfgState *s, const char *filename,
   1012                        void *data, size_t len)
   1013{
   1014    int i, index;
   1015    void *ptr = NULL;
   1016
   1017    assert(s->files);
   1018
   1019    index = be32_to_cpu(s->files->count);
   1020
   1021    for (i = 0; i < index; i++) {
   1022        if (strcmp(filename, s->files->f[i].name) == 0) {
   1023            ptr = fw_cfg_modify_bytes_read(s, FW_CFG_FILE_FIRST + i,
   1024                                           data, len);
   1025            s->files->f[i].size   = cpu_to_be32(len);
   1026            fw_cfg_acpi_mr_save(s, filename, len);
   1027            return ptr;
   1028        }
   1029    }
   1030
   1031    assert(index < fw_cfg_file_slots(s));
   1032
   1033    /* add new one */
   1034    fw_cfg_add_file_callback(s, filename, NULL, NULL, NULL, data, len, true);
   1035    return NULL;
   1036}
   1037
   1038bool fw_cfg_add_from_generator(FWCfgState *s, const char *filename,
   1039                               const char *gen_id, Error **errp)
   1040{
   1041    FWCfgDataGeneratorClass *klass;
   1042    GByteArray *array;
   1043    Object *obj;
   1044    gsize size;
   1045
   1046    obj = object_resolve_path_component(object_get_objects_root(), gen_id);
   1047    if (!obj) {
   1048        error_setg(errp, "Cannot find object ID '%s'", gen_id);
   1049        return false;
   1050    }
   1051    if (!object_dynamic_cast(obj, TYPE_FW_CFG_DATA_GENERATOR_INTERFACE)) {
   1052        error_setg(errp, "Object ID '%s' is not a '%s' subclass",
   1053                   gen_id, TYPE_FW_CFG_DATA_GENERATOR_INTERFACE);
   1054        return false;
   1055    }
   1056    klass = FW_CFG_DATA_GENERATOR_GET_CLASS(obj);
   1057    array = klass->get_data(obj, errp);
   1058    if (!array) {
   1059        return false;
   1060    }
   1061    size = array->len;
   1062    fw_cfg_add_file(s, filename, g_byte_array_free(array, FALSE), size);
   1063
   1064    return true;
   1065}
   1066
   1067void fw_cfg_add_extra_pci_roots(PCIBus *bus, FWCfgState *s)
   1068{
   1069    int extra_hosts = 0;
   1070
   1071    if (!bus) {
   1072        return;
   1073    }
   1074
   1075    QLIST_FOREACH(bus, &bus->child, sibling) {
   1076        /* look for expander root buses */
   1077        if (pci_bus_is_root(bus)) {
   1078            extra_hosts++;
   1079        }
   1080    }
   1081
   1082    if (extra_hosts && s) {
   1083        uint64_t *val = g_malloc(sizeof(*val));
   1084        *val = cpu_to_le64(extra_hosts);
   1085        fw_cfg_add_file(s, "etc/extra-pci-roots", val, sizeof(*val));
   1086    }
   1087}
   1088
   1089static void fw_cfg_machine_reset(void *opaque)
   1090{
   1091    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
   1092    FWCfgState *s = opaque;
   1093    void *ptr;
   1094    size_t len;
   1095    char *buf;
   1096
   1097    buf = get_boot_devices_list(&len);
   1098    ptr = fw_cfg_modify_file(s, "bootorder", (uint8_t *)buf, len);
   1099    g_free(ptr);
   1100
   1101    if (!mc->legacy_fw_cfg_order) {
   1102        buf = get_boot_devices_lchs_list(&len);
   1103        ptr = fw_cfg_modify_file(s, "bios-geometry", (uint8_t *)buf, len);
   1104        g_free(ptr);
   1105    }
   1106}
   1107
   1108static void fw_cfg_machine_ready(struct Notifier *n, void *data)
   1109{
   1110    FWCfgState *s = container_of(n, FWCfgState, machine_ready);
   1111    qemu_register_reset(fw_cfg_machine_reset, s);
   1112}
   1113
   1114static Property fw_cfg_properties[] = {
   1115    DEFINE_PROP_BOOL("acpi-mr-restore", FWCfgState, acpi_mr_restore, true),
   1116    DEFINE_PROP_END_OF_LIST(),
   1117};
   1118
   1119static void fw_cfg_common_realize(DeviceState *dev, Error **errp)
   1120{
   1121    FWCfgState *s = FW_CFG(dev);
   1122    MachineState *machine = MACHINE(qdev_get_machine());
   1123    uint32_t version = FW_CFG_VERSION;
   1124
   1125    if (!fw_cfg_find()) {
   1126        error_setg(errp, "at most one %s device is permitted", TYPE_FW_CFG);
   1127        return;
   1128    }
   1129
   1130    fw_cfg_add_bytes(s, FW_CFG_SIGNATURE, (char *)"QEMU", 4);
   1131    fw_cfg_add_bytes(s, FW_CFG_UUID, &qemu_uuid, 16);
   1132    fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)!machine->enable_graphics);
   1133    fw_cfg_add_i16(s, FW_CFG_BOOT_MENU, (uint16_t)boot_menu);
   1134    fw_cfg_bootsplash(s);
   1135    fw_cfg_reboot(s);
   1136
   1137    if (s->dma_enabled) {
   1138        version |= FW_CFG_VERSION_DMA;
   1139    }
   1140
   1141    fw_cfg_add_i32(s, FW_CFG_ID, version);
   1142
   1143    s->machine_ready.notify = fw_cfg_machine_ready;
   1144    qemu_add_machine_init_done_notifier(&s->machine_ready);
   1145}
   1146
   1147FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase,
   1148                                AddressSpace *dma_as)
   1149{
   1150    DeviceState *dev;
   1151    SysBusDevice *sbd;
   1152    FWCfgIoState *ios;
   1153    FWCfgState *s;
   1154    bool dma_requested = dma_iobase && dma_as;
   1155
   1156    dev = qdev_new(TYPE_FW_CFG_IO);
   1157    if (!dma_requested) {
   1158        qdev_prop_set_bit(dev, "dma_enabled", false);
   1159    }
   1160
   1161    object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
   1162                              OBJECT(dev));
   1163
   1164    sbd = SYS_BUS_DEVICE(dev);
   1165    sysbus_realize_and_unref(sbd, &error_fatal);
   1166    ios = FW_CFG_IO(dev);
   1167    sysbus_add_io(sbd, iobase, &ios->comb_iomem);
   1168
   1169    s = FW_CFG(dev);
   1170
   1171    if (s->dma_enabled) {
   1172        /* 64 bits for the address field */
   1173        s->dma_as = dma_as;
   1174        s->dma_addr = 0;
   1175        sysbus_add_io(sbd, dma_iobase, &s->dma_iomem);
   1176    }
   1177
   1178    return s;
   1179}
   1180
   1181FWCfgState *fw_cfg_init_io(uint32_t iobase)
   1182{
   1183    return fw_cfg_init_io_dma(iobase, 0, NULL);
   1184}
   1185
   1186FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr,
   1187                                 hwaddr data_addr, uint32_t data_width,
   1188                                 hwaddr dma_addr, AddressSpace *dma_as)
   1189{
   1190    DeviceState *dev;
   1191    SysBusDevice *sbd;
   1192    FWCfgState *s;
   1193    bool dma_requested = dma_addr && dma_as;
   1194
   1195    dev = qdev_new(TYPE_FW_CFG_MEM);
   1196    qdev_prop_set_uint32(dev, "data_width", data_width);
   1197    if (!dma_requested) {
   1198        qdev_prop_set_bit(dev, "dma_enabled", false);
   1199    }
   1200
   1201    object_property_add_child(OBJECT(qdev_get_machine()), TYPE_FW_CFG,
   1202                              OBJECT(dev));
   1203
   1204    sbd = SYS_BUS_DEVICE(dev);
   1205    sysbus_realize_and_unref(sbd, &error_fatal);
   1206    sysbus_mmio_map(sbd, 0, ctl_addr);
   1207    sysbus_mmio_map(sbd, 1, data_addr);
   1208
   1209    s = FW_CFG(dev);
   1210
   1211    if (s->dma_enabled) {
   1212        s->dma_as = dma_as;
   1213        s->dma_addr = 0;
   1214        sysbus_mmio_map(sbd, 2, dma_addr);
   1215    }
   1216
   1217    return s;
   1218}
   1219
   1220FWCfgState *fw_cfg_init_mem(hwaddr ctl_addr, hwaddr data_addr)
   1221{
   1222    return fw_cfg_init_mem_wide(ctl_addr, data_addr,
   1223                                fw_cfg_data_mem_ops.valid.max_access_size,
   1224                                0, NULL);
   1225}
   1226
   1227
   1228FWCfgState *fw_cfg_find(void)
   1229{
   1230    /* Returns NULL unless there is exactly one fw_cfg device */
   1231    return FW_CFG(object_resolve_path_type("", TYPE_FW_CFG, NULL));
   1232}
   1233
   1234
   1235static void fw_cfg_class_init(ObjectClass *klass, void *data)
   1236{
   1237    DeviceClass *dc = DEVICE_CLASS(klass);
   1238
   1239    dc->reset = fw_cfg_reset;
   1240    dc->vmsd = &vmstate_fw_cfg;
   1241
   1242    device_class_set_props(dc, fw_cfg_properties);
   1243}
   1244
   1245static const TypeInfo fw_cfg_info = {
   1246    .name          = TYPE_FW_CFG,
   1247    .parent        = TYPE_SYS_BUS_DEVICE,
   1248    .abstract      = true,
   1249    .instance_size = sizeof(FWCfgState),
   1250    .class_init    = fw_cfg_class_init,
   1251};
   1252
   1253static void fw_cfg_file_slots_allocate(FWCfgState *s, Error **errp)
   1254{
   1255    uint16_t file_slots_max;
   1256
   1257    if (fw_cfg_file_slots(s) < FW_CFG_FILE_SLOTS_MIN) {
   1258        error_setg(errp, "\"file_slots\" must be at least 0x%x",
   1259                   FW_CFG_FILE_SLOTS_MIN);
   1260        return;
   1261    }
   1262
   1263    /* (UINT16_MAX & FW_CFG_ENTRY_MASK) is the highest inclusive selector value
   1264     * that we permit. The actual (exclusive) value coming from the
   1265     * configuration is (FW_CFG_FILE_FIRST + fw_cfg_file_slots(s)). */
   1266    file_slots_max = (UINT16_MAX & FW_CFG_ENTRY_MASK) - FW_CFG_FILE_FIRST + 1;
   1267    if (fw_cfg_file_slots(s) > file_slots_max) {
   1268        error_setg(errp, "\"file_slots\" must not exceed 0x%" PRIx16,
   1269                   file_slots_max);
   1270        return;
   1271    }
   1272
   1273    s->entries[0] = g_new0(FWCfgEntry, fw_cfg_max_entry(s));
   1274    s->entries[1] = g_new0(FWCfgEntry, fw_cfg_max_entry(s));
   1275    s->entry_order = g_new0(int, fw_cfg_max_entry(s));
   1276}
   1277
   1278static Property fw_cfg_io_properties[] = {
   1279    DEFINE_PROP_BOOL("dma_enabled", FWCfgIoState, parent_obj.dma_enabled,
   1280                     true),
   1281    DEFINE_PROP_UINT16("x-file-slots", FWCfgIoState, parent_obj.file_slots,
   1282                       FW_CFG_FILE_SLOTS_DFLT),
   1283    DEFINE_PROP_END_OF_LIST(),
   1284};
   1285
   1286static void fw_cfg_io_realize(DeviceState *dev, Error **errp)
   1287{
   1288    ERRP_GUARD();
   1289    FWCfgIoState *s = FW_CFG_IO(dev);
   1290
   1291    fw_cfg_file_slots_allocate(FW_CFG(s), errp);
   1292    if (*errp) {
   1293        return;
   1294    }
   1295
   1296    /* when using port i/o, the 8-bit data register ALWAYS overlaps
   1297     * with half of the 16-bit control register. Hence, the total size
   1298     * of the i/o region used is FW_CFG_CTL_SIZE */
   1299    memory_region_init_io(&s->comb_iomem, OBJECT(s), &fw_cfg_comb_mem_ops,
   1300                          FW_CFG(s), "fwcfg", FW_CFG_CTL_SIZE);
   1301
   1302    if (FW_CFG(s)->dma_enabled) {
   1303        memory_region_init_io(&FW_CFG(s)->dma_iomem, OBJECT(s),
   1304                              &fw_cfg_dma_mem_ops, FW_CFG(s), "fwcfg.dma",
   1305                              sizeof(dma_addr_t));
   1306    }
   1307
   1308    fw_cfg_common_realize(dev, errp);
   1309}
   1310
   1311static void fw_cfg_io_class_init(ObjectClass *klass, void *data)
   1312{
   1313    DeviceClass *dc = DEVICE_CLASS(klass);
   1314
   1315    dc->realize = fw_cfg_io_realize;
   1316    device_class_set_props(dc, fw_cfg_io_properties);
   1317}
   1318
   1319static const TypeInfo fw_cfg_io_info = {
   1320    .name          = TYPE_FW_CFG_IO,
   1321    .parent        = TYPE_FW_CFG,
   1322    .instance_size = sizeof(FWCfgIoState),
   1323    .class_init    = fw_cfg_io_class_init,
   1324};
   1325
   1326
   1327static Property fw_cfg_mem_properties[] = {
   1328    DEFINE_PROP_UINT32("data_width", FWCfgMemState, data_width, -1),
   1329    DEFINE_PROP_BOOL("dma_enabled", FWCfgMemState, parent_obj.dma_enabled,
   1330                     true),
   1331    DEFINE_PROP_UINT16("x-file-slots", FWCfgMemState, parent_obj.file_slots,
   1332                       FW_CFG_FILE_SLOTS_DFLT),
   1333    DEFINE_PROP_END_OF_LIST(),
   1334};
   1335
   1336static void fw_cfg_mem_realize(DeviceState *dev, Error **errp)
   1337{
   1338    ERRP_GUARD();
   1339    FWCfgMemState *s = FW_CFG_MEM(dev);
   1340    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
   1341    const MemoryRegionOps *data_ops = &fw_cfg_data_mem_ops;
   1342
   1343    fw_cfg_file_slots_allocate(FW_CFG(s), errp);
   1344    if (*errp) {
   1345        return;
   1346    }
   1347
   1348    memory_region_init_io(&s->ctl_iomem, OBJECT(s), &fw_cfg_ctl_mem_ops,
   1349                          FW_CFG(s), "fwcfg.ctl", FW_CFG_CTL_SIZE);
   1350    sysbus_init_mmio(sbd, &s->ctl_iomem);
   1351
   1352    if (s->data_width > data_ops->valid.max_access_size) {
   1353        s->wide_data_ops = *data_ops;
   1354
   1355        s->wide_data_ops.valid.max_access_size = s->data_width;
   1356        s->wide_data_ops.impl.max_access_size  = s->data_width;
   1357        data_ops = &s->wide_data_ops;
   1358    }
   1359    memory_region_init_io(&s->data_iomem, OBJECT(s), data_ops, FW_CFG(s),
   1360                          "fwcfg.data", data_ops->valid.max_access_size);
   1361    sysbus_init_mmio(sbd, &s->data_iomem);
   1362
   1363    if (FW_CFG(s)->dma_enabled) {
   1364        memory_region_init_io(&FW_CFG(s)->dma_iomem, OBJECT(s),
   1365                              &fw_cfg_dma_mem_ops, FW_CFG(s), "fwcfg.dma",
   1366                              sizeof(dma_addr_t));
   1367        sysbus_init_mmio(sbd, &FW_CFG(s)->dma_iomem);
   1368    }
   1369
   1370    fw_cfg_common_realize(dev, errp);
   1371}
   1372
   1373static void fw_cfg_mem_class_init(ObjectClass *klass, void *data)
   1374{
   1375    DeviceClass *dc = DEVICE_CLASS(klass);
   1376
   1377    dc->realize = fw_cfg_mem_realize;
   1378    device_class_set_props(dc, fw_cfg_mem_properties);
   1379}
   1380
   1381static const TypeInfo fw_cfg_mem_info = {
   1382    .name          = TYPE_FW_CFG_MEM,
   1383    .parent        = TYPE_FW_CFG,
   1384    .instance_size = sizeof(FWCfgMemState),
   1385    .class_init    = fw_cfg_mem_class_init,
   1386};
   1387
   1388static void fw_cfg_register_types(void)
   1389{
   1390    type_register_static(&fw_cfg_info);
   1391    type_register_static(&fw_cfg_io_info);
   1392    type_register_static(&fw_cfg_mem_info);
   1393}
   1394
   1395type_init(fw_cfg_register_types)