summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2022-02-02 09:05:56 +0000
committerPeter Maydell <peter.maydell@linaro.org>2022-02-02 09:05:56 +0000
commitf7c0e223acd5021d03736644cc0abf3501003820 (patch)
tree9b7636760db49ee543abc06118e38a31afb898ca
parent47cc1a3655135b89fa75c2824fbddd29df874612 (diff)
parenteb9d35f686ed1279d57463d9e6f289988f594c19 (diff)
downloadfocaccia-qemu-f7c0e223acd5021d03736644cc0abf3501003820.tar.gz
focaccia-qemu-f7c0e223acd5021d03736644cc0abf3501003820.zip
Merge remote-tracking branch 'remotes/bsdimp/tags/bsd-user-fix-pull-request' into staging
Pull request

Fix FreeBSD 12 and 13 builds.

# gpg: Signature made Tue 01 Feb 2022 21:58:37 GMT
# gpg:                using RSA key 2035F894B00AA3CF7CCDE1B76C1CD1287DB01100
# gpg: Good signature from "Warner Losh <wlosh@netflix.com>" [unknown]
# gpg:                 aka "Warner Losh <imp@bsdimp.com>" [unknown]
# gpg:                 aka "Warner Losh <imp@freebsd.org>" [unknown]
# gpg:                 aka "Warner Losh <imp@village.org>" [unknown]
# gpg:                 aka "Warner Losh <wlosh@bsdimp.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 2035 F894 B00A A3CF 7CCD  E1B7 6C1C D128 7DB0 1100

* remotes/bsdimp/tags/bsd-user-fix-pull-request:
  bsd-user/signal.c: Only copy the _capsicum for FreeBSD_version > 1400026

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--bsd-user/signal-common.h5
-rw-r--r--bsd-user/signal.c5
2 files changed, 10 insertions, 0 deletions
diff --git a/bsd-user/signal-common.h b/bsd-user/signal-common.h
index 7ff8e8f2e4..6f90345bb2 100644
--- a/bsd-user/signal-common.h
+++ b/bsd-user/signal-common.h
@@ -59,12 +59,17 @@ void target_to_host_sigset(sigset_t *d, const target_sigset_t *s);
  * For FreeBSD, we have si_pid, si_uid, si_status, and si_addr always. Linux and
  * {Open,Net}BSD have a different approach (where their reason field is larger,
  * but whose siginfo has fewer fields always).
+ *
+ * QEMU_SI_CAPSICUM is currently only FreeBSD 14 current only, so only define
+ * it where _capsicum is available.
  */
 #define QEMU_SI_NOINFO   0      /* nothing other than si_signo valid */
 #define QEMU_SI_FAULT    1      /* _fault is valid in _reason */
 #define QEMU_SI_TIMER    2      /* _timer is valid in _reason */
 #define QEMU_SI_MESGQ    3      /* _mesgq is valid in _reason */
 #define QEMU_SI_POLL     4      /* _poll is valid in _reason */
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1400026
 #define QEMU_SI_CAPSICUM 5      /* _capsicum is valid in _reason */
+#endif
 
 #endif
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index ad22ba9d90..0bc6d2edbd 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -222,6 +222,7 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
          * We have to go based on the signal number now to figure out
          * what's valid.
          */
+        si_type = QEMU_SI_NOINFO;
         if (has_trapno(sig)) {
             tinfo->_reason._fault._trapno = info->_reason._fault._trapno;
             si_type = QEMU_SI_FAULT;
@@ -241,11 +242,13 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
          * capsicum is somewhere between weak and non-existant, but if we get
          * one, then we know what to save.
          */
+#ifdef QEMU_SI_CAPSICUM
         if (sig == TARGET_SIGTRAP) {
             tinfo->_reason._capsicum._syscall =
                 info->_reason._capsicum._syscall;
             si_type = QEMU_SI_CAPSICUM;
         }
+#endif
         break;
     }
     tinfo->si_code = deposit32(si_code, 24, 8, si_type);
@@ -295,10 +298,12 @@ static void tswap_siginfo(target_siginfo_t *tinfo, const target_siginfo_t *info)
         /* Note: Not generated on FreeBSD */
         __put_user(info->_reason._poll._band, &tinfo->_reason._poll._band);
         break;
+#ifdef QEMU_SI_CAPSICUM
     case QEMU_SI_CAPSICUM:
         __put_user(info->_reason._capsicum._syscall,
                    &tinfo->_reason._capsicum._syscall);
         break;
+#endif
     default:
         g_assert_not_reached();
     }