uaccess.h File Reference

Access to external ("user") memory. More...

#include <stdint.h>
#include <string.h>
#include <gpxe/api.h>
#include <config/ioapi.h>
#include <gpxe/efi/efi_uaccess.h>
#include <bits/uaccess.h>

Go to the source code of this file.

Defines

#define UNULL   ( ( userptr_t ) 0 )
 Equivalent of NULL for user pointers.
#define UACCESS_INLINE(_subsys, _api_func)   SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func )
 Calculate static inline user access API function name.
#define PROVIDE_UACCESS(_subsys, _api_func, _func)   PROVIDE_SINGLE_API ( UACCESS_PREFIX_ ## _subsys, _api_func, _func )
 Provide an user access API implementation.
#define PROVIDE_UACCESS_INLINE(_subsys, _api_func)   PROVIDE_SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func )
 Provide a static inline user access API implementation.

Typedefs

typedef unsigned long userptr_t
 A pointer to a user buffer.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static __always_inline userptr_t trivial_virt_to_user (volatile const void *addr)
 Convert virtual address to user pointer.
static __always_inline void * trivial_user_to_virt (userptr_t userptr, off_t offset)
 Convert user pointer to virtual address.
static __always_inline userptr_t trivial_userptr_add (userptr_t userptr, off_t offset)
 Add offset to user pointer.
static __always_inline void trivial_memcpy_user (userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
 Copy data between user buffers.
static __always_inline void trivial_memmove_user (userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
 Copy data between user buffers, allowing for overlap.
static __always_inline void trivial_memset_user (userptr_t buffer, off_t offset, int c, size_t len)
 Fill user buffer with a constant byte.
static __always_inline size_t trivial_strlen_user (userptr_t buffer, off_t offset)
 Find length of NUL-terminated string in user buffer.
static __always_inline off_t trivial_memchr_user (userptr_t buffer, off_t offset, int c, size_t len)
 Find character in user buffer.
userptr_t phys_to_user (unsigned long phys_addr)
 Convert physical address to user pointer.
unsigned long user_to_phys (userptr_t userptr, off_t offset)
 Convert user pointer to physical address.
userptr_t virt_to_user (volatile const void *addr)
 Convert virtual address to user pointer.
void * user_to_virt (userptr_t userptr, off_t offset)
 Convert user pointer to virtual address.
userptr_t userptr_add (userptr_t userptr, off_t offset)
 Add offset to user pointer.
static __always_inline
unsigned long 
virt_to_phys (volatile const void *addr)
 Convert virtual address to a physical address.
static __always_inline void * phys_to_virt (unsigned long phys_addr)
 Convert physical address to a virtual address.
void memcpy_user (userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
 Copy data between user buffers.
static __always_inline void copy_to_user (userptr_t dest, off_t dest_off, const void *src, size_t len)
 Copy data to user buffer.
static __always_inline void copy_from_user (void *dest, userptr_t src, off_t src_off, size_t len)
 Copy data from user buffer.
void memmove_user (userptr_t dest, off_t dest_off, userptr_t src, off_t src_off, size_t len)
 Copy data between user buffers, allowing for overlap.
void memset_user (userptr_t userptr, off_t offset, int c, size_t len)
 Fill user buffer with a constant byte.
size_t strlen_user (userptr_t userptr, off_t offset)
 Find length of NUL-terminated string in user buffer.
off_t memchr_user (userptr_t userptr, off_t offset, int c, size_t len)
 Find character in user buffer.


Detailed Description

Access to external ("user") memory.

gPXE often needs to transfer data between internal and external buffers. On i386, the external buffers may require access via a different segment, and the buffer address cannot be encoded into a simple void * pointer. The userptr_t type encapsulates the information needed to identify an external buffer, and the copy_to_user() and copy_from_user() functions provide methods for transferring data between internal and external buffers.

Note that userptr_t is an opaque type; in particular, performing arithmetic upon a userptr_t is not allowed.

Definition in file uaccess.h.


Define Documentation

#define UNULL   ( ( userptr_t ) 0 )

#define UACCESS_INLINE ( _subsys,
_api_func   )     SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func )

Calculate static inline user access API function name.

Parameters:
_prefix Subsystem prefix
_api_func API function
Return values:
_subsys_func Subsystem API function

Definition at line 168 of file uaccess.h.

#define PROVIDE_UACCESS ( _subsys,
_api_func,
_func   )     PROVIDE_SINGLE_API ( UACCESS_PREFIX_ ## _subsys, _api_func, _func )

Provide an user access API implementation.

Parameters:
_prefix Subsystem prefix
_api_func API function
_func Implementing function

Definition at line 178 of file uaccess.h.

#define PROVIDE_UACCESS_INLINE ( _subsys,
_api_func   )     PROVIDE_SINGLE_API_INLINE ( UACCESS_PREFIX_ ## _subsys, _api_func )

Provide a static inline user access API implementation.

Parameters:
_prefix Subsystem prefix
_api_func API function

Definition at line 187 of file uaccess.h.


Typedef Documentation

typedef unsigned long userptr_t

A pointer to a user buffer.

Definition at line 33 of file uaccess.h.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

userptr_t phys_to_user ( unsigned long  phys_addr  ) 

unsigned long user_to_phys ( userptr_t  userptr,
off_t  offset 
)

userptr_t virt_to_user ( volatile const void *  addr  ) 

Convert virtual address to user pointer.

Parameters:
addr Virtual address
Return values:
userptr User pointer

Referenced by ata_identify(), com32_farcall(), com32_intcall(), copy_from_user(), copy_to_user(), embedded_init(), guess_int13_geometry(), scsi_read_capacity_10(), scsi_read_capacity_16(), and virt_to_phys().

void* user_to_virt ( userptr_t  userptr,
off_t  offset 
)

Convert user pointer to virtual address.

Parameters:
userptr User pointer
offset Offset from user pointer
Return values:
addr Virtual address
This operation is not available under all memory models.

Referenced by efi_image_exec(), efi_image_load(), and phys_to_virt().

userptr_t userptr_add ( userptr_t  userptr,
off_t  offset 
)

Add offset to user pointer.

Parameters:
userptr User pointer
offset Offset
Return values:
userptr New pointer value

Referenced by ecollect_free(), memtop_urealloc(), and nbi_process_segments().

static __always_inline unsigned long virt_to_phys ( volatile const void *  addr  )  [inline, static]

static __always_inline void* phys_to_virt ( unsigned long  phys_addr  )  [inline, static]

Convert physical address to a virtual address.

Parameters:
addr Virtual address
Return values:
phys_addr Physical address
This operation is not available under all memory models.

Definition at line 260 of file uaccess.h.

References phys_to_user(), and user_to_virt().

Referenced by aout_download(), arbel_alloc_icm(), bus_to_virt(), ce_loader(), com32_exec(), fnrec_init(), jump_2ep(), myri10ge_net_open(), video_init(), and vring_init().

00260                                                                               {
00261         return user_to_virt ( phys_to_user ( phys_addr ), 0 );
00262 }

void memcpy_user ( userptr_t  dest,
off_t  dest_off,
userptr_t  src,
off_t  src_off,
size_t  len 
)

static __always_inline void copy_to_user ( userptr_t  dest,
off_t  dest_off,
const void *  src,
size_t  len 
) [inline, static]

Copy data to user buffer.

Parameters:
dest Destination
dest_off Destination offset
src Source
len Length

Definition at line 285 of file uaccess.h.

References memcpy_user(), and virt_to_user().

Referenced by aoe_rx_ata(), bzimage_load_initrd(), bzimage_set_cmdline(), bzimage_update_header(), comboot_copy_cmdline(), comboot_init_psp(), copy_to_real(), downloader_xfer_deliver_iob(), efi_urealloc(), iscsi_rx_data_in(), memtop_urealloc(), pxe_api_call(), pxe_loader_call(), pxe_tftp_xfer_deliver_iob(), pxe_udp_deliver_iob(), pxenv_get_cached_info(), and read_user().

00285                                                                              {
00286         memcpy_user ( dest, dest_off, virt_to_user ( src ), 0, len );
00287 }

static __always_inline void copy_from_user ( void *  dest,
userptr_t  src,
off_t  src_off,
size_t  len 
) [inline, static]

void memmove_user ( userptr_t  dest,
off_t  dest_off,
userptr_t  src,
off_t  src_off,
size_t  len 
)

Copy data between user buffers, allowing for overlap.

Parameters:
dest Destination
dest_off Destination offset
src Source
src_off Source offset
len Length

Referenced by memtop_urealloc(), and shuffle().

void memset_user ( userptr_t  userptr,
off_t  offset,
int  c,
size_t  len 
)

Fill user buffer with a constant byte.

Parameters:
userptr User buffer
offset Offset within buffer
c Constant byte with which to fill
len Length

Referenced by comboot_prepare_segment(), prep_segment(), and shuffle().

size_t strlen_user ( userptr_t  userptr,
off_t  offset 
)

Find length of NUL-terminated string in user buffer.

Parameters:
userptr User buffer
offset Offset within buffer
Return values:
len Length of string (excluding NUL)

Referenced by int22(), pxenv_file_exec(), pxenv_file_open(), and read_smbios_string().

off_t memchr_user ( userptr_t  userptr,
off_t  offset,
int  c,
size_t  len 
)

Find character in user buffer.

Parameters:
userptr User buffer
offset Starting offset within buffer
c Character to search for
len Length of user buffer
Return values:
offset Offset of character, or <0 if not found

Referenced by script_exec().


Generated on Tue Apr 6 20:01:52 2010 for gPXE by  doxygen 1.5.7.1