1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "qemu/osdep.h"
26#include "qemu/error-report.h"
27#include "hw/hw.h"
28#include "hw/boards.h"
29#include "hw/xen/xen_backend.h"
30#include "xen_domainbuild.h"
31#include "sysemu/block-backend.h"
32
33static void xen_init_pv(MachineState *machine)
34{
35 DriveInfo *dinfo;
36 int i;
37
38
39 if (xen_be_init() != 0) {
40 error_report("%s: xen backend core setup failed", __func__);
41 exit(1);
42 }
43
44 switch (xen_mode) {
45 case XEN_ATTACH:
46
47 break;
48#ifdef CONFIG_XEN_PV_DOMAIN_BUILD
49 case XEN_CREATE: {
50 const char *kernel_filename = machine->kernel_filename;
51 const char *kernel_cmdline = machine->kernel_cmdline;
52 const char *initrd_filename = machine->initrd_filename;
53 if (xen_domain_build_pv(kernel_filename, initrd_filename,
54 kernel_cmdline) < 0) {
55 error_report("xen pv domain creation failed");
56 exit(1);
57 }
58 break;
59 }
60#endif
61 case XEN_EMULATE:
62 error_report("xen emulation not implemented (yet)");
63 exit(1);
64 break;
65 default:
66 error_report("unhandled xen_mode %d", xen_mode);
67 exit(1);
68 break;
69 }
70
71 xen_be_register_common();
72 xen_be_register("vfb", &xen_framebuffer_ops);
73 xen_be_register("qnic", &xen_netdev_ops);
74
75
76 if (xenfb_enabled) {
77 xen_config_dev_vfb(0, "vnc");
78 xen_config_dev_vkbd(0);
79 }
80
81
82 for (i = 0; i < 16; i++) {
83 dinfo = drive_get(IF_XEN, 0, i);
84 if (!dinfo)
85 continue;
86 xen_config_dev_blk(dinfo);
87 }
88
89
90 for (i = 0; i < nb_nics; i++) {
91 if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen"))
92 continue;
93 xen_config_dev_nic(nd_table + i);
94 }
95
96
97 atexit(xen_config_cleanup);
98}
99
100static void xenpv_machine_init(MachineClass *mc)
101{
102 mc->desc = "Xen Para-virtualized PC";
103 mc->init = xen_init_pv;
104 mc->max_cpus = 1;
105 mc->default_machine_opts = "accel=xen";
106}
107
108DEFINE_MACHINE("xenpv", xenpv_machine_init)
109