This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / sparc64 / lib / user_fixup.c
1 /* user_fixup.c: Fix up user copy faults.
2  *
3  * Copyright (C) 2004 David S. Miller <davem@redhat.com>
4  */
5
6 #include <linux/compiler.h>
7 #include <linux/kernel.h>
8 #include <linux/string.h>
9 #include <linux/errno.h>
10 #include <asm/uaccess.h>
11
12 /* Calculating the exact fault address when using
13  * block loads and stores can be very complicated.
14  * Instead of trying to be clever and handling all
15  * of the cases, just fix things up simply here.
16  */
17
18 unsigned long copy_from_user_fixup(void *to, const void __user *from, unsigned long size)
19 {
20         char *dst = to;
21         const char __user *src = from;
22
23         while (size--) {
24                 if (__get_user(*dst, src))
25                         break;
26                 dst++;
27                 src++;
28         }
29
30         if (size)
31                 memset(dst, 0, size);
32
33         return size;
34 }
35
36 unsigned long copy_to_user_fixup(void __user *to, const void *from, unsigned long size)
37 {
38         char __user *dst = to;
39         const char *src = from;
40
41         while (size--) {
42                 if (__put_user(*src, dst))
43                         break;
44                 dst++;
45                 src++;
46         }
47
48         return size;
49 }
50
51 unsigned long copy_in_user_fixup(void __user *to, void __user *from, unsigned long size)
52 {
53         char __user *dst = to;
54         char __user *src = from;
55
56         while (size--) {
57                 char tmp;
58
59                 if (__get_user(tmp, src))
60                         break;
61                 if (__put_user(tmp, dst))
62                         break;
63                 dst++;
64                 src++;
65         }
66
67         return size;
68 }