Statistics
| Branch: | Revision:

root / hw / xen_devconfig.c @ 0ed8b6f6

History | View | Annotate | Download (4.7 kB)

1 2c8b24a3 aliguori
#include "xen_backend.h"
2 2446333c Blue Swirl
#include "blockdev.h"
3 2c8b24a3 aliguori
4 2c8b24a3 aliguori
/* ------------------------------------------------------------- */
5 2c8b24a3 aliguori
6 2c8b24a3 aliguori
struct xs_dirs {
7 2c8b24a3 aliguori
    char *xs_dir;
8 72cf2d4f Blue Swirl
    QTAILQ_ENTRY(xs_dirs) list;
9 2c8b24a3 aliguori
};
10 72cf2d4f Blue Swirl
static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup = QTAILQ_HEAD_INITIALIZER(xs_cleanup);
11 2c8b24a3 aliguori
12 2c8b24a3 aliguori
static void xen_config_cleanup_dir(char *dir)
13 2c8b24a3 aliguori
{
14 2c8b24a3 aliguori
    struct xs_dirs *d;
15 2c8b24a3 aliguori
16 7267c094 Anthony Liguori
    d = g_malloc(sizeof(*d));
17 2c8b24a3 aliguori
    d->xs_dir = dir;
18 72cf2d4f Blue Swirl
    QTAILQ_INSERT_TAIL(&xs_cleanup, d, list);
19 2c8b24a3 aliguori
}
20 2c8b24a3 aliguori
21 28695489 Anthony Liguori
void xen_config_cleanup(void)
22 2c8b24a3 aliguori
{
23 2c8b24a3 aliguori
    struct xs_dirs *d;
24 2c8b24a3 aliguori
25 72cf2d4f Blue Swirl
    QTAILQ_FOREACH(d, &xs_cleanup, list) {
26 2c8b24a3 aliguori
        xs_rm(xenstore, 0, d->xs_dir);
27 2c8b24a3 aliguori
    }
28 2c8b24a3 aliguori
}
29 2c8b24a3 aliguori
30 2c8b24a3 aliguori
/* ------------------------------------------------------------- */
31 2c8b24a3 aliguori
32 2c8b24a3 aliguori
static int xen_config_dev_mkdir(char *dev, int p)
33 2c8b24a3 aliguori
{
34 2c8b24a3 aliguori
    struct xs_permissions perms[2] = {{
35 2c8b24a3 aliguori
            .id    = 0, /* set owner: dom0 */
36 2c8b24a3 aliguori
        },{
37 2c8b24a3 aliguori
            .id    = xen_domid,
38 2c8b24a3 aliguori
            .perms = p,
39 2c8b24a3 aliguori
        }};
40 2c8b24a3 aliguori
41 2c8b24a3 aliguori
    if (!xs_mkdir(xenstore, 0, dev)) {
42 2c8b24a3 aliguori
        xen_be_printf(NULL, 0, "xs_mkdir %s: failed\n", dev);
43 2c8b24a3 aliguori
        return -1;
44 2c8b24a3 aliguori
    }
45 7267c094 Anthony Liguori
    xen_config_cleanup_dir(g_strdup(dev));
46 2c8b24a3 aliguori
47 2c8b24a3 aliguori
    if (!xs_set_permissions(xenstore, 0, dev, perms, 2)) {
48 2c8b24a3 aliguori
        xen_be_printf(NULL, 0, "xs_set_permissions %s: failed\n", dev);
49 2c8b24a3 aliguori
        return -1;
50 2c8b24a3 aliguori
    }
51 2c8b24a3 aliguori
    return 0;
52 2c8b24a3 aliguori
}
53 2c8b24a3 aliguori
54 2c8b24a3 aliguori
static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev,
55 2c8b24a3 aliguori
                               char *fe, char *be, int len)
