Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
xen
xenbus
xenbus_dev_backend.c
Go to the documentation of this file.
1
#include <linux/slab.h>
2
#include <linux/types.h>
3
#include <
linux/mm.h
>
4
#include <linux/fs.h>
5
#include <
linux/miscdevice.h
>
6
#include <linux/module.h>
7
#include <linux/capability.h>
8
9
#include <
xen/xen.h
>
10
#include <xen/page.h>
11
#include <
xen/xenbus.h
>
12
#include <
xen/xenbus_dev.h
>
13
#include <
xen/grant_table.h
>
14
#include <xen/events.h>
15
#include <asm/xen/hypervisor.h>
16
17
#include "
xenbus_comms.h
"
18
19
MODULE_LICENSE
(
"GPL"
);
20
21
static
int
xenbus_backend_open(
struct
inode
*
inode
,
struct
file
*filp)
22
{
23
if
(!
capable
(
CAP_SYS_ADMIN
))
24
return
-
EPERM
;
25
26
return
nonseekable_open
(inode, filp);
27
}
28
29
static
long
xenbus_alloc(
domid_t
domid
)
30
{
31
struct
evtchn_alloc_unbound
arg
;
32
int
err
= -
EEXIST
;
33
34
xs_suspend
();
35
36
/* If xenstored_ready is nonzero, that means we have already talked to
37
* xenstore and set up watches. These watches will be restored by
38
* xs_resume, but that requires communication over the port established
39
* below that is not visible to anyone until the ioctl returns.
40
*
41
* This can be resolved by splitting the ioctl into two parts
42
* (postponing the resume until xenstored is active) but this is
43
* unnecessarily complex for the intended use where xenstored is only
44
* started once - so return -EEXIST if it's already running.
45
*/
46
if
(
xenstored_ready
)
47
goto
out_err;
48
49
gnttab_grant_foreign_access_ref
(
GNTTAB_RESERVED_XENSTORE
, domid,
50
virt_to_mfn
(
xen_store_interface
), 0
/* writable */
);
51
52
arg
.dom =
DOMID_SELF
;
53
arg
.remote_dom =
domid
;
54
55
err =
HYPERVISOR_event_channel_op
(
EVTCHNOP_alloc_unbound
, &
arg
);
56
if
(err)
57
goto
out_err;
58
59
if
(
xen_store_evtchn
> 0)
60
xb_deinit_comms
();
61
62
xen_store_evtchn
=
arg
.port;
63
64
xs_resume
();
65
66
return
arg
.port;
67
68
out_err:
69
xs_suspend_cancel
();
70
return
err
;
71
}
72
73
static
long
xenbus_backend_ioctl(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
data
)
74
{
75
if
(!
capable
(
CAP_SYS_ADMIN
))
76
return
-
EPERM
;
77
78
switch
(cmd) {
79
case
IOCTL_XENBUS_BACKEND_EVTCHN
:
80
if
(
xen_store_evtchn
> 0)
81
return
xen_store_evtchn
;
82
return
-
ENODEV
;
83
84
case
IOCTL_XENBUS_BACKEND_SETUP
:
85
return
xenbus_alloc(data);
86
87
default
:
88
return
-
ENOTTY
;
89
}
90
}
91
92
static
int
xenbus_backend_mmap(
struct
file *file,
struct
vm_area_struct
*vma)
93
{
94
size_t
size
= vma->
vm_end
- vma->
vm_start
;
95
96
if
(!
capable
(
CAP_SYS_ADMIN
))
97
return
-
EPERM
;
98
99
if
((size >
PAGE_SIZE
) || (vma->
vm_pgoff
!= 0))
100
return
-
EINVAL
;
101
102
if
(
remap_pfn_range
(vma, vma->
vm_start
,
103
virt_to_pfn
(
xen_store_interface
),
104
size, vma->
vm_page_prot
))
105
return
-
EAGAIN
;
106
107
return
0;
108
}
109
110
static
const
struct
file_operations
xenbus_backend_fops = {
111
.open = xenbus_backend_open,
112
.mmap = xenbus_backend_mmap,
113
.unlocked_ioctl = xenbus_backend_ioctl,
114
};
115
116
static
struct
miscdevice
xenbus_backend_dev = {
117
.minor =
MISC_DYNAMIC_MINOR
,
118
.name =
"xen/xenbus_backend"
,
119
.fops = &xenbus_backend_fops,
120
};
121
122
static
int
__init
xenbus_backend_init(
void
)
123
{
124
int
err
;
125
126
if
(!
xen_initial_domain
())
127
return
-
ENODEV
;
128
129
err =
misc_register
(&xenbus_backend_dev);
130
if
(err)
131
printk
(
KERN_ERR
"Could not register xenbus backend device\n"
);
132
return
err
;
133
}
134
135
static
void
__exit
xenbus_backend_exit(
void
)
136
{
137
misc_deregister
(&xenbus_backend_dev);
138
}
139
140
module_init
(xenbus_backend_init);
141
module_exit
(xenbus_backend_exit);
Generated on Thu Jan 10 2013 14:43:38 for Linux Kernel by
1.8.2