[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / include / gpxe / efi / efi_uaccess.h
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 #ifdef UACCESS_EFI
14 #define UACCESS_PREFIX_efi
15 #else
16 #define UACCESS_PREFIX_efi __efi_
17 #endif
18
19 /**
20  * Convert physical address to user pointer
21  *
22  * @v phys_addr         Physical address
23  * @ret userptr         User pointer
24  */
25 static inline __always_inline userptr_t
26 UACCESS_INLINE ( efi, phys_to_user ) ( unsigned long phys_addr ) {
27         return phys_addr;
28 }
29
30 /**
31  * Convert user buffer to physical address
32  *
33  * @v userptr           User pointer
34  * @v offset            Offset from user pointer
35  * @ret phys_addr       Physical address
36  */
37 static inline __always_inline unsigned long
38 UACCESS_INLINE ( efi, user_to_phys ) ( userptr_t userptr, off_t offset ) {
39         return ( userptr + offset );
40 }
41
42 static inline __always_inline userptr_t
43 UACCESS_INLINE ( efi, virt_to_user ) ( volatile const void *addr ) {
44         return trivial_virt_to_user ( addr );
45 }
46
47 static inline __always_inline void *
48 UACCESS_INLINE ( efi, user_to_virt ) ( userptr_t userptr, off_t offset ) {
49         return trivial_user_to_virt ( userptr, offset );
50 }
51
52 static inline __always_inline userptr_t
53 UACCESS_INLINE ( efi, userptr_add ) ( userptr_t userptr, off_t offset ) {
54         return trivial_userptr_add ( userptr, offset );
55 }
56
57 static inline __always_inline void
58 UACCESS_INLINE ( efi, memcpy_user ) ( userptr_t dest, off_t dest_off,
59                                         userptr_t src, off_t src_off,
60                                         size_t len ) {
61         trivial_memcpy_user ( dest, dest_off, src, src_off, len );
62 }
63
64 static inline __always_inline void
65 UACCESS_INLINE ( efi, memmove_user ) ( userptr_t dest, off_t dest_off,
66                                          userptr_t src, off_t src_off,
67                                          size_t len ) {
68         trivial_memmove_user ( dest, dest_off, src, src_off, len );
69 }
70
71 static inline __always_inline void
72 UACCESS_INLINE ( efi, memset_user ) ( userptr_t buffer, off_t offset,
73                                         int c, size_t len ) {
74         trivial_memset_user ( buffer, offset, c, len );
75 }
76
77 static inline __always_inline size_t
78 UACCESS_INLINE ( efi, strlen_user ) ( userptr_t buffer, off_t offset ) {
79         return trivial_strlen_user ( buffer, offset );
80 }
81
82 static inline __always_inline off_t
83 UACCESS_INLINE ( efi, memchr_user ) ( userptr_t buffer, off_t offset,
84                                         int c, size_t len ) {
85         return trivial_memchr_user ( buffer, offset, c, len );
86 }
87
88 #endif /* _GPXE_EFI_UACCESS_H */