00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00041 #include <syscall/copy.h>
00042 #include <proc/thread.h>
00043 #include <mm/as.h>
00044 #include <macros.h>
00045 #include <arch.h>
00046 #include <errno.h>
00047 #include <typedefs.h>
00048
00061 int copy_from_uspace(void *dst, const void *uspace_src, size_t size)
00062 {
00063 ipl_t ipl;
00064 int rc;
00065
00066 ASSERT(THREAD);
00067 ASSERT(!THREAD->in_copy_from_uspace);
00068
00069 if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
00070 if (overlaps((__address) uspace_src, size,
00071 KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) {
00072
00073
00074
00075 return EPERM;
00076 }
00077 }
00078
00079 ipl = interrupts_disable();
00080 THREAD->in_copy_from_uspace = true;
00081
00082 rc = memcpy_from_uspace(dst, uspace_src, size);
00083
00084 THREAD->in_copy_from_uspace = false;
00085
00086 interrupts_restore(ipl);
00087 return !rc ? EPERM : 0;
00088 }
00089
00102 int copy_to_uspace(void *uspace_dst, const void *src, size_t size)
00103 {
00104 ipl_t ipl;
00105 int rc;
00106
00107 ASSERT(THREAD);
00108 ASSERT(!THREAD->in_copy_from_uspace);
00109
00110 if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
00111 if (overlaps((__address) uspace_dst, size,
00112 KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) {
00113
00114
00115
00116 return EPERM;
00117 }
00118 }
00119
00120 ipl = interrupts_disable();
00121 THREAD->in_copy_from_uspace = true;
00122
00123 rc = memcpy_to_uspace(uspace_dst, src, size);
00124
00125 THREAD->in_copy_from_uspace = false;
00126
00127 interrupts_restore(ipl);
00128 return !rc ? EPERM : 0;
00129 }
00130