You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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