aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenstore/init-xenstore-domain.c
blob: 35f1aa3e1ad9849e83685b75afc24a4f54d540fe (plain)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <xenctrl.h>
#include <xc_dom.h>
#include <xenstore.h>
#include <xen/sys/xenbus_dev.h>

static uint32_t domid = -1;

static int build(xc_interface *xch, char** argv)
{
	char cmdline[512];
	uint32_t ssid;
	xen_domain_handle_t handle = { 0 };
	int rv;
	int xs_fd = open("/dev/xen/xenbus_backend", O_RDWR);
	struct xc_dom_image *dom;
	int maxmem = atoi(argv[2]);
	int limit_kb = (maxmem + 1)*1024;

	rv = xc_flask_context_to_sid(xch, argv[3], strlen(argv[3]), &ssid);
	if (rv) return rv;
	rv = xc_domain_create(xch, ssid, handle, 0, &domid);
	if (rv) return rv;
	rv = xc_domain_max_vcpus(xch, domid, 1);
	if (rv) return rv;
	rv = xc_domain_setmaxmem(xch, domid, limit_kb);
	if (rv) return rv;
	rv = xc_domain_set_memmap_limit(xch, domid, limit_kb);
	if (rv) return rv;

	rv = ioctl(xs_fd, IOCTL_XENBUS_BACKEND_SETUP, domid);
	if (rv < 0) return rv;
	snprintf(cmdline, 512, "--event %d --internal-db", rv);

	dom = xc_dom_allocate(xch, cmdline, NULL);
	rv = xc_dom_kernel_file(dom, argv[1]);
	if (rv) return rv;
	rv = xc_dom_boot_xen_init(dom, xch, domid);
	if (rv) return rv;
	rv = xc_dom_parse_image(dom);
	if (rv) return rv;
	rv = xc_dom_mem_init(dom, maxmem);
	if (rv) return rv;
	rv = xc_dom_boot_mem_init(dom);
	if (rv) return rv;
	rv = xc_dom_build_image(dom);
	if (rv) return rv;
	rv = xc_dom_boot_image(dom);
	if (rv) return rv;

	xc_dom_release(dom);

	rv = xc_domain_set_virq_handler(xch, domid, VIRQ_DOM_EXC);
	if (rv) return rv;
	rv = xc_domain_unpause(xch, domid);
	if (rv) return rv;

	return 0;
}

int main(int argc, char** argv)
{
	xc_interface *xch;
	struct xs_handle *xsh;
	char buf[16];
	int rv, fd;

	if (argc != 4) {
		printf("Use: %s <xenstore-kernel> <memory_mb> <flask-label>\n", argv[0]);
		return 2;
	}

	xch = xc_interface_open(NULL, NULL, 0);
	if (!xch) return 1;

	rv = build(xch, argv);

	xc_interface_close(xch);

	if (rv) return 1;

	xsh = xs_open(0);
	rv = snprintf(buf, 16, "%d", domid);
	xs_write(xsh, XBT_NULL, "/tool/xenstored/domid", buf, rv);
	xs_daemon_close(xsh);

	fd = creat("/var/run/xenstored.pid", 0666);
	if (fd < 0)
		return 3;
	rv = snprintf(buf, 16, "domid:%d\n", domid);
	rv = write(fd, buf, rv);
	close(fd);
	if (rv < 0)
		return 3;

	return 0;
}