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_common();
71 xen_be_register("vfb", &xen_framebuffer_ops);
72 xen_be_register("qnic", &xen_netdev_ops);
73
74
75 if (xenfb_enabled) {
76 xen_config_dev_vfb(0, "vnc");
77 xen_config_dev_vkbd(0);
78 }
79
80
81 for (i = 0; i < 16; i++) {
82 dinfo = drive_get(IF_XEN, 0, i);
83 if (!dinfo)
84 continue;
85 xen_config_dev_blk(dinfo);
86 }
87
88
89 for (i = 0; i < nb_nics; i++) {
90 if (!nd_table[i].model || 0 != strcmp(nd_table[i].model, "xen"))
91 continue;
92 xen_config_dev_nic(nd_table + i);
93 }
94
95
96 atexit(xen_config_cleanup);
97
98
99 xen_init_display(xen_domid);
100}
101
102static void xenpv_machine_init(MachineClass *mc)
103{
104 mc->desc = "Xen Para-virtualized PC";
105 mc->init = xen_init_pv;
106 mc->max_cpus = 1;
107 mc->default_machine_opts = "accel=xen";
108}
109
110DEFINE_MACHINE("xenpv", xenpv_machine_init)
111