1e37630caSaliguori /* 2e37630caSaliguori * QEMU Xen PV Machine 3e37630caSaliguori * 4e37630caSaliguori * Copyright (c) 2007 Red Hat 5e37630caSaliguori * 6e37630caSaliguori * Permission is hereby granted, free of charge, to any person obtaining a copy 7e37630caSaliguori * of this software and associated documentation files (the "Software"), to deal 8e37630caSaliguori * in the Software without restriction, including without limitation the rights 9e37630caSaliguori * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10e37630caSaliguori * copies of the Software, and to permit persons to whom the Software is 11e37630caSaliguori * furnished to do so, subject to the following conditions: 12e37630caSaliguori * 13e37630caSaliguori * The above copyright notice and this permission notice shall be included in 14e37630caSaliguori * all copies or substantial portions of the Software. 15e37630caSaliguori * 16e37630caSaliguori * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17e37630caSaliguori * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18e37630caSaliguori * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19e37630caSaliguori * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20e37630caSaliguori * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21e37630caSaliguori * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22e37630caSaliguori * THE SOFTWARE. 23e37630caSaliguori */ 24e37630caSaliguori 2583c9f4caSPaolo Bonzini #include "hw/hw.h" 2683c9f4caSPaolo Bonzini #include "hw/boards.h" 270d09e41aSPaolo Bonzini #include "hw/xen/xen_backend.h" 2847b43a1fSPaolo Bonzini #include "xen_domainbuild.h" 294be74634SMarkus Armbruster #include "sysemu/block-backend.h" 30e37630caSaliguori 313ef96221SMarcel Apfelbaum static void xen_init_pv(MachineState *machine) 32e37630caSaliguori { 333ef96221SMarcel Apfelbaum const char *kernel_filename = machine->kernel_filename; 343ef96221SMarcel Apfelbaum const char *kernel_cmdline = machine->kernel_cmdline; 353ef96221SMarcel Apfelbaum const char *initrd_filename = machine->initrd_filename; 36751c6a17SGerd Hoffmann DriveInfo *dinfo; 37751c6a17SGerd Hoffmann int i; 38e37630caSaliguori 39d94f9486Saliguori /* Initialize backend core & drivers */ 40d94f9486Saliguori if (xen_be_init() != 0) { 41d94f9486Saliguori fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__); 42d94f9486Saliguori exit(1); 43d94f9486Saliguori } 449306acb5Saliguori 459306acb5Saliguori switch (xen_mode) { 469306acb5Saliguori case XEN_ATTACH: 479306acb5Saliguori /* nothing to do, xend handles everything */ 489306acb5Saliguori break; 499306acb5Saliguori case XEN_CREATE: 509306acb5Saliguori if (xen_domain_build_pv(kernel_filename, initrd_filename, 519306acb5Saliguori kernel_cmdline) < 0) { 529306acb5Saliguori fprintf(stderr, "xen pv domain creation failed\n"); 539306acb5Saliguori exit(1); 549306acb5Saliguori } 559306acb5Saliguori break; 569306acb5Saliguori case XEN_EMULATE: 579306acb5Saliguori fprintf(stderr, "xen emulation not implemented (yet)\n"); 589306acb5Saliguori exit(1); 599306acb5Saliguori break; 609306acb5Saliguori } 619306acb5Saliguori 62e57dd20bSaliguori xen_be_register("console", &xen_console_ops); 63e7151f83Saliguori xen_be_register("vkbd", &xen_kbdmouse_ops); 64e7151f83Saliguori xen_be_register("vfb", &xen_framebuffer_ops); 6562d23efaSaliguori xen_be_register("qdisk", &xen_blkdev_ops); 66e613b064Saliguori xen_be_register("qnic", &xen_netdev_ops); 67e7151f83Saliguori 6894909d9fSaliguori /* configure framebuffer */ 6994909d9fSaliguori if (xenfb_enabled) { 7094909d9fSaliguori xen_config_dev_vfb(0, "vnc"); 7194909d9fSaliguori xen_config_dev_vkbd(0); 7294909d9fSaliguori } 7394909d9fSaliguori 742c8b24a3Saliguori /* configure disks */ 752c8b24a3Saliguori for (i = 0; i < 16; i++) { 76751c6a17SGerd Hoffmann dinfo = drive_get(IF_XEN, 0, i); 77751c6a17SGerd Hoffmann if (!dinfo) 782c8b24a3Saliguori continue; 79751c6a17SGerd Hoffmann xen_config_dev_blk(dinfo); 802c8b24a3Saliguori } 812c8b24a3Saliguori 822c8b24a3Saliguori /* configure nics */ 832c8b24a3Saliguori for (i = 0; i < nb_nics; i++) { 842c8b24a3Saliguori if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen")) 852c8b24a3Saliguori continue; 862c8b24a3Saliguori xen_config_dev_nic(nd_table + i); 872c8b24a3Saliguori } 882c8b24a3Saliguori 892c8b24a3Saliguori /* config cleanup hook */ 9028695489SAnthony Liguori atexit(xen_config_cleanup); 912c8b24a3Saliguori 92e7151f83Saliguori /* setup framebuffer */ 93e7151f83Saliguori xen_init_display(xen_domid); 94e37630caSaliguori } 95e37630caSaliguori 96*e264d29dSEduardo Habkost static void xenpv_machine_init(MachineClass *mc) 97f80f9ec9SAnthony Liguori { 98*e264d29dSEduardo Habkost mc->desc = "Xen Para-virtualized PC"; 99*e264d29dSEduardo Habkost mc->init = xen_init_pv; 100*e264d29dSEduardo Habkost mc->max_cpus = 1; 101*e264d29dSEduardo Habkost mc->default_machine_opts = "accel=xen"; 102f80f9ec9SAnthony Liguori } 103f80f9ec9SAnthony Liguori 104*e264d29dSEduardo Habkost DEFINE_MACHINE("xenpv", xenpv_machine_init) 105