rumpcopy.c revision 1.2.4.3 1 /* $NetBSD: rumpcopy.c,v 1.2.4.3 2010/08/11 22:55:07 yamt Exp $ */
2
3 /*
4 * Copyright (c) 2009 Antti Kantee. All Rights Reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28 #include <sys/cdefs.h>
29 __KERNEL_RCSID(0, "$NetBSD: rumpcopy.c,v 1.2.4.3 2010/08/11 22:55:07 yamt Exp $");
30
31 #include <sys/param.h>
32 #include <sys/lwp.h>
33 #include <sys/systm.h>
34
35 #include <rump/rump.h>
36
37 #include "rump_private.h"
38
39 int
40 copyin(const void *uaddr, void *kaddr, size_t len)
41 {
42
43 if (curproc->p_vmspace == &vmspace0) {
44 if (__predict_false(uaddr == NULL && len)) {
45 return EFAULT;
46 }
47 memcpy(kaddr, uaddr, len);
48 } else {
49 rump_sysproxy_copyin(uaddr, kaddr, len);
50 }
51 return 0;
52 }
53
54 int
55 copyout(const void *kaddr, void *uaddr, size_t len)
56 {
57
58 if (curproc->p_vmspace == &vmspace0) {
59 if (__predict_false(uaddr == NULL && len)) {
60 return EFAULT;
61 }
62 memcpy(uaddr, kaddr, len);
63 } else {
64 rump_sysproxy_copyout(kaddr, uaddr, len);
65 }
66 return 0;
67 }
68
69 int
70 subyte(void *uaddr, int byte)
71 {
72
73 if (curproc->p_vmspace == &vmspace0)
74 *(char *)uaddr = byte;
75 else
76 rump_sysproxy_copyout(&byte, uaddr, 1);
77 return 0;
78 }
79
80 int
81 copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done)
82 {
83
84 return copyinstr(kfaddr, kdaddr, len, done);
85 }
86
87 int
88 copyinstr(const void *uaddr, void *kaddr, size_t len, size_t *done)
89 {
90
91 if (curproc->p_vmspace == &vmspace0)
92 strlcpy(kaddr, uaddr, len);
93 else
94 rump_sysproxy_copyin(uaddr, kaddr, len);
95 if (done)
96 *done = strlen(kaddr)+1; /* includes termination */
97 return 0;
98 }
99
100 int
101 copyoutstr(const void *kaddr, void *uaddr, size_t len, size_t *done)
102 {
103
104 if (curproc->p_vmspace == &vmspace0)
105 strlcpy(uaddr, kaddr, len);
106 else
107 rump_sysproxy_copyout(kaddr, uaddr, len);
108 if (done)
109 *done = strlen(uaddr)+1; /* includes termination */
110 return 0;
111 }
112
113 int
114 kcopy(const void *src, void *dst, size_t len)
115 {
116
117 memcpy(dst, src, len);
118 return 0;
119 }
120