qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Karim Taha <kariem.taha2.7@gmail.com>
To: qemu-devel@nongnu.org
Cc: imp@bsdimp.com, Karim Taha <kariem.taha2.7@gmail.com>,
	Richard Henderson <richard.henderson@linaro.org>
Subject: [PATCH v3 03/32] Update the definitions of __put_user and __get_user macros
Date: Sun, 13 Aug 2023 10:41:24 +0200	[thread overview]
Message-ID: <20230813084153.6510-4-kariem.taha2.7@gmail.com> (raw)
In-Reply-To: <20230813084153.6510-1-kariem.taha2.7@gmail.com>

From: Warner Losh <imp@bsdimp.com>

Use __builtin_choose_expr to avoid type promotion from ?:
in __put_user_e and __get_user_e macros.
Copied from linux-user/qemu.h, originally by Blue Swirl.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/qemu.h   | 81 ++++++++++++++++++++---------------------------
 bsd-user/signal.c |  5 +--
 2 files changed, 35 insertions(+), 51 deletions(-)

diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index edf9602f9b..656f38db56 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -276,50 +276,37 @@ static inline bool access_ok(int type, abi_ulong addr, abi_ulong size)
  * These are usually used to access struct data members once the struct has been
  * locked - usually with lock_user_struct().
  */
-#define __put_user(x, hptr)\
-({\
-    int size = sizeof(*hptr);\
-    switch (size) {\
-    case 1:\
-        *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
-        break;\
-    case 2:\
-        *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
-        break;\
-    case 4:\
-        *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
-        break;\
-    case 8:\
-        *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
-        break;\
-    default:\
-        abort();\
-    } \
-    0;\
-})
+#define __put_user_e(x, hptr, e)                                            \
+    do {                                                                    \
+        PRAGMA_DISABLE_PACKED_WARNING;                                      \
+        (__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p,                 \
+        __builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p,            \
+        __builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p,            \
+        __builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort))))  \
+            ((hptr), (x)), (void)0);                                        \
+        PRAGMA_REENABLE_PACKED_WARNING;                                     \
+    } while (0)
+
+#define __get_user_e(x, hptr, e)                                            \
+    do {                                                                    \
+        PRAGMA_DISABLE_PACKED_WARNING;                                      \
+        ((x) = (typeof(*hptr))(                                             \
+        __builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p,                 \
+        __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p,           \
+        __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p,            \
+        __builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort))))  \
+            (hptr)), (void)0);                                              \
+        PRAGMA_REENABLE_PACKED_WARNING;                                     \
+    } while (0)
 
-#define __get_user(x, hptr) \
-({\
-    int size = sizeof(*hptr);\
-    switch (size) {\
-    case 1:\
-        x = (typeof(*hptr))*(uint8_t *)(hptr);\
-        break;\
-    case 2:\
-        x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
-        break;\
-    case 4:\
-        x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
-        break;\
-    case 8:\
-        x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
-        break;\
-    default:\
-        x = 0;\
-        abort();\
-    } \
-    0;\
-})
+
+#if TARGET_BIG_ENDIAN
+# define __put_user(x, hptr)  __put_user_e(x, hptr, be)
+# define __get_user(x, hptr)  __get_user_e(x, hptr, be)
+#else
+# define __put_user(x, hptr)  __put_user_e(x, hptr, le)
+# define __get_user(x, hptr)  __get_user_e(x, hptr, le)
+#endif
 
 /*
  * put_user()/get_user() take a guest address and check access
@@ -332,10 +319,10 @@ static inline bool access_ok(int type, abi_ulong addr, abi_ulong size)
 ({                                                                      \
     abi_ulong __gaddr = (gaddr);                                        \
     target_type *__hptr;                                                \
-    abi_long __ret;                                                     \
+    abi_long __ret = 0;                                                 \
     __hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0);  \
     if (__hptr) {                                                       \
-        __ret = __put_user((x), __hptr);                                \
+        __put_user((x), __hptr);                                        \
         unlock_user(__hptr, __gaddr, sizeof(target_type));              \
     } else                                                              \
         __ret = -TARGET_EFAULT;                                         \
@@ -346,10 +333,10 @@ static inline bool access_ok(int type, abi_ulong addr, abi_ulong size)
 ({                                                                      \
     abi_ulong __gaddr = (gaddr);                                        \
     target_type *__hptr;                                                \
-    abi_long __ret;                                                     \
+    abi_long __ret = 0;                                                 \
     __hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1);   \
     if (__hptr) {                                                       \
-        __ret = __get_user((x), __hptr);                                \
+        __get_user((x), __hptr);                                        \
         unlock_user(__hptr, __gaddr, 0);                                \
     } else {                                                            \
         (x) = 0;                                                        \
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index f4e078ee1d..4db85a3485 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -787,10 +787,7 @@ static int reset_signal_mask(target_ucontext_t *ucontext)
     TaskState *ts = (TaskState *)thread_cpu->opaque;
 
     for (i = 0; i < TARGET_NSIG_WORDS; i++) {
-        if (__get_user(target_set.__bits[i],
-                    &ucontext->uc_sigmask.__bits[i])) {
-            return -TARGET_EFAULT;
-        }
+        __get_user(target_set.__bits[i], &ucontext->uc_sigmask.__bits[i]);
     }
     target_to_host_sigset_internal(&blocked, &target_set);
     ts->signal_mask = blocked;
-- 
2.40.0



  parent reply	other threads:[~2023-08-13 19:46 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-13  8:41 [PATCH v3 00/32] Implement the stat system calls for FreeBSD Karim Taha
2023-08-13  8:41 ` [PATCH v3 01/32] Move _WANT_FREEBSD macros to include/qemu/osdep.h Karim Taha
2023-08-13  8:41 ` [PATCH v3 02/32] Disable clang warnings Karim Taha
2023-08-13  8:41 ` Karim Taha [this message]
2023-08-13  8:41 ` [PATCH v3 04/32] Declarations of h2t and t2h conversion functions Karim Taha
2023-08-13  8:41 ` [PATCH v3 05/32] Add struct target_freebsd11_stat to bsd-user/syscall_defs Karim Taha
2023-08-13  8:41 ` [PATCH v3 06/32] Add struct target_stat to bsd-user/syscall_defs.h Karim Taha
2023-08-13  8:41 ` [PATCH v3 07/32] Add structs target_freebsd11_nstat and target_freebsd11_statfs " Karim Taha
2023-08-13  8:41 ` [PATCH v3 08/32] Add struct target_statfs " Karim Taha
2023-08-13  8:41 ` [PATCH v3 09/32] Add struct target_freebsd_fhandle and fcntl flags " Karim Taha
2023-08-13  8:41 ` [PATCH v3 10/32] Define safe_fcntl macro in bsd-user/syscall_defs.h Karim Taha
2023-08-13  8:41 ` [PATCH v3 11/32] Rename target_freebsd_time_t to target_time_t Karim Taha
2023-08-13  8:41 ` [PATCH v3 12/32] Implement h2t_freebsd11_stat h2t_freebsd_nstat Karim Taha
2023-08-13  8:41 ` [PATCH v3 13/32] Implement h2t_freebsd_fhandle t2h_freebsd_fhandle functions Karim Taha
2023-08-13  8:41 ` [PATCH v3 14/32] Implement h2t_freebds11_statfs Karim Taha
2023-08-13  8:41 ` [PATCH v3 15/32] Implement target_to_host_fcntl_cmd Karim Taha
2023-08-13  8:41 ` [PATCH v3 16/32] Implement h2t_freebsd_stat and h2t_freebsd_statfs functions Karim Taha
2023-08-13  8:41 ` [PATCH v3 17/32] Implement stat related syscalls Karim Taha
2023-08-13  8:41 ` [PATCH v3 18/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 19/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 20/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 21/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 22/32] Implement freebsd11 " Karim Taha
2023-08-13  8:41 ` [PATCH v3 23/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 24/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 25/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 26/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 27/32] Implement do_freebsd_realpathat syscall Karim Taha
2023-08-13  8:41 ` [PATCH v3 28/32] Add os-stat.c to the build Karim Taha
2023-08-13  8:41 ` [PATCH v3 29/32] Add glue to call the following syscalls to the freebsd_syscall function: Karim Taha
2023-08-13  8:41 ` [PATCH v3 30/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 31/32] " Karim Taha
2023-08-13  8:41 ` [PATCH v3 32/32] " Karim Taha
2023-08-20  4:03 ` [PATCH v3 00/32] Implement the stat system calls for FreeBSD Warner Losh
2023-08-21 11:59 ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230813084153.6510-4-kariem.taha2.7@gmail.com \
    --to=kariem.taha2.7@gmail.com \
    --cc=imp@bsdimp.com \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).