SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005  David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
017 */
018 #ifndef _SOS_UACCESS_H_
019 #define _SOS_UACCESS_H_
020 
021 
022 /**
023  * @file uaccess.h
024  *
025  * Routines to access user-space data from inside the kernel space.
026  */
027 
028 #include <sos/types.h>
029 #include <sos/errno.h>
030 
031 
032 /**
033  * Retrieve a bunch of data from the user space of the
034  * current_thread->process
035  *
036  * @return <0 on error ! Return the number of bytes successfully copied
037  * otherwise.
038  */
039 sos_ret_t sos_memcpy_from_user(sos_vaddr_t kernel_to,
040                                sos_uaddr_t user_from,
041                                sos_size_t size);
042 
043 
044 /**
045  * Retrieve a bunch of data from the user space of the
046  * current_thread->process and copy it in a newly allocated kernel
047  * area
048  *
049  * @return NULL on error (including unresolved page fault during
050  * transfer)
051  */
052 sos_ret_t sos_memdup_from_user(sos_vaddr_t * kernel_to, sos_uaddr_t from_user,
053                                sos_size_t length,
054                                sos_ui32_t kmalloc_flags);
055 
056 
057 /**
058  * Transfer a bunch of data to the user space of the
059  * current_thread->process
060  *
061  * @return <0 n error ! Return the number of bytes successfully copied
062  * otherwise.
063  */
064 sos_ret_t sos_memcpy_to_user(sos_uaddr_t user_to,
065                              sos_vaddr_t kernel_from,
066                              sos_size_t size);
067 
068 
069 /**
070  * @return the length of the given user space string user_str
071  * (excluding the trailing \0), up to max_len bytes. <0 on error
072  * (unresolved page fault, etc.)
073  */
074 sos_ret_t sos_strnlen_from_user(sos_uaddr_t user_str, sos_size_t max_len);
075 
076 
077 /**
078  * Copy the given user space string to kernel space, up to max_len
079  * bytes (including trailing \0)
080  *
081  * @return SOS_OK on success, <0 otherwise (unresolved page fault, etc.)
082  */
083 sos_ret_t sos_strzcpy_from_user(char *kernel_to, sos_uaddr_t user_from,
084                                 sos_size_t max_len);
085 
086 
087 /**
088  * Copy the given kernel string to user space, up to max_len bytes
089  * (including trailing \0)
090  *
091  * @return SOS_OK on success, <0 otherwise (unresolved page fault, etc.)
092  */
093 sos_ret_t sos_strzcpy_to_user(sos_uaddr_t user_to, const char *kernel_from,
094                               sos_size_t max_len);
095 
096 
097 /**
098  * Copy the given user space string into a new allocated kernel space
099  * area of the correct size, up to max_len bytes (including trailing
100  * \0)
101  *
102  * @return SOS_OK on success + *kernel_to is set to the freshly
103  * allocated kernel string, <0 otherwise (unresolved page fault, etc.)
104  */
105 sos_ret_t sos_strndup_from_user(char ** kernel_to, sos_uaddr_t from_user,
106                                 sos_size_t max_len,
107                                 sos_ui32_t kmalloc_flags);
108 
109 
110 /*
111  * Special functions to access both kernel/user space
112  */
113 /** Generic (Kernel or User) virtual address. We define a structure to
114     force the compiler to signal when we call this special function
115     with a usual address... */
116 typedef struct sos_genaddr { sos_bool_t is_user;
117                              sos_ui32_t addr; } sos_genaddr_t;
118 #define SOS_GENADDR_DECL(name,_is_user,_addr) \
119   sos_genaddr_t name = (struct sos_genaddr) { .is_user=_is_user, .addr=_addr }
120 
121 sos_ret_t sos_memcpy_generic_to(sos_genaddr_t to_addr,
122                                 sos_vaddr_t kernel_from,
123                                 sos_size_t size);
124 
125 sos_ret_t sos_memcpy_generic_from(sos_vaddr_t kernel_from,
126                                   sos_genaddr_t from_addr,
127                                   sos_size_t size);
128 
129 #endif /* _SOS_UACCESS_H_ */

source navigation ] diff markup ] identifier search ] general search ]