All of lore.kernel.org
 help / color / mirror / Atom feed
From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Reinoud Zandijk <reinoud@netbsd.org>,
	Warner Losh <imp@bsdimp.com>, Ryo ONODERA <ryoon@netbsd.org>,
	Kyle Evans <kevans@freebsd.org>,
	Karim Taha <kariem.taha2.7@gmail.com>,
	Richard Henderson <richard.henderson@linaro.org>
Subject: [PULL 06/36] bsd-user; Update the definitions of __put_user and __get_user macros
Date: Mon, 28 Aug 2023 17:37:51 -0600	[thread overview]
Message-ID: <20230828233821.43074-7-imp@bsdimp.com> (raw)
In-Reply-To: <20230828233821.43074-1-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 61501c321b0..ca791e18b22 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -272,50 +272,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
@@ -328,10 +315,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;                                         \
@@ -342,10 +329,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 f4e078ee1da..4db85a3485e 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.41.0



  parent reply	other threads:[~2023-08-28 23:44 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-28 23:37 [PULL 00/36] 2023q3 bsd user patches Warner Losh
2023-08-28 23:37 ` [PULL 01/36] bsd-user: Remove ELF_START_MMAP and image_info.start_mmap Warner Losh
2023-08-28 23:37 ` [PULL 02/36] bsd-user: Remove image_info.mmap Warner Losh
2023-08-28 23:37 ` [PULL 03/36] bsd-user: Remove image_info.start_brk Warner Losh
2023-08-28 23:37 ` [PULL 04/36] bsd-user: Move _WANT_FREEBSD macros to include/qemu/osdep.h Warner Losh
2023-08-28 23:37 ` [PULL 05/36] bsd-user: Disable clang warnings Warner Losh
2023-08-28 23:37 ` Warner Losh [this message]
2023-08-28 23:37 ` [PULL 07/36] bsd-user: Declarations of h2t and t2h conversion functions Warner Losh
2023-08-28 23:37 ` [PULL 08/36] bsd-user: Add struct target_freebsd11_stat to bsd-user/syscall_defs Warner Losh
2023-08-28 23:37 ` [PULL 09/36] bsd-user: Add struct target_stat to bsd-user/syscall_defs.h Warner Losh
2023-08-28 23:37 ` [PULL 10/36] bsd-user: Add structs target_freebsd11_{nstat,statfs} Warner Losh
2023-08-28 23:37 ` [PULL 11/36] bsd-user: Add struct target_statfs Warner Losh
2023-08-28 23:37 ` [PULL 12/36] bsd-user: Add struct target_freebsd_fhandle and fcntl flags Warner Losh
2023-08-28 23:37 ` [PULL 13/36] bsd-user: Define safe_fcntl macro in bsd-user/syscall_defs.h Warner Losh
2023-08-28 23:37 ` [PULL 14/36] bsd-user: Rename target_freebsd_time_t to target_time_t Warner Losh
2023-08-28 23:38 ` [PULL 15/36] bsd-user: Implement h2t_freebsd11_stat h2t_freebsd_nstat Warner Losh
2023-08-28 23:38 ` [PULL 16/36] bsd-user: Implement h2t_freebsd_fhandle t2h_freebsd_fhandle Warner Losh
2023-08-28 23:38 ` [PULL 17/36] bsd-user: Implement h2t_freebds11_statfs Warner Losh
2023-08-28 23:38 ` [PULL 18/36] bsd-user: Implement target_to_host_fcntl_cmd Warner Losh
2023-08-28 23:38 ` [PULL 19/36] bsd-uesr: Implement h2t_freebsd_stat and h2t_freebsd_statfs functions Warner Losh
2023-08-28 23:38 ` [PULL 20/36] bsd-user: Implement stat related syscalls Warner Losh
2023-08-28 23:38 ` [PULL 21/36] bsd-user: Implement statfh " Warner Losh
2023-08-28 23:38 ` [PULL 22/36] bsd-user: Implement statfs " Warner Losh
2023-08-28 23:38 ` [PULL 23/36] bsd-user: Implement getdents " Warner Losh
2023-08-28 23:38 ` [PULL 24/36] bsd-user: Implement stat " Warner Losh
2023-08-28 23:38 ` [PULL 25/36] bsd-user: Implement freebsd11 " Warner Losh
2023-08-28 23:38 ` [PULL 26/36] bsd-user: Implement freebsd11 fstat and fhstat " Warner Losh
2023-08-28 23:38 ` [PULL 27/36] bsd-user: Implement freebsd11 statfs " Warner Losh
2023-08-28 23:38 ` [PULL 28/36] bsd-user: Implement freebsd11 getdirents " Warner Losh
2023-08-28 23:38 ` [PULL 29/36] bsd-user: Implement freebsd11 netbsd stat " Warner Losh
2023-08-28 23:38 ` [PULL 30/36] bsd-user: Implement do_freebsd_realpathat syscall Warner Losh
2023-08-28 23:38 ` [PULL 31/36] bsd-user: Add os-stat.c to the build Warner Losh
2023-08-28 23:38 ` [PULL 32/36] bsd-user: Add glue for the freebsd11_stat syscalls Warner Losh
2023-08-28 23:38 ` [PULL 33/36] bsd-user: Add glue for getfh and related syscalls Warner Losh
2023-08-28 23:38 ` [PULL 34/36] bsd-user: Add glue for statfs related system calls Warner Losh
2023-08-28 23:38 ` [PULL 35/36] bsd-user: Add getdents and fcntl " Warner Losh
2023-08-28 23:38 ` [PULL 36/36] bsd-user: Add missing break after do_bsd_preadv Warner Losh
2023-08-29 13:50 ` [PULL 00/36] 2023q3 bsd user patches Stefan Hajnoczi
2023-08-29 15:32   ` Warner Losh
2023-08-29 17:30   ` Peter Maydell
2023-08-29 18:38     ` Warner Losh

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=20230828233821.43074-7-imp@bsdimp.com \
    --to=imp@bsdimp.com \
    --cc=kariem.taha2.7@gmail.com \
    --cc=kevans@freebsd.org \
    --cc=qemu-devel@nongnu.org \
    --cc=reinoud@netbsd.org \
    --cc=richard.henderson@linaro.org \
    --cc=ryoon@netbsd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.