qemu/arch_init.c
<<
>>
Prefs
   1/*
   2 * QEMU System Emulator
   3 *
   4 * Copyright (c) 2003-2008 Fabrice Bellard
   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#include "qemu/osdep.h"
  25#include "qemu-common.h"
  26#include "cpu.h"
  27#include "sysemu/sysemu.h"
  28#include "sysemu/arch_init.h"
  29#include "hw/pci/pci.h"
  30#include "hw/audio/audio.h"
  31#include "hw/smbios/smbios.h"
  32#include "qemu/config-file.h"
  33#include "qemu/error-report.h"
  34#include "qmp-commands.h"
  35#include "hw/acpi/acpi.h"
  36#include "qemu/help_option.h"
  37
  38#ifdef TARGET_SPARC
  39int graphic_width = 1024;
  40int graphic_height = 768;
  41int graphic_depth = 8;
  42#else
  43int graphic_width = 800;
  44int graphic_height = 600;
  45int graphic_depth = 32;
  46#endif
  47
  48
  49#if defined(TARGET_ALPHA)
  50#define QEMU_ARCH QEMU_ARCH_ALPHA
  51#elif defined(TARGET_ARM)
  52#define QEMU_ARCH QEMU_ARCH_ARM
  53#elif defined(TARGET_CRIS)
  54#define QEMU_ARCH QEMU_ARCH_CRIS
  55#elif defined(TARGET_I386)
  56#define QEMU_ARCH QEMU_ARCH_I386
  57#elif defined(TARGET_M68K)
  58#define QEMU_ARCH QEMU_ARCH_M68K
  59#elif defined(TARGET_LM32)
  60#define QEMU_ARCH QEMU_ARCH_LM32
  61#elif defined(TARGET_MICROBLAZE)
  62#define QEMU_ARCH QEMU_ARCH_MICROBLAZE
  63#elif defined(TARGET_MIPS)
  64#define QEMU_ARCH QEMU_ARCH_MIPS
  65#elif defined(TARGET_MOXIE)
  66#define QEMU_ARCH QEMU_ARCH_MOXIE
  67#elif defined(TARGET_OPENRISC)
  68#define QEMU_ARCH QEMU_ARCH_OPENRISC
  69#elif defined(TARGET_PPC)
  70#define QEMU_ARCH QEMU_ARCH_PPC
  71#elif defined(TARGET_S390X)
  72#define QEMU_ARCH QEMU_ARCH_S390X
  73#elif defined(TARGET_SH4)
  74#define QEMU_ARCH QEMU_ARCH_SH4
  75#elif defined(TARGET_SPARC)
  76#define QEMU_ARCH QEMU_ARCH_SPARC
  77#elif defined(TARGET_XTENSA)
  78#define QEMU_ARCH QEMU_ARCH_XTENSA
  79#elif defined(TARGET_UNICORE32)
  80#define QEMU_ARCH QEMU_ARCH_UNICORE32
  81#elif defined(TARGET_TRICORE)
  82#define QEMU_ARCH QEMU_ARCH_TRICORE
  83#endif
  84
  85const uint32_t arch_type = QEMU_ARCH;
  86
  87static struct defconfig_file {
  88    const char *filename;
  89    /* Indicates it is an user config file (disabled by -no-user-config) */
  90    bool userconfig;
  91} default_config_files[] = {
  92    { CONFIG_QEMU_CONFDIR "/qemu.conf",                   true },
  93    { NULL }, /* end of list */
  94};
  95
  96int qemu_read_default_config_files(bool userconfig)
  97{
  98    int ret;
  99    struct defconfig_file *f;
 100
 101    for (f = default_config_files; f->filename; f++) {
 102        if (!userconfig && f->userconfig) {
 103            continue;
 104        }
 105        ret = qemu_read_config_file(f->filename);
 106        if (ret < 0 && ret != -ENOENT) {
 107            return ret;
 108        }
 109    }
 110
 111    return 0;
 112}
 113
 114struct soundhw {
 115    const char *name;
 116    const char *descr;
 117    int enabled;
 118    int isa;
 119    union {
 120        int (*init_isa) (ISABus *bus);
 121        int (*init_pci) (PCIBus *bus);
 122    } init;
 123};
 124
 125static struct soundhw soundhw[9];
 126static int soundhw_count;
 127
 128void isa_register_soundhw(const char *name, const char *descr,
 129                          int (*init_isa)(ISABus *bus))
 130{
 131    assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
 132    soundhw[soundhw_count].name = name;
 133    soundhw[soundhw_count].descr = descr;
 134    soundhw[soundhw_count].isa = 1;
 135    soundhw[soundhw_count].init.init_isa = init_isa;
 136    soundhw_count++;
 137}
 138
 139void pci_register_soundhw(const char *name, const char *descr,
 140                          int (*init_pci)(PCIBus *bus))
 141{
 142    assert(soundhw_count < ARRAY_SIZE(soundhw) - 1);
 143    soundhw[soundhw_count].name = name;
 144    soundhw[soundhw_count].descr = descr;
 145    soundhw[soundhw_count].isa = 0;
 146    soundhw[soundhw_count].init.init_pci = init_pci;
 147    soundhw_count++;
 148}
 149
 150void select_soundhw(const char *optarg)
 151{
 152    struct soundhw *c;
 153
 154    if (is_help_option(optarg)) {
 155    show_valid_cards:
 156
 157        if (soundhw_count) {
 158             printf("Valid sound card names (comma separated):\n");
 159             for (c = soundhw; c->name; ++c) {
 160                 printf ("%-11s %s\n", c->name, c->descr);
 161             }
 162             printf("\n-soundhw all will enable all of the above\n");
 163        } else {
 164             printf("Machine has no user-selectable audio hardware "
 165                    "(it may or may not have always-present audio hardware).\n");
 166        }
 167        exit(!is_help_option(optarg));
 168    }
 169    else {
 170        size_t l;
 171        const char *p;
 172        char *e;
 173        int bad_card = 0;
 174
 175        if (!strcmp(optarg, "all")) {
 176            for (c = soundhw; c->name; ++c) {
 177                c->enabled = 1;
 178            }
 179            return;
 180        }
 181
 182        p = optarg;
 183        while (*p) {
 184            e = strchr(p, ',');
 185            l = !e ? strlen(p) : (size_t) (e - p);
 186
 187            for (c = soundhw; c->name; ++c) {
 188                if (!strncmp(c->name, p, l) && !c->name[l]) {
 189                    c->enabled = 1;
 190                    break;
 191                }
 192            }
 193
 194            if (!c->name) {
 195                if (l > 80) {
 196                    error_report("Unknown sound card name (too big to show)");
 197                }
 198                else {
 199                    error_report("Unknown sound card name `%.*s'",
 200                                 (int) l, p);
 201                }
 202                bad_card = 1;
 203            }
 204            p += l + (e != NULL);
 205        }
 206
 207        if (bad_card) {
 208            goto show_valid_cards;
 209        }
 210    }
 211}
 212
 213void audio_init(void)
 214{
 215    struct soundhw *c;
 216    ISABus *isa_bus = (ISABus *) object_resolve_path_type("", TYPE_ISA_BUS, NULL);
 217    PCIBus *pci_bus = (PCIBus *) object_resolve_path_type("", TYPE_PCI_BUS, NULL);
 218
 219    for (c = soundhw; c->name; ++c) {
 220        if (c->enabled) {
 221            if (c->isa) {
 222                if (!isa_bus) {
 223                    error_report("ISA bus not available for %s", c->name);
 224                    exit(1);
 225                }
 226                c->init.init_isa(isa_bus);
 227            } else {
 228                if (!pci_bus) {
 229                    error_report("PCI bus not available for %s", c->name);
 230                    exit(1);
 231                }
 232                c->init.init_pci(pci_bus);
 233            }
 234        }
 235    }
 236}
 237
 238int qemu_uuid_parse(const char *str, uint8_t *uuid)
 239{
 240    int ret;
 241
 242    if (strlen(str) != 36) {
 243        return -1;
 244    }
 245
 246    ret = sscanf(str, UUID_FMT, &uuid[0], &uuid[1], &uuid[2], &uuid[3],
 247                 &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9],
 248                 &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14],
 249                 &uuid[15]);
 250
 251    if (ret != 16) {
 252        return -1;
 253    }
 254    return 0;
 255}
 256
 257void do_acpitable_option(const QemuOpts *opts)
 258{
 259#ifdef TARGET_I386
 260    Error *err = NULL;
 261
 262    acpi_table_add(opts, &err);
 263    if (err) {
 264        error_reportf_err(err, "Wrong acpi table provided: ");
 265        exit(1);
 266    }
 267#endif
 268}
 269
 270void do_smbios_option(QemuOpts *opts)
 271{
 272#ifdef TARGET_I386
 273    smbios_entry_add(opts);
 274#endif
 275}
 276
 277int kvm_available(void)
 278{
 279#ifdef CONFIG_KVM
 280    return 1;
 281#else
 282    return 0;
 283#endif
 284}
 285
 286int xen_available(void)
 287{
 288#ifdef CONFIG_XEN
 289    return 1;
 290#else
 291    return 0;
 292#endif
 293}
 294
 295
 296TargetInfo *qmp_query_target(Error **errp)
 297{
 298    TargetInfo *info = g_malloc0(sizeof(*info));
 299
 300    info->arch = g_strdup(TARGET_NAME);
 301
 302    return info;
 303}
 304