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.

efi_uaccess.h 2.4KB

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