56 2c8b24a3 aliguori
{
57 2c8b24a3 aliguori
    char *dom;
58 2c8b24a3 aliguori
59 2c8b24a3 aliguori
    dom = xs_get_domain_path(xenstore, xen_domid);
60 2c8b24a3 aliguori
    snprintf(fe, len, "%s/device/%s/%d", dom, ftype, vdev);
61 2c8b24a3 aliguori
    free(dom);
62 2c8b24a3 aliguori
63 2c8b24a3 aliguori
    dom = xs_get_domain_path(xenstore, 0);
64 2c8b24a3 aliguori
    snprintf(be, len, "%s/backend/%s/%d/%d", dom, btype, xen_domid, vdev);
65 2c8b24a3 aliguori
    free(dom);
66 2c8b24a3 aliguori
67 2c8b24a3 aliguori
    xen_config_dev_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
68 2c8b24a3 aliguori
    xen_config_dev_mkdir(be, XS_PERM_READ);
69 2c8b24a3 aliguori
    return 0;
70 2c8b24a3 aliguori
}
71 2c8b24a3 aliguori
72 2c8b24a3 aliguori
static int xen_config_dev_all(char *fe, char *be)
73 2c8b24a3 aliguori
{
74 2c8b24a3 aliguori
    /* frontend */
75 2c8b24a3 aliguori
    if (xen_protocol)
76 2c8b24a3 aliguori
        xenstore_write_str(fe, "protocol", xen_protocol);
77 2c8b24a3 aliguori
78 2c8b24a3 aliguori
    xenstore_write_int(fe, "state",           XenbusStateInitialising);
79 2c8b24a3 aliguori
    xenstore_write_int(fe, "backend-id",      0);
80 2c8b24a3 aliguori
    xenstore_write_str(fe, "backend",         be);
81 2c8b24a3 aliguori
82 2c8b24a3 aliguori
    /* backend */
83 2c8b24a3 aliguori
    xenstore_write_str(be, "domain",          qemu_name ? qemu_name : "no-name");
84 2c8b24a3 aliguori
    xenstore_write_int(be, "online",          1);
85 2c8b24a3 aliguori
    xenstore_write_int(be, "state",           XenbusStateInitialising);
86 2c8b24a3 aliguori
    xenstore_write_int(be, "frontend-id",     xen_domid);
87 2c8b24a3 aliguori
    xenstore_write_str(be, "frontend",        fe);
88 2c8b24a3 aliguori
89 2c8b24a3 aliguori
    return 0;
90 2c8b24a3 aliguori
}
91 2c8b24a3 aliguori
92 2c8b24a3 aliguori
/* ------------------------------------------------------------- */
93 2c8b24a3 aliguori
94 2c8b24a3 aliguori
int xen_config_dev_blk(DriveInfo *disk)
95 2c8b24a3 aliguori
{
96 8814a051 Markus Armbruster
    char fe[256], be[256], device_name[32];
97 2c8b24a3 aliguori
    int vdev = 202 * 256 + 16 * disk->unit;
98 95b5edcd Markus Armbruster
    int cdrom = disk->media_cd;
99 2c8b24a3 aliguori
    const char *devtype = cdrom ? "cdrom" : "disk";
100 2c8b24a3 aliguori
    const char *mode    = cdrom ? "r"     : "w";
101 093003b1 Markus Armbruster
    const char *filename = qemu_opt_get(disk->opts, "file");
102 2c8b24a3 aliguori
103 8814a051 Markus Armbruster
    snprintf(device_name, sizeof(device_name), "xvd%c", 'a' + disk->unit);
104 2c8b24a3 aliguori
    xen_be_printf(NULL, 1, "config disk %d [%s]: %s\n",
105 093003b1 Markus Armbruster
                  disk->unit, device_name, filename);
106 2c8b24a3 aliguori
    xen_config_dev_dirs("vbd", "qdisk", vdev, fe, be, sizeof(fe));
107 2c8b24a3 aliguori
108 2c8b24a3 aliguori
    /* frontend */
109 2c8b24a3 aliguori
    xenstore_write_int(fe, "virtual-device",  vdev);
110 2c8b24a3 aliguori
    xenstore_write_str(fe, "device-type",     devtype);
111 2c8b24a3 aliguori
112 2c8b24a3 aliguori
    /* backend */
113 8814a051 Markus Armbruster
    xenstore_write_str(be, "dev",             device_name);
114 2c8b24a3 aliguori
    xenstore_write_str(be, "type",            "file");
115 093003b1 Markus Armbruster
    xenstore_write_str(be, "params",          filename);
116 2c8b24a3 aliguori
    xenstore_write_str(be, "mode",            mode);
117 2c8b24a3 aliguori
118 2c8b24a3 aliguori
    /* common stuff */
119 2c8b24a3 aliguori
    return xen_config_dev_all(fe, be);
120 2c8b24a3 aliguori
}
121 2c8b24a3 aliguori
122 2c8b24a3 aliguori
int xen_config_dev_nic(NICInfo *nic)
123 2c8b24a3 aliguori
{
124 2c8b24a3 aliguori
    char fe[256], be[256];
125 2c8b24a3 aliguori
    char mac[20];
126 2c8b24a3 aliguori
127 2c8b24a3 aliguori
    snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x",
128 6eed1856 Jan Kiszka
             nic->macaddr.a[0], nic->macaddr.a[1], nic->macaddr.a[2],
129 6eed1856 Jan Kiszka
             nic->macaddr.a[3], nic->macaddr.a[4], nic->macaddr.a[5]);
