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" 2683c9f4caSPaolo Bonzini #include "hw/hw.h" 2783c9f4caSPaolo Bonzini #include "hw/boards.h" 280d09e41aSPaolo Bonzini #include "hw/xen/xen_backend.h" 2947b43a1fSPaolo Bonzini #include "xen_domainbuild.h" 304be74634SMarkus Armbruster #include "sysemu/block-backend.h" 31e37630caSaliguori 323ef96221SMarcel Apfelbaum static void xen_init_pv(MachineState *machine) 33e37630caSaliguori { 34751c6a17SGerd Hoffmann DriveInfo *dinfo; 35751c6a17SGerd Hoffmann int i; 36e37630caSaliguori 37d94f9486Saliguori /* Initialize backend core & drivers */ 38d94f9486Saliguori if (xen_be_init() != 0) { 39d94f9486Saliguori fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__); 40d94f9486Saliguori exit(1); 41d94f9486Saliguori } 429306acb5Saliguori 439306acb5Saliguori switch (xen_mode) { 449306acb5Saliguori case XEN_ATTACH: 459306acb5Saliguori /* nothing to do, xend handles everything */ 469306acb5Saliguori break; 4764a7ad6fSIan Campbell #ifdef CONFIG_XEN_PV_DOMAIN_BUILD 4864a7ad6fSIan Campbell case XEN_CREATE: { 4964a7ad6fSIan Campbell const char *kernel_filename = machine->kernel_filename; 5064a7ad6fSIan Campbell const char *kernel_cmdline = machine->kernel_cmdline; 5164a7ad6fSIan Campbell const char *initrd_filename = machine->initrd_filename; 529306acb5Saliguori if (xen_domain_build_pv(kernel_filename, initrd_filename, 539306acb5Saliguori kernel_cmdline) < 0) { 549306acb5Saliguori fprintf(stderr, "xen pv domain creation failed\n"); 559306acb5Saliguori exit(1); 569306acb5Saliguori } 579306acb5Saliguori break; 5864a7ad6fSIan Campbell } 5964a7ad6fSIan Campbell #endif 609306acb5Saliguori case XEN_EMULATE: 619306acb5Saliguori fprintf(stderr, "xen emulation not implemented (yet)\n"); 629306acb5Saliguori exit(1); 639306acb5Saliguori break; 6464a7ad6fSIan Campbell default: 6564a7ad6fSIan Campbell fprintf(stderr, "unhandled xen_mode %d\n", xen_mode); 6664a7ad6fSIan Campbell exit(1); 6764a7ad6fSIan Campbell break; 689306acb5Saliguori } 699306acb5Saliguori 70*0e39bb02SJuergen Gross xen_be_register_common(); 71e7151f83Saliguori xen_be_register("vfb", &xen_framebuffer_ops); 72e613b064Saliguori xen_be_register("qnic", &xen_netdev_ops); 73e7151f83Saliguori 7494909d9fSaliguori /* configure framebuffer */ 7594909d9fSaliguori if (xenfb_enabled) { 7694909d9fSaliguori xen_config_dev_vfb(0, "vnc"); 7794909d9fSaliguori xen_config_dev_vkbd(0); 7894909d9fSaliguori } 7994909d9fSaliguori 802c8b24a3Saliguori /* configure disks */ 812c8b24a3Saliguori for (i = 0; i < 16; i++) { 82751c6a17SGerd Hoffmann dinfo = drive_get(IF_XEN, 0, i); 83751c6a17SGerd Hoffmann if (!dinfo) 842c8b24a3Saliguori continue; 85751c6a17SGerd Hoffmann xen_config_dev_blk(dinfo); 862c8b24a3Saliguori } 872c8b24a3Saliguori 882c8b24a3Saliguori /* configure nics */ 892c8b24a3Saliguori for (i = 0; i < nb_nics; i++) { 902c8b24a3Saliguori if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen")) 912c8b24a3Saliguori continue; 922c8b24a3Saliguori xen_config_dev_nic(nd_table + i); 932c8b24a3Saliguori } 942c8b24a3Saliguori 952c8b24a3Saliguori /* config cleanup hook */ 9628695489SAnthony Liguori atexit(xen_config_cleanup); 972c8b24a3Saliguori 98e7151f83Saliguori /* setup framebuffer */ 99e7151f83Saliguori xen_init_display(xen_domid); 100e37630caSaliguori } 101e37630caSaliguori 102e264d29dSEduardo Habkost static void xenpv_machine_init(MachineClass *mc) 103f80f9ec9SAnthony Liguori { 104e264d29dSEduardo Habkost mc->desc = "Xen Para-virtualized PC"; 105e264d29dSEduardo Habkost mc->init = xen_init_pv; 106e264d29dSEduardo Habkost mc->max_cpus = 1; 107e264d29dSEduardo Habkost mc->default_machine_opts = "accel=xen"; 108f80f9ec9SAnthony Liguori } 109f80f9ec9SAnthony Liguori 110e264d29dSEduardo Habkost DEFINE_MACHINE("xenpv", xenpv_machine_init) 111