1*89c9de7dSDavid van Moolenbroek
2*89c9de7dSDavid van Moolenbroek #include "fsdriver.h"
3*89c9de7dSDavid van Moolenbroek
4*89c9de7dSDavid van Moolenbroek /*
5*89c9de7dSDavid van Moolenbroek * Copy data from the caller into the local address space.
6*89c9de7dSDavid van Moolenbroek */
7*89c9de7dSDavid van Moolenbroek int
fsdriver_copyin(const struct fsdriver_data * data,size_t off,void * ptr,size_t len)8*89c9de7dSDavid van Moolenbroek fsdriver_copyin(const struct fsdriver_data * data, size_t off, void * ptr,
9*89c9de7dSDavid van Moolenbroek size_t len)
10*89c9de7dSDavid van Moolenbroek {
11*89c9de7dSDavid van Moolenbroek
12*89c9de7dSDavid van Moolenbroek /* Do nothing for peek requests. */
13*89c9de7dSDavid van Moolenbroek if (data == NULL)
14*89c9de7dSDavid van Moolenbroek return OK;
15*89c9de7dSDavid van Moolenbroek
16*89c9de7dSDavid van Moolenbroek /* The data size field is used only for this integrity check. */
17*89c9de7dSDavid van Moolenbroek if (off + len > data->size)
18*89c9de7dSDavid van Moolenbroek panic("fsdriver: copy-in buffer overflow");
19*89c9de7dSDavid van Moolenbroek
20*89c9de7dSDavid van Moolenbroek if (data->endpt == SELF) {
21*89c9de7dSDavid van Moolenbroek memcpy(ptr, &data->ptr[off], len);
22*89c9de7dSDavid van Moolenbroek
23*89c9de7dSDavid van Moolenbroek return OK;
24*89c9de7dSDavid van Moolenbroek }
25*89c9de7dSDavid van Moolenbroek
26*89c9de7dSDavid van Moolenbroek return sys_safecopyfrom(data->endpt, data->grant, off, (vir_bytes)ptr,
27*89c9de7dSDavid van Moolenbroek (phys_bytes)len);
28*89c9de7dSDavid van Moolenbroek }
29*89c9de7dSDavid van Moolenbroek
30*89c9de7dSDavid van Moolenbroek /*
31*89c9de7dSDavid van Moolenbroek * Copy data from the local address space to the caller.
32*89c9de7dSDavid van Moolenbroek */
33*89c9de7dSDavid van Moolenbroek int
fsdriver_copyout(const struct fsdriver_data * data,size_t off,const void * ptr,size_t len)34*89c9de7dSDavid van Moolenbroek fsdriver_copyout(const struct fsdriver_data * data, size_t off,
35*89c9de7dSDavid van Moolenbroek const void * ptr, size_t len)
36*89c9de7dSDavid van Moolenbroek {
37*89c9de7dSDavid van Moolenbroek
38*89c9de7dSDavid van Moolenbroek /* Do nothing for peek requests. */
39*89c9de7dSDavid van Moolenbroek if (data == NULL)
40*89c9de7dSDavid van Moolenbroek return OK;
41*89c9de7dSDavid van Moolenbroek
42*89c9de7dSDavid van Moolenbroek /* The data size field is used only for this integrity check. */
43*89c9de7dSDavid van Moolenbroek if (off + len > data->size)
44*89c9de7dSDavid van Moolenbroek panic("fsdriver: copy-out buffer overflow");
45*89c9de7dSDavid van Moolenbroek
46*89c9de7dSDavid van Moolenbroek if (data->endpt == SELF) {
47*89c9de7dSDavid van Moolenbroek memcpy(&data->ptr[off], ptr, len);
48*89c9de7dSDavid van Moolenbroek
49*89c9de7dSDavid van Moolenbroek return OK;
50*89c9de7dSDavid van Moolenbroek }
51*89c9de7dSDavid van Moolenbroek
52*89c9de7dSDavid van Moolenbroek return sys_safecopyto(data->endpt, data->grant, off, (vir_bytes)ptr,
53*89c9de7dSDavid van Moolenbroek (phys_bytes)len);
54*89c9de7dSDavid van Moolenbroek }
55*89c9de7dSDavid van Moolenbroek
56*89c9de7dSDavid van Moolenbroek /*
57*89c9de7dSDavid van Moolenbroek * Zero out a data region in the caller.
58*89c9de7dSDavid van Moolenbroek */
59*89c9de7dSDavid van Moolenbroek int
fsdriver_zero(const struct fsdriver_data * data,size_t off,size_t len)60*89c9de7dSDavid van Moolenbroek fsdriver_zero(const struct fsdriver_data * data, size_t off, size_t len)
61*89c9de7dSDavid van Moolenbroek {
62*89c9de7dSDavid van Moolenbroek
63*89c9de7dSDavid van Moolenbroek /* Do nothing for peek requests. */
64*89c9de7dSDavid van Moolenbroek if (data == NULL)
65*89c9de7dSDavid van Moolenbroek return OK;
66*89c9de7dSDavid van Moolenbroek
67*89c9de7dSDavid van Moolenbroek /* The data size field is used only for this integrity check. */
68*89c9de7dSDavid van Moolenbroek if (off + len > data->size)
69*89c9de7dSDavid van Moolenbroek panic("fsdriver: copy-out buffer overflow");
70*89c9de7dSDavid van Moolenbroek
71*89c9de7dSDavid van Moolenbroek if (data->endpt == SELF) {
72*89c9de7dSDavid van Moolenbroek memset(&data->ptr[off], 0, len);
73*89c9de7dSDavid van Moolenbroek
74*89c9de7dSDavid van Moolenbroek return OK;
75*89c9de7dSDavid van Moolenbroek }
76*89c9de7dSDavid van Moolenbroek
77*89c9de7dSDavid van Moolenbroek return sys_safememset(data->endpt, data->grant, off, 0, len);
78*89c9de7dSDavid van Moolenbroek }
79*89c9de7dSDavid van Moolenbroek
80*89c9de7dSDavid van Moolenbroek /*
81*89c9de7dSDavid van Moolenbroek * Copy in a null-terminated name, and perform sanity checks.
82*89c9de7dSDavid van Moolenbroek */
83*89c9de7dSDavid van Moolenbroek int
fsdriver_getname(endpoint_t endpt,cp_grant_id_t grant,size_t len,char * name,size_t size,int not_empty)84*89c9de7dSDavid van Moolenbroek fsdriver_getname(endpoint_t endpt, cp_grant_id_t grant, size_t len,
85*89c9de7dSDavid van Moolenbroek char * name, size_t size, int not_empty)
86*89c9de7dSDavid van Moolenbroek {
87*89c9de7dSDavid van Moolenbroek int r;
88*89c9de7dSDavid van Moolenbroek
89*89c9de7dSDavid van Moolenbroek /* The given length includes the null terminator. */
90*89c9de7dSDavid van Moolenbroek if (len == 0 || (not_empty && len == 1))
91*89c9de7dSDavid van Moolenbroek return EINVAL;
92*89c9de7dSDavid van Moolenbroek if (len > size)
93*89c9de7dSDavid van Moolenbroek return ENAMETOOLONG;
94*89c9de7dSDavid van Moolenbroek
95*89c9de7dSDavid van Moolenbroek if ((r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes)name,
96*89c9de7dSDavid van Moolenbroek (phys_bytes)len)) != OK)
97*89c9de7dSDavid van Moolenbroek return r;
98*89c9de7dSDavid van Moolenbroek
99*89c9de7dSDavid van Moolenbroek if (name[len - 1] != 0) {
100*89c9de7dSDavid van Moolenbroek printf("fsdriver: name not null-terminated\n");
101*89c9de7dSDavid van Moolenbroek return EINVAL;
102*89c9de7dSDavid van Moolenbroek }
103*89c9de7dSDavid van Moolenbroek
104*89c9de7dSDavid van Moolenbroek return OK;
105*89c9de7dSDavid van Moolenbroek }
106