130 2c8b24a3 aliguori
    xen_be_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", nic->vlan->id, mac);
131 2c8b24a3 aliguori
    xen_config_dev_dirs("vif", "qnic", nic->vlan->id, fe, be, sizeof(fe));
132 2c8b24a3 aliguori
133 2c8b24a3 aliguori
    /* frontend */
134 2c8b24a3 aliguori
    xenstore_write_int(fe, "handle",     nic->vlan->id);
135 2c8b24a3 aliguori
    xenstore_write_str(fe, "mac",        mac);
136 2c8b24a3 aliguori
137 2c8b24a3 aliguori
    /* backend */
138 2c8b24a3 aliguori
    xenstore_write_int(be, "handle",     nic->vlan->id);
139 2c8b24a3 aliguori
    xenstore_write_str(be, "mac",        mac);
140 2c8b24a3 aliguori
141 2c8b24a3 aliguori
    /* common stuff */
142 2c8b24a3 aliguori
    return xen_config_dev_all(fe, be);
143 2c8b24a3 aliguori
}
144 9306acb5 aliguori
145 9306acb5 aliguori
int xen_config_dev_vfb(int vdev, const char *type)
146 9306acb5 aliguori
{
147 9306acb5 aliguori
    char fe[256], be[256];
148 9306acb5 aliguori
149 9306acb5 aliguori
    xen_config_dev_dirs("vfb", "vfb", vdev, fe, be, sizeof(fe));
150 9306acb5 aliguori
151 9306acb5 aliguori
    /* backend */
152 9306acb5 aliguori
    xenstore_write_str(be, "type",  type);
153 9306acb5 aliguori
154 9306acb5 aliguori
    /* common stuff */
155 9306acb5 aliguori
    return xen_config_dev_all(fe, be);
156 9306acb5 aliguori
}
157 9306acb5 aliguori
158 9306acb5 aliguori
int xen_config_dev_vkbd(int vdev)
159 9306acb5 aliguori
{
160 9306acb5 aliguori
    char fe[256], be[256];
161 9306acb5 aliguori
162 9306acb5 aliguori
    xen_config_dev_dirs("vkbd", "vkbd", vdev, fe, be, sizeof(fe));
163 9306acb5 aliguori
    return xen_config_dev_all(fe, be);
164 9306acb5 aliguori
}
165 9306acb5 aliguori
166 9306acb5 aliguori
int xen_config_dev_console(int vdev)
167 9306acb5 aliguori
{
168 9306acb5 aliguori
    char fe[256], be[256];
169 9306acb5 aliguori
170 9306acb5 aliguori
    xen_config_dev_dirs("console", "console", vdev, fe, be, sizeof(fe));
171 9306acb5 aliguori
    return xen_config_dev_all(fe, be);
172 9306acb5 aliguori
}