2
0

uaccess.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Helper routines to provide target memory access for semihosting
  3. * syscalls in system emulation mode.
  4. *
  5. * Copyright (c) 2007 CodeSourcery.
  6. *
  7. * This code is licensed under the GPL
  8. */
  9. #ifndef SEMIHOSTING_UACCESS_H
  10. #define SEMIHOSTING_UACCESS_H
  11. #ifdef CONFIG_USER_ONLY
  12. #error Cannot include semihosting/uaccess.h from user emulation
  13. #endif
  14. #include "exec/cpu-common.h"
  15. #include "exec/cpu-defs.h"
  16. #include "exec/tswap.h"
  17. #include "exec/page-protection.h"
  18. /**
  19. * get_user_u64:
  20. *
  21. * Returns: 0 on success, -1 on error.
  22. */
  23. #define get_user_u64(val, addr) \
  24. ({ uint64_t val_ = 0; \
  25. int ret_ = cpu_memory_rw_debug(env_cpu(env), (addr), \
  26. &val_, sizeof(val_), 0); \
  27. (val) = tswap64(val_); ret_; })
  28. /**
  29. * get_user_u32:
  30. *
  31. * Returns: 0 on success, -1 on error.
  32. */
  33. #define get_user_u32(val, addr) \
  34. ({ uint32_t val_ = 0; \
  35. int ret_ = cpu_memory_rw_debug(env_cpu(env), (addr), \
  36. &val_, sizeof(val_), 0); \
  37. (val) = tswap32(val_); ret_; })
  38. /**
  39. * get_user_u8:
  40. *
  41. * Returns: 0 on success, -1 on error.
  42. */
  43. #define get_user_u8(val, addr) \
  44. ({ uint8_t val_ = 0; \
  45. int ret_ = cpu_memory_rw_debug(env_cpu(env), (addr), \
  46. &val_, sizeof(val_), 0); \
  47. (val) = val_; ret_; })
  48. /**
  49. * get_user_ual:
  50. *
  51. * Returns: 0 on success, -1 on error.
  52. */
  53. #define get_user_ual(arg, p) get_user_u32(arg, p)
  54. /**
  55. * put_user_u64:
  56. *
  57. * Returns: 0 on success, -1 on error.
  58. */
  59. #define put_user_u64(val, addr) \
  60. ({ uint64_t val_ = tswap64(val); \
  61. cpu_memory_rw_debug(env_cpu(env), (addr), &val_, sizeof(val_), 1); })
  62. /**
  63. * put_user_u32:
  64. *
  65. * Returns: 0 on success, -1 on error.
  66. */
  67. #define put_user_u32(val, addr) \
  68. ({ uint32_t val_ = tswap32(val); \
  69. cpu_memory_rw_debug(env_cpu(env), (addr), &val_, sizeof(val_), 1); })
  70. /**
  71. * put_user_ual:
  72. *
  73. * Returns: 0 on success, -1 on error.
  74. */
  75. #define put_user_ual(arg, p) put_user_u32(arg, p)
  76. /**
  77. * uaccess_lock_user:
  78. *
  79. * The returned pointer should be freed using uaccess_unlock_user().
  80. */
  81. void *uaccess_lock_user(CPUArchState *env, target_ulong addr,
  82. target_ulong len, bool copy);
  83. /**
  84. * lock_user:
  85. *
  86. * The returned pointer should be freed using unlock_user().
  87. */
  88. #define lock_user(type, p, len, copy) uaccess_lock_user(env, p, len, copy)
  89. /**
  90. * uaccess_lock_user_string:
  91. *
  92. * The returned string should be freed using uaccess_unlock_user().
  93. */
  94. char *uaccess_lock_user_string(CPUArchState *env, target_ulong addr);
  95. /**
  96. * uaccess_lock_user_string:
  97. *
  98. * The returned string should be freed using unlock_user().
  99. */
  100. #define lock_user_string(p) uaccess_lock_user_string(env, p)
  101. void uaccess_unlock_user(CPUArchState *env, void *p,
  102. target_ulong addr, target_ulong len);
  103. #define unlock_user(s, args, len) uaccess_unlock_user(env, s, args, len)
  104. ssize_t uaccess_strlen_user(CPUArchState *env, target_ulong addr);
  105. #define target_strlen(p) uaccess_strlen_user(env, p)
  106. #endif /* SEMIHOSTING_SOFTMMU_UACCESS_H */