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 2521cbfe5fSPeter Maydell #include "qemu/osdep.h" 2647d17c0aSAlistair Francis #include "qemu/error-report.h" 2783c9f4caSPaolo Bonzini #include "hw/boards.h" 282d0ed5e6SPaul Durrant #include "hw/xen/xen-legacy-backend.h" 29108f7bbaSPaul Durrant #include "hw/xen/xen-bus.h" 304be74634SMarkus Armbruster #include "sysemu/block-backend.h" 3146517dd4SMarkus Armbruster #include "sysemu/sysemu.h" 32e37630caSaliguori 333ef96221SMarcel Apfelbaum static void xen_init_pv(MachineState *machine) 34e37630caSaliguori { 35751c6a17SGerd Hoffmann DriveInfo *dinfo; 36751c6a17SGerd Hoffmann int i; 37e37630caSaliguori 38d94f9486Saliguori /* Initialize backend core & drivers */ 39d94f9486Saliguori if (xen_be_init() != 0) { 4047d17c0aSAlistair Francis error_report("%s: xen backend core setup failed", __func__); 41d94f9486Saliguori exit(1); 42d94f9486Saliguori } 439306acb5Saliguori 449306acb5Saliguori switch (xen_mode) { 459306acb5Saliguori case XEN_ATTACH: 461077bcacSAnthony PERARD /* nothing to do, libxl handles everything */ 479306acb5Saliguori break; 489306acb5Saliguori case XEN_EMULATE: 4947d17c0aSAlistair Francis error_report("xen emulation not implemented (yet)"); 509306acb5Saliguori exit(1); 519306acb5Saliguori break; 5264a7ad6fSIan Campbell default: 5347d17c0aSAlistair Francis error_report("unhandled xen_mode %d", xen_mode); 5464a7ad6fSIan Campbell exit(1); 5564a7ad6fSIan Campbell break; 569306acb5Saliguori } 579306acb5Saliguori 580e39bb02SJuergen Gross xen_be_register_common(); 59e7151f83Saliguori xen_be_register("vfb", &xen_framebuffer_ops); 60e613b064Saliguori xen_be_register("qnic", &xen_netdev_ops); 61e7151f83Saliguori 6294909d9fSaliguori /* configure framebuffer */ 63*d9018fbbSThomas Huth if (vga_interface_type == VGA_XENFB) { 6494909d9fSaliguori xen_config_dev_vfb(0, "vnc"); 6594909d9fSaliguori xen_config_dev_vkbd(0); 6694909d9fSaliguori } 6794909d9fSaliguori 682c8b24a3Saliguori /* configure disks */ 692c8b24a3Saliguori for (i = 0; i < 16; i++) { 70751c6a17SGerd Hoffmann dinfo = drive_get(IF_XEN, 0, i); 71751c6a17SGerd Hoffmann if (!dinfo) 722c8b24a3Saliguori continue; 73751c6a17SGerd Hoffmann xen_config_dev_blk(dinfo); 742c8b24a3Saliguori } 752c8b24a3Saliguori 762c8b24a3Saliguori /* configure nics */ 772c8b24a3Saliguori for (i = 0; i < nb_nics; i++) { 782c8b24a3Saliguori if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen")) 792c8b24a3Saliguori continue; 802c8b24a3Saliguori xen_config_dev_nic(nd_table + i); 812c8b24a3Saliguori } 822c8b24a3Saliguori 83108f7bbaSPaul Durrant xen_bus_init(); 84108f7bbaSPaul Durrant 852c8b24a3Saliguori /* config cleanup hook */ 8628695489SAnthony Liguori atexit(xen_config_cleanup); 87e37630caSaliguori } 88e37630caSaliguori 89e264d29dSEduardo Habkost static void xenpv_machine_init(MachineClass *mc) 90f80f9ec9SAnthony Liguori { 91e264d29dSEduardo Habkost mc->desc = "Xen Para-virtualized PC"; 92e264d29dSEduardo Habkost mc->init = xen_init_pv; 93e264d29dSEduardo Habkost mc->max_cpus = 1; 94e264d29dSEduardo Habkost mc->default_machine_opts = "accel=xen"; 95f80f9ec9SAnthony Liguori } 96f80f9ec9SAnthony Liguori 97e264d29dSEduardo Habkost DEFINE_MACHINE("xenpv", xenpv_machine_init) 98