1 #ifndef _GPXE_EFI_UACCESS_H 2 #define _GPXE_EFI_UACCESS_H 3 4 /** @file 5 * 6 * gPXE user access API for EFI 7 * 8 * EFI runs with flat physical addressing, so the various mappings 9 * between virtual addresses, I/O addresses and bus addresses are all 10 * no-ops. 11 */ 12 13 FILE_LICENCE ( GPL2_OR_LATER ); 14 15 #ifdef UACCESS_EFI 16 #define UACCESS_PREFIX_efi 17 #else 18 #define UACCESS_PREFIX_efi __efi_ 19 #endif 20 21 /** 22 * Convert physical address to user pointer 23 * 24 * @v phys_addr Physical address 25 * @ret userptr User pointer 26 */ 27 static inline __always_inline userptr_t 28 UACCESS_INLINE ( efi, phys_to_user ) ( unsigned long phys_addr ) { 29 return phys_addr; 30 } 31 32 /** 33 * Convert user buffer to physical address 34 * 35 * @v userptr User pointer 36 * @v offset Offset from user pointer 37 * @ret phys_addr Physical address 38 */ 39 static inline __always_inline unsigned long 40 UACCESS_INLINE ( efi, user_to_phys ) ( userptr_t userptr, off_t offset ) { 41 return ( userptr + offset ); 42 } 43 44 static inline __always_inline userptr_t 45 UACCESS_INLINE ( efi, virt_to_user ) ( volatile const void *addr ) { 46 return trivial_virt_to_user ( addr ); 47 } 48 49 static inline __always_inline void * 50 UACCESS_INLINE ( efi, user_to_virt ) ( userptr_t userptr, off_t offset ) { 51 return trivial_user_to_virt ( userptr, offset ); 52 } 53 54 static inline __always_inline userptr_t 55 UACCESS_INLINE ( efi, userptr_add ) ( userptr_t userptr, off_t offset ) { 56 return trivial_userptr_add ( userptr, offset ); 57 } 58 59 static inline __always_inline void 60 UACCESS_INLINE ( efi, memcpy_user ) ( userptr_t dest, off_t dest_off, 61 userptr_t src, off_t src_off, 62 size_t len ) { 63 trivial_memcpy_user ( dest, dest_off, src, src_off, len ); 64 } 65 66 static inline __always_inline void 67 UACCESS_INLINE ( efi, memmove_user ) ( userptr_t dest, off_t dest_off, 68 userptr_t src, off_t src_off, 69 size_t len ) { 70 trivial_memmove_user ( dest, dest_off, src, src_off, len ); 71 } 72 73 static inline __always_inline void 74 UACCESS_INLINE ( efi, memset_user ) ( userptr_t buffer, off_t offset, 75 int c, size_t len ) { 76 trivial_memset_user ( buffer, offset, c, len ); 77 } 78 79 static inline __always_inline size_t 80 UACCESS_INLINE ( efi, strlen_user ) ( userptr_t buffer, off_t offset ) { 81 return trivial_strlen_user ( buffer, offset ); 82 } 83 84 static inline __always_inline off_t 85 UACCESS_INLINE ( efi, memchr_user ) ( userptr_t buffer, off_t offset, 86 int c, size_t len ) { 87 return trivial_memchr_user ( buffer, offset, c, len ); 88 } 89 90 #endif /* _GPXE_EFI_UACCESS_H */ 91