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 "hw/hw.h"
27#include "hw/boards.h"
28#include "hw/xen/xen_backend.h"
29#include "xen_domainbuild.h"
30#include "sysemu/block-backend.h"
31
32static void xen_init_pv(MachineState *machine)
33{
34 DriveInfo *dinfo;
35 int i;
36
37
38 if (xen_be_init() != 0) {
39 fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__);
40 exit(1);
41 }
42
43 switch (xen_mode) {
44 case XEN_ATTACH:
45
46 break;
47#ifdef CONFIG_XEN_PV_DOMAIN_BUILD
48 case XEN_CREATE: {
49 const char *kernel_filename = machine->kernel_filename;
50 const char *kernel_cmdline = machine->kernel_cmdline;
51 const char *initrd_filename = machine->initrd_filename;
52 if (xen_domain_build_pv(kernel_filename, initrd_filename,
53 kernel_cmdline) < 0) {
54 fprintf(stderr, "xen pv domain creation failed\n");
55 exit(1);
56 }
57 break;
58 }
59#endif
60 case XEN_EMULATE:
61 fprintf(stderr, "xen emulation not implemented (yet)\n");
62 exit(1);
63 break;
64 default:
65 fprintf(stderr, "unhandled xen_mode %d\n", xen_mode);
66 exit(1);
67 break;
68 }
69
70 xen_be_register("console", &xen_console_ops);
71 xen_be_register("vkbd", &xen_kbdmouse_ops);
72 xen_be_register("vfb", &xen_framebuffer_ops);
73 xen_be_register("qdisk", &xen_blkdev_ops);
74 xen_be_register("qnic", &xen_netdev_ops);
75
76
77 if (xenfb_enabled) {
78 xen_config_dev_vfb(0, "vnc");
79 xen_config_dev_vkbd(0);
80 }
81
82
83 for (i = 0; i < 16; i++) {
84 dinfo = drive_get(IF_XEN, 0, i);
85 if (!dinfo)
86 continue;
87 xen_config_dev_blk(dinfo);
88 }
89
90
91 for (i = 0; i < nb_nics; i++) {
92 if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen"))
93 continue;
94 xen_config_dev_nic(nd_table + i);
95 }
96
97
98 atexit(xen_config_cleanup);
99
100
101 xen_init_display(xen_domid);
102}
103
104static void xenpv_machine_init(MachineClass *mc)
105{
106 mc->desc = "Xen Para-virtualized PC";
107 mc->init = xen_init_pv;
108 mc->max_cpus = 1;
109 mc->default_machine_opts = "accel=xen";
110}
111
112DEFINE_MACHINE("xenpv", xenpv_machine_init)
113