qemu/hw/xen_machine_pv.c
<<
>>
Prefs
   1/*
   2 * QEMU Xen PV Machine
   3 *
   4 * Copyright (c) 2007 Red Hat
   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 "hw.h"
  26#include "pc.h"
  27#include "boards.h"
  28#include "xen_backend.h"
  29#include "xen_domainbuild.h"
  30#include "blockdev.h"
  31
  32static void xen_init_pv(ram_addr_t ram_size,
  33                        const char *boot_device,
  34                        const char *kernel_filename,
  35                        const char *kernel_cmdline,
  36                        const char *initrd_filename,
  37                        const char *cpu_model)
  38{
  39    CPUState *env;
  40    DriveInfo *dinfo;
  41    int i;
  42
  43    /* Initialize a dummy CPU */
  44    if (cpu_model == NULL) {
  45#ifdef TARGET_X86_64
  46        cpu_model = "qemu64";
  47#else
  48        cpu_model = "qemu32";
  49#endif
  50    }
  51    env = cpu_init(cpu_model);
  52    env->halted = 1;
  53
  54    /* Initialize backend core & drivers */
  55    if (xen_be_init() != 0) {
  56        fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__);
  57        exit(1);
  58    }
  59
  60    switch (xen_mode) {
  61    case XEN_ATTACH:
  62        /* nothing to do, xend handles everything */
  63        break;
  64    case XEN_CREATE:
  65        if (xen_domain_build_pv(kernel_filename, initrd_filename,
  66                                kernel_cmdline) < 0) {
  67            fprintf(stderr, "xen pv domain creation failed\n");
  68            exit(1);
  69        }
  70        break;
  71    case XEN_EMULATE:
  72        fprintf(stderr, "xen emulation not implemented (yet)\n");
  73        exit(1);
  74        break;
  75    }
  76
  77    xen_be_register("console", &xen_console_ops);
  78    xen_be_register("vkbd", &xen_kbdmouse_ops);
  79    xen_be_register("vfb", &xen_framebuffer_ops);
  80    xen_be_register("qdisk", &xen_blkdev_ops);
  81    xen_be_register("qnic", &xen_netdev_ops);
  82
  83    /* configure framebuffer */
  84    if (xenfb_enabled) {
  85        xen_config_dev_vfb(0, "vnc");
  86        xen_config_dev_vkbd(0);
  87    }
  88
  89    /* configure disks */
  90    for (i = 0; i < 16; i++) {
  91        dinfo = drive_get(IF_XEN, 0, i);
  92        if (!dinfo)
  93            continue;
  94        xen_config_dev_blk(dinfo);
  95    }
  96
  97    /* configure nics */
  98    for (i = 0; i < nb_nics; i++) {
  99        if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen"))
 100            continue;
 101        xen_config_dev_nic(nd_table + i);
 102    }
 103
 104    /* config cleanup hook */
 105    atexit(xen_config_cleanup);
 106
 107    /* setup framebuffer */
 108    xen_init_display(xen_domid);
 109}
 110
 111static QEMUMachine xenpv_machine = {
 112    .name = "xenpv",
 113    .desc = "Xen Para-virtualized PC",
 114    .init = xen_init_pv,
 115    .max_cpus = 1,
 116    .default_machine_opts = "accel=xen",
 117};
 118
 119static void xenpv_machine_init(void)
 120{
 121    qemu_register_machine(&xenpv_machine);
 122}
 123
 124machine_init(xenpv_machine_init);
 125