From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016013; cv=none; d=zohomail.com; s=zohoarc; b=jA6VfUns6Kin41iGZTVBMBHvTT7rfEoXv49BudpFER3ACFBe3x+N5jHqdT5pnml+CBUt4DkzWKKpPK73RzYPOcnyrJwLZ46ged0yvEqpjd8tOpE/MkWHYrrjBk44DhNLyhGqhFqKs9/Pl2iuV5CMP/f8o+lnnu743aNtvbCjTxQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016013; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fzpwJqrwWAd3VFFYpaG8wAf+Nc1z6/55fHtqwLYrqxM=; b=XpAHtXshYZT+yaJ/Z9zBTcY3ZuRMj4UNX0YNmd/NAvG9d6FRXo3ZWx3Ii3tGurPfvtq8qLRYgIPC3uYBmsyfhlyK6WnnECWujGYQ6Kj7zIgn3+kIhGz+l0GL1dTKaemkQth1c7x0uq2Muis1oUL7m82GFK4DhQvN4wukaCEbSlw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016013320449.8792561792791; Sat, 20 Jun 2026 21:26:53 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9go-0002t8-C8; Sun, 21 Jun 2026 00:21:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gl-0002sU-Fu for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:43 -0400 Received: from mail-oo1-xc33.google.com ([2607:f8b0:4864:20::c33]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gj-000513-5x for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:43 -0400 Received: by mail-oo1-xc33.google.com with SMTP id 006d021491bc7-69dead44101so2844904eaf.3 for ; Sat, 20 Jun 2026 21:21:39 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015698; x=1782620498; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fzpwJqrwWAd3VFFYpaG8wAf+Nc1z6/55fHtqwLYrqxM=; b=dY44YDjy0oG55DrLq2IewW1stWYmQR94YrhRb+Vq87W+AHOCbrileeQSouRKeCprCI nNXcwbC5+LcVphbGjtRyKezQoI7nHE/F7Y3Ogh0OIfsa2fnFJzmJdUGpN//VmBa43bzl URpfQLcIsl87gdjm2n2zQpgaUpRVwADjlby4KK0HG1zWXZCytBZOoSqYlMV3A/p/UH+u x0sANPHOAlJZzcusj3HpoRfR9znbPAGEi5IOVOvZcWDkdXr6s6VctxJiIBiDxQf4sQLI ER/BonkIHYcmarq8bYhTLAeWFdvwVsEkwxhblasfVrW0fkhKgigqsSnOy4KgdOz7Ldmt 4MDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015698; x=1782620498; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=fzpwJqrwWAd3VFFYpaG8wAf+Nc1z6/55fHtqwLYrqxM=; b=MbMUt6+hwWsui4+UVWfW/Bd/Eu6JQ+6nBemOBwdME5bPz1Tqz0vNaGSF8hctLOmLyb bvvfsLzeVAcyJAUiRSAvyqTSqOer8i24uMPRQTL8/L9cTvALliLXuc5jdD6XoeHh7Aoi M0YgEd90HUcr2uQhp+zXUzfPwuhWxb/iuGA6659p782Dzl8SK9sqD5C8PcqLHbrFObzk 6jIxwlVvmaTjDI7JLPW2IE17rL6YroSR43oYe/LblHOwQrZVS3pcYfKHTqnBNQ3HY8MF E5uCfQUcE+AsmLchJM5j5CBTuONY4dL78DeqE31v8o4D+CwWweJs/TcxFxrmw0qD0guT H0iQ== X-Gm-Message-State: AOJu0YwtZl69Uht0zfj1ks9qHFb4dZNcSiKWn8gdDHpa7sNpFSL/qiUa p2HZNYETlkkY8FZNJrfjChRgdLX1rJEmkkd+LxevK/aoktb23vkQzqESqITgibw3+qa2hy4ZnND 9BhYQCESZ7g== X-Gm-Gg: AfdE7cnz0toSu6uAhsFtOQYigbqNnqO++SBnZ9+920ROL5sCPcRih4MGAlZMsukMImJ QadiD0xXMNelTS1oREI+q7jUk1A81eSzTeXnQK+kVwPs7b5Mhy+KWitnXo6JyXtt01s80q2ZaGa GzRoymKgfZQUTT0FIMdXaLW8qZ3654ZfaQvEiRf21Ckr2I6XzTfQUhEbMVz6jLkekaFwfGTg7z4 Bf0v79OuoSE9sNW9NrHQTWeBTZXVRQZgyPKiIJJoXwyhUBpz2H2Xv99ubfyN8O9834JGorGvfl+ lMrkXCvjbuM0rfBK0ClV2jWLcZoXwTtc0fvyYS+ixKtYNPiTwSiYeeYun7lWHp26n3lI3klnruZ 6+qSinklu3voFRo0Otp9T5cIB0KtTxnb1izayJL515v8vncv+UR4r6/qNUp5Jz1J0lhS073EPkP w= X-Received: by 2002:a05:6820:4b86:b0:69e:9d90:4b31 with SMTP id 006d021491bc7-6a0d893f0c0mr8525579eaf.26.1782015698588; Sat, 20 Jun 2026 21:21:38 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:48 -0600 Subject: [PATCH v3 01/40] bsd-user: catchup to locking / mapping routines in bsd-misc. MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-1-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1559; i=imp@bsdimp.com; h=from:subject:message-id; bh=KM05tZy7MozYd/zz06WXSb3RtIm7HHqGMQ0kCX4eSvo=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z804w5eHy9TZ750O8jT3A9K0PgdvuL0e7Ym BgCXz/HUAuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfAAKCRBsHNEofbAR AIG5D/9aWImU7mDMHbqEtefZhZ1ReAU3oUqcr91GyQ6s1lCFWPS5dAg7QZ/G+AjsxPVU9I3E9Ea oDOwwyYM/5XWh6sP+Hozdjtocv6Qm9f/3X87tPdQyyYup+gfNY+oGK7iwbO4lfdKd3mpH8idTqR KpE7bO3jUZ/DHOOfhcvaZcglRfw6s4yFDocV/CBxuGJX2QmRACMwB9569mKrXajEs9A3a7SS4ms 72NkxgHcM5rVJGDdDkqwYUshD2nGc7l+ljNIzHTAEb01kpmDjfEY2JDT4ss9UG6SkYk9+yzD/XZ OLOvayIq3U2mdT871LEvtz5jdIbbr74G/0JPOR3aD5+Ub/LwWd1kL9lKn1n4DbhdJPIigRXEEtI C6FbAwQ40NxGTH9kseLThdd2rbGvnmO5hHG4GJChuT1qAc3UP9BXblZFEeFtZgS0YYXMEA3ttps Kwqbdqac1XuX1zIWMxLIi0SfxaDm2bxRUdT+127WPGsMHhn1E9xowxL34zuzBxITvT2jHYoxBlc WOHqbjTnvp22IXoXlALdE1EcQH7vjFoxGUJJMQs/dPMrU5pmjn6eJU8liw2thTVk7UYOMpGl6KH yx09/1WUqI1wN26WIVnXh5SukrytBCkcfdA04DWxoR1xedeaKKxzs9qXLWjm+4hViOAVG0g8qhX /He7aH60jP6c2CQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c33; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc33.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016015499154100 These were added to bsd-misc.c in a prior series. The declarations logically belong here, but aren't strictly needed with the current structure of the code due to include contamination. Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/qemu-bsd.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/bsd-user/qemu-bsd.h b/bsd-user/qemu-bsd.h index 756425d18e..f7c8338213 100644 --- a/bsd-user/qemu-bsd.h +++ b/bsd-user/qemu-bsd.h @@ -32,6 +32,24 @@ int host_to_target_waitstatus(int status); void h2g_rusage(const struct rusage *rusage, struct target_freebsd_rusage *target_rusage); =20 +/* bsd-misc.c */ +abi_long host_to_target_uuid(abi_ulong target_addr, struct uuid *host_uuid= ); + +abi_long target_to_host_semarray(int semid, unsigned short **host_array, + abi_ulong target_addr); +abi_long host_to_target_semarray(int semid, abi_ulong target_addr, + unsigned short **host_array); + +abi_long target_to_host_semid_ds(struct semid_ds *host_sd, + abi_ulong target_addr); +abi_long host_to_target_semid_ds(abi_ulong target_addr, + struct semid_ds *host_sd); + +abi_long target_to_host_msqid_ds(struct msqid_ds *host_md, + abi_ulong target_addr); +abi_long host_to_target_msqid_ds(abi_ulong target_addr, + struct msqid_ds *host_md); + /* bsd-mem.c */ void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip, struct target_ipc_perm *target_ip); --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016004; cv=none; d=zohomail.com; s=zohoarc; b=ZPFsvps87u13kd7tqWn2qnJc1rVK4uvLeyhLxbqcebMRJXCzrlK7Ml3qaMVVXVEx4rbqXJAkrwmp0NusdN9yzfAVCyO7tzTJPFUkAf5H39tEs/pvfirlwW4msZB/H9gJOJ3CqD2DVyjF+cKntOKfm/5T5MYoH8QK9RsCNFl0BnY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016004; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=SzihHIaAfDOvDex1+2MC40Tq1++DvlJ6+bozmCWbBNM=; b=Tiyy1YN9GXFdVWRAPmjtao669IiMF62+zhHOU4n5t5+aNj+/QKTbNtWJjXMhfTo1Xh6PJOGoluzBinwBWqY4b/zx24004XsJ6AYjkT1tmtgnt2ZOeiFoa5LBiU5WcxKpmqNaYL7nBRiiJankeruaFsYFZMYHBA4PWE8lPEeJx6E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016004219615.3023327938437; Sat, 20 Jun 2026 21:26:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gr-0002u3-8I; Sun, 21 Jun 2026 00:21:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9go-0002t7-2c for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:46 -0400 Received: from mail-oo1-xc2d.google.com ([2607:f8b0:4864:20::c2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gj-00051M-G1 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:45 -0400 Received: by mail-oo1-xc2d.google.com with SMTP id 006d021491bc7-6a0eb19ff49so819856eaf.1 for ; Sat, 20 Jun 2026 21:21:41 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015700; x=1782620500; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=SzihHIaAfDOvDex1+2MC40Tq1++DvlJ6+bozmCWbBNM=; b=rB/wgDDRrjQlwCB6MZ94mk1Yalz7zHSbj3JrvmWVjSocpc/l4T0ImZHBVDI8lqwJAA 8komzgbuFdL0y2oUpHGdQFSsewjlIXC+9SDBcP8gY9gyj64cUxuWpbbh/51jdSvHHXJO z+ofTMIXBb6H9Y8l2WHoF8BiIq+tVw/8IxbrzTrnspPn+qYRwHI/ajXmCC6Wt7CcFsrq PdWy08hyGbeq0SiG0RpyQngrPSGh1amYMxti4veCzNT+WWazNmJkOSYb8l4N/4LMDZI8 TJkr55r7GnDTBXmGC4SkFTmrEtGK/8Ou2QQkPVkuXiKfOwoXwwCgco82Gv706Prmx7b1 drWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015700; x=1782620500; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=SzihHIaAfDOvDex1+2MC40Tq1++DvlJ6+bozmCWbBNM=; b=ADSf3rcWPA21gfQ+tPWtSDAnwt0tWsrFj8dw9HNPPt4EBYtiTdz3aJE+YtgRu9fuhH z68SPJ5le/DgMgJWXt+jO3LhwT2ThoGijRaFtzmi9KWitKgLcmPUTMA88ujtNzEKtisj K/7B00ok6Gf4Rw5MJJqvbm9FWIWaFL6qHoEWNLFxuD5ol48ujk3I6kMnb/u4Ek4pMhJX kOW7j+UFDPnx4o2unnzYIdyIjU5aNsZWC1HZYc6eyOToT22NQ3pos3uhIq5tv873oOm+ 1PPpZ4LH+sf94YUhe1JaMK7JjlzQCBVHzewlUJZzBNKiM07bWdp+3rHUL/EukTR72uyp j7Sg== X-Gm-Message-State: AOJu0YzBPyWDrhP2VX8E+tCgCje6pz3+kn1I83DSsNDUatU7cnirq1Ga oGU2+aTE5v4SfDDtUehdRkvJp+E3prPWOqrevdAqkaSRVpoJpS4sGOXcJ/wde8kk9qs= X-Gm-Gg: AfdE7cmE386XOfC+5RsFGcC0J6wS+/k4arS/YvMXOJl1o/TaI6OXVqhqUmF0W0eE39d on9XmgEY89ILk5V1JJT+ed+xU9dsD/2B35b3/LLELkm4ZDl4HOxfF9UnHO1UN6Pe39cwyQDhA9O ix6ICrWRUN7vBVb9autf+IHzrNMmYrvlW2sk+iuUwEVdynYu+KHx50GteDO9YaFXNW8KEPmYcbP poJZn0jN9+klREFoMGMPO+hHwX5YBmqv4PLXtTRAdBOvYHd0Udjf83BGSBl83wExft27oIIw0gg +VX1A9VVL3Jm8fNpnSEntIFcNDQu0lb0M4PTSb53ZSC5laO8osNSyHXfT+OM7r7CFWvoixmrUqG d3XnKz94jqx7uUm+K2wgQPiwOGbSNHy+vFleNU2SI3PKYy3JnrKSPOcAewzId/ZNWZ6ohx3IUOP 8= X-Received: by 2002:a4a:ee06:0:b0:6a0:e3ec:7a69 with SMTP id 006d021491bc7-6a0e3ec7dffmr5568910eaf.54.1782015700202; Sat, 20 Jun 2026 21:21:40 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:49 -0600 Subject: [PATCH v3 02/40] bsd-user: Rename cpu_env to env throughout bsd-user MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-2-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=23599; i=imp@bsdimp.com; h=from:subject:message-id; bh=RfqlJee1Ojc9qmaY2UUE6xBfxvRfJr9J1sNhCYioYGg=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z8m5UedQD6WAU7EnxBZRazrx+g0i6VjZhXL ZNdt5A8bn6JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfAAKCRBsHNEofbAR ALTaD/9an/n2qUg7uwrn69eDuj26dtMI07NfVxZw7dyNMryDpEws0hT1G3K2K34otITamBno4YL IYUQKhx5c9i504YxBYJevHjd6k0mQM+5lne/YPaF77FBsNXSrDFzj+eWyybKJnB+7sUhjZDyXUu tcktycIotA5RLF8WvyMwYvufPcC8kmgmVEO1E2uRhHytP2HKM83hjQYh7hRmj6DAirU403zDbZh oDRFezzwii29nGXbFAE9BtdOEuDITb9iVCAQPjpuOH2rjjI714uQP+6aJukwj0DpOwSEJHrTu0V mrQx4JlwKWRWTInAYcHhFnOcKdik87SRyyyFhUrZ+jpGRtq2v93bliAqIy2cpc31snpxjeB2/SU ck8Z+deSYEhbdupQCquAXHeMGZ7ZHOUTRM56f41MjREWno9Le4fDaeCOTS+4RCLp0fBwWERZHN6 h4LYDfm8N4Vn6e3eKbY5QLU+a6dyrm4Ihgli1tWeSvLiM1ScI+OmUFfeRCXL7+VMIGBJMovSb3J w3GuZGCIyPo23R4EZ2cVC89Wn/NDcUpvAVjZPyxWnq7dzC6Hm+CbnpbqmvfzGk/QdosobyjbEgm /H2hGLH552+qFByZXT46UeSuY34qYgMq1MgAuhO7CLCSHuvD9rdQX4asRAxiWScT4VqfOpKzPfo jWheF1V+PhIH3wg== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2d; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016007455154100 Replace 'void *cpu_env' parameters with 'CPUArchState *env' across all bsd-user source files. This improves type safety and aligns with the convention used in the rest of the codebase. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/aarch64/target.h | 2 +- bsd-user/arm/target.h | 2 +- bsd-user/bsd-file.h | 28 +++++++++++++-------------- bsd-user/bsd-mem.h | 4 ++-- bsd-user/bsd-proc.h | 8 ++++---- bsd-user/freebsd/os-proc.c | 4 ++-- bsd-user/freebsd/os-proc.h | 26 ++++++++++++------------- bsd-user/freebsd/os-sys.c | 4 ++-- bsd-user/freebsd/os-syscall.c | 44 +++++++++++++++++++++------------------= ---- bsd-user/i386/target.h | 2 +- bsd-user/qemu.h | 6 +++--- bsd-user/riscv/target.h | 2 +- bsd-user/x86_64/target.h | 2 +- 13 files changed, 67 insertions(+), 67 deletions(-) diff --git a/bsd-user/aarch64/target.h b/bsd-user/aarch64/target.h index 702aeb7fc5..37b9817fe1 100644 --- a/bsd-user/aarch64/target.h +++ b/bsd-user/aarch64/target.h @@ -12,7 +12,7 @@ /* * aaarch64 ABI does not 'lump' the registers for 64-bit args. */ -static inline bool regpairs_aligned(void *cpu_env) +static inline bool regpairs_aligned(CPUArchState *env) { return false; } diff --git a/bsd-user/arm/target.h b/bsd-user/arm/target.h index 7c423ec575..cf131f29fb 100644 --- a/bsd-user/arm/target.h +++ b/bsd-user/arm/target.h @@ -12,7 +12,7 @@ /* * arm EABI 'lumps' the registers for 64-bit args. */ -static inline bool regpairs_aligned(void *cpu_env) +static inline bool regpairs_aligned(CPUArchState *env) { return true; } diff --git a/bsd-user/bsd-file.h b/bsd-user/bsd-file.h index dca1518cb1..dec59bd80b 100644 --- a/bsd-user/bsd-file.h +++ b/bsd-user/bsd-file.h @@ -72,7 +72,7 @@ static abi_long do_bsd_read(abi_long arg1, abi_long arg2,= abi_long arg3) } =20 /* pread(2) */ -static abi_long do_bsd_pread(void *cpu_env, abi_long arg1, +static abi_long do_bsd_pread(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long a= rg6) { abi_long ret; @@ -82,7 +82,7 @@ static abi_long do_bsd_pread(void *cpu_env, abi_long arg1, if (p =3D=3D NULL) { return -TARGET_EFAULT; } - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg4 =3D arg5; arg5 =3D arg6; } @@ -109,14 +109,14 @@ static abi_long do_bsd_readv(abi_long arg1, abi_long = arg2, abi_long arg3) } =20 /* preadv(2) */ -static abi_long do_bsd_preadv(void *cpu_env, abi_long arg1, +static abi_long do_bsd_preadv(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long a= rg6) { abi_long ret; struct iovec *vec =3D lock_iovec(VERIFY_WRITE, arg2, arg3, 1); =20 if (vec !=3D NULL) { - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg4 =3D arg5; arg5 =3D arg6; } @@ -151,7 +151,7 @@ static abi_long do_bsd_write(abi_long arg1, abi_long ar= g2, abi_long arg3) } =20 /* pwrite(2) */ -static abi_long do_bsd_pwrite(void *cpu_env, abi_long arg1, +static abi_long do_bsd_pwrite(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long a= rg6) { abi_long ret; @@ -161,7 +161,7 @@ static abi_long do_bsd_pwrite(void *cpu_env, abi_long a= rg1, if (p =3D=3D NULL) { return -TARGET_EFAULT; } - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg4 =3D arg5; arg5 =3D arg6; } @@ -188,14 +188,14 @@ static abi_long do_bsd_writev(abi_long arg1, abi_long= arg2, abi_long arg3) } =20 /* pwritev(2) */ -static abi_long do_bsd_pwritev(void *cpu_env, abi_long arg1, +static abi_long do_bsd_pwritev(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long a= rg6) { abi_long ret; struct iovec *vec =3D lock_iovec(VERIFY_READ, arg2, arg3, 1); =20 if (vec !=3D NULL) { - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg4 =3D arg5; arg5 =3D arg6; } @@ -484,14 +484,14 @@ static abi_long do_bsd_dup2(abi_long arg1, abi_long a= rg2) } =20 /* truncate(2) */ -static abi_long do_bsd_truncate(void *cpu_env, abi_long arg1, +static abi_long do_bsd_truncate(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4) { abi_long ret; void *p; =20 LOCK_PATH(p, arg1); - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg2 =3D arg3; arg3 =3D arg4; } @@ -502,10 +502,10 @@ static abi_long do_bsd_truncate(void *cpu_env, abi_lo= ng arg1, } =20 /* ftruncate(2) */ -static abi_long do_bsd_ftruncate(void *cpu_env, abi_long arg1, +static abi_long do_bsd_ftruncate(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4) { - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg2 =3D arg3; arg3 =3D arg4; } @@ -735,7 +735,7 @@ static abi_long do_bsd_freebsd11_mknodat(abi_long arg1,= abi_long arg2, } =20 /* post-ino64 mknodat(2) */ -static abi_long do_bsd_mknodat(void *cpu_env, abi_long arg1, +static abi_long do_bsd_mknodat(CPUArchState *env, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6) { @@ -744,7 +744,7 @@ static abi_long do_bsd_mknodat(void *cpu_env, abi_long = arg1, =20 LOCK_PATH(p, arg2); /* 32-bit arch's use two 32 registers for 64 bit return value */ - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { ret =3D get_errno(mknodat(arg1, p, arg3, target_arg64(arg5, arg6))= ); } else { ret =3D get_errno(mknodat(arg1, p, arg3, target_arg64(arg4, arg5))= ); diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h index 9d7b60d3c3..3086143d40 100644 --- a/bsd-user/bsd-mem.h +++ b/bsd-user/bsd-mem.h @@ -51,11 +51,11 @@ extern abi_ulong target_brk; extern abi_ulong initial_target_brk; =20 /* mmap(2) */ -static inline abi_long do_bsd_mmap(void *cpu_env, abi_long arg1, abi_long = arg2, +static inline abi_long do_bsd_mmap(CPUArchState *env, abi_long arg1, abi_l= ong arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long a= rg7, abi_long arg8) { - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { arg6 =3D arg7; arg7 =3D arg8; } diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h index b1d4446ff1..7efc5b4c92 100644 --- a/bsd-user/bsd-proc.h +++ b/bsd-user/bsd-proc.h @@ -6,8 +6,8 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ =20 -#ifndef BSD_PROC_H_ -#define BSD_PROC_H_ +#ifndef BSD_PROC_H +#define BSD_PROC_H =20 #include =20 @@ -19,7 +19,7 @@ extern int _getlogin(char*, int); int bsd_get_ncpu(void); =20 /* exit(2) */ -static inline abi_long do_bsd_exit(void *cpu_env, abi_long arg1) +static inline abi_long do_bsd_exit(CPUArchState *env, abi_long arg1) { gdb_exit(arg1); qemu_plugin_user_exit(); @@ -400,4 +400,4 @@ static inline abi_long do_bsd_setpriority(abi_long whic= h, abi_long who, return get_errno(setpriority(which, who, prio)); } =20 -#endif /* !BSD_PROC_H_ */ +#endif /* !BSD_PROC_H */ diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c index 0309036178..0a0cea5bb2 100644 --- a/bsd-user/freebsd/os-proc.c +++ b/bsd-user/freebsd/os-proc.c @@ -238,7 +238,7 @@ h2t_procctl_reaper_pidinfo(struct procctl_reaper_pidinf= o *host_pi, } =20 abi_long -do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong arg2, abi_ulong ar= g3, +do_freebsd_procctl(CPUArchState *env, int idtype, abi_ulong arg2, abi_ulon= g arg3, abi_ulong arg4, abi_ulong arg5, abi_ulong arg6) { abi_long error =3D 0, target_rp_pids; @@ -257,7 +257,7 @@ do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong= arg2, abi_ulong arg3, =20 #if TARGET_ABI_BITS =3D=3D 32 /* See if we need to align the register pairs. */ - if (regpairs_aligned(cpu_env)) { + if (regpairs_aligned(env)) { id =3D (id_t)target_arg64(arg3, arg4); target_cmd =3D (int)arg5; target_arg =3D arg6; diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h index 1cf3c43de3..7a035f5481 100644 --- a/bsd-user/freebsd/os-proc.h +++ b/bsd-user/freebsd/os-proc.h @@ -68,7 +68,7 @@ static inline abi_long do_freebsd_wait4(abi_long arg1, ab= i_ulong target_status, } =20 /* wait6(2) */ -static inline abi_long do_freebsd_wait6(void *cpu_env, abi_long idtype, +static inline abi_long do_freebsd_wait6(CPUArchState *env, abi_long idtype, abi_long id1, abi_long id2, abi_ulong target_status, abi_long options, abi_ulong target_wrusage, abi_ulong target_infop, abi_ulong pad1) @@ -79,7 +79,7 @@ static inline abi_long do_freebsd_wait6(void *cpu_env, ab= i_long idtype, siginfo_t info; void *p; =20 - if (regpairs_aligned(cpu_env) !=3D 0) { + if (regpairs_aligned(env) !=3D 0) { /* printf("shifting args\n"); */ /* 64-bit id is aligned, so shift all the arguments over by one */ id1 =3D id2; @@ -173,7 +173,7 @@ static inline abi_long do_freebsd___setugid(abi_long ar= g1) } =20 /* fork(2) */ -static inline abi_long do_freebsd_fork(void *cpu_env) +static inline abi_long do_freebsd_fork(CPUArchState *env) { abi_long ret; abi_ulong child_flag; @@ -183,7 +183,7 @@ static inline abi_long do_freebsd_fork(void *cpu_env) if (ret =3D=3D 0) { /* child */ child_flag =3D 1; - target_cpu_clone_regs(cpu_env, 0); + target_cpu_clone_regs(env, 0); } else { /* parent */ child_flag =3D 0; @@ -193,7 +193,7 @@ static inline abi_long do_freebsd_fork(void *cpu_env) * The fork system call sets a child flag in the second return * value: 0 for parent process, 1 for child process. */ - set_second_rval(cpu_env, child_flag); + set_second_rval(env, child_flag); =20 fork_end(ret); =20 @@ -201,13 +201,13 @@ static inline abi_long do_freebsd_fork(void *cpu_env) } =20 /* vfork(2) */ -static inline abi_long do_freebsd_vfork(void *cpu_env) +static inline abi_long do_freebsd_vfork(CPUArchState *env) { - return do_freebsd_fork(cpu_env); + return do_freebsd_fork(env); } =20 /* rfork(2) */ -static inline abi_long do_freebsd_rfork(void *cpu_env, abi_long flags) +static inline abi_long do_freebsd_rfork(CPUArchState *env, abi_long flags) { abi_long ret; abi_ulong child_flag; @@ -228,7 +228,7 @@ static inline abi_long do_freebsd_rfork(void *cpu_env, = abi_long flags) if (ret =3D=3D 0) { /* child */ child_flag =3D 1; - target_cpu_clone_regs(cpu_env, 0); + target_cpu_clone_regs(env, 0); } else { /* parent */ child_flag =3D 0; @@ -238,7 +238,7 @@ static inline abi_long do_freebsd_rfork(void *cpu_env, = abi_long flags) * The fork system call sets a child flag in the second return * value: 0 for parent process, 1 for child process. */ - set_second_rval(cpu_env, child_flag); + set_second_rval(env, child_flag); fork_end(ret); =20 return ret; @@ -246,7 +246,7 @@ static inline abi_long do_freebsd_rfork(void *cpu_env, = abi_long flags) } =20 /* pdfork(2) */ -static inline abi_long do_freebsd_pdfork(void *cpu_env, abi_ulong target_f= dp, +static inline abi_long do_freebsd_pdfork(CPUArchState *env, abi_ulong targ= et_fdp, abi_long flags) { abi_long ret; @@ -258,7 +258,7 @@ static inline abi_long do_freebsd_pdfork(void *cpu_env,= abi_ulong target_fdp, if (ret =3D=3D 0) { /* child */ child_flag =3D 1; - target_cpu_clone_regs(cpu_env, 0); + target_cpu_clone_regs(env, 0); } else { /* parent */ child_flag =3D 0; @@ -271,7 +271,7 @@ static inline abi_long do_freebsd_pdfork(void *cpu_env,= abi_ulong target_fdp, * The fork system call sets a child flag in the second return * value: 0 for parent process, 1 for child process. */ - set_second_rval(cpu_env, child_flag); + set_second_rval(env, child_flag); fork_end(ret); =20 return ret; diff --git a/bsd-user/freebsd/os-sys.c b/bsd-user/freebsd/os-sys.c index df31706558..d6f7c92420 100644 --- a/bsd-user/freebsd/os-sys.c +++ b/bsd-user/freebsd/os-sys.c @@ -593,7 +593,7 @@ out: } =20 /* sysarch() is architecture dependent. */ -abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2) +abi_long do_freebsd_sysarch(CPUArchState *env, abi_long arg1, abi_long arg= 2) { - return do_freebsd_arch_sysarch(cpu_env, arg1, arg2); + return do_freebsd_arch_sysarch(env, arg1, arg2); } diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 90ef1bd916..d402c64726 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -215,7 +215,7 @@ void unlock_iovec(struct iovec *vec, abi_ulong target_a= ddr, /* * All errnos that freebsd_syscall() returns must be -TARGET_. */ -static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1, +static abi_long freebsd_syscall(CPUArchState *env, int num, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg= 4, abi_long arg5, abi_long arg6, abi_long arg= 7, abi_long arg8) @@ -227,19 +227,19 @@ static abi_long freebsd_syscall(void *cpu_env, int nu= m, abi_long arg1, * process system calls */ case TARGET_FREEBSD_NR_fork: /* fork(2) */ - ret =3D do_freebsd_fork(cpu_env); + ret =3D do_freebsd_fork(env); break; =20 case TARGET_FREEBSD_NR_vfork: /* vfork(2) */ - ret =3D do_freebsd_vfork(cpu_env); + ret =3D do_freebsd_vfork(env); break; =20 case TARGET_FREEBSD_NR_rfork: /* rfork(2) */ - ret =3D do_freebsd_rfork(cpu_env, arg1); + ret =3D do_freebsd_rfork(env, arg1); break; =20 case TARGET_FREEBSD_NR_pdfork: /* pdfork(2) */ - ret =3D do_freebsd_pdfork(cpu_env, arg1, arg2); + ret =3D do_freebsd_pdfork(env, arg1, arg2); break; =20 case TARGET_FREEBSD_NR_execve: /* execve(2) */ @@ -255,12 +255,12 @@ static abi_long freebsd_syscall(void *cpu_env, int nu= m, abi_long arg1, break; =20 case TARGET_FREEBSD_NR_wait6: /* wait6(2) */ - ret =3D do_freebsd_wait6(cpu_env, arg1, arg2, arg3, + ret =3D do_freebsd_wait6(env, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); break; =20 case TARGET_FREEBSD_NR_exit: /* exit(2) */ - ret =3D do_bsd_exit(cpu_env, arg1); + ret =3D do_bsd_exit(env, arg1); break; =20 case TARGET_FREEBSD_NR_getgroups: /* getgroups(2) */ @@ -424,7 +424,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_procctl: /* procctl(2) */ - ret =3D do_freebsd_procctl(cpu_env, arg1, arg2, arg3, arg4, arg5, = arg6); + ret =3D do_freebsd_procctl(env, arg1, arg2, arg3, arg4, arg5, arg6= ); break; =20 /* @@ -435,7 +435,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_pread: /* pread(2) */ - ret =3D do_bsd_pread(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); + ret =3D do_bsd_pread(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR_readv: /* readv(2) */ @@ -443,7 +443,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_preadv: /* preadv(2) */ - ret =3D do_bsd_preadv(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); + ret =3D do_bsd_preadv(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR_write: /* write(2) */ @@ -451,7 +451,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_pwrite: /* pwrite(2) */ - ret =3D do_bsd_pwrite(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); + ret =3D do_bsd_pwrite(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR_writev: /* writev(2) */ @@ -459,7 +459,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_pwritev: /* pwritev(2) */ - ret =3D do_bsd_pwritev(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6= ); + ret =3D do_bsd_pwritev(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR_open: /* open(2) */ @@ -559,11 +559,11 @@ static abi_long freebsd_syscall(void *cpu_env, int nu= m, abi_long arg1, break; =20 case TARGET_FREEBSD_NR_truncate: /* truncate(2) */ - ret =3D do_bsd_truncate(cpu_env, arg1, arg2, arg3, arg4); + ret =3D do_bsd_truncate(env, arg1, arg2, arg3, arg4); break; =20 case TARGET_FREEBSD_NR_ftruncate: /* ftruncate(2) */ - ret =3D do_bsd_ftruncate(cpu_env, arg1, arg2, arg3, arg4); + ret =3D do_bsd_ftruncate(env, arg1, arg2, arg3, arg4); break; =20 case TARGET_FREEBSD_NR_acct: /* acct(2) */ @@ -595,7 +595,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_readlink: /* readlink(2) */ - ret =3D do_bsd_readlink(cpu_env, arg1, arg2, arg3); + ret =3D do_bsd_readlink(env, arg1, arg2, arg3); break; =20 case TARGET_FREEBSD_NR_readlinkat: /* readlinkat(2) */ @@ -627,7 +627,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, break; =20 case TARGET_FREEBSD_NR_mknodat: /* mknodat(2) */ - ret =3D do_bsd_mknodat(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6= ); + ret =3D do_bsd_mknodat(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR_chown: /* chown(2) */ @@ -807,7 +807,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, * Memory management system calls. */ case TARGET_FREEBSD_NR_mmap: /* mmap(2) */ - ret =3D do_bsd_mmap(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6, a= rg7, + ret =3D do_bsd_mmap(env, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); break; =20 @@ -953,15 +953,15 @@ static abi_long freebsd_syscall(void *cpu_env, int nu= m, abi_long arg1, * sys{ctl, arch, call} */ case TARGET_FREEBSD_NR___sysctl: /* sysctl(3) */ - ret =3D do_freebsd_sysctl(cpu_env, arg1, arg2, arg3, arg4, arg5, a= rg6); + ret =3D do_freebsd_sysctl(env, arg1, arg2, arg3, arg4, arg5, arg6); break; =20 case TARGET_FREEBSD_NR___sysctlbyname: /* sysctlbyname(2) */ - ret =3D do_freebsd_sysctlbyname(cpu_env, arg1, arg2, arg3, arg4, a= rg5, arg6); + ret =3D do_freebsd_sysctlbyname(env, arg1, arg2, arg3, arg4, arg5,= arg6); break; =20 case TARGET_FREEBSD_NR_sysarch: /* sysarch(2) */ - ret =3D do_freebsd_sysarch(cpu_env, arg1, arg2); + ret =3D do_freebsd_sysarch(env, arg1, arg2); break; =20 default: @@ -979,7 +979,7 @@ static abi_long freebsd_syscall(void *cpu_env, int num,= abi_long arg1, * as a wrapper around freebsd_syscall() so that actually happens. Since * that is a singleton, modern compilers will inline it anyway... */ -abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1, +abi_long do_freebsd_syscall(CPUArchState *env, int num, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long arg7, abi_long arg8) @@ -990,7 +990,7 @@ abi_long do_freebsd_syscall(void *cpu_env, int num, abi= _long arg1, print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); } =20 - ret =3D freebsd_syscall(cpu_env, num, arg1, arg2, arg3, arg4, arg5, ar= g6, + ret =3D freebsd_syscall(env, num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); if (do_strace) { print_freebsd_syscall_ret(num, ret); diff --git a/bsd-user/i386/target.h b/bsd-user/i386/target.h index ddd3b8ec08..9cd158fc11 100644 --- a/bsd-user/i386/target.h +++ b/bsd-user/i386/target.h @@ -12,7 +12,7 @@ /* * i386 doesn't 'lump' the registers for 64-bit args. */ -static inline bool regpairs_aligned(void *cpu_env) +static inline bool regpairs_aligned(CPUArchState *env) { return false; } diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index b0b2c249fb..60d1adf560 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -176,7 +176,7 @@ abi_long memcpy_to_target(abi_ulong dest, const void *s= rc, void target_set_brk(abi_ulong new_brk); abi_long do_brk(abi_ulong new_brk); void syscall_init(void); -abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1, +abi_long do_freebsd_syscall(CPUArchState *env, int num, abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long arg7, abi_long arg8); @@ -238,7 +238,7 @@ int host_to_target_errno(int err); /* os-proc.c */ abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp, abi_ulong guest_envp, int do_fexec); -abi_long do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong arg2, +abi_long do_freebsd_procctl(CPUArchState *env, int idtype, abi_ulong arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5, abi_ulong arg6); =20 /* os-sys.c */ @@ -247,7 +247,7 @@ abi_long do_freebsd_sysctl(CPUArchState *env, abi_ulong= namep, int32_t namelen, abi_long do_freebsd_sysctlbyname(CPUArchState *env, abi_ulong namep, int32_t namelen, abi_ulong oldp, abi_ulong oldlenp, abi_ulong newp, abi_ulong newlen); -abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2); +abi_long do_freebsd_sysarch(CPUArchState *env, abi_long arg1, abi_long arg= 2); =20 /* user access */ =20 diff --git a/bsd-user/riscv/target.h b/bsd-user/riscv/target.h index 036ddd185e..dc3e0be795 100644 --- a/bsd-user/riscv/target.h +++ b/bsd-user/riscv/target.h @@ -12,7 +12,7 @@ /* * riscv64 ABI does not 'lump' the registers for 64-bit args. */ -static inline bool regpairs_aligned(void *cpu_env) +static inline bool regpairs_aligned(CPUArchState *env) { return false; } diff --git a/bsd-user/x86_64/target.h b/bsd-user/x86_64/target.h index 0cf0e2a14a..fccfc593bd 100644 --- a/bsd-user/x86_64/target.h +++ b/bsd-user/x86_64/target.h @@ -12,7 +12,7 @@ /* * x86 doesn't 'lump' the registers for 64-bit args, all args are 64 bits. */ -static inline bool regpairs_aligned(void *cpu_env) +static inline bool regpairs_aligned(CPUArchState *env) { return false; } --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015788; cv=none; d=zohomail.com; s=zohoarc; b=FEOo4+qSJuh0MaaEc49KUUREAeqn6jzJT4FPu2Z+G2+/yyg608fLiXEeOi1iLOEkfZi7A4DDFvl0W0BmczV1Cfq7qqKEEf2/x/uLkzGKcFLYTjk/doLzDo8qkWTbn7GteBdxuJW38mG0vzJGVXmOzldAbDJcbxpmn37cm1zkE7Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=i8Pi8kyErJNzT7FzUGzu7gHRRT2l3zlLMMdTDg/Ha0o=; b=dSoJZc3FW3GnUQ+ej6uLrprNF1zEKT96syIcF3DXl+Bw8X6eeMqOc1O6JexPolUxA3bz+Ug69dmQxfJF/88oC9UFrFQ01YCMLTzSazA8wD9i6BVAr1PTO5G4hGysF6W2FEhDK5+DCInHKRK4OOmtIQ8w2uG0ca1FJtQwKi8272w= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015788504621.1743025976981; Sat, 20 Jun 2026 21:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gp-0002tP-SZ; Sun, 21 Jun 2026 00:21:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gn-0002sg-80 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:45 -0400 Received: from mail-oo1-xc2b.google.com ([2607:f8b0:4864:20::c2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gk-00051W-NL for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:44 -0400 Received: by mail-oo1-xc2b.google.com with SMTP id 006d021491bc7-6a0db321df5so1689963eaf.0 for ; Sat, 20 Jun 2026 21:21:42 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015701; x=1782620501; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=i8Pi8kyErJNzT7FzUGzu7gHRRT2l3zlLMMdTDg/Ha0o=; b=VqNNqMTtFVL17UxKI4V8JYhkJDkiNAW+9KsNnrcznjVTKSBQeOmp4Dd12sR+qurYLv Er6sIXdSnD3aasA0LUnD8tFbkDHj1nRBjQuRYbYJwE9eW0X5CVf6O/3e+G1kyWdPkYsp TmrLAxLTUmLuxAwp8nhAskjnD5P8eH39O3sneV1ayF0XTefBecJwrSlFO/fvqLE/Ta6M 8qIuEwW6zULkVzgYpq4vZ1NqJ31HLNfMIB1dgjLDpIc2kbBGZB2JJJ2CsPQfoV1RaOho 4dMpVfjpQJcoxCL5nCJQDtbPgxAH9WBS2crpGc3pxISz4EfKgmRsr5Z7/vBsh0G7Y5Dc CWQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015701; x=1782620501; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=i8Pi8kyErJNzT7FzUGzu7gHRRT2l3zlLMMdTDg/Ha0o=; b=N37/eaLsKFjext4Ezc8GZbpKJ7sEnXWypNYv1RQnCFZ+KDMaPGMXuyk8SkWZQM6RT8 JcxkaZsLzcWOr61SHOkEWll8f5hlKvAnyH8zl6MVeQ9nRYbmDNfr5Zm18o6OZJS+d70U /BlcX1WC1hEt4YMpxBGLmGl5YJ3LIpH0thCLQ759sdkzA+6U5y7YNUt6gBQhwswD4tw6 6eN4RLeoPUPzse4Q49Q6RvpHIHdyl37xF8MHWfJzWftVwtMCg77vmFxarvO+8Osg64oY l7truEva19QpSHxaEYnxSRwSxJXsUvlYyRQ7ckgfPfT3S0mhCbqXWHu3spr9lRwGxSQm aOVA== X-Gm-Message-State: AOJu0YwR6AwU6dCFBKAM8Lsvwg+g9PYHQ72QwrBzgFNeuWxOMt/MwH7/ VG5X/1pEhNrx7fOSkaJcPW3zlkxQjRIqtsCI68N030XylXGY8DrjR7Q90RfEjt87wXc= X-Gm-Gg: AfdE7cm4mMWCRM8XSlMla/xm4XCONAgtI/zuaXuZFl4fjH/ieojE1sn1xfagIv9DjmO pqhlk9uqTvOkiW5KGq6Xv1bmTdLx4RJ2e1g2wmViG4LkJJlm5AAgVTWrbreRz+JaP7juZGzcR5i /nou4t2HNxkc/v8WHWkzevESJb0bhiruVNErEdzyR1Oru2zFmoRi1iZYdbAP7cYXwmn8ErtzLx0 t9pbO3/1JXp3+k/56frAPIt87aq+ttvd6gihk1j0tEqt5gaOOeJuTDhNvYCXEqq79Ct5m8ju4GX RwUEBIa44WXwxF2Shu5ONfxKnfNJY/6pUV0s0mEEFcQtBqi8zIaoFcoEkDrnK1Ub2ELicocZ7nP fuqmc8ux3xIbpRu5IMQYIhIv6efdBlySBNfRDxghIU/KNGIX+Nqy7w7VFxn9lVXfn99Wy/6T01e g= X-Received: by 2002:a05:6820:1746:b0:696:2b09:5988 with SMTP id 006d021491bc7-6a0d8d13ff5mr7219347eaf.40.1782015701523; Sat, 20 Jun 2026 21:21:41 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:50 -0600 Subject: [PATCH v3 03/40] bsd-user: Fix copy direciton in preadv MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-3-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1215; i=imp@bsdimp.com; h=from:subject:message-id; bh=9tnBDxKpznGCAZTCU65N4cpxt2zZdrlO9GbM1GMBpy8=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z98QKiFiTE6hnlQMcAmv/MtwTLwXKdoRDjD mlyCpQToJ6JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AJ8QD/9ZTIz9W79gUcSrR8c/e1SUNYFpFZ+qyBT7DwGFMwd1BALy3U5yAoV2gp5SnCfTAiVrwd/ tyuTywujCQaLMQOVhnAMyzt11rcIjxi4bIY7/32MyQMdTyHHfQh4bt4AdOxLHlzrkpaQ/pCi2Dv 8Y6l95iXawztbNtVwGQSc+k+ypzzKdCJz2LqKEERbmNFBnzESptFSckRlEbeLSrwpRV2JHwOKMl vkgIViryN10O5PggjCugE1DMNHkaGlwJFcALE7FbvApufEH/KnwvZSAiUwRPw3of0/KnsJSvlvx vtyIbzsG3L1yCdcJohM+gMDbdFc/zAQOXwO6PXIbj8EoFFIzwYgnuFusCTy/awZQ51wJ45r4a/R STPxHYLYChGZZ50w8NDWzph/fQEdehWNJwJ/nOMuKjWo/JlmXqdmen6tADwyITW8fuAh4Kdjs7K oi/pVCWaBe136O3aiE7XP2pJmqXICrxAhmmVMGaUEbY1vsGLpqv1XcuZBsnmeJi3qDMRl6erE6B 9weOSGITjHwacmSnsCVQRkoCKOOWV/l1/PNEEWpvq4z5mahadGIwY5YYAe8OqgtOdgrhsRohvav ER8wD+XB9p731hLAvhIrWzEYgrZVlPuz79pXfMqq85jSqI+TGs0yb0bPXXF/BdCaJdW3hm38AJ7 rN7LicQHn55nAVQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2b; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2b.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015790400154100 As written, we copy in the vector and data then don't copy it out, when instead. Instead, we should copy the data out. pread and read are already correct. Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/bsd-file.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bsd-user/bsd-file.h b/bsd-user/bsd-file.h index dec59bd80b..7ef9470c4e 100644 --- a/bsd-user/bsd-file.h +++ b/bsd-user/bsd-file.h @@ -113,7 +113,7 @@ static abi_long do_bsd_preadv(CPUArchState *env, abi_lo= ng arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5, abi_long a= rg6) { abi_long ret; - struct iovec *vec =3D lock_iovec(VERIFY_WRITE, arg2, arg3, 1); + struct iovec *vec =3D lock_iovec(VERIFY_WRITE, arg2, arg3, 0); =20 if (vec !=3D NULL) { if (regpairs_aligned(env) !=3D 0) { @@ -121,7 +121,7 @@ static abi_long do_bsd_preadv(CPUArchState *env, abi_lo= ng arg1, arg5 =3D arg6; } ret =3D get_errno(safe_preadv(arg1, vec, arg3, target_arg64(arg4, = arg5))); - unlock_iovec(vec, arg2, arg3, 0); + unlock_iovec(vec, arg2, arg3, 1); } else { ret =3D -host_to_target_errno(errno); } --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016007; cv=none; d=zohomail.com; s=zohoarc; b=Gy7Lr80AsRlhFqOBR5w4418GMyGoi7dH+qsYhk+/otpflXrWIWPr+Vfs4cLbhHPQLsFKsZv74sl/D76WotCKHkkSZqOfn5z8A4iMa3HO+TTwxZPxEot9EWuE5bAfJhqIKMB9DVAFKqu4mjX4hmOLHPJLZ74g39DQzQpStgKC5QU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016007; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rVFgNUzEgNeXkvcwrYEMpHw8aucEjPJtMHF3BkvZjGY=; b=OJFw3gpUb4zmBwqi0axzHwJHWA6C+5hEWk2lp/pL37zw7/K1w9HBgMgT57jQnRFIjo0dRv9WyZkKm/Q98I+pSuThM2tqwTpWdCmOy0wfxrBRpvhMGJYlsnfKQPHOAgUe/PopsjFC8xCviV7cy3NsLZ+c52cQb2oLA87RhRBlR/g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016007659876.0355217838963; Sat, 20 Jun 2026 21:26:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gu-0002vZ-FA; Sun, 21 Jun 2026 00:21:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gp-0002tQ-2t for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:47 -0400 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gm-000525-WE for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:46 -0400 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-6a0eb19ff49so819878eaf.1 for ; Sat, 20 Jun 2026 21:21:44 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015703; x=1782620503; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rVFgNUzEgNeXkvcwrYEMpHw8aucEjPJtMHF3BkvZjGY=; b=F+Kc2km4omhlGdWceNMgYkap63XO/jt7MzdD4D+GFLW9mvOmrC06jHQ2+Qttya1IlC xwMSGw7QeHL6flxEs09Dhdnu8SAWrNXbLgmawQiqaxbIEsoi5PiRcUYH3g26+LjPeV5D OKq/cZ8x4Ygdwwi0NAU4w2ZOVe0QlPDzZ7RVHiRrNtj6fBaCncJlazVMLvGSfusXOtbv NlzbnTuAzYof90LNcUJ3Kf+XeePYBibpBcZg/JTYTzVOheq0Emu+6Ff9c/HDXmuIPpS9 ON27S2rgjZJ9mFvX9G4cqi+D4BDSVua0JOJFFHGNzv/3Ks7Zoh+LICJUNQ6XNKGi0X9w UPJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015703; x=1782620503; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=rVFgNUzEgNeXkvcwrYEMpHw8aucEjPJtMHF3BkvZjGY=; b=mvgxT+NsjIdLgqCljilq/UlX7ZIZfZ+2Sk4ZctXo4lMibCJxoF6ShucmU+isRsnI1J z6hlGsXFsKtCXqX+r9LpR2aaRMIc+yqIGGJ1mz80gDRwqKOQPTy6PAY3cgqv5LQVaCeq /ge0xsv2l8jMSpua0R12ySzhyqi1PCT0QDEX44Fxk8P5Ct3B97xwHZdFmkP7V6B6hsyg aOcge+DgHbMuTTlaMzutJFcJfDg9xGyzv25qzwxeWkexJRC1vX9QELkjqnNz3KpUHc0a dhq5dP/YqtQRZ4xpOODLciFFx8/kX9Jk0iS/FUm0mUF3YsdqxMEUBntRZcB/zmSmjw8l bh1A== X-Gm-Message-State: AOJu0Yws2M81KXXpwdhSSkQXPC0h/mXH03o2kIEL+I9zP2cbTVWGQ7CK EXZ/sjFrVjGnmkXrKYl1n+TPnGw9AkguEyqzNCJsx7kyTXR1KBzorbgubayYbWSu4e4= X-Gm-Gg: AfdE7clw7ICa2vREkC8PF/NMomX7ouhKJtD3a2cJLu0hL+I/Ie5EjBwIRMgMEIBAXA7 JrePRFHRBwRo49aJgxVvsJikl6t+r/XErjfo3cocp4AWSeW87iA1LwyfRRGJGVHVgAw/3nIELdE TObJEAsUKJ3d6P3TDIxEDhf0TIfMFLuKvmmrlkokikFDPUgDejDnBdUqJwZYHnh3UuC7iDk4Boy I0WTqt0q8K0y5NsNEUsi9QjmW8zh+PxokyzAB5tZ8PfLqaELbjq0APlFf9KpBq3FbcnQYtabiOv TkNhJ+gY3AaSMxL7vBFK9JV/bTmx52v8FjrSKO+CfX3jugxna6u6HWL1+mrzIkDSsoPa87RrLyN 3pqgVR/kojkOB4z+Psfdv1gBnUswbUKsYNUp74DOBnDP0eP6C8kpcZgl4DMwW+gZD3t+rlG+ngh g= X-Received: by 2002:a05:6820:200a:b0:6a0:f2b9:c318 with SMTP id 006d021491bc7-6a0f2b9cef0mr3474199eaf.7.1782015703160; Sat, 20 Jun 2026 21:21:43 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:51 -0600 Subject: [PATCH v3 04/40] bsd-user: Remove accidentally duplicated prototypes. MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-4-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2527; i=imp@bsdimp.com; h=from:subject:message-id; bh=O9RD8iWIp9DwL2VmoJ/fbF+Rwdx/qNLPhxiZGhqs58k=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z9WGUJUwB/ANnvmF6iwDUUSHO5T7tZVRbpP n4rfam86ZGJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AMQKD/9ucmhVrDT2EAdE0eE1UqhbbmXlOD02Vs7ah5SoXh30utQ3cRdGaF6cFL+G31RXJIp7xE7 ImHCCR3cuCHb1JSFivrG9V6yRnmQyd2kCUoOuty2Znc5icaGi+yElTU2FOPnZp1sPlZiFl+Wgm7 P9idwy6vP9jp6Bs1uC5GFAZFe9sWBSmYx/wlbtivSrig7JZNOFQLyLw88W4S0QFK8DFgxYDW3IK FLbBDcGiMXSheIrIVP7xOfw3h9onPswIcQDvWHySpzhPwuZzsj4laUjkJsGRLrGO+lzgifn8Bjz jdbBcKxAZYYoL1OgG8hUjCJ93v76HB+ludxu8cF5unXzYJIEA0hyjRJqWS7D2s8FJKA/pjEvFW1 I1HH0yAg6xc7cykieLkNKa/XDAs/CMy6BkWCBCFyJh9IHsjCCONZMheCIhLc1hBJCMunvv3CVIb 5OS78EwlWi1QfM5kIO8tB+Sc8d8uK2JCWXqw6mtNGWMYhvz8H19XAnRIJqckTw/Juu9NCvpOrpz rJnSejwys/5XTL88n+RC1w4lk/m4xsmy12CyJ9S+8M0gjx95OLEYbf6j5M9or4EiHPWDbfE2q56 NK5UzuStBG2nKBTod1Yoc7IxSmR3kAb5koc8V+5wBdT63dQkHNGulxIv8XiDIDxWkUlkM+8EGDm 4oBQm6iCwvNgx9w== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c30; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016009394154100 Now sure how we mismerged these, but we have two sets of prototypes. Remove one. Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/qemu-bsd.h | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/bsd-user/qemu-bsd.h b/bsd-user/qemu-bsd.h index f7c8338213..cdd27b44b4 100644 --- a/bsd-user/qemu-bsd.h +++ b/bsd-user/qemu-bsd.h @@ -50,29 +50,40 @@ abi_long target_to_host_msqid_ds(struct msqid_ds *host_= md, abi_long host_to_target_msqid_ds(abi_ulong target_addr, struct msqid_ds *host_md); =20 -/* bsd-mem.c */ -void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip, - struct target_ipc_perm *target_ip); -void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip, - struct ipc_perm *host_ip); -abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd, - abi_ulong target_addr); -abi_long host_to_target_shmid_ds(abi_ulong target_addr, - struct shmid_ds *host_sd); +/* bsd-socket.c */ +abi_long target_to_host_sockaddr(struct sockaddr *addr, abi_ulong target_a= ddr, + socklen_t len); +abi_long host_to_target_sockaddr(abi_ulong target_addr, struct sockaddr *a= ddr, + socklen_t len); +abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, abi_ulong target_a= ddr, + socklen_t len); =20 /* bsd-misc.c */ abi_long host_to_target_uuid(abi_ulong target_addr, struct uuid *host_uuid= ); + abi_long target_to_host_semarray(int semid, unsigned short **host_array, abi_ulong target_addr); abi_long host_to_target_semarray(int semid, abi_ulong target_addr, unsigned short **host_array); + abi_long target_to_host_semid_ds(struct semid_ds *host_sd, abi_ulong target_addr); abi_long host_to_target_semid_ds(abi_ulong target_addr, struct semid_ds *host_sd); + abi_long target_to_host_msqid_ds(struct msqid_ds *host_md, abi_ulong target_addr); abi_long host_to_target_msqid_ds(abi_ulong target_addr, struct msqid_ds *host_md); =20 +/* bsd-mem.c */ +void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip, + struct target_ipc_perm *target_ip); +void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip, + struct ipc_perm *host_ip); +abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd, + abi_ulong target_addr); +abi_long host_to_target_shmid_ds(abi_ulong target_addr, + struct shmid_ds *host_sd); + #endif /* QEMU_BSD_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016014; cv=none; d=zohomail.com; s=zohoarc; b=a3S7NtgsxCrsWC4V9K1gfzHN9S5j4qTb9UR2Va0k5Wtu8s2+dzIvftsmqG/X8LF6SVWPjESW922O1DjVOHZVlzfZ2yvKe7nU4HO4Cy7VE/jzdIc1c/VohvI6/Qd/zHqDXeZE5QU9nDpemGKQLS7jDDMHtt4Ptu68OgNwX4r2pQ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016014; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=j+cNbvuRLubDIqacxeKO9fWQDsE10nkqV1eof2bHpNs=; b=Xe7uedwXAnPHq44d4fZHu+QlWnDrmyyrQFK94YhOn3a1YKV4A+w2KsSSR8lE39ec1L6ssF30/w4dmpyzeRTMMSxJRIRr8uSNG2E8be0dg1XCREdw7CZY4Es0I1kwj3Ym/0oRJ92HpK3M3YruIqASYTWQacPlN1m9ogKxxYA4yqY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016014181256.19777098378586; Sat, 20 Jun 2026 21:26:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gr-0002tz-0z; Sun, 21 Jun 2026 00:21:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gq-0002to-5Y for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:48 -0400 Received: from mail-oo1-xc41.google.com ([2607:f8b0:4864:20::c41]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9go-00052Y-3U for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:47 -0400 Received: by mail-oo1-xc41.google.com with SMTP id 006d021491bc7-69e1eae4eb4so2772003eaf.2 for ; Sat, 20 Jun 2026 21:21:45 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015705; x=1782620505; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=j+cNbvuRLubDIqacxeKO9fWQDsE10nkqV1eof2bHpNs=; b=zVmm/X2D/UtaFazD8t74vjkPy/c6m7JK4k7va/EMvXDLnuCNCCvFC6OUQXiWjR5ILA WzaKq8MbuwdFl995ZTl3k8L0H3IjpszpTycq98XRRxnJdfxTo1w7zRAyWvq71ZopPcN5 7FxqtfVnT530aaYVoODnmkdtiaO/VZ083K4Ed9QdtEJxg0JPNN6T//brhdt3hEpxQZpn RxqbDfgihmp2VP9FS4koOVUEo4M2e0sk5MW7weUvsiKB88a+kFZwNgYe7mwAr8ECwVI+ V2thPUuY410N0LP/SRZ6xt+fav2rZm0Qfy171QVjqkjeim15XLu5ha3DpKiWL9igu6CS VdAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015705; x=1782620505; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=j+cNbvuRLubDIqacxeKO9fWQDsE10nkqV1eof2bHpNs=; b=bCWqXgaJl60aCic6KDC/g54T0oSznvK4Wd6t7ftJ9TEvu3J9eRNrbQpYRIA8o0kgjV YQCPUbdGTyNw/8DosGUdD/xkJ3hnda6J4hnOhpLEB+qlxvXHoTVJSOkzamXfltmkMadc itbfx4tAiHhcTKPUL4xsnNshb8LxvG46tFujt/IdnFEibVU5G21rYO4DKEaFwhYVRuwu U7x34BckaKNB/xFy3YkQC3+mFT3j4T65YTChvV2va6Zm15qT3kkCJR/AKySM+o17SV57 K99+bke87XbP2VN8UCHuwEiV0inFWMIntmmFHLrs3XZ7BnU7I7vriKzTL0Ty/gtnDhZy 595Q== X-Gm-Message-State: AOJu0YxVhJ8McFmga1PfvuHEEOHmEwWq0yX6acqNNOVieq0yyWVyuk1W cUCbbRAOyM/DknYWOJzmH9nnIGy+vzzygzE4aZAe00Q3rm8gYgQtxUd8DQ58mCdVf00= X-Gm-Gg: AfdE7ck6e/bveMYXZzJI9/GG3oZUd2e6w4fomndoFz9BBYG1E67n3QjaSBwVViJGDRu geM+EJAPBmwyCROMxU5QSIefSUDaOE3PnptWwKuvcXzdGSpsQKQrTLx5fSS8fqiCLUhj1zFH6lL f6ODy6lu9jWuAQfTAD9PYl8b65x0cy25TAp4D17jQrPMWD7P5sJTqpmglyGr8bB6DeOlNSsgAlA VLNyHTliDEPRFE55EbW8MvI4aYCabbf1gItWZ0QEG/aGjvs8JbTpRb3b9FgjJ1GMayzGohyIB/E WwDRfE54H7Yz/+Ajk3S8TIFuaixi7E4HSZWpPrm4mWRsrwz3jR57qU9Bn6bN2JhA67Zsnhly9io +PVB8oi5sO2JTDboQAWwUOpZAYColTayUPgEpUamreFHvgzhYxiR/5HolfYibkKbmuy5HSs8Y5E s= X-Received: by 2002:a05:6820:221c:b0:69e:8976:77d9 with SMTP id 006d021491bc7-6a0de0d51ebmr5752092eaf.40.1782015704754; Sat, 20 Jun 2026 21:21:44 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:52 -0600 Subject: [PATCH v3 05/40] bsd-user: Add bsd-signal.h with sigaction through sigreturn MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-5-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans , Jessica Clarke , =?utf-8?q?Mika=C3=ABl_Urankar?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9527; i=imp@bsdimp.com; h=from:subject:message-id; bh=Kv2Qe9Ud9kAfSbvySlQ0ZUMuE6RsukrFKqBnZ6FuB7Q=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z90nnpAuw6+S1WOlfdsv7LkPsKxJKDIKRpu rRZP0P5VBuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AAucEADEOmq/q9+BmyV1RV4uTpoKtKSFC20dk5n4Tx2KAwBgFef8Gd31plMVrpPlgQtni50h24V vUp5lrZAflwi29pndL4kqVG5DiDWQbO0pmTAWCZn9vTsxVz7tDFk6KQH5UXbCwObk3Q3Eq3OcuV V8Ycd810yzbN5phxNKNCPhvjOiONtZXSZhdgrzmtOJcs8WpV/UXe+n4tbK4ii3oYMGrTY5oG77T w+ETXxKUu0c15xu+VEDveJphJWN2v2/9M1qjrHht/ZI6qiK3uyGg4Htbd/rH5xwQKVWEGj8A83/ EDLIBdcos7sKGCOVzBgXK2xxbfnwVbUnp68wuYhpYWEyy/WaYonj83h4l7JBTo/b51I/S1A+81r i0jsfthF9tbYGbm5ENefGvJ8lO/652csERL6Zlb4EcOBjYT8CRX4kLo7QSDdCNMdlm2482UH3Nr jEqm+3yq83fg0LH8NyN+sHXuiuq+I2e5sk3eSzv+B4/0zMjbcrWUtJW3DBJRpc6jCXfsKvVfGq9 OK5wPZBPosKn1ccSmt/3yUXmVLs5xYYBQGzk//3awcT0xIsrbxhHUlK+Rtg1QEF2pVRI5WqeE9Q pKu5gNUyDs66cRF6lZh88Zs9kuBlHXTaZvihFutZH8ttpaM89O5kkZ4Fd4wXfxoordYETwIlh8I iRaGJGIYSTGLCVQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c41; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc41.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016015542154100 Add the first set of signal-related system call shims: sigaction, sigprocmask, sigpending, sigsuspend, and sigreturn. Also add the do_sigprocmask and target_to_host_sigevent helper functions to signal.c and their declarations to signal-common.h. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Signed-off-by: Jessica Clarke Signed-off-by: Mika=C3=ABl Urankar Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/bsd-signal.h | 151 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-syscall.c | 1 + bsd-user/signal-common.h | 4 ++ bsd-user/signal.c | 67 +++++++++++++++++++ 4 files changed, 223 insertions(+) diff --git a/bsd-user/bsd-signal.h b/bsd-user/bsd-signal.h new file mode 100644 index 0000000000..49e58d7436 --- /dev/null +++ b/bsd-user/bsd-signal.h @@ -0,0 +1,151 @@ +/* + * signal related system call shims + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef BSD_SIGNAL_H +#define BSD_SIGNAL_H + +#include + +/* sigaction(2) */ +static inline abi_long do_bsd_sigaction(abi_long arg1, abi_long arg2, + abi_long arg3) +{ + abi_long ret; + struct target_sigaction *old_act, act, oact, *pact; + + if (arg2) { + if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1)) { + return -TARGET_EFAULT; + } + act._sa_handler =3D old_act->_sa_handler; + act.sa_flags =3D old_act->sa_flags; + memcpy(&act.sa_mask, &old_act->sa_mask, sizeof(target_sigset_t)); + unlock_user_struct(old_act, arg2, 0); + pact =3D &act; + } else { + pact =3D NULL; + } + ret =3D get_errno(do_sigaction(arg1, pact, &oact)); + if (!is_error(ret) && arg3) { + if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0)) { + return -TARGET_EFAULT; + } + old_act->_sa_handler =3D oact._sa_handler; + old_act->sa_flags =3D oact.sa_flags; + memcpy(&old_act->sa_mask, &oact.sa_mask, sizeof(target_sigset_t)); + unlock_user_struct(old_act, arg3, 1); + } + return ret; +} + + +/* sigprocmask(2) */ +static inline abi_long do_bsd_sigprocmask(abi_long arg1, abi_ulong arg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + sigset_t set, oldset, *set_ptr; + int how; + + ret =3D 0; + if (arg2) { + p =3D lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg2, 0); + set_ptr =3D &set; + switch (arg1) { + case TARGET_SIG_BLOCK: + how =3D SIG_BLOCK; + break; + case TARGET_SIG_UNBLOCK: + how =3D SIG_UNBLOCK; + break; + case TARGET_SIG_SETMASK: + how =3D SIG_SETMASK; + break; + default: + return -TARGET_EINVAL; + } + } else { + how =3D 0; + set_ptr =3D NULL; + } + ret =3D do_sigprocmask(how, set_ptr, &oldset); + if (!is_error(ret) && arg3) { + p =3D lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + host_to_target_sigset(p, &oldset); + unlock_user(p, arg3, sizeof(target_sigset_t)); + } + return ret; +} + +/* sigpending(2) */ +static inline abi_long do_bsd_sigpending(abi_long arg1) +{ + abi_long ret; + void *p; + sigset_t set; + + ret =3D get_errno(sigpending(&set)); + if (!is_error(ret)) { + p =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + host_to_target_sigset(p, &set); + unlock_user(p, arg1, sizeof(target_sigset_t)); + } + return ret; +} + +/* sigsuspend(2) */ +static inline abi_long do_bsd_sigsuspend(CPUArchState *env, abi_long arg1, + abi_long arg2) +{ + CPUState *cpu =3D env_cpu(env); + TaskState *ts =3D cpu->opaque; + void *p; + abi_long ret; + + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&ts->sigsuspend_mask, p); + unlock_user(p, arg1, 0); + + ret =3D get_errno(sigsuspend(&ts->sigsuspend_mask)); + /* XXX Trivially true until safe_syscall */ + if (ret !=3D -TARGET_ERESTART) { + ts->in_sigsuspend =3D true; + } + + return ret; +} + +/* sigreturn(2) */ +static inline abi_long do_bsd_sigreturn(CPUArchState *env, abi_long arg1) +{ + if (block_signals()) { + return -TARGET_ERESTART; + } + return do_sigreturn(env, arg1); +} + +/* sigvec(2) - not defined */ +/* sigblock(2) - not defined */ +/* sigsetmask(2) - not defined */ +/* sigstack(2) - not defined */ + +#endif /* BSD_SIGNAL_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index d402c64726..7fefdb569f 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -38,6 +38,7 @@ #include "bsd-mem.h" #include "bsd-proc.h" #include "bsd-misc.h" +#include "bsd-signal.h" =20 /* BSD dependent syscall shims */ #include "os-stat.h" diff --git a/bsd-user/signal-common.h b/bsd-user/signal-common.h index 4e634e04a3..9071757873 100644 --- a/bsd-user/signal-common.h +++ b/bsd-user/signal-common.h @@ -32,6 +32,7 @@ int block_signals(void); /* Returns non zero if signal pe= nding */ long do_rt_sigreturn(CPUArchState *env); int do_sigaction(int sig, const struct target_sigaction *act, struct target_sigaction *oact); +int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset); abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong= sp); long do_sigreturn(CPUArchState *env, abi_ulong addr); void force_sig_fault(int sig, int code, abi_ulong addr); @@ -42,6 +43,9 @@ void process_pending_signals(CPUArchState *env); void queue_signal(CPUArchState *env, int sig, int si_type, target_siginfo_t *info); void signal_init(void); +abi_long target_to_host_sigevent(struct sigevent *host_sevp, + abi_ulong target_addr); +int target_to_host_signal(int sig); void target_to_host_sigset(sigset_t *d, const target_sigset_t *s); =20 /* diff --git a/bsd-user/signal.c b/bsd-user/signal.c index 3e5e41e1b1..da7cf1d60b 100644 --- a/bsd-user/signal.c +++ b/bsd-user/signal.c @@ -346,6 +346,33 @@ int block_signals(void) return qatomic_xchg(&ts->signal_pending, 1); } =20 +abi_long target_to_host_sigevent(struct sigevent *host_sevp, + abi_ulong target_addr) +{ + struct target_sigevent *target_sevp; + + if (!lock_user_struct(VERIFY_READ, target_sevp, target_addr, 1)) { + return -TARGET_EFAULT; + } + + /* + * This union is awkward on 64 bit systems because it has a 32 bit + * integer and a pointer in it; we follow the conversion approach + * used for handling sigval types in signal.c so the guest should get + * the correct value back even if we did a 64 bit byteswap and it's + * using the 32 bit integer. + */ + host_sevp->sigev_value.sival_ptr =3D + (void *)(uintptr_t)tswapal(target_sevp->sigev_value.sival_ptr); + host_sevp->sigev_signo =3D + target_to_host_signal(tswap32(target_sevp->sigev_signo)); + host_sevp->sigev_notify =3D tswap32(target_sevp->sigev_notify); + host_sevp->_sigev_un._threadid =3D tswap32(target_sevp->_sigev_un._thr= eadid); + + unlock_user_struct(target_sevp, target_addr, 0); + return 0; +} + /* Returns 1 if given signal should dump core if not handled. */ static int core_dump_signal(int sig) { @@ -725,6 +752,46 @@ int do_sigaction(int sig, const struct target_sigactio= n *act, return ret; } =20 +int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset) +{ + TaskState *ts =3D get_task_state(thread_cpu); + + if (oldset) { + *oldset =3D ts->signal_mask; + } + + if (set) { + int i; + + if (block_signals()) { + return -TARGET_ERESTART; + } + + switch (how) { + case SIG_BLOCK: + sigorset(&ts->signal_mask, &ts->signal_mask, set); + break; + case SIG_UNBLOCK: + for (i =3D 1; i <=3D NSIG; ++i) { + if (sigismember(set, i)) { + sigdelset(&ts->signal_mask, i); + } + } + break; + case SIG_SETMASK: + ts->signal_mask =3D *set; + break; + default: + g_assert_not_reached(); + } + + /* Silently ignore attempts to change blocking status of KILL or S= TOP */ + sigdelset(&ts->signal_mask, SIGKILL); + sigdelset(&ts->signal_mask, SIGSTOP); + } + return 0; +} + static inline abi_ulong get_sigframe(struct target_sigaction *ka, CPUArchState *env, size_t frame_size) { --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015933; cv=none; d=zohomail.com; s=zohoarc; b=QP8wLRzbAvjW9TzNzvhrtjZgq34XTOnRbhIkvc2DkpxxelRFv5UZNHH+Jse4NlCkqyKk45nxkaMuO2lpUIafiMaQwaz9HR2RrEfTRm/CsOSKI5vokzkJWhhTJQwBcXVN0LtVRf2gjwmt+on+g2KMH+689ol3LVZBaQFNWRJcZy4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015933; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=w4XqxstNC5ZdN+bCv4aDkZLciSfFgFlRhnKV1D7FmZo=; b=e6tPEzUO0mhWC/VYyKsUKC9njPm1RJIKJCj2DSjQRQXuY7qSNkjZq4Igpt5YQy0h6Qi/FsdUqpXXqfhANPD+6ioAvpDO0uR+NBV+xkfVKk3to769Vm2eW7HbL6XYbL8ZJVIvzRSPmT0pvsvisuZ0e2HrpAJNNZdps0drVQQkBEE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015933983985.4448678112768; Sat, 20 Jun 2026 21:25:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gs-0002uw-M9; Sun, 21 Jun 2026 00:21:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gr-0002u6-9I for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:49 -0400 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gp-00053L-IO for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:49 -0400 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-69de9bc590aso2663918eaf.1 for ; Sat, 20 Jun 2026 21:21:47 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015706; x=1782620506; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=w4XqxstNC5ZdN+bCv4aDkZLciSfFgFlRhnKV1D7FmZo=; b=JQEcx2mvhMDi7qjsMJ3wgY76I2janZqk5eu4TLiDjHcxmUrUrdoyVT819Z4+XmSV34 fG0CJ7UyWcySDTGFwZ2C22LzLNBpi8InD1UfLqg4MoXBdczw9hXleX8na6I9+dmayfxF GqdqH25H4lrfASEDUJi6ybPhF0WiblP+DPtqLtkFe8K6kgGXHZdbe3ZvJG0FVbfEHiNU Uu3Y4XjukUAuBrUTnaNSua0Cycr6B0mQoaizqDMupqpgkrzbGhCsHmTjVtLZeR/BwnvH N2UtqIqsf/lv7kTEa1cvXgSqXxQOFRSWs4uD2Q22ogGD4XWGfDteOCFVYPHED4SijW6D 0Gig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015706; x=1782620506; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=w4XqxstNC5ZdN+bCv4aDkZLciSfFgFlRhnKV1D7FmZo=; b=Baw9PhrxvFc/ErMfYc8DH01CFV4FSE8ksv/8oFXiYBi+68vBJy2RAVpe9SXzZrC1ZC xdU3fteA5rmWlcA31K4mlJ/mqgtp8y4znS4RAROC08pXH/5WGUqwLYlGV0gxtc5CSp5Q k2lnQA4KmnBxQQAfmWQ21EHu5MTOOEzmrd+v7KjNmB0+xM6uiIs1L/2BzpNxFMbcNCJy ZOLlKW4FPiyMxG4U0ElVJYDiLt5OHg0X6FEJ93FUYWRrU8ic2TuGyUUIfhoaiseERxdA tXyhZD8xqfnohiWtJQONmiLS9SurDoBUP3tTSjwWnxGjfXRMkEHVkqombXHBM7WIBZ1k RHAg== X-Gm-Message-State: AOJu0YyacGbmZ/6R8KiAVopUaioXGrHz73Gi1lhr5C9gEgK1HDunt+sU I6Ec1Hlfef0SvJ8f84Q9XhsivWbor5Eg5+OtWcX5nRTMgA25QaOfX4f/c12zePh66cI= X-Gm-Gg: AfdE7cnPVdEHkfoiqSzx7UrPOya4rq6vBOaim2BnzgkBJK2fnkoZSqvVveytw1EvS1P RMXaZ1NMJB2d3GgfGJ2Iv36hPgQ0Rq+Wk5aP+BXz7FARc9CDKxmrDMy+Ym5xVsrRxP8q3IfLDfM HH9+z5MyXh+xq7F6UYTVcQNipDBjE0BCbcwVfbsDjTQihVZ2U6eCt8FVlkjbnAr14kGZOmtr57f I6IcQclrwKjZe5bJyhJyAZ3dBdhhJVXaTnHsXoD1+KO998McptiX65a59Wfhg5GRUQyzuIY7B8q 1QQoVI8PteSwOtMhsZpGeGymx7Vefle+clarYexMc5r6S+qSed2MlPvRSmk1ryP+v3rEq2ws5iM bnllxL5gN6EOywHLLlLQoVH9eC4hJbYnjQ65b1TrCgqjSl8qkptEiqSOtJJy0kHc41onHL0963t Q= X-Received: by 2002:a05:6820:4dfb:b0:69e:4246:e6d7 with SMTP id 006d021491bc7-6a0d905f3eamr6930016eaf.45.1782015706536; Sat, 20 Jun 2026 21:21:46 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:53 -0600 Subject: [PATCH v3 06/40] bsd-user: Add signal shims sigwait through kill and os-signal.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-6-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3910; i=imp@bsdimp.com; h=from:subject:message-id; bh=D+nsnfjUUBFDuXWRM4NmZCL+u5W9K4ynuSDjuaNXXOw=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z9M72jeOeioSXG8AtIxKpYWCT5ljDQFFFTt uarUmLW8sSJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR ANH4D/0W2xpgXLNj0OcnrkYFKiRgDVzMadMav5raTWhG28gc55/ujzy+ArES6dQ+fzqC9KoR9wg 0QS0pxm7NUBQKuPZxB+GXYcP0omXLzdIhVfLFXa5xVT7t7JOIejw0yCjDDgkDHSHPG8RVsw/qwd CjSXvaeTZk5QU2jffMzoaUnzVo8UwgMWYwzdjhqBighKLf49zUTO7uavFnc2UA8UJogay+M864J RyO6Q3BcQ0kf/mStEjI1sTEv3KC52T/WPSsXqrUh+CcBAM6Z74OYlPayvtY1s3YGxpNCQYAQSDQ +1SqXgU13EmvZFwpnaXkPJOBJ0df5kC3764gYoo3gEBsTKhE9uRyv3dTDKvm5Uxw9DoDdvzkxg9 ZZmyG89Zo6pLZFljAnmg/UQptFtntZdiNg+mnzPXOcfZ1KDf1kv/SF8CwGwudNXXhlYJ5RRIPmm LahZrz9VIjXJKOT4RJNQQtkKy+8hkN3MHIWH8WuBDGxdhacS1JzF0C413b5m+uo9viYCbsspYDY 5F/QrX593hDh7spELqrWHZWQr1y3czQkQvYE+G6fBhv9YT7GGvSGp6TQtMD1Rlob9ad6aC+0AOT QCH0eN3bovcwO6kTgxTnTXUc6zkl0cggdaaqoP2A3MWN2SNvuEX8Rt7ys2bH37G25Gs8HWTlgiK dlxu4QPDlOuFI9A== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c30; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015936365154100 Complete bsd-signal.h with sigwait, sigwaitinfo, sigqueue, sigaltstack, kill, and killpg. Add FreeBSD-specific os-signal.h with pdkill. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/bsd-signal.h | 80 ++++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-signal.h | 20 +++++++++++ 2 files changed, 100 insertions(+) diff --git a/bsd-user/bsd-signal.h b/bsd-user/bsd-signal.h index 49e58d7436..09c5b30913 100644 --- a/bsd-user/bsd-signal.h +++ b/bsd-user/bsd-signal.h @@ -148,4 +148,84 @@ static inline abi_long do_bsd_sigreturn(CPUArchState *= env, abi_long arg1) /* sigsetmask(2) - not defined */ /* sigstack(2) - not defined */ =20 +/* sigwait(2) */ +static inline abi_long do_bsd_sigwait(abi_ulong arg1, abi_ulong arg2, + abi_long arg3) +{ + abi_long ret; + void *p; + sigset_t set; + int sig; + + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg1, 0); + ret =3D get_errno(sigwait(&set, &sig)); + if (!is_error(ret) && arg2) { + ret =3D put_user_s32(sig, arg2); + } + return ret; +} + +/* sigwaitinfo(2) */ +static inline abi_long do_bsd_sigwaitinfo(abi_ulong arg1, abi_ulong arg2) +{ + abi_long ret; + void *p; + sigset_t set; + siginfo_t uinfo; + + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg1, 0); + ret =3D get_errno(sigwaitinfo(&set, &uinfo)); + if (!is_error(ret) && arg2) { + p =3D lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + host_to_target_siginfo(p, &uinfo); + unlock_user(p, arg2, sizeof(target_siginfo_t)); + } + return ret; +} + +/* sigqueue(2) */ +static inline abi_long do_bsd_sigqueue(abi_long arg1, abi_long arg2, + abi_ulong arg3) +{ + union sigval value; + target_sigval_t *tvalue =3D (target_sigval_t *)&arg3; + abi_ulong sival_ptr; + + __get_user(sival_ptr, &tvalue->sival_ptr); + value.sival_ptr =3D (void *)(uintptr_t)sival_ptr; + return get_errno(sigqueue(arg1, target_to_host_signal(arg2), value)); +} + +/* sigaltstck(2) */ +static inline abi_long do_bsd_sigaltstack(CPUArchState *env, abi_ulong arg= 1, + abi_ulong arg2) +{ + return do_sigaltstack(arg1, arg2, get_sp_from_cpustate(env)); +} + +/* kill(2) */ +static inline abi_long do_bsd_kill(abi_long pid, abi_long sig) +{ + return get_errno(kill(pid, target_to_host_signal(sig))); +} + +/* killpg(2) */ +static inline abi_long do_bsd_killpg(abi_long pg, abi_long sig) +{ + return get_errno(killpg(pg, target_to_host_signal(sig))); +} + #endif /* BSD_SIGNAL_H */ diff --git a/bsd-user/freebsd/os-signal.h b/bsd-user/freebsd/os-signal.h new file mode 100644 index 0000000000..fe102c33e4 --- /dev/null +++ b/bsd-user/freebsd/os-signal.h @@ -0,0 +1,20 @@ +/* + * FreeBSD signal system call shims + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef FREEBSD_OS_SIGNAL_H +#define FREEBSD_OS_SIGNAL_H + +#include + +/* pdkill(2) */ +static inline abi_long do_freebsd_pdkill(abi_long arg1, abi_long arg2) +{ + + return get_errno(pdkill(arg1, target_to_host_signal(arg2))); +} + +#endif /* FREEBSD_OS_SIGNAL_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015986; cv=none; d=zohomail.com; s=zohoarc; b=J2epuodYiTfvOQOqMAD+y0mNNGUa+7LA+2Q6BqkvGMawq01k18Zkze5mqHxDZJeile3te/7JB9Cb6M8+LKtaNO9vHvN7H88E8AyvQ8c7LAU5/4Uw9c/Stp8ZA7qoHwYMZLY0vr4rGmjchrL5DyjvO7Zg/zvkfZhDcs4QOrIlZdE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015986; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=iZPcdsv0Y6loh0IkwO4iwB8tZ2b1qwhxFkRMVauSAoM=; b=DBLODYnzBo2rSvxNmVChfpndC97DD6yD5oYezvU1jgKKfjYURjDGo/gYwFK5lGchdTGr9Qg2clZfQB0wQUReAz4/AcvI6JV02jb2wWwR+iY8cQkgvnts3YkLSh/G6CtRvYsVhZ2EKaDsQc28doefeANUCY8ElNxRIQtGq7EfShU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015986861303.8263072757537; Sat, 20 Jun 2026 21:26:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gu-0002ve-S7; Sun, 21 Jun 2026 00:21:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gs-0002v2-UM for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:51 -0400 Received: from mail-oo1-xc2d.google.com ([2607:f8b0:4864:20::c2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gr-00053r-DU for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:50 -0400 Received: by mail-oo1-xc2d.google.com with SMTP id 006d021491bc7-6a0ddedcd00so753389eaf.1 for ; Sat, 20 Jun 2026 21:21:49 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015708; x=1782620508; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=iZPcdsv0Y6loh0IkwO4iwB8tZ2b1qwhxFkRMVauSAoM=; b=slZDwCNP8C2Svq4o1MMax0ll9FHC6BOkyEVrBYTiiigReOLte89nBh/A3RvVhst3Vs 5I7Z1HCCkvCUCXZHnuOJPXp3vTKHcOYxsBvwOJQlo9AB+X0pHgS9CUthpHsfRbKTW8aT ltN2n4qS8O0HVCI+ixZ5fWzqSxMlQ7nnLF/YILXRg6/BB41Wuz5twuy9vREdZvI7UFcQ QvJ7WwOeBNFRf3n4RsqxvveSWAWF22bB20Ux9dOpYhJiTp16r4WfvX1lgbw+ALIrdnH4 gQno6olemzqA2Gi2bPW5mHSdzN1mLVi8T2PeiFgVI8u+qXtDkeFpfuerZCA7oa8Dn62r qXnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015708; x=1782620508; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=iZPcdsv0Y6loh0IkwO4iwB8tZ2b1qwhxFkRMVauSAoM=; b=P53xyBwe8nwXbbb+ANFxbX2hctnzMD9vNTuEODEGEzTkcdtp50YtOgMJIjzg1z7T6i 3JfU39P9q/N7aQgH9Qfp7pOb/SMU0jE6BDDH+BxGGSzYuxeYwLvYWlVm20ipRy7/LkgC AfRI8B/t73uWlOihuHZLPpWpzrRMCmlC0Y28uQOOtriSv28OqJrkDNRn92SV9cBQvtUn JL+zZFWKGkB1NHIoOA4v2LEnEL09FLy26KIKTL4O/91OsCjWPZ4eP0SY5zJhClQYYFpx rzfFqosdgBITFXgfadnmX1ecFSTeMX+ef+p0fsBwqgNyOqJtNlKil+MIha7Ik6Ti6K5T C9RQ== X-Gm-Message-State: AOJu0YxBeyzu/pwyVPiNKxoaCxQdNe/XoNzgqQzzTtGVz7nRkH0E8FIS ZlU4BNPpX+P+xAkWLESvzbJQW9a4GiMgcP3UlExBVk2wxb6+52QQEk30FIqCx5F2O/8= X-Gm-Gg: AfdE7cmByaX+60R1dlIU/hqerYwfKeoX2VaoJn3zRNMHZi2Tz3CwSll1Awn3m/UHNPH xfSe1VG159k+SX+p3tkL39y9QUeJiKacsIPcpUSz6g8EAnGu7vXzmiTn4WEhjVChidtuOVTkIlJ 3OUOe4Xcd2O1e6/5Xgceat6prNiTR2fdYqHOfiSbLs0qoSzJ2Ndg+ktH8kSD13y/Xe899Am8cwz 2KHr20lpyDiWgg/rYxLiVrAybV6ndpkCVFdUqerozhCM4DS+DjHvlsg6Sa7kD2xMVTdbJaxPcUC MVUuizXVgs7YSIabRmYAU19/rutgssXbqqllZnSGpbMQ3jpr/7TYtd6TcdyB7wHR9eR+pV4Q3A2 mSOuiOWUYHxeAYg4AUdRyMTy9pOa5TQyF0eZ7f2IrDRhy5b12RdZvmpKUXwz1cVX4zxdIG0fBmc g= X-Received: by 2002:a05:6820:138e:b0:69d:a224:6ee7 with SMTP id 006d021491bc7-6a0d89d1a64mr7727314eaf.54.1782015708130; Sat, 20 Jun 2026 21:21:48 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:54 -0600 Subject: [PATCH v3 07/40] bsd-user: Add signal system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-7-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2615; i=imp@bsdimp.com; h=from:subject:message-id; bh=4Ub/2xph8KTLMe7XHxz740Bfv668ZuKAhgHFetlKwm0=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z98r1/DpFIEauw5O7pttoWFmz3S8r0QuwLS K8SpNAD4BeJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AHf1D/9fe2B3I7FwDfkXGru5n4JSsXiXFiTp3EXB6UjkOHcZlBEuxbApYtwLH0XjKW5JpN+EiqX P+x8JQCUe5z1WzpOPjFuUzToWZSgQoYl2DjuDOAQUPNzO71FjMPGHqGUEV59I2IsUhZr7MycGG3 J6pG0R+sNdui6Gwlhy5I5ZTgoXrJmOsLYdhNvKXD2GIRUECjOWN8fgwF/B6srFxQsZm8zKCvPha 036/HvtZpzb6rI2AxwFyRU/AVPxH9PwV8PfgQiOjrTz6a/6AdvO9+NOXZ5i0Bl2rF9cHiuw3wSv biRVdxU400NaY97dm62Dz3mJLgfmYVNu8ySW3X3+VHRnsSkbw1GgO04wJD4fbqRpr7OvZitucXD YVnEEQVymaHYRA5IIdMwkOWWY5+uXpNYI2Clv4ZKOakfAPSQ46ECxlXqWjIHIAzMPUu2D77CyMO +ZiQvxzCyHa6HykOeZHcEjapaDGscFBD6MKRuV6rdNT3vfkxnLE2Yc2aTK3qctCXDR5l/r59QBF nDdZbOZ22fIBUgQqusHD34OJR2JxWDnMXSBPCh0MmXM+q7JTXFL4BYtdt9dmsU0gcmabUoQGp6z yxLxR3vDk/05XQYyY68AAxzBKvA1KvRdB5bujBQEmQNxMcQMKEAKg/j91lNXdE8nnHmxf681clO Bnx6HZqXIC3ZoLw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2d; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015989263154100 Wire up the signal-related system calls in the FreeBSD syscall dispatcher: sigaction, sigprocmask, sigpending, sigsuspend, sigreturn, sigwait, sigwaitinfo, sigqueue, sigaltstack, kill, and pdkill. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 48 +++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 48 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 7fefdb569f..06148fe3ce 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -43,6 +43,7 @@ /* BSD dependent syscall shims */ #include "os-stat.h" #include "os-proc.h" +#include "os-signal.h" #include "os-misc.h" =20 /* I/O */ @@ -950,6 +951,53 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_getdtablesize(); break; =20 + /* + * signal system calls + */ + case TARGET_FREEBSD_NR_sigaction: /* sigaction(2) */ + ret =3D do_bsd_sigaction(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_sigprocmask: /* sigprocmask(2) */ + ret =3D do_bsd_sigprocmask(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_sigpending: /* sigpending(2) */ + ret =3D do_bsd_sigpending(arg1); + break; + + case TARGET_FREEBSD_NR_sigsuspend: /* sigsuspend(2) */ + ret =3D do_bsd_sigsuspend(env, arg1, arg2); + break; + + case TARGET_FREEBSD_NR_sigreturn: /* sigreturn(2) */ + ret =3D do_bsd_sigreturn(env, arg1); + break; + + case TARGET_FREEBSD_NR_sigwait: /* sigwait(2) */ + ret =3D do_bsd_sigwait(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_sigwaitinfo: /* sigwaitinfo(2) */ + ret =3D do_bsd_sigwaitinfo(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_sigqueue: /* sigqueue(2) */ + ret =3D do_bsd_sigqueue(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_sigaltstack: /* sigaltstack(2) */ + ret =3D do_bsd_sigaltstack(env, arg1, arg2); + break; + + case TARGET_FREEBSD_NR_kill: /* kill(2) */ + ret =3D do_bsd_kill(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_pdkill: /* pdkill(2) */ + ret =3D do_freebsd_pdkill(arg1, arg2); + break; + /* * sys{ctl, arch, call} */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015934; cv=none; d=zohomail.com; s=zohoarc; b=iy1aJJH/fcWbs2yLzGptm2w7rdj5EH4/K/KpLQ5Y+BV+YalictRNky4c4HQnePHb9FoHS/bzvfd9+QGqycUAWEZGdxiEb4KGUhPXbPQi+AwdLE7NEkdXEoe18UfJrSpcnlSkketpgNQugEReF0Z2h+n1kP0at8iCkJZpFxQW6/M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015934; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=sRC3kvzITX1OvjKiubDPut5xsLaO/5c5/2N3DA0JvIw=; b=FsBpddW3Qlz9tTgnnTPWC8TEOjp1XNCPBIGwhkxHxwfQERVdIVLpEuRgXPPGp/NSGHFXQA+3zNsSNnrKfz5V99FHlWV7dZpu0n5twk+sUvAFKlQWlAwWjr4TbU9VoJc6e3rhlPZIrCOKKsZwBrhQkHtsxWeqyz2xzUuuVROGulE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015934364301.54267839039096; Sat, 20 Jun 2026 21:25:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gy-0002wP-An; Sun, 21 Jun 2026 00:21:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gv-0002vr-HK for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:53 -0400 Received: from mail-oo1-xc42.google.com ([2607:f8b0:4864:20::c42]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gs-00054P-JE for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:53 -0400 Received: by mail-oo1-xc42.google.com with SMTP id 006d021491bc7-6a0db321df5so1690000eaf.0 for ; Sat, 20 Jun 2026 21:21:50 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015709; x=1782620509; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=sRC3kvzITX1OvjKiubDPut5xsLaO/5c5/2N3DA0JvIw=; b=XuC6jJ7XJTsHcXPHSm6NYW2/dSmYQek8kwXBuMlj97Et81vCf7K7uDqu8glSOogVls t66VsJ0F4iZRhrfI0jx7b2z1phBG6LWPUUcUhG1kQKjAUxeID4jPRQS0LA1zlAmr6KS9 xmGn0TeiFFFpHboSIg9wPTWkLVW4RsgyaMRU4isgUvaitvTKUW7ZtGxOVMCxQYeJ3BRs nnw3mDKolC89SP9F3CN7pBKJIsXIHv3xN6JrAXfD+tP3ipg1Jxp9s2/ANLZrLKwTSdmo fvrJVZEbVwFBKOsUkzp1RBVsq+2A1xKgi63l6IUa5ugxlPY0ioBJCAfN/cxm/uFaFOYX OZOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015709; x=1782620509; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=sRC3kvzITX1OvjKiubDPut5xsLaO/5c5/2N3DA0JvIw=; b=Wm0nUdeEfWyjaPsoEvM4Lkqlqg7EfIZqHAvRbr5UnG/noePLGy59lwH8DehKPQ2Ke/ LqbgYShkwfO7Fo9EuFHU7+9sJG/GF/1m/SIJsqH+Iwqtcv3MA6lLPW8ZeGO0qVILDON6 KhqGvRyl1z8JpwHpGM0FhCXS2FGAEnz4SlQ8DoQIjrHkAm3p1KArH7IqES59LEob0SKi v0ATUYLTl6YawLLWLFkqBcgiMBUohxGjEqyIzXomzgsgPkAoliO/APyJMNYXsbP9qZv/ 8FPI28BLiHicOdt+iELzyx9xE17WCd4CxlhUDtQO4MSz2r67V8ahhFruc731fxf+/6q9 9PQw== X-Gm-Message-State: AOJu0YzB0gP+AWiM7tOgQiiULrfKsb4h07Rn3otvQhODJjlV96TQNfMp oSeNWGxSC8pQk1oX0OyfEUlLt/trISEOv4daP5FmI0vg19uLMH8rcHNTk2NedsWr4p8= X-Gm-Gg: AfdE7cm8T9kxGybfsypVaqvykQ+6wKzFj2dbpIyfvu6esaFub4jCI0WCRDFkMbYaItO 70LWYi1FX+oHEwxpkqfjEaO1NatrvRrj+nkAoEkPBXUzyctjloNW+m/zTv9bgZNtSnrCfVmh79Z HMWxI+bHnVnJhoJLWPjFhe56UNeEf6Xpugpo0/MYTtTtpII2HFqR9wHSAZljCYnBSZJd30X1ti7 +Xjgk73iX3LO+UcIav2EVwBLtCkBvzIL4mN0dey5mpf61il3mc+OB5XsaATUsmvJV93daP+Bj0w pUJMAFBIlcZ9DBN6pJUWt/hb+myYzTAPIXtfaYdaC1TRTTSCxQhoB4Dgk8QPL5nHb8WGQBWmF/G 5L0uw79VMiyqE6lQYUEwPmLNVftn7qzvlu2CoTfpW64CSSr5mh4ELxrkWd5w9faTAwrnxYXtTwb qt+Be6VHuwcw== X-Received: by 2002:a05:6820:201b:b0:69e:e019:a187 with SMTP id 006d021491bc7-6a0d8c24227mr6879011eaf.20.1782015709392; Sat, 20 Jun 2026 21:21:49 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:55 -0600 Subject: [PATCH v3 08/40] bsd-user: Add poll, lseek, pipe, and swap system call shims MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-8-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=22843; i=imp@bsdimp.com; h=from:subject:message-id; bh=gcb/BuSEcjZjFvpsDNoniaTFulYGCVFqua2pj0rF1nk=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z9NivZbSNPYyztqYthGPmQHYDV26G+weVUy mm0VWUy9j2JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AJK+EACh6yDac8urEnbfBkesGCP7fI0LxB/W9e72/rdAJBfdxqpDeiu6OxDuLfuxwzoeHwXNLfw cjUQAFyM0gLskpnY65qnMTpMZdzl8vGxqAkWXR8Gr38WgWF8MWGML72ROa/zEMSREk2yCe2H2aP pqqbRpfD6BtrACBGP3dqnCfXEzsQwUEUHd2NHoSTqE6xNKYqhv4dczemFZ6qdNJOM1o7Nw+lifl 64ngyLYFMnBsXCevf0NnN/LVJNbGlOsbidTKVcLFB/1fjDULcbIJMMhTGpWiMjzUZ6Lk9n21JDl HcLBlMT+l6BpuZzFcia7KfJ5KlkGTagdaPJsEUTdJRD49on05zokDdrJA9hM/08XSe7dvOtpPvT uDGtFQgkrQJekRy7Dpx43Mp1EYDkr5AZOHRcz7BjnoOdHzFq+4A8spRQdlavgQPHcfm8cY+cXVM MJcuKM/lRgUeLSnGlfYmNOtnpNS+9uBCRqYF8bEYi7ATc2qlr5FqvZjgdH5lY8uw1fbDxCOfNlr ppXfYdVdLtBtoMf/cS2iJ+8Ythy7yz8awXa7MDyMA9233LoUsI47Rv9HmgingvOaVNE7dqWO0Bd XR7dgThxl6Vb/nDklASfCnv8LXSUe6QBu30UXahb00LwNpiA2kIIsVwkZVkVUH06RjfP8ntoW4e uE467pqErClP/BA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c42; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc42.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015936472154100 Add do_bsd_poll, do_bsd_lseek, do_bsd_pipe, do_bsd_swapon, do_freebsd13_swapoff, and do_bsd_swapoff to bsd-file.h. Also add target_pollfd structure to syscall_defs.h and include poll.h in os-syscall.c. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/bsd-file.h | 136 +++++++++++++ bsd-user/freebsd/os-syscall.c | 1 + bsd-user/syscall_defs.h | 458 ++++++++++++++++++++++++++++++++++++--= ---- 3 files changed, 534 insertions(+), 61 deletions(-) diff --git a/bsd-user/bsd-file.h b/bsd-user/bsd-file.h index 7ef9470c4e..0fefc07232 100644 --- a/bsd-user/bsd-file.h +++ b/bsd-user/bsd-file.h @@ -55,6 +55,10 @@ ssize_t safe_pwrite(int fd, void *buf, size_t nbytes, of= f_t offset); ssize_t safe_writev(int fd, const struct iovec *iov, int iovcnt); ssize_t safe_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t of= fset); =20 +int safe_ppoll(struct pollfd *fds, nfds_t nfds, + const struct timespec *restrict timeout, + const sigset_t *restrict newsigmask); + /* read(2) */ static abi_long do_bsd_read(abi_long arg1, abi_long arg2, abi_long arg3) { @@ -925,4 +929,136 @@ static abi_long do_bsd_undelete(abi_long arg1) return ret; } =20 +/* poll(2) */ +static abi_long do_bsd_poll(abi_long arg1, abi_long arg2, abi_long arg3) +{ + abi_long ret; + nfds_t i, nfds =3D arg2; + int timeout =3D arg3; + struct pollfd *pfd; + struct target_pollfd *target_pfd; + struct timespec ts, *pts =3D NULL; + + target_pfd =3D lock_user(VERIFY_WRITE, arg1, + sizeof(struct target_pollfd) * nfds, 1); + if (!target_pfd) { + return -TARGET_EFAULT; + } + pfd =3D alloca(sizeof(struct pollfd) * nfds); + for (i =3D 0; i < nfds; i++) { + pfd[i].fd =3D tswap32(target_pfd[i].fd); + pfd[i].events =3D tswap16(target_pfd[i].events); + } + + if (timeout !=3D INFTIM) { + ts.tv_sec =3D timeout / 1000; + ts.tv_nsec =3D (timeout % 1000) * 1000000; + pts =3D &ts; + } + + ret =3D get_errno(safe_ppoll(pfd, nfds, pts, NULL)); + + if (!is_error(ret)) { + for (i =3D 0; i < nfds; i++) { + target_pfd[i].revents =3D tswap16(pfd[i].revents); + } + } + unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds); + + return ret; +} + +/* lseek(2) */ +static abi_long do_bsd_lseek(CPUArchState *env, abi_long arg1, abi_long ar= g2, + abi_long arg3, abi_long arg4, abi_long arg5) +{ + abi_long ret; +#if TARGET_ABI_BITS =3D=3D 32 + int64_t res; + + /* 32-bit arch's use two 32 registers for 64 bit return value */ + if (regpairs_aligned(env) !=3D 0) { + res =3D lseek(arg1, target_arg64(arg3, arg4), arg5); + } else { + res =3D lseek(arg1, target_arg64(arg2, arg3), arg4); + } + if (res =3D=3D -1) { + ret =3D get_errno(res); + set_second_rval(env, 0xFFFFFFFF); + } else { +#ifdef TARGET_BIG_ENDIAN + ret =3D ((res >> 32) & 0xFFFFFFFF); + set_second_rval(env, res & 0xFFFFFFFF); +#else + ret =3D res & 0xFFFFFFFF; + set_second_rval(env, (res >> 32) & 0xFFFFFFFF); +#endif + } +#else + ret =3D get_errno(lseek(arg1, arg2, arg3)); +#endif + return ret; +} + +/* pipe(2) */ +static abi_long do_bsd_pipe(CPUArchState *env, abi_ulong pipedes) +{ + abi_long ret; + int host_pipe[2]; + int host_ret =3D pipe(host_pipe); + + if (host_ret !=3D -1) { + set_second_rval(env, host_pipe[1]); + ret =3D host_pipe[0]; + } else { + ret =3D get_errno(host_ret); + } + return ret; +} + +/* swapon(2) */ +static abi_long do_bsd_swapon(abi_long arg1) +{ + abi_long ret; + void *p; + + LOCK_PATH(p, arg1); + ret =3D get_errno(swapon(path(p))); + UNLOCK_PATH(p, arg1); + + return ret; +} + +#ifdef TARGET_FREEBSD_NR_freebsd13_swapoff +/* swapoff(2) */ +static abi_long do_freebsd13_swapoff(abi_long arg1) +{ + abi_long ret; + void *p; + + LOCK_PATH(p, arg1); + ret =3D get_errno(swapoff(path(p), 0)); + UNLOCK_PATH(p, arg1); + + return ret; +} +#endif + +/* swapoff(2) */ +static abi_long do_bsd_swapoff(abi_long arg1, abi_long arg2) +{ + abi_long ret; + void *p; + + LOCK_PATH(p, arg1); +#ifdef TARGET_FREEBSD_NR_freebsd13_swapoff + ret =3D get_errno(swapoff(path(p), arg2)); +#else + ret =3D get_errno(swapoff(path(p))); +#endif + UNLOCK_PATH(p, arg1); + + return ret; +} + #endif /* BSD_FILE_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 06148fe3ce..fc6273a780 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -26,6 +26,7 @@ #include #include #include +#include =20 #include "include/gdbstub/syscalls.h" =20 diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h index 0612be8bbb..833c7509e3 100644 --- a/bsd-user/syscall_defs.h +++ b/bsd-user/syscall_defs.h @@ -42,26 +42,6 @@ struct target_ipc_perm { #define TARGET_IPC_SET 1 /* set options */ #define TARGET_IPC_STAT 2 /* get options */ =20 -/* - * sys/shm.h - */ -struct target_shmid_ds { - struct target_ipc_perm shm_perm; /* peration permission structure */ - abi_ulong shm_segsz; /* size of segment in bytes */ - int32_t shm_lpid; /* process ID of last shared memory op */ - int32_t shm_cpid; /* process ID of creator */ - int32_t shm_nattch; /* number of current attaches */ - target_time_t shm_atime; /* time of last shmat() */ - target_time_t shm_dtime; /* time of last shmdt() */ - target_time_t shm_ctime; /* time of last change by shmctl() */ -}; - -#define N_BSD_SHM_REGIONS 32 -struct bsd_shm_regions { - abi_long start; - abi_long size; -}; - /* * sys/sem.h */ @@ -93,6 +73,26 @@ struct target_semid_ds { target_time_t sem_ctime; /* times measured in secs */ }; =20 +/* + * sys/shm.h + */ +struct target_shmid_ds { + struct target_ipc_perm shm_perm; /* peration permission structure */ + abi_ulong shm_segsz; /* size of segment in bytes */ + int32_t shm_lpid; /* process ID of last shared memory op */ + int32_t shm_cpid; /* process ID of creator */ + int32_t shm_nattch; /* number of current attaches */ + target_time_t shm_atime; /* time of last shmat() */ + target_time_t shm_dtime; /* time of last shmdt() */ + target_time_t shm_ctime; /* time of last change by shmctl() */ +}; + +#define N_BSD_SHM_REGIONS 32 +struct bsd_shm_regions { + abi_long start; + abi_long size; +}; + /* * sys/msg.h */ @@ -118,23 +118,26 @@ struct target_msgbuf { char mtext[1]; /* body of message */ }; =20 +/* + * sched.h + */ +struct target_sched_param { + int32_t sched_priority; +}; + /* * sys/mman.h */ #define TARGET_MADV_DONTNEED 4 /* dont need these pages */ =20 -#define TARGET_FREEBSD_MAP_RESERVED0080 0x0080 /* previously misimplement= ed */ - /* MAP_INHERIT */ -#define TARGET_FREEBSD_MAP_RESERVED0100 0x0100 /* previously unimplemente= d */ - /* MAP_NOEXTEND */ -#define TARGET_FREEBSD_MAP_STACK 0x0400 /* region grows down, like= a */ - /* stack */ -#define TARGET_FREEBSD_MAP_NOSYNC 0x0800 /* page to but do not sync= */ - /* underlying file */ +#define MAP_TYPE 0xf =20 +/* XXX These are needed by mmap.c until it is updated to match blitz */ +#define TARGET_FREEBSD_MAP_RESERVED0080 0x0080 +#define TARGET_FREEBSD_MAP_RESERVED0100 0x0100 +#define TARGET_FREEBSD_MAP_STACK 0x0400 +#define TARGET_FREEBSD_MAP_NOSYNC 0x0800 #define TARGET_FREEBSD_MAP_FLAGMASK 0x1ff7 - -/* XXX */ #define TARGET_BSD_MAP_FLAGMASK 0x3ff7 =20 /* @@ -142,8 +145,6 @@ struct target_msgbuf { * sys/timex.h */ =20 -typedef abi_long target_freebsd_suseconds_t; - /* compare to sys/timespec.h */ struct target_freebsd_timespec { target_time_t tv_sec; /* seconds */ @@ -165,12 +166,75 @@ struct target_freebsd__umtx_time { =20 struct target_freebsd_timeval { target_time_t tv_sec; /* seconds */ - target_freebsd_suseconds_t tv_usec;/* and microseconds */ + target_suseconds_t tv_usec;/* and microseconds */ #if !defined(TARGET_I386) && TARGET_ABI_BITS =3D=3D 32 abi_long _pad; #endif }; =20 +/* compare to sys/timex.h */ +struct target_freebsd_ntptimeval { + struct target_freebsd_timespec time; + abi_long maxerror; + abi_long esterror; + abi_long tai; + int32_t time_state; +}; + +struct target_freebsd_itimerspec { + struct target_freebsd_timespec it_interval; + struct target_freebsd_timespec it_value; +}; + +struct target_freebsd_timex { + uint32_t modes; + abi_long offset; + abi_long freq; + abi_long maxerror; + abi_long esterror; + int32_t status; + abi_long constant; + abi_long precision; + abi_long tolerance; + + abi_long ppsfreq; + abi_long jitter; + int32_t shift; + abi_long stabil; + abi_long jitcnt; + abi_long calcnt; + abi_long errcnt; + abi_long stbcnt; +}; + +/* Maxiumum of 32 active POSIX timers allowed at any one time. */ +extern int g_posix_timers[32]; + +#define TIMER_MAGIC 0x0caf0000 +#define TIMER_MAGIC_MASK 0xffff0000 + +/* + * sys/event.h + */ +struct target_freebsd11_kevent { + abi_ulong ident; + int16_t filter; + uint16_t flags; + uint32_t fflags; + abi_long data; + abi_ulong udata; +}; + +struct target_freebsd_kevent { + abi_ulong ident; + int16_t filter; + uint16_t flags; + uint32_t fflags; + int64_t data; + abi_ulong udata; + uint64_t ext[4]; +}; + /* * sys/resource.h */ @@ -219,6 +283,154 @@ struct target_freebsd__wrusage { struct target_freebsd_rusage wru_children; }; =20 +/* + * sys/socket.h + */ + +/* + * Types + */ +#define TARGET_SOCK_STREAM 1 /* stream socket */ +#define TARGET_SOCK_DGRAM 2 /* datagram socket */ +#define TARGET_SOCK_RAW 3 /* raw-protocol interface */ +#define TARGET_SOCK_RDM 4 /* reliably-delivered message */ +#define TARGET_SOCK_SEQPACKET 5 /* sequenced packet stream */ + + +/* + * Option flags per-socket. + */ + +#define TARGET_SO_DEBUG 0x0001 /* turn on debugging info recordin= g */ +#define TARGET_SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define TARGET_SO_REUSEADDR 0x0004 /* allow local address reuse */ +#define TARGET_SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define TARGET_SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define TARGET_SO_BROADCAST 0x0020 /* permit sending of broadcast msg= s */ +#define TARGET_SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define TARGET_SO_LINGER 0x0080 /* linger on close if data present= */ +#define TARGET_SO_OOBINLINE 0x0100 /* leave received OOB data in line= */ +#define TARGET_SO_REUSEPORT 0x0200 /* allow local address & port reus= e */ +#define TARGET_SO_TIMESTAMP 0x0400 /* timestamp received dgram traffi= c */ +#define TARGET_SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ +#define TARGET_SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ +#define TARGET_SO_BINTIME 0x2000 /* timestamp received dgram traffi= c */ +#define TARGET_SO_NO_OFFLOAD 0x4000 /* socket cannot be offloaded */ +#define TARGET_SO_NO_DDP 0x8000 /* disable direct data placement */ + +/* + * Additional options, not kept in so_options. + */ +#define TARGET_SO_SNDBUF 0x1001 /* send buffer size */ +#define TARGET_SO_RCVBUF 0x1002 /* receive buffer size */ +#define TARGET_SO_SNDLOWAT 0x1003 /* send low-water mark */ +#define TARGET_SO_RCVLOWAT 0x1004 /* receive low-water mark */ +#define TARGET_SO_SNDTIMEO 0x1005 /* send timeout */ +#define TARGET_SO_RCVTIMEO 0x1006 /* receive timeout */ +#define TARGET_SO_ERROR 0x1007 /* get error status and clear */ +#define TARGET_SO_TYPE 0x1008 /* get socket type */ +#define TARGET_SO_LABEL 0x1009 /* socket's MAC label */ +#define TARGET_SO_PEERLABEL 0x1010 /* socket's peer's MAC label */ +#define TARGET_SO_LISTENQLIMIT 0x1011 /* socket's backlog limit */ +#define TARGET_SO_LISTENQLEN 0x1012 /* socket's complete queue length = */ +#define TARGET_SO_LISTENINCQLEN 0x1013 /* socket's incomplete queue lengt= h */ +#define TARGET_SO_SETFIB 0x1014 /* use this FIB to route */ +#define TARGET_SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ +#define TARGET_SO_PROTOCOL 0x1016 /* get socket protocol (Linux name= ) */ + +/* alias for SO_PROTOCOL (SunOS name) */ +#define TARGET_SO_PROTOTYPE TARGET_SO_PROTOCOL + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define TARGET_SOL_SOCKET 0xffff /* options for socket level */ + +#ifndef CMSG_ALIGN +#define CMSG_ALIGN(len) (((len) + sizeof(long) - 1) & ~(sizeof(long) - 1)) +#endif + +/* + * sys/socket.h + */ +struct target_msghdr { + abi_long msg_name; /* Socket name */ + int32_t msg_namelen; /* Length of name */ + abi_long msg_iov; /* Data blocks */ + int32_t msg_iovlen; /* Number of blocks */ + abi_long msg_control; /* Per protocol magic (eg BSD fd passing) = */ + int32_t msg_controllen; /* Length of cmsg list */ + int32_t msg_flags; /* flags on received message */ +}; + +struct target_sockaddr { + uint8_t sa_len; + uint8_t sa_family; + uint8_t sa_data[14]; +} QEMU_PACKED; + +struct target_in_addr { + uint32_t s_addr; /* big endian */ +}; + +struct target_cmsghdr { + uint32_t cmsg_len; + int32_t cmsg_level; + int32_t cmsg_type; +}; + +/* + * mips32 is the exception to the general rule of long-alignment; it + * unconditionally uses 64-bit alignment instead. + */ +#if defined(TARGET_MIPS) && TARGET_ABI_BITS =3D=3D 32 +#define TARGET_ALIGNBYTES (sizeof(abi_llong) - 1) +#else +#define TARGET_ALIGNBYTES (sizeof(abi_long) - 1) +#endif + +#define TARGET_CMSG_NXTHDR(mhdr, cmsg, cmsg_start) \ + __target_cmsg_nxthdr(mhdr, cmsg, cmsg_start) +#define TARGET_CMSG_ALIGN(len) (((len) + TARGET_ALIGNBYTES) \ + & (size_t) ~TARGET_ALIGNBYTES) +#define TARGET_CMSG_DATA(cmsg) \ + ((unsigned char *)(cmsg) + TARGET_CMSG_ALIGN(sizeof(struct target_cmsg= hdr))) +#define TARGET_CMSG_SPACE(len) \ + (TARGET_CMSG_ALIGN(sizeof(struct target_cmsghdr)) + TARGET_CMSG_ALIGN(= len)) +#define TARGET_CMSG_LEN(len) \ + (TARGET_CMSG_ALIGN(sizeof(struct target_cmsghdr)) + (len)) + +static inline struct target_cmsghdr * +__target_cmsg_nxthdr(struct target_msghdr *__mhdr, + struct target_cmsghdr *__cmsg, + struct target_cmsghdr *__cmsg_start) +{ + struct target_cmsghdr *__ptr; + + __ptr =3D (struct target_cmsghdr *)((unsigned char *) __cmsg + + TARGET_CMSG_ALIGN(tswap32(__cmsg->cmsg_len))); + if ((unsigned long)((char *)(__ptr + 1) - (char *)__cmsg_start) > + tswap32(__mhdr->msg_controllen)) { + /* No more entries. */ + return (struct target_cmsghdr *)0; + } + return __ptr; +} + +/* + * netinet/in.h + */ +struct target_ip_mreq { + struct target_in_addr imr_multiaddr; + struct target_in_addr imr_interface; +}; + +struct target_ip_mreqn { + struct target_in_addr imr_multiaddr; + struct target_in_addr imr_address; + int32_t imr_ifindex; +}; + /* * sys/stat.h */ @@ -434,6 +646,152 @@ struct target_freebsd_flock { /* user: vfork(2) semantics, clear signals */ #define TARGET_RFSPAWN (1U << 31) =20 +/* sys/specialfd.h */ +enum target_specialfd_type { + TARGET_SPECIALFD_EVENT =3D 1, +}; + +struct target_specialfd_eventfd { + unsigned int initval; + int flags; +}; + +/* + * FreeBSD thread and user mutex support. + */ + +/* sys/thr.h */ +#define TARGET_THR_SUSPENDED 0x0001 +#define TARGET_THR_SYSTEM_SCOPE 0x0002 + +struct target_freebsd_thr_param { + abi_ulong start_func; /* thread entry function. */ + abi_ulong arg; /* argument for entry function. */ + abi_ulong stack_base; /* stack base address. */ + abi_ulong stack_size; /* stack size. */ + abi_ulong tls_base; /* tls base address. */ + abi_ulong tls_size; /* tls size. */ + abi_ulong child_tid; /* address to store new TID. */ + abi_ulong parent_tid; /* parent access the new TID here. */ + int32_t flags; /* thread flags. */ + abi_ulong rtp; /* Real-time scheduling priority. */ + abi_ulong spare[3]; /* spares. */ +}; + +/* sys/rtprio.h */ +struct target_freebsd_rtprio { + uint16_t type; + uint16_t prio; +}; + +typedef struct { + CPUArchState *env; + long parent_tid; + pthread_mutex_t mutex; + pthread_cond_t cond; + pthread_t thread; + sigset_t sigmask; + struct target_freebsd_thr_param param; +} new_freebsd_thread_info_t; + +/* sys/utmx.h */ +/* op code for _umtx_op */ +#define TARGET_UMTX_OP_LOCK 0 +#define TARGET_UMTX_OP_UNLOCK 1 +#define TARGET_UMTX_OP_WAIT 2 +#define TARGET_UMTX_OP_WAKE 3 +#define TARGET_UMTX_OP_MUTEX_TRYLOCK 4 +#define TARGET_UMTX_OP_MUTEX_LOCK 5 +#define TARGET_UMTX_OP_MUTEX_UNLOCK 6 +#define TARGET_UMTX_OP_SET_CEILING 7 +#define TARGET_UMTX_OP_CV_WAIT 8 +#define TARGET_UMTX_OP_CV_SIGNAL 9 +#define TARGET_UMTX_OP_CV_BROADCAST 10 +#define TARGET_UMTX_OP_WAIT_UINT 11 +#define TARGET_UMTX_OP_RW_RDLOCK 12 +#define TARGET_UMTX_OP_RW_WRLOCK 13 +#define TARGET_UMTX_OP_RW_UNLOCK 14 +#define TARGET_UMTX_OP_WAIT_UINT_PRIVATE 15 +#define TARGET_UMTX_OP_WAKE_PRIVATE 16 +#define TARGET_UMTX_OP_MUTEX_WAIT 17 +#define TARGET_UMTX_OP_MUTEX_WAKE 18 +#define TARGET_UMTX_OP_SEM_WAIT 19 +#define TARGET_UMTX_OP_SEM_WAKE 20 +#define TARGET_UMTX_OP_NWAKE_PRIVATE 21 +#define TARGET_UMTX_OP_MUTEX_WAKE2 22 +#define TARGET_UMTX_OP_SEM2_WAIT 23 +#define TARGET_UMTX_OP_SEM2_WAKE 24 +#define TARGET_UMTX_OP_SHM 25 +#define TARGET_UMTX_OP_ROBUST_LISTS 26 + +/* flags for UMTX_OP_CV_WAIT */ +#define TARGET_CVWAIT_CHECK_UNPARKING 0x01 +#define TARGET_CVWAIT_ABSTIME 0x02 +#define TARGET_CVWAIT_CLOCKID 0x04 + +#define TARGET_UMTX_UNOWNED 0x0 +#define TARGET_UMUTEX_UNOWNED 0x0 +#define TARGET_UMTX_CONTESTED (abi_ulong)(-1) +#define TARGET_UMUTEX_CONTESTED 0x80000000U + +/* flags for umutex */ +#define TARGET_UMUTEX_ERROR_CHECK 0x0002 /* Error-checking mutex */ +#define TARGET_UMUTEX_PRIO_INHERIT 0x0004 /* Priority inherited mutex */ +#define TARGET_UMUTEX_PRIO_PROTECT 0x0008 /* Priority protect mutex */ + +#define TARGET_UMUTEX_TRY 1 +#define TARGET_UMUTEX_WAIT 2 + +/* urwlock flags */ +#define TARGET_URWLOCK_PREFER_READER 0x0002 +#define TARGET_URWLOCK_WRITE_OWNER 0x80000000U +#define TARGET_URWLOCK_WRITE_WAITERS 0x40000000U +#define TARGET_URWLOCK_READ_WAITERS 0x20000000U +#define TARGET_URWLOCK_MAX_READERS 0x1fffffffU +#define TARGET_URWLOCK_READER_COUNT(c) ((c) & TARGET_URWLOCK_MAX_READERS) + +/* + * sys/acl.h + */ +#define TARGET_FREEBSD_ACL_MAX_ENTRIES 254 + +/* vaild acl_type_t arguments */ +#define TARGET_FREEBSD_ACL_TYPE_ACCESS_OLD 0x00000000 +#define TARGET_FREEBSD_ACL_TYPE_DEFAULT_OLD 0x00000001 +#define TARGET_FREEBSD_ACL_TYPE_ACCESS 0x00000002 +#define TARGET_FREEBSD_ACL_TYPE_DEFAULT 0x00000003 +#define TARGET_FREEBSD_ACL_TYPE_NFS4 0x00000004 + +struct target_freebsd_acl_entry { + uint32_t ae_tag; + uint32_t ae_id; + uint32_t ae_perm; + uint16_t ae_entry_type; + uint16_t ae_flags; +}; + +struct target_freebsd_acl { + uint32_t acl_maxcnt; + uint32_t acl_cnt; + int32_t acl_spare[4]; + struct target_freebsd_acl_entry acl_entry[TARGET_FREEBSD_ACL_MAX_ENTR= IES]; +}; + +/* + * sys/uuid.h + */ + +#define TARGET_UUID_NODE_LEN 6 + +struct target_uuid { + uint32_t time_low; + uint16_t time_mid; + uint16_t time_hi_and_version; + uint8_t clock_seq_hi_and_reserved; + uint8_t clock_seq_low; + uint8_t node[TARGET_UUID_NODE_LEN]; +}; + /* * from sys/procctl.h */ @@ -475,21 +833,6 @@ struct target_procctl_reaper_kill { uint32_t rk_pad0[15]; }; =20 -/* - * sys/uuid.h - */ -#define TARGET_UUID_NODE_LEN 6 - -struct target_uuid { - uint32_t time_low; - uint16_t time_mid; - uint16_t time_hi_and_version; - uint8_t clock_seq_hi_and_reserved; - uint8_t clock_seq_low; - uint8_t node[TARGET_UUID_NODE_LEN]; -}; - - #define safe_syscall0(type, name) \ type safe_##name(void) \ { \ @@ -537,22 +880,15 @@ type safe_##name(type1 arg1, type2 arg2, type3 arg3, = type4 arg4, \ return safe_syscall(SYS_##name, arg1, arg2, arg3, arg4, arg5, arg6); \ } =20 -/* - * sys/socket.h - */ -struct target_sockaddr { - uint8_t sa_len; - uint8_t sa_family; - uint8_t sa_data[14]; -} QEMU_PACKED; - -struct target_in_addr { - uint32_t s_addr; /* big endian */ -}; - #define safe_ioctl(...) safe_syscall(SYS_ioctl, __VA_ARGS__) #define safe_fcntl(...) safe_syscall(SYS_fcntl, __VA_ARGS__) =20 +struct target_pollfd { + int32_t fd; /* file descriptor */ + int16_t events; /* requested events */ + int16_t revents; /* returned events */ +}; + /* So far all target and host bitmasks are the same */ #undef target_to_host_bitmask #define target_to_host_bitmask(x, tbl) (x) --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015974; cv=none; d=zohomail.com; s=zohoarc; b=TzslPLpqpSuqTSrDz2mXycVuwHxKE1s6RV08NVoPKS8L1pF4ljgSZ9gJfm9yiHiqnspnm5qxf2pJYCCOAx6dxxbjHqa4vHUfeXtBxkN1cAHxN02JER69gq0COmjNfMH/zDCdAY/gXrju9HKNV6fBISuiDLHgYZRVKG8Z6AjKm3I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015974; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kvUGahSEkdtAJdO2FteQD4GPP2ZsdlVT6D+xHuojI5k=; b=lXu6gBtpMsv9hGntstaBYFwiOMBPBJlPMGy0f8n+q8tWoLqqZ1u3PJ0d6au0gfhlAT5ng3OUFyvG3e8nkkLcGIpOaetfXpf4RytrgmX++oG7ouf0AUiaFYE2CZkxXhYAgR43hDkBPn6JoXgjOUxeoWCjsu6tK129LcjZ+BW/sb8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015974081575.5253156112997; Sat, 20 Jun 2026 21:26:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gy-0002wc-Qn; Sun, 21 Jun 2026 00:21:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gv-0002vy-S8 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:53 -0400 Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gu-000552-1l for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:53 -0400 Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-6a0b1edbe32so2780568eaf.1 for ; Sat, 20 Jun 2026 21:21:51 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015711; x=1782620511; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=kvUGahSEkdtAJdO2FteQD4GPP2ZsdlVT6D+xHuojI5k=; b=rYqHZvDXSmWsDSebKJkQowMS1jvEZ6O9wa423zHUyQ5hEg5EZL+YK1BuP9ALS9W9Jj 3EyhQ5SAxkOgglAwjXl3qVZyUZHFVI1O8BMQZ9QzBoByRSemYS6ItUrKkwkl+1ht46pq IElD1izmRmA4zuD2otmjkzbNOeTEp8nxXtkOw+7NKr50yDTcVUqZ3wheQ76R0hAHxm9A KtWTt9BwznVFqi10or65XHASpaaTcrNuCgZmrtd50H+IhvB2k2JY9iJeawZp5lsldfUN EQuyypQfUdpM5pNN/IrCMcKJeSLN3kYESNazQ7sZFuS5WslD+odtUquC5RBk6K8d+dxv 0Szw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015711; x=1782620511; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=kvUGahSEkdtAJdO2FteQD4GPP2ZsdlVT6D+xHuojI5k=; b=FDVEjHMeSGBGay2dNCeLbCvH9WX2Kijz4tJWk7hrOQJ4XCGSk8786fRxW+7CfJTYE/ +xfroJoEm456GRD6VO6Gw3KRPEjr/HcyIt9Yi4d+horSaojhHi9ZhzcBoCMheGdNfOPK 3KxTpZiwVDp085iz3DRcjzhHWwR8LLdxyqZRitCx3QRuv1te3/E7gK0do8HfzLOoN8JM zjyR0llw/28kxPzQrdKaE1N+XQZB2Xc5bBHWMSar3CoggcK6/aKRWlR6RCJe5qAkp6C3 csyyT+A0woPmGsDyYrTvswM84uG+mx7ntoyTJ6XERv+kRmu4Hccwvp3f43LPgazKAB7E 13Cg== X-Gm-Message-State: AOJu0YyvrPNDSNlxrGxO6/PZJp9R5U1u1qOiQnIxjjiOpTUzmuVfFmIh FXzS+1t2FQt7tEonihe7r0raOhSwen+dBwp1Q13Bupi0LM+ZEx8WI08+NTL1TRX4bySX2HNwuaX AhrSMswC8ow== X-Gm-Gg: AfdE7ckGk1zrvQ2tvzgS/XIHJnXSh9TvHsBT9mjMI1JHiHy0GszQj/v/s3nncEmq6Lo jvTruOk/YOGicHIJ6mJt10ntBImZYThMX1w7izW3FmO6/aFh8hjTIREkjamupdgp2m184KFr7Db aamVGZXcsvNOjGVaz9mxwzu2py3QwXbZoKFI8tgC68Ui9aUhAbAJQbeLiPVJP9h8vJJ+fzbM5dW Xdb5Qqis4pHx2DazTyBZ/XB4QlhbFU6ZaMCQXPZfL1HUh4Lww9zQs8nm7i6Sw7dJt/tp1bizYFF 5n4C67u96CLxoCiBpKDpYM6QeSWdyUMwMAtCDHl0o8h1V3F6VARFoVH70WKoJGXPdMfDsG/BPn2 zX+uthX5Z/dD+eJO4tjrPRXr1Ee2vb/lDDK8oFE32CAM2vAyN3K0BZeS4IMcQjMBLz2k1xkOu0o Q= X-Received: by 2002:a05:6820:828:b0:69e:34f1:9690 with SMTP id 006d021491bc7-6a0de08c212mr7287708eaf.35.1782015710763; Sat, 20 Jun 2026 21:21:50 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:56 -0600 Subject: [PATCH v3 09/40] bsd-user: Add os-file.h with pipe2, chflagsat, close_range, and more MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-9-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5387; i=imp@bsdimp.com; h=from:subject:message-id; bh=ruAHVIgTwv2WPSDGUkKvT7snhR5AW/NAdfEJwFTECnc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z9cZobdqktg9QeO4O5x8Sg+kohoLh78VZmC BHK/1yU3N6JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AHTtD/45JogC/VlXTLfTDMuSNtD0Oiin2SBBnrx7suNmVmfvYjCEGYkh3unvYhAm1sascHicjYy 7BFjA6wL5jsIeYLC8MpvffqWhO7rqR+B6pcl4MukB4k4anMuJJlUzE2pFqqfmqvC4w0/H8KeK0p fZVCQ9nxuYLiWFpNpinX+oYvIxfAwVvhhRRDXVwBRSOBAM85ZwEdiegPq4P6cc3dswgaZPN/+Xf 4Po+selBpNyKBo28p+4EOUgoXL1jnKpvFoD7g940UlsitBb8d9nrOp/IhaZCtdx4NA5KvFqB5cc SW2yNj+acCCEzntia8z7+kEqUyCkavJVCCPhsW84FoY8lwKTn61eL2wzpUTpH4TWjZFXK8nB6+c nvbMPZ5Bq578Fgt77AwwiNFxXUyBYtNjCHGjkYATtCfI4o7D1Yquz+fMZKdz1ibJ98eqF/wI/lu XQhOAqT+4g0c+L8mxo/1El7TeqYDqBbc56YCt6DRFPcfTPYLFnPvHsYjRu+ySKlAsPh3egwskco xfkDW7mDit+EA8eY3tE/Bz9n/BUEP4yZhOWDP1RPpnLh0jalQNCPWpKUxVIKiVptgQekPZA2MWj hQgmW+gT82Ur+XtoclLtz4Z05phjmAIoa4wmN/ec3z0l7PGSV0LUexqCW6TyyGzTrDSGIu7B5fH e2WCy3IIuVv7WVA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2c; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015974964154100 Add FreeBSD-specific file operation shims: pipe2, chflagsat, close_range, copy_file_range, and __specialfd. Also add the safe_copy_file_range and safe_ppoll syscall wrappers and the target_specialfd_eventfd type definitions. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/freebsd/os-file.h | 129 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-syscall.c | 7 +++ 2 files changed, 136 insertions(+) diff --git a/bsd-user/freebsd/os-file.h b/bsd-user/freebsd/os-file.h new file mode 100644 index 0000000000..c1da52789a --- /dev/null +++ b/bsd-user/freebsd/os-file.h @@ -0,0 +1,129 @@ +/* + * FreeBSD file related system call shims and definitions + * + * Copyright (c) 2014 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef FREEBSD_OS_FILE_H +#define FREEBSD_OS_FILE_H + +#include + +/* + * Asynchronous I/O. + */ + +/* pipe2(2) */ +static abi_long do_bsd_pipe2(CPUArchState *env, abi_ulong pipedes, int fla= gs) +{ + int host_pipe[2]; + int host_ret =3D pipe2(host_pipe, flags); + /* XXXss - flags should be translated from target to host. */ + + if (host_ret =3D=3D -1) { + return get_errno(host_ret); + } + + /* + * pipe2() returns it's second FD by copying it back to userspace and = not in + * a second register like pipe(2): set_second_rval(env, host_pipe[1]); + * + * Copy the FD's back to userspace: + */ + if (put_user_s32(host_pipe[0], pipedes) || + put_user_s32(host_pipe[1], pipedes + sizeof(host_pipe[0]))) { + close(host_pipe[0]); + close(host_pipe[1]); + return -TARGET_EFAULT; + } + return 0; +} + +/* chflagsat(2) */ +static inline abi_long do_bsd_chflagsat(int fd, abi_ulong path, + abi_ulong flags, int atflags) +{ + abi_long ret; + void *p; + + LOCK_PATH(p, path); + ret =3D get_errno(chflagsat(fd, p, flags, atflags)); /* XXX path(p)? */ + UNLOCK_PATH(p, path); + + return ret; +} + +/* close_range(2) */ +static inline abi_long do_freebsd_close_range(unsigned int lowfd, + unsigned int highfd, int flags) +{ + + return get_errno(close_range(lowfd, highfd, flags)); +} + +ssize_t safe_copy_file_range(int, off_t *, int, off_t *, size_t, unsigned = int); + +/* copy_file_range(2) */ +static inline abi_long do_freebsd_copy_file_range(int infd, + abi_ulong inofftp, int outfd, abi_ulong outofftp, size_t len, + unsigned int flags) +{ + off_t inoff, outoff, *inp, *outp; + abi_long ret; + + inp =3D outp =3D NULL; + if (inofftp !=3D 0 && !access_ok(VERIFY_WRITE, inofftp, sizeof(off_t))= ) { + return -TARGET_EFAULT; + } else if (inofftp !=3D 0) { + inoff =3D tswap64(*(off_t *)g2h_untagged(inofftp)); + inp =3D &inoff; + } + if (outofftp !=3D 0 && !access_ok(VERIFY_WRITE, outofftp, sizeof(off_t= ))) { + return -TARGET_EFAULT; + } else if (outofftp !=3D 0) { + outoff =3D tswap64(*(off_t *)g2h_untagged(outofftp)); + outp =3D &outoff; + } + + ret =3D get_errno(safe_copy_file_range(infd, inp, outfd, outp, len, + flags)); + + if (!is_error(ret)) { + if (inofftp !=3D 0) { + *(off_t *)g2h_untagged(inofftp) =3D tswap64(inoff); + } + if (outofftp !=3D 0) { + *(off_t *)g2h_untagged(outofftp) =3D tswap64(outoff); + } + } + return ret; +} + +static inline abi_long do_freebsd___specialfd(int type, abi_ulong req, + size_t len) +{ + abi_long ret; + + ret =3D -TARGET_EINVAL; + switch (type) { + case TARGET_SPECIALFD_EVENT: { + struct specialfd_eventfd evfd; + struct target_specialfd_eventfd *target_eventfd; + + if (!lock_user_struct(VERIFY_READ, target_eventfd, req, 1)) { + return -TARGET_EFAULT; + } + + evfd.initval =3D tswap32(target_eventfd->initval); + evfd.flags =3D tswap32(target_eventfd->flags); + ret =3D get_errno(syscall(SYS___specialfd, type, &evfd, sizeof(evf= d))); + unlock_user_struct(target_eventfd, req, 0); + break; + } + } + + return ret; +} + +#endif /* FREEBSD_OS_FILE_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index fc6273a780..8a25be4ac7 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -45,6 +45,7 @@ #include "os-stat.h" #include "os-proc.h" #include "os-signal.h" +#include "os-file.h" #include "os-misc.h" =20 /* I/O */ @@ -66,6 +67,12 @@ safe_syscall3(ssize_t, writev, int, fd, const struct iov= ec *, iov, int, iovcnt); safe_syscall4(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, i= ovcnt, off_t, offset); =20 +safe_syscall4(int, ppoll, struct pollfd *, fds, nfds_t, nfds, + const struct timespec *, restrict_timeout, const sigset_t *, + restrict_newsigmask); +safe_syscall6(ssize_t, copy_file_range, int, infd, off_t *, inoffp, int, o= utfd, + off_t *, outoffp, size_t, len, unsigned int, flags); + /* used in os-proc */ safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options, struct rusage *, rusage); --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015788; cv=none; d=zohomail.com; s=zohoarc; b=O6bf9BXJb1zKijuyiz/eRC0ZLKFoIIPctFCZHyk5TyiPpDp7zaO2oVnr7Jn1aTsERwIGye/csPSYNS63ENOZGyYgvKq0V9CwZj+0U4NUe/rsdgXkoTrr0NVfMKOCMTlUS3uoLiuV12jbFEhFcYWv6OkzTF1YvfrMagYhUW2otkU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IiWazTsjHV3FGpcV1rYqHlq9lclQ1rtXU/+IT6WBdEk=; b=k+ziOII7mOY82wWh/eHwJjPALOASJZHrZ4ZFhKSRxfC7mAnCg8m0dcysdek0U6yvDNIg80rnmLlRHnhhVRnP+K2tQpCucQ+WkRM7cRKM7a1Lf24EMI8/2aL/y7A4ZCrKo5uFh5hjD++FlGLPZsdjrNYKwqvSkNTk/fIF5Oik4Ac= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015788011605.6213384185053; Sat, 20 Jun 2026 21:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9gz-0002wf-Ax; Sun, 21 Jun 2026 00:21:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gx-0002wE-KG for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:55 -0400 Received: from mail-oo1-xc43.google.com ([2607:f8b0:4864:20::c43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gv-00055U-Op for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:55 -0400 Received: by mail-oo1-xc43.google.com with SMTP id 006d021491bc7-6a0ef0e88e2so349722eaf.3 for ; Sat, 20 Jun 2026 21:21:53 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015712; x=1782620512; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=IiWazTsjHV3FGpcV1rYqHlq9lclQ1rtXU/+IT6WBdEk=; b=KJubaVpF4SpyR/kIaycBuqzdYbQdWVws0+JHWDqU1TBRXUfFtpGLL60w4UCEEbzckx oqWLeMMgZnxuceZ4lbyUpt5vK8ujjX9XEY5Q8a0GlBMdimv5GBJRhTMv0jFoC3dQsr9B QfVK7yP673SU2KM/YX3EHZqt612yM1sUGLJOaM3orGg24jWNe5venYEitBd8+B+MQ4SC AwT8wZX9VycgdRLjPD0nrHk5xzPggOLjMnFiUg3tMLYEJATyTbWWxdHN4+3mxfCmVnBa v2B1ra+HoaxOgyvGYSlboSQ9ohtpNkHg5iycZvfGDT4uun+2h8RA4ROr/Db3EEL1QLT0 07Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015712; x=1782620512; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=IiWazTsjHV3FGpcV1rYqHlq9lclQ1rtXU/+IT6WBdEk=; b=DbE+qcfkCMEjOEI7E1S3Klqia4EEG/U6rBwc8jDjgefl3ZPnZQj3NxWvUeFVI5s7tT uC0sPQ18d3Ic11r+L0G72jJ3+n4HMHozjAl4r1kcDlRLfs66Al2Lfu9UFVY+2RFgULoQ kjMOvoZGY8UISKiRYZUpgmbLp4vznhq3B/9SaPNVsRknRzCSDktLQg1782/nAo0Fmlqr Y6iY0xaSZdRWBpW7+6hrXC5WQx1XIWwVcoDKOAOq0oXdInaeh+JhKQz5YhHOmBlgSt6K pfdON68UPspc0dfk4//pA3fC30XZSdWVNetjxJGD+pU9fIez0XpRZfhg+FHwGdgpYSKg yZ0g== X-Gm-Message-State: AOJu0Yy+RypNR9WIufDcokTPr+2+aKj84LUXWGowuRGU+c+OIoQ7Ierv mvhtfZDVTIR5TxEfiyol9hjeEP1LntjzpvSTZa/rb8ifdsENlqht7KZMy7PEF6tt6r8= X-Gm-Gg: AfdE7cktwlrxIVOKF//yLn7x6/gQ1TuZZh3GMOG1ERYUVydAjML5tNdVYsTvxbh1Ffj 1YFLlFOSrGGibtD/QsWdpSjigLh+3EegK4pXEC+ZWGO7tdBATlgZlhJAHKIPh0Qw2mSn+X1Vzsy YjDDVMnjFDg03E57YNCVnJfYdHw6bbLDQTp2MXpubQNmfmJaSgaMq15ekT7TWgvz0GFi6KOFClE qq8PcfoLfl+3DSFkE6RntuO9c8otGchI4I/GEA6gYwofZIy6ywRwLHadOHzVagLs7Upy4hF5/uf 8vgVfHCVEbY+ynvf26E9maGNWfkUjh14xEB33jERzeO8GLdx8WwW6xeUyUnQzEDcevE2tiiHuPP bNhxVT+Cdrv5i8MRMyytFkxfOkNb98gTCgz29KCg5wylvmmpk50UK8hmWz6S2w+AyI67nAQLrZ3 c= X-Received: by 2002:a05:6820:6ac8:b0:69d:fc30:1cf2 with SMTP id 006d021491bc7-6a0d883eceemr7154485eaf.7.1782015712452; Sat, 20 Jun 2026 21:21:52 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:57 -0600 Subject: [PATCH v3 10/40] bsd-user: Add file operation system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-10-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3764; i=imp@bsdimp.com; h=from:subject:message-id; bh=V1c5/yRkvmxjSaAU72UKP7d6NpebiPAGQNhepWKM4mY=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z9YmLHPD1Y8MqK/Xz2Lvryrr1x+f7SUlSnS Dek2kpMDv+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfQAKCRBsHNEofbAR AEJVEACiLE/pZxoq429GKmPoFVc7ocPi5WMKqS1SUxxmKQBf7ev+bEeOmudtiBe/+kTLpMGdJKU e4O+PGArZBZsD0tSy/VGuMN5ytNnw15X/wk3vA+lY8NJcN/1WqOGjuFDTyA6K21lbKPj2PQYMza QQMYqqSHv2mmUSKQXv2qhIhUwMKwhWKizxIAKY7uk9xjnmaBXC216g5m/XzalI8uHbo/BRFhctx OAAKiQo8Jjb/UZAVewjGduV75z4evX4AXHzEbI0IIJjp8oGyKyMQ5LVbUOuXdr5aLxsWKfK6ONg VjGl2Rv1elCINIftx8+vyaTu02z9pW6I81iVGNPt/mmJeiV3WfXmMXbdWQArN7qQ7XfYItvNm3a weYmXEftZ1CUkzK0W0fMFmCoFKedOFAEMIES9GlW9lbGv6Y9hwZ1Mr+27ROHna5GfMLzBKiZGoj 90vgafEuli+NXZDAy9qSN6IsAqLZ/nHADM5UYCOr4M4uodkXerv7hl/yXwQQxQe9FVG5Q6xX35e S6UZzuOe1l780pIfBkGjet3uB0KFGtLrqsHx9C8VV4WOFZA+jnYpw/8XLh9DhHKdGPTDfErtr0g PPxznaqJR1AyzyVqgeY4IPImh2Ey0hkumscFemj3EUZxFOOS9I5FSmmXeM0Q9a5n1WuJS7+LKVn q8E5sMZFwSXefZw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c43; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc43.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015790429154100 Wire up additional file-related system calls: poll, lseek, pipe, pipe2, swapon, swapoff, chflagsat, close_range, __realpathat, copy_file_range, and __specialfd. Also fix __realpathat to use __sys___realpathat on FreeBSD >=3D 15.0. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/freebsd/os-stat.h | 8 +------ bsd-user/freebsd/os-syscall.c | 51 +++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/bsd-user/freebsd/os-stat.h b/bsd-user/freebsd/os-stat.h index ea95aa6344..4e5fc30de4 100644 --- a/bsd-user/freebsd/os-stat.h +++ b/bsd-user/freebsd/os-stat.h @@ -622,11 +622,6 @@ static inline abi_long do_freebsd_fcntl(abi_long arg1,= abi_long arg2, return ret; } =20 -#if defined(__FreeBSD_version) && __FreeBSD_version >=3D 1300080 -extern int __realpathat(int fd, const char *path, char *buf, size_t size, - int flags); -/* https://svnweb.freebsd.org/base?view=3Drevision&revision=3D358172 */ -/* no man page */ static inline abi_long do_freebsd_realpathat(abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg5) { @@ -640,12 +635,11 @@ static inline abi_long do_freebsd_realpathat(abi_long= arg1, abi_long arg2, return -TARGET_EFAULT; } =20 - ret =3D get_errno(__realpathat(arg1, p, b, arg4, arg5)); + ret =3D get_errno(syscall(SYS___realpathat, arg1, p, b, arg4, arg5)); UNLOCK_PATH(p, arg2); unlock_user(b, arg3, ret); =20 return ret; } -#endif =20 #endif /* BSD_USER_FREEBSD_OS_STAT_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 8a25be4ac7..228daed4c4 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -700,6 +700,57 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_undelete(arg1); break; =20 + case TARGET_FREEBSD_NR_poll: /* poll(2) */ + ret =3D do_bsd_poll(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_lseek: /* lseek(2) */ + ret =3D do_bsd_lseek(env, arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_freebsd10_pipe: /* pipe(2) */ + ret =3D do_bsd_pipe(env, arg1); + break; + + case TARGET_FREEBSD_NR_pipe2: /* pipe2(2) */ + ret =3D do_bsd_pipe2(env, arg1, arg2); + break; + + case TARGET_FREEBSD_NR_swapon: /* swapon(2) */ + ret =3D do_bsd_swapon(arg1); + break; + +#if TARGET_FREEBSD_NR_freebsd13_swapoff + case TARGET_FREEBSD_NR_freebsd13_swapoff: /* freebsd13_swapoff(2) */ + ret =3D do_freebsd13_swapoff(arg1); + break; +#endif + + case TARGET_FREEBSD_NR_swapoff: /* swapoff(2) */ + ret =3D do_bsd_swapoff(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_chflagsat: /* chflagsat(2) */ + ret =3D do_bsd_chflagsat(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_close_range: /* close_range(2) */ + ret =3D do_freebsd_close_range(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___realpathat: + /* __realpathat(2) (XXX no realpathat()) */ + ret =3D do_freebsd_realpathat(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_copy_file_range: + ret =3D do_freebsd_copy_file_range(arg1, arg2, arg3, arg4, arg5, a= rg6); + break; + + case TARGET_FREEBSD_NR___specialfd: + ret =3D do_freebsd___specialfd(arg1, arg2, arg3); + break; + /* * ioctl(2) */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015788; cv=none; d=zohomail.com; s=zohoarc; b=IFK3Ny0USJ4E4q/0By+bCD0F81nvuKEGbL62wOpMvsewajxjcHcQwwcvy9GuH7PtL5KxAohHMc/d6ngZ1gzETA3AkN3HSpatt7nc51wkUj6oFCCpfoHWfo8gtRg2eWwR1p7LdpLJjEOT3gRllmZvr8F7FVJgc3YtPbZ53RiqCQo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jqGkbUPVWpPg4nAS2t8eDn1jA6zkTv0XMfxbv5aynCc=; b=IA83ibpuZbTsZ7zt2f9TWBzcRIKGnkzhHfXhdNS4ejPBhfiLA5HnomIu7mcyHibepWaDbkKW7XCTrLrK/Ks3eygsQBk1kx+PXYjEs+myGrj5au5hvPkz/1m5wL3R4wLy33BbZSW6T6qZ57AqoBAaC2XZiF6f7bISoGJ+T+AINwo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015788003396.5672940633476; Sat, 20 Jun 2026 21:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9h1-0002xT-3g; Sun, 21 Jun 2026 00:21:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9gz-0002wd-34 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:57 -0400 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gx-00057I-55 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:56 -0400 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-69de16f5e80so1814134eaf.0 for ; Sat, 20 Jun 2026 21:21:54 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015714; x=1782620514; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=jqGkbUPVWpPg4nAS2t8eDn1jA6zkTv0XMfxbv5aynCc=; b=iVkKVJGwhUthED0CwXSnnHyMhdNvqEGL40BW/Fr79+Lm1jPJM1u0r6qF6yFBGct4Jb kSSuBiz/hmAfq5ldUE/vQ1zcu5J3WvU2QsfndZmzaEHpgZg2Mk0cWimFzDvss9dnuqXg DrjJK4pg2+VNyHHKT588MnG4c5wJySifm0hunKGMrLvatIyRfj0s27c2uaAkrfAqI9VW jmlUegKZ7eE4dD4ebqe6t15CqKQI3msqsZ5W2QAONFRl3EvO8RtCnWMo+erkWy1JBILR jh3CMTbvWMxEWSLFqGTW9qtyvYiIGuj1ja/ZgScADHJqs3ULcEl98dkb03DczArpjn4P Sm5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015714; x=1782620514; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=jqGkbUPVWpPg4nAS2t8eDn1jA6zkTv0XMfxbv5aynCc=; b=OyICmLpOjU2Nrlftd7WPwDZMFj6qKWU4doQb0qP2dPUnS0aLW7pNiZGQSMFzdt6Vbf WV9DmwWAnKUtrOUdER8kYg6wE68BSUJ4oxyML3/SestA8fuHMRIKfKzIoMYirjny45hO 0pF4hM44xFMrHONAzMBiRULc12WwV/5JQTlmlJDcJRjRKH+4CggT5p38+O61g7n4IxWA Ve7+MKcwsyLjDP/SLDPZErjC3szqR0/IA7yjARZFJU8dG/qMAhEAyNDqOkozd9s4AJBg yNeb4nkQ5fxp0usOm2IAKW2Hh7Kxgjw9suvKXEKPPCqv8tSZwnv6zTzAeGyaEjp16dzu Es+g== X-Gm-Message-State: AOJu0YwhtIWPV7Fbxr0Iu3qstHMo5hFOuAWXBB0oeg69PtUICFdxy2iW tZ6MEN6pLALgzlyqQoNKrQRpx1yTFCC3qu4Cg4jc+TiK6a4+NZ9T3Qdag1Qvlj6AlugSOPuS4tf XJN51rK+ecA== X-Gm-Gg: AfdE7cmn9bN5hX7j3t7MllVqaQRM4qTE7Ass5xewM0jcVGFvSF56ybNkvaSwZSN4Em5 +U26Jc4ldVVoMaUtKdDU88bXSS5sBFNuU9zFxpuFHywccBSsqASCCB9NqaraHNEcm143ft30Ejh gUJcy2hPoad6MQ9GYvIWKk0+eYvhzr33AavysFzc7+RyCavdqVwEpjQYvOswLNynIbsptBYjVKh Y4VjHq58Y/IVlrRZTXhnNnHoKozHgQTLQyCMDU7/+XHCEjQBKY3fIdUv/2jfY88m87GRp1WukZ9 /47SVRYu1DQ1n4lFaUG/LahgyNRLuMw+DWtwAnUPeItY35EVAqAkrtxD4/S/uXlVBBg1mVTArV2 KebnTWWDh1IgpUaltoRaDKJmeAilOHdUCgn4ool4BJ8mV4bMiXPvRV6C1LN5qhB4ctQg+8YhZWz M= X-Received: by 2002:a05:6820:3081:b0:696:77e2:a78 with SMTP id 006d021491bc7-6a0d88b165dmr7848733eaf.23.1782015714057; Sat, 20 Jun 2026 21:21:54 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:58 -0600 Subject: [PATCH v3 11/40] bsd-user: Add bsd-socket.h with bind through getsockname MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-11-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7162; i=imp@bsdimp.com; h=from:subject:message-id; bh=J8SA0e583JfbXoF/dYpAHOqxYLUapaIlg1a5MTqLMlc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+hRlQbwI0g09mEYSHs3AdRfeynKrY9QVpX zk67JIPoJuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR AKGCEACLnroxZR33CrI/vm9FfjvshfgE6EEuXvVa0JUk7zg4v4132yx7gigztVe/tCdu/GI4nrk 0+HASVr1XTzIUXQbuXJ13RPCqODxH3nK+ltcESho0Mq1b3/HWj4PBn1/62ZUMjZRYP2Sx8jD4gC XBqnFMW6QSSLTM7AbffQsg99hYODJ1obF7LBhoHpqDofgiEfHU+aFdqN43/ZaADVnMx4zSXTtpn UFwSVvRD1ZkoU07pJOFowcNFpBnZPg4bAky1GTznnkc2oOwVE2vT928CXLqpfq9z73lSW8TW62W Nlw3l2jhulxNWB4AtgXADCnYcxZa8OQQOvRLdvVEvBQ91DxiHwsK5zilyb4c0Rx7SXXagmggO1F a5TkMIXfUdpDpbUhd/KyXSqHCbWjA0iFY1nhldTQqUHCBaB5qO69z9VHNjiRAHxh+Gm3cVzPhN+ nAY/ZwjUTdkU60yKdpf1wAUBrItejrJy65uibCwryNWZPOx+qH6KQDEnNyf3CvoLg1ooGQy5dBl ZcCObFZV8mwhThIngDeL6oaNri1lXjQjl+HL3kAxlVtnrr4G5QzX15mvKVKKfeAuWWYum/vQcz7 3dkHtSfRGTk4Fa0NS3MtlFwjfid6g65z2iQewTCUFsdbLd1HfIb6C5xPzs8o2RGpUttp6cH/X9o 0J76WWlelnGOnQA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c30; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015790354154100 Add the first set of socket system call shims: bind, connect, accept, getpeername, and getsockname. Also add safe_syscall wrappers for sendto, recvfrom, select, pselect, recvmsg, and sendmsg. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/bsd-socket.h | 167 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-syscall.c | 15 ++++ 2 files changed, 182 insertions(+) diff --git a/bsd-user/bsd-socket.h b/bsd-user/bsd-socket.h new file mode 100644 index 0000000000..c786d6717a --- /dev/null +++ b/bsd-user/bsd-socket.h @@ -0,0 +1,167 @@ +/* + * socket related system call shims + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef BSD_SOCKET_H +#define BSD_SOCKET_H + +#include +#include +#include +#include + +#include "qemu-bsd.h" + +ssize_t safe_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *restrict from, socklen_t *restrict fromlen); +ssize_t safe_sendto(int s, const void *buf, size_t len, int flags, + const struct sockaddr *to, socklen_t tolen); +int safe_select(int nfds, fd_set *readfs, fd_set *writefds, fd_set *except= fds, + struct timeval *timeout); +int safe_pselect(int nfds, fd_set *restrict readfds, + fd_set *restrict writefds, fd_set *restrict exceptfds, + const struct timespec *restrict timeout, + const sigset_t *restrict newsigmask); + +/* bind(2) */ +static inline abi_long do_bsd_bind(int sockfd, abi_ulong target_addr, + socklen_t addrlen) +{ + abi_long ret; + void *addr; + + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + + addr =3D alloca(addrlen + 1); + ret =3D target_to_host_sockaddr(addr, target_addr, addrlen); + if (is_error(ret)) { + return ret; + } + + return get_errno(bind(sockfd, addr, addrlen)); +} + +/* connect(2) */ +static inline abi_long do_bsd_connect(int sockfd, abi_ulong target_addr, + socklen_t addrlen) +{ + abi_long ret; + void *addr; + + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + addr =3D alloca(addrlen + 1); + + ret =3D target_to_host_sockaddr(addr, target_addr, addrlen); + + if (is_error(ret)) { + return ret; + } + + return get_errno(connect(sockfd, addr, addrlen)); +} + +/* accept(2) */ +static inline abi_long do_bsd_accept(int fd, abi_ulong target_addr, + abi_ulong target_addrlen_addr) +{ + socklen_t addrlen; + void *addr; + abi_long ret; + + if (target_addr =3D=3D 0) { + return get_errno(accept(fd, NULL, NULL)); + } + /* return EINVAL if addrlen pointer is invalid */ + if (get_user_u32(addrlen, target_addrlen_addr)) { + return -TARGET_EINVAL; + } + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) { + return -TARGET_EINVAL; + } + addr =3D alloca(addrlen); + + ret =3D get_errno(accept(fd, addr, &addrlen)); + if (!is_error(ret)) { + if (is_error(host_to_target_sockaddr(target_addr, addr, addrlen)))= { + close(ret); + ret =3D -TARGET_EFAULT; + } else if (put_user_u32(addrlen, target_addrlen_addr)) { + close(ret); + ret =3D -TARGET_EFAULT; + } + } + return ret; +} + +/* getpeername(2) */ +static inline abi_long do_bsd_getpeername(int fd, abi_ulong target_addr, + abi_ulong target_addrlen_addr) +{ + socklen_t addrlen; + void *addr; + abi_long ret; + + if (get_user_u32(addrlen, target_addrlen_addr)) { + return -TARGET_EFAULT; + } + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) { + return -TARGET_EFAULT; + } + addr =3D alloca(addrlen); + ret =3D get_errno(getpeername(fd, addr, &addrlen)); + if (!is_error(ret)) { + ret =3D host_to_target_sockaddr(target_addr, addr, addrlen); + if (is_error(ret)) { + ret =3D -TARGET_EFAULT; + } else if (put_user_u32(addrlen, target_addrlen_addr)) { + ret =3D -TARGET_EFAULT; + } + } + return ret; +} + +/* getsockname(2) */ +static inline abi_long do_bsd_getsockname(int fd, abi_ulong target_addr, + abi_ulong target_addrlen_addr) +{ + socklen_t addrlen; + void *addr; + abi_long ret; + + if (get_user_u32(addrlen, target_addrlen_addr)) { + return -TARGET_EFAULT; + } + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) { + return -TARGET_EFAULT; + } + addr =3D alloca(addrlen); + + ret =3D get_errno(getsockname(fd, addr, &addrlen)); + if (!is_error(ret)) { + ret =3D host_to_target_sockaddr(target_addr, addr, addrlen); + if (is_error(ret)) { + ret =3D -TARGET_EFAULT; + } else if (put_user_u32(addrlen, target_addrlen_addr)) { + ret =3D -TARGET_EFAULT; + } + } + return ret; +} + +#endif /* BSD_SOCKET_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 228daed4c4..737de36514 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -40,6 +40,7 @@ #include "bsd-proc.h" #include "bsd-misc.h" #include "bsd-signal.h" +#include "bsd-socket.h" =20 /* BSD dependent syscall shims */ #include "os-stat.h" @@ -73,6 +74,20 @@ safe_syscall4(int, ppoll, struct pollfd *, fds, nfds_t, = nfds, safe_syscall6(ssize_t, copy_file_range, int, infd, off_t *, inoffp, int, o= utfd, off_t *, outoffp, size_t, len, unsigned int, flags); =20 +/* used in bsd-socket */ +safe_syscall5(int, select, int, nfds, fd_set *, readfs, fd_set *, writefds, + fd_set *, exceptfds, struct timeval *, timeout); +safe_syscall6(int, pselect, int, nfds, fd_set *restrict, readfs, + fd_set *restrict, writefds, fd_set *restrict, exceptfds, + const struct timespec *restrict, timeout, const sigset_t *restrict, + newsigmask); +safe_syscall6(ssize_t, recvfrom, int, fd, void *, buf, size_t, len, int, f= lags, + struct sockaddr *restrict, from, socklen_t *restrict, fromlen); +safe_syscall6(ssize_t, sendto, int, fd, const void *, buf, size_t, len, in= t, + flags, const struct sockaddr *, to, socklen_t, tolen); +safe_syscall3(ssize_t, recvmsg, int, s, struct msghdr *, msg, int, flags); +safe_syscall3(ssize_t, sendmsg, int, s, const struct msghdr *, msg, int, f= lags); + /* used in os-proc */ safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options, struct rusage *, rusage); --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015806; cv=none; d=zohomail.com; s=zohoarc; b=WqvZgi4VkbejBwwt3YfjdBY0AdeP74ZusG1EG4JHHS9Dg9s18BAFqQOW9dLvE1SYRq+nonXUkLUvd0n0NplWaMp2UpTnFcHdQl7RNA6KZiv7EYd728gzdWg2Rih+83iEzluOYCa8Ti6JIk0pSxmml6rej6cc+uBnF3R0NcW4wtM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015806; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=MvzdOyiF2y1MIvT+QTKGvq56/uFT2/67tUiQCVPCd7w=; b=EuaDmnFIx0X+z8Hg20TvBBNZAey9k7bVdtnlcBJqK08FU2oQuII32KtJJGsz+FTc9WK85WqrG6FO5bS30jqdUqTbe3kY9W1ryPUtkmueEaBVkIxMuNkFwff4mcwUTOPNRI2MpIvax5nJk1vVmZmaPo2mvhxSy9LKdEghWVaSmVc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015806571357.69024716518015; Sat, 20 Jun 2026 21:23:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9h5-0002xz-2m; Sun, 21 Jun 2026 00:22:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h0-0002xG-FR for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:58 -0400 Received: from mail-oo1-xc34.google.com ([2607:f8b0:4864:20::c34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9gy-00059K-RN for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:21:58 -0400 Received: by mail-oo1-xc34.google.com with SMTP id 006d021491bc7-69e1f777bcaso2930156eaf.1 for ; Sat, 20 Jun 2026 21:21:56 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015716; x=1782620516; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MvzdOyiF2y1MIvT+QTKGvq56/uFT2/67tUiQCVPCd7w=; b=GU27Vu5+sZSQeTJsxOOkgYNTu2YbEpYVonVflskbIA0KpEOKLza6HgEa0RWPuQMqQ0 wgWOM09DxIpNUNqTIacszaJiiF19lSNATmT8nBSzUMNodPZrCVLoV5WtyhoCSQmdvP9/ bFl90LHrKc+qwLo0pIekE0K4RtwwaStLBLS0UpZca8M8hJncO+gYqKUKAS1dCherWzt+ Y12sYrbnn4R9zBYHEcjMxxyKRuo/eON51Yg/zjWJmJeXW0P2IGSiT+IHr3GOxBtGruXo oPlybzCc2te15dqjddohyfrxlfCYTBJ0nvwt+F5y/03i4mSYF72IKz6FJZ8BQLEg2yRl 1/yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015716; x=1782620516; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=MvzdOyiF2y1MIvT+QTKGvq56/uFT2/67tUiQCVPCd7w=; b=UCXahOTcsQEzYQffkSg0jgVd32m9clNp0/epJG66HJJ6nOnwZaBc/l6r8UyZI153SI hiQP9bSkXQ3dMEgHyp/NRY2sv2xmBEr3uU70xTyZzc9wCAES4pQD48sZYkrBzwxPP+rT QnX1iUTO6ufAAYrBIMS8hQHnL6AD5v9v2hlMTvimnzVGIejsK2yDKEVCfNJ3n3bqMtDT 2npE84JjW3s3JWngZnvnclUoKqNPVLmPoUmTMl0l46meBeaGk3spYlnQoUkefsnCTzzb ++ZEaO/v1RA+SvbzBWHACBLVDWXKULksT94sSNKXN1reNpdNLClEs591eaBEqTkD1TT/ dw8w== X-Gm-Message-State: AOJu0YwdBdhmHrxV043oPpaBOALSYOoHfnNrry0QP9KH1+1aTNHuHQKR L7/oZ5rcK5z0F8PefaLwGsm+cTgh2dTCQlku1Kp/GUmX15nHQ6QhcXOzB/11IvDs2Og= X-Gm-Gg: AfdE7clGbD+cauxSrhEScATCC2kuqwcUMO8hozvcrRR4PC2jXtgucZHwceMI30rEEXK YjlKyXX4RkWma3nyh0nE9jQdojHGScAaZHUfWUBVDzgkLKFz0tQCx1xzOSeczzeswZtuyVTY4qv MpkXUzIB74TXWWme5ciQggeJXN5xeAinlN1vARTJceh25tOEcnwMiihRY6VUAWQWYfsGeCMokIO 3Cs6+c6GZOr+abqpC1xKxpxsy1kd0BoFwJMHijlO2nvNlQ92JbC35u64fdo1G58sBZHi5BeWts9 HbBPEXLkhqsyttpdUvWIVX0X04NAAaB8JzyKYUMU3jvg9BP9vuFdAvVkX6kccexJliqWK/U7W9Y +7SiyG4tVVsXqbUxtSNpj7tyxPQ2OcD6hGNceY0pE4WrnFNyOKgGQXKbxXaJmFx5mwROGMwzUCS +htRlnBVaWjQ== X-Received: by 2002:a4a:e911:0:b0:696:1594:c5bd with SMTP id 006d021491bc7-6a0da05b4a5mr5794788eaf.12.1782015715753; Sat, 20 Jun 2026 21:21:55 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:19:59 -0600 Subject: [PATCH v3 12/40] bsd-user: Add socket shims socketpair through shutdown MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-12-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4353; i=imp@bsdimp.com; h=from:subject:message-id; bh=MqY1unKJzBNNJ0wbC3yInaYYVvafwqt+1PzNlApqdfs=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+fwbww5yOkgj3oNdaHNzEN8K7DHZrKPxAS eBQzaPDB1iJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR ACUqEADqzYHx2xjFDJqKmPi7yXKQX5UspmDJ1oieVEeemjkCZAtXeLKzGUbrbUlqWt7uG6Bzsr/ WhqjbT3SjsPYh3qV5HWGKbhNHC/rMTJoFMwcdYfqyLkftw+3kdcRT5V/Yct4Y3uozWXdyHZc3Xc GOkMjQEFyXQbGDV57Nk5+wpbrlxixfVte5P+0lMAu6o02/RDKq2rUyV9mOgIAyoEwnMkpXQBmlG 39N55mpNslc0wtUiJlF1GcZa+GMMX8QrEmRP5djDOXn8LLZfrIBsC04Oab+awtmKJRhkm6F0RQL Kfdz0cwhETJ6h+Wn5mdu/lyk4T5Y53qD/IEYAvi0YDA2a6vQsUqMw30MdHjdmlhPtiM+6yKWEMU AsW0LCTrHZYhuDCzZPCGhUw/tcnvLJToDYCrXcDSo6tDsIIkvqM8HXgAuPLmolcK+/yXjlXefwL +lJTgmp59ozJl0lT/GGCP6MtTsFEMix3CXp04yi1GX7EiKw5Q0j4vapdtWGDzdOIG5hHsATfgP0 bLjoC9UNxQxirZbjOZK35FedgvmiMTx56QivM9d3+OdNWkwicKDE6rH811th2fzQXg3xABp558F J+VEZ4OxjLzoULCCHagGTPDClK6YEADgUPyWodoqkVH/mzfIaWgyR0QLlJkFckk24HL16GgxnYv QZSZ/hCROVfFCKA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c34; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc34.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015808748154100 Complete bsd-socket.h with socketpair, sendto, recvfrom, socket, and shutdown system call shims. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/bsd-socket.h | 116 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 116 insertions(+) diff --git a/bsd-user/bsd-socket.h b/bsd-user/bsd-socket.h index c786d6717a..43aacce5dc 100644 --- a/bsd-user/bsd-socket.h +++ b/bsd-user/bsd-socket.h @@ -164,4 +164,120 @@ static inline abi_long do_bsd_getsockname(int fd, abi= _ulong target_addr, return ret; } =20 +/* socketpair(2) */ +static inline abi_long do_bsd_socketpair(int domain, int type, int protoco= l, + abi_ulong target_tab_addr) +{ + int tab[2]; + abi_long ret; + + if (!access_ok(VERIFY_WRITE, target_tab_addr, sizeof(tab[0]) * 2)) { + return -TARGET_EFAULT; + } + ret =3D get_errno(socketpair(domain, type, protocol, tab)); + if (!is_error(ret)) { + if (put_user_s32(tab[0], target_tab_addr) || + put_user_s32(tab[1], target_tab_addr + sizeof(tab[0]))) { + ret =3D -TARGET_EFAULT; + } + } + return ret; +} + +/* sendto(2) */ +static inline abi_long do_bsd_sendto(int fd, abi_ulong msg, size_t len, + int flags, abi_ulong target_addr, + socklen_t addrlen) +{ + struct sockaddr *saddr; + void *host_msg; + abi_long ret; + + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + if (len !=3D 0) { + host_msg =3D lock_user(VERIFY_READ, msg, len, 1); + if (!host_msg) { + return -TARGET_EFAULT; + } + } else { + host_msg =3D NULL; + } + if (target_addr) { + saddr =3D alloca(addrlen + 1); + ret =3D target_to_host_sockaddr(saddr, target_addr, addrlen); + if (is_error(ret)) { + unlock_user(host_msg, msg, 0); + return ret; + } + ret =3D get_errno(safe_sendto(fd, host_msg, len, flags, saddr, add= rlen)); + } else { + ret =3D get_errno(send(fd, host_msg, len, flags)); + } + unlock_user(host_msg, msg, 0); + return ret; +} + +/* recvfrom(2) */ +static inline abi_long do_bsd_recvfrom(int fd, abi_ulong msg, size_t len, + int flags, abi_ulong target_addr, + abi_ulong target_addrlen) +{ + socklen_t addrlen; + struct sockaddr *saddr; + void *host_msg; + abi_long ret; + + host_msg =3D lock_user(VERIFY_WRITE, msg, len, 0); + if (!host_msg) { + return -TARGET_EFAULT; + } + if (target_addr) { + if (get_user_u32(addrlen, target_addrlen)) { + ret =3D -TARGET_EFAULT; + goto fail; + } + if ((int)addrlen < 0) { + ret =3D -TARGET_EINVAL; + goto fail; + } + saddr =3D alloca(addrlen + 1); + ret =3D get_errno(safe_recvfrom(fd, host_msg, len, flags, saddr, + &addrlen)); + } else { + saddr =3D NULL; /* To keep compiler quiet. */ + ret =3D get_errno(recv(fd, host_msg, len, flags)); + } + if (!is_error(ret)) { + if (target_addr) { + if (is_error(host_to_target_sockaddr(target_addr, saddr, addrl= en))) { + ret =3D -TARGET_EFAULT; + goto fail; + } else if (put_user_u32(addrlen, target_addrlen)) { + ret =3D -TARGET_EFAULT; + goto fail; + } + } + unlock_user(host_msg, msg, ret); + } else { +fail: + unlock_user(host_msg, msg, 0); + } + return ret; +} + +/* socket(2) */ +static inline abi_long do_bsd_socket(abi_long domain, abi_long type, + abi_long protocol) +{ + return get_errno(socket(domain, type, protocol)); +} + +/* shutdown(2) */ +static inline abi_long do_bsd_shutdown(abi_long s, abi_long how) +{ + return get_errno(shutdown(s, how)); +} + #endif /* BSD_SOCKET_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015782; cv=none; d=zohomail.com; s=zohoarc; b=ijwCCfxegTo9MMtFDC/1wXT3ai8U2E6+9Bezl8eUtzXMErrC2EzyGK+FGu5GR5jrM7pRq2Wflh/5KtbLrTN5jM6a40FU8xwFeh6cZp2RPD/Jx8ahtK5F89/l0NyUspNy5ZfixC+J3zoWbzCJmBur7XIeFoRaIe9ifcO/8IJWlzY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015782; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NuDX3suEuhBni2TeqRPLYDKb+hwQ5H67fcr+5rGTXPQ=; b=lPxv9ZCRGJnZ9efyJV7INPT+90a0SE3qWyNOD6xEo2ivnpAnzdb7IpCpFBMrkafMgOVIaTTUjm8ftP59TipNs1X5ZEgdf1i3EEquVltaqU/59Ne4ptWjhWP68GSREFtNj3VJak6+r9FKAZjGjseOFBh1xDuTXsvC2nvcnZuHxA8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015782409600.2139393039794; Sat, 20 Jun 2026 21:23:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9h9-0002yv-5N; Sun, 21 Jun 2026 00:22:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h3-0002xv-EL for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:02 -0400 Received: from mail-oo1-xc35.google.com ([2607:f8b0:4864:20::c35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h0-00059q-O1 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:00 -0400 Received: by mail-oo1-xc35.google.com with SMTP id 006d021491bc7-6a0c604b9cfso2769527eaf.0 for ; Sat, 20 Jun 2026 21:21:58 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015717; x=1782620517; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=NuDX3suEuhBni2TeqRPLYDKb+hwQ5H67fcr+5rGTXPQ=; b=BKOraGLr25XRL/+8bf5gwxRYTkz7cK0bFDposYELHtLvtVLg6Q+bld4kzro05fMH93 dkA24tnQWvvFYs7k65HBRAQRLBEwUoR9uH09ip47z2ZbuBB1lGgcs8PQvEY5C+imy6CD 8azO2yyRogiNPtXEzyVERgjFGcMd4W3SsWua+IwsD9Gt0sXPcmIGGBThUGuexyd1qvAF 6cp9rla8rO2sh193KEBk9yO69xKI7Cy7esv3cL8imtLru2FCPUlScd27syVacrcBgYT4 cXGbUEVnKUQEroA0Qm4yBvWkCHsMD/7fr3YDDTztOWOSn6hQAaUFdtCM4aNuDkdfK5JY MmzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015717; x=1782620517; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=NuDX3suEuhBni2TeqRPLYDKb+hwQ5H67fcr+5rGTXPQ=; b=WVSdvcG9KZn7JpJRxBX5y+4nG/JeQVe/Tt0wV4H1oHgfqaY4GvFdnJyGvOxvt0jo1n px3UstS7AHWK/WZ5nyIdqQCnsJO8anjJJR9BprK/8zGQWL+I3ACh7HLhxFABDBn8To8u 4xQ5v2N6CaDnqiA3ZD8hGKcTj6tpfqbh3MkXoxSf3q8pynAgAT/UARbv65BTyJaq7kHv WcnuRFF0+X1GRBccb+pi6S7+ns1FYZuZCH7iTMicCbNR0Os7ttkMTmPkP5c701cp5/tT 0CbbWDaqhFdWUzFX76Cb24ew4u6KrwQyEPd+7sy1oF6zg5wNURP2iZLVorgkeuT1EJej c8Dw== X-Gm-Message-State: AOJu0YxgkbLRcnJMeON4QKy09FQvw5CHCRjEeZ0RkiFqKPl1QcGSr8am KlJUDAdorgN1nNAvWvH4ikzAyZ2/9t/BeaBMPeXGdYdSB4mmC6cVPp86T3owF1fysI4= X-Gm-Gg: AfdE7cnN/96AHtjFmb2hFLHXH19qiY6FVis5Zkj/xTanOMxDDaplHhJkHZGcuJ5hUIK vdYQhzzHyWzZuJa/M2jOxATL7vGkromXIVRWOA4dFvdEjlYv1gqR4X9ZGW8SZJcKl/f6NPRaLJ1 Iwc97TyGYKCdjXTxzgxQdScuIjS9tGLitG8tpXhcUo1JeptnhMnwUW75HMIILUVwTOUHwKPWaao dWY6raLmt3QBq9D9HUnkv5757mW3rkeVJfguUXOkvAuzZrGc968rSeWY+GRSVmieUXq59OqHv77 5rCCbhUPEY1RcfYO4yfhln4pHCluWFhCBjoqsW470GW06uo1tSnn/HAAq2Ffrl15Hb3gBvcMjZy dWfqpskz9xRj1DmPi7SnUZ3AwAW8EsWdkGF7bhNKFhd5FZln17831bq/Ku0YOgYkVw4zZZQAWok g= X-Received: by 2002:a05:6820:4b01:b0:69d:8700:c925 with SMTP id 006d021491bc7-6a0eb2bb79bmr4022497eaf.8.1782015717271; Sat, 20 Jun 2026 21:21:57 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:00 -0600 Subject: [PATCH v3 13/40] bsd-user: Add os-socket.h with sendrecvmsg and message structures MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-13-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5700; i=imp@bsdimp.com; h=from:subject:message-id; bh=O6uPorQhaJDF6iKXgsNK03Zv9M/bdNuQvvrVnzWPmM8=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+NmpHVRsAZ8xMja+6ux3oyFqmXtDNYuT/7 ilrQ98/VkuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR AH/8EACsPsIIfdygGsAqKucdoiUIzRl6T1CnLV1rzG+itK1cQBJU9sqUYJBwQOK4a8SqwfJPYyO xpVZiO416Z3tIF8Jom9gP9GrwdECCe6wwlS+QtFUZhEKHP6FFZy44jWIC9atfJ/9vDue+pCZFxR 1/TGi5oxjHbUcinBjO0Eg/06v42Aq8JWF/x2FbGDOzziQrT8BWX+j0QtwL8B4PR0bI5huthmi6C k/H6zS35jd9evo/ubZty9/rzHA8iOdu4vuiAHa42ndYY3TaTAeNbEmqYOtIR6ST530vts1eWA6O UetuZTUjIRCEpT5VTsAgjnbdHnNiGD4BBORrS6PXwwFghJQpZx+mLrD+cw4xQnR2IaAzrcnfejS Jlmzs6UNDK/nM9Mvqmc3LMVqgCW9w1jXXAcDGYLwy1QDmuPyfg/oUTJgBvYywBZfQ05gl+JMzdh 9qgtqVgFiYiUNi4EVyrbUBNY/mjX94wOqXTsgIutHo42Gl1tA3ulia8w1gQ5/uZBnA7yTft2Tx2 g+1R2Fg/uJwAxsb5YJMjG+oE+fBMPzy4vef+SZYrgndn6oq5Qo9ftZ4DdWD+RkHQxoss3R3OBvq dPfwZQCR3nV2buq/8rLFFapP9AfnqCTXbKzW1RhsHzeVoGruqVGTQfo1VJyf+j1PMChX1R9qGpq DRXnpeThunN0iJQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c35; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc35.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015784686154100 Add the first part of FreeBSD socket support: do_sendrecvmsg_locked and do_sendrecvmsg functions. Also add target_msghdr, target_cmsghdr, CMSG macros, target_ip_mreq, and target_ip_mreqn structures to syscall_defs.h. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-socket.h | 142 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-syscall.c | 1 + 2 files changed, 143 insertions(+) diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h new file mode 100644 index 0000000000..279157dd05 --- /dev/null +++ b/bsd-user/freebsd/os-socket.h @@ -0,0 +1,142 @@ +/* + * FreeBSD socket related system call shims + * + * Copyright (c) 2013-2014 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef BSD_USER_FREEBSD_OS_SOCKET_H +#define BSD_USER_FREEBSD_OS_SOCKET_H + +#include +#include +#include +#include + +#include "qemu-os.h" + +ssize_t safe_recvmsg(int s, struct msghdr *msg, int flags); +ssize_t safe_sendmsg(int s, const struct msghdr *msg, int flags); + +/* do_sendrecvmsg_locked() Must return target values and target errnos. */ +static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp, + int flags, int send) +{ + abi_long ret, len; + struct msghdr msg; + abi_ulong count; + struct iovec *vec; + abi_ulong target_vec; + + if (msgp->msg_name) { + msg.msg_namelen =3D tswap32(msgp->msg_namelen); + msg.msg_name =3D alloca(msg.msg_namelen + 1); + ret =3D target_to_host_sockaddr(msg.msg_name, + tswapal(msgp->msg_name), + msg.msg_namelen); + if (ret =3D=3D -TARGET_EFAULT) { + /* + * For connected sockets msg_name and msg_namelen must be igno= red, + * so returning EFAULT immediately is wrong. Instead, pass a = bad + * msg_name to the host kernel, and let it decide whether to r= eturn + * EFAULT or not. + */ + msg.msg_name =3D (void *)-1; + } else if (ret) { + goto out2; + } + } else { + msg.msg_name =3D NULL; + msg.msg_namelen =3D 0; + } + msg.msg_controllen =3D 2 * tswap32(msgp->msg_controllen); + if (msgp->msg_control) { + msg.msg_control =3D alloca(msg.msg_controllen); + memset(msg.msg_control, 0, msg.msg_controllen); + } else { + msg.msg_control =3D NULL; + } + + msg.msg_flags =3D tswap32(msgp->msg_flags); + + count =3D tswap32(msgp->msg_iovlen); + target_vec =3D tswapal(msgp->msg_iov); + + if (count > IOV_MAX) { + /* + * sendrcvmsg returns a different errno for this condition than + * readv/writev, so we must catch it here before lock_iovec() does. + */ + ret =3D -TARGET_EMSGSIZE; + goto out2; + } + + vec =3D lock_iovec(send ? VERIFY_READ : VERIFY_WRITE, + target_vec, count, send); + if (vec =3D=3D NULL) { + ret =3D -host_to_target_errno(errno); + goto out2; + } + msg.msg_iovlen =3D count; + msg.msg_iov =3D vec; + + if (send) { + if (msg.msg_control !=3D NULL) { + ret =3D t2h_freebsd_cmsg(&msg, msgp); + } else { + ret =3D 0; + } + if (ret =3D=3D 0) { + ret =3D get_errno(safe_sendmsg(fd, &msg, flags)); + } + } else { + ret =3D get_errno(safe_recvmsg(fd, &msg, flags)); + if (!is_error(ret)) { + len =3D ret; + if (msg.msg_control !=3D NULL) { + ret =3D h2t_freebsd_cmsg(msgp, &msg); + } else { + ret =3D 0; + } + if (!is_error(ret)) { + msgp->msg_namelen =3D tswap32(msg.msg_namelen); + msgp->msg_flags =3D tswap32(msg.msg_flags); + if (msg.msg_name !=3D NULL && msg.msg_name !=3D (void *)-1= ) { + ret =3D host_to_target_sockaddr(tswapal(msgp->msg_name= ), + msg.msg_name, msg.msg_namelen); + if (ret) { + goto out; + } + } + + ret =3D len; + } + } + } + +out: + unlock_iovec(vec, target_vec, count, !send); +out2: + return ret; +} + + +static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, + int flags, int send) +{ + abi_long ret; + struct target_msghdr *msgp; + + if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE, + msgp, + target_msg, + send ? 1 : 0)) { + return -TARGET_EFAULT; + } + ret =3D do_sendrecvmsg_locked(fd, msgp, flags, send); + unlock_user_struct(msgp, target_msg, send ? 0 : 1); + return ret; +} + + +#endif /* BSD_USER_FREEBSD_OS_SOCKET_H */ diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 737de36514..46fee46336 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -47,6 +47,7 @@ #include "os-proc.h" #include "os-signal.h" #include "os-file.h" +#include "os-socket.h" #include "os-misc.h" =20 /* I/O */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016023; cv=none; d=zohomail.com; s=zohoarc; b=CT3lw0muCs1FisbjEHsU6hJGxwBdyNIxILz64ogd2LohywP31Hy/wn82NkWxrix374zSKhYSYhRlySZOAI26lMtQWMsCyzeto6hTdFRj38kMRaXr5D1PpKrKWsmbxrsNJQcf1wvM7VxDujlZ+1fOVDkzUtZAbhvKyzkwSF1mJiQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016023; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=O2uW+td9IO/G7jmrt/6okiq1Qth2Hfkxcn/cPw1X3vU=; b=DmaMimKYVeIc31V2ERWVFR/6RtcCrVrLlyNwROZidKwzcmdMaI7/ZIDyVWsDVyHQwraPXeGUYx8HhMKNASgot6cEvT3rn6VmW04fK9cHj/0jwzNnkAuUYUI8O8l5SnCRcQVJA5R9mN63LDVBPuAdwevEfAOxwAa1L+tGwkhZoaw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016023443278.5279426752626; Sat, 20 Jun 2026 21:27:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hA-0002z7-5t; Sun, 21 Jun 2026 00:22:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h4-0002y2-8l for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:02 -0400 Received: from mail-oo1-xc36.google.com ([2607:f8b0:4864:20::c36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h1-0005AH-NM for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:02 -0400 Received: by mail-oo1-xc36.google.com with SMTP id 006d021491bc7-69e8aa31e9fso1620642eaf.2 for ; Sat, 20 Jun 2026 21:21:59 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015718; x=1782620518; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=O2uW+td9IO/G7jmrt/6okiq1Qth2Hfkxcn/cPw1X3vU=; b=XAGr+NWKBcv8VGsHsztpSmUDaCTNBPRfbcvnm+7tuFLsXLn9ICh6nIdZrKf9Sf7dyf k1nt8WA+0uLISlxXZv77AeT3Kv5uMfRdkhMY3qKTReRLBml8qE62LPcOFNHFhiVl5ePt bkgIPWW5b7brj+nPo/RoUPqiuw/3dK9OLld86TJiKqiycrql2fGo+qLUdfQ4qGWceTao Q942cbt7jsf2DtqredrI2M67pgOMFbptoEoVFjwLbel0tHh8FqZx5j2n+dpRTGhvRRuz UI15EfrryyAypHWlZPWr6YSlb5PcdiTcKxMc7244+U6W+RDqKcTK9gFezqTaDHY9YIgl tlfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015718; x=1782620518; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=O2uW+td9IO/G7jmrt/6okiq1Qth2Hfkxcn/cPw1X3vU=; b=SJm13zm4qDWDjqf3Mz4ddIEczFoR4cd2nOmQ26AiBzoiIyI2Qc3RUOyRYXwV7X4Q3z mASd15PXPim6jjCZXsAU+GCqUNzG1O/ykKAgpMK59TqshR2wT+HFVFfnFb+P/jxdNzEg RLdG6uYKqfuR6vW6rXmWltj/V30n4yWgP1ZvT9k46abbesIffPgK3AbyT007TWg8VjyX i61eERRflQDXsDyjfhLcMsPbBImKD+AbqqBQee3J1X5j3d/nywuppt5yZwk1c6m+sapd 5YmEReoLOFIIFtKERWEYWcwuloNxP568J6RT+ES7tilfCpq6tdw8O/x2Dynb7VQFR6pm 8FfQ== X-Gm-Message-State: AOJu0YzNxhA35Sv7/dPzNWG1T3lP1pJz0IysAl6Cv6l8QdijNLRLf3ko dYRrXCESuZ5YH4S0P8AV/kwApvXfCH54n1XpzOMf2qu4SSg/dPLfO4Axp/3QL6kemW0= X-Gm-Gg: AfdE7cm+nqHT8zP6+6oxp0yuAzDfM449L17js5aRg1yn/0WbB8ERCgn7Hi49tBcHVEm c26CI/EY5Q+3DjKnE0KUlEu9mpla4WbY7SJMlFW9IqTUW+IAf51TSamIIA+3Cmsv/QRf/j3Jiwe knPjLpRKulAUqd4AhZzAGTjFMHXm8fGJ/dI8NyGfvMCEGcWyTmL6jubSMPgRfDu+UO/oQMAPWGQ mRe4uRw8z7ubT2yZzXS1eklKCgcmWEqXry6j8vctV8O2MRdAc0z6NsPdLQHo0AdpEbCgrjaLxyW J+t5DnOlZVkL3gI8Wncu90CMH1qZ4dJlewefYgk/JHWMKDUPTTLVkLz+JcDvZ2d6W9R/Vdf7yMD MoI3voq/1q9DfWfUZnKdAk7wPO0z1T2dMGNLqXHmUJ9PgudS6Y31mrm21GQL+ObGqvmWuFPr10g g= X-Received: by 2002:a05:6820:2220:b0:6a0:a791:6885 with SMTP id 006d021491bc7-6a0ddf1fa0amr6469962eaf.23.1782015718407; Sat, 20 Jun 2026 21:21:58 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:01 -0600 Subject: [PATCH v3 14/40] bsd-user: Commit the generated os-sockopt.h files MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-14-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=20449; i=imp@bsdimp.com; h=from:subject:message-id; bh=daYv8NlB0VYVi3lTp8iCY/xmTz0OF/DUPiRwFyF0pyU=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+nHi9ZcaqOMjCnK4L352EuuoH+TGJTOZyH d9hNlPOVLGJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR AIjBD/9HeuqDud+01nzP3V6ElqCJrFyFpPNCcMrJ3KHq8UNGPNOBJx0CuP8i8Eu47aWOKQlhuJX ye9gu/yU8Kb2SrRespcnspGWFQSvM5/ENJMJrALbqx0MtSUSY/I6qGCVi4Qvn4w0g6eYfKxIDii Gpn6gDDv4QUeTtpn9Lno4vtwH7zpBkMl7o3bNomweafTejUyptcfTCX43YRUFEagQbh8ZcIxQ6h jJefnqwplkeq6r7wW52PBTgPigzOmu14QmZFiSHbGQEB+rnFOa7lcSGMDaSSlpzIDvrrA7M37zK OmeRmgB2l1tBepvhdXFfWM5OCUIuNcAfnf0pPsQg3QIM3cLtLh0s/ZiNg3EwUB2E7U/EubWtUuy AAVcKoe7xM5GB/3Mv7tWP5efxSh0CZQfm94Bj6pdUgvJSaqHbb1y+lwcneRH8bU5Vg9OLmbKnuS +kyh9Gy37oOKb+YizPwl2/D63vI9eB0cIYFFBQfWwWEDNKJww6bDnPIdxgrOLWPukXsZX0u3NoW hR0NGuUiy5brjvVF1iawvBkZizPsaeqlBeDO+cV7I30XWViLsTX5trbq/jF/yqu4Sml1w6BKgc6 YMR+hB4eHbqUmPq9Y9kUvFfk2N9AZ2PsmrvHzT8F7U8iSoc4U+4+vPsr++uNzDwAeJ/7UZwTHQt 10MSZkeQdbczG6Q== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c36; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc36.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001, UPPERCASE_75_100=0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016025704154100 Generate the table of all socket options in FreeBSD. This only works against the latest FreeBSD, so we have to commit this table for now. Once the supporting machinery is merged to the stable branches, we can move to generating it as a build artifact. This uses BSD-2-Clause because it's derived from BSD-2-Clause material. It's likely in the public domain, though, since it's a generated file. Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-sockopt.h | 316 ++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 316 insertions(+) diff --git a/bsd-user/freebsd/os-sockopt.h b/bsd-user/freebsd/os-sockopt.h new file mode 100644 index 0000000000..2f984cf8e3 --- /dev/null +++ b/bsd-user/freebsd/os-sockopt.h @@ -0,0 +1,316 @@ +/* Auto-generated by gen_sockopt.sh -- do not edit */ +/* SPDX-License-Identifier: BSD-2-Clause */ +#pragma once + +#define SOCK_LEVEL_NONE -1234 + +#include +#include +#include +#include +#include + +enum sockopt_type { + SOCKOPT_TYPE_NONE =3D 0, + SOCKOPT_TYPE___MSFILTERREQ, + SOCKOPT_TYPE_ACCEPT_FILTER_ARG, + SOCKOPT_TYPE_BOOL, + SOCKOPT_TYPE_DUMP, + SOCKOPT_TYPE_ICMP6_FILTER, + SOCKOPT_TYPE_IN6_PKTINFO, + SOCKOPT_TYPE_INT, + SOCKOPT_TYPE_IP_MREQ_SOURCE, + SOCKOPT_TYPE_IP_MREQ, + SOCKOPT_TYPE_IP_OPTS, + SOCKOPT_TYPE_IP6_DEST, + SOCKOPT_TYPE_IP6_HBH, + SOCKOPT_TYPE_IP6_RTHDR, + SOCKOPT_TYPE_IPV6_MREQ, + SOCKOPT_TYPE_LINGER, + SOCKOPT_TYPE_SADB_X_POLICY, + SOCKOPT_TYPE_SOCKADDR, + SOCKOPT_TYPE_SPLICE, + SOCKOPT_TYPE_TCP_FASTOPEN, + SOCKOPT_TYPE_TCP_FUNCTION_SET, + SOCKOPT_TYPE_TCP_INFO, + SOCKOPT_TYPE_TCP_PERF_INFO, + SOCKOPT_TYPE_TIMEVAL, + SOCKOPT_TYPE_U_CHAR, + SOCKOPT_TYPE_U_INT, + SOCKOPT_TYPE_UINT32_T, + SOCKOPT_TYPE_UINT64_T, +}; + +struct sockopt_entry { + int level; + int optname; + enum sockopt_type type[5]; +}; +static struct sockopt_entry sol_socket[] =3D { + { SOL_SOCKET , SO_DEBUG , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_ACCEPTCONN , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_REUSEADDR , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_KEEPALIVE , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_DONTROUTE , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_BROADCAST , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_USELOOPBACK , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_LINGER , { SOCKOPT_TYPE_LINGER, } }, + { SOL_SOCKET , SO_OOBINLINE , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_REUSEPORT , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_TIMESTAMP , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_NOSIGPIPE , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_ACCEPTFILTER , { SOCKOPT_TYPE_ACCEPT_FILTER= _ARG, } }, + { SOL_SOCKET , SO_BINTIME , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_NO_OFFLOAD , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_NO_DDP , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_REUSEPORT_LB , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_RERROR , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_SNDBUF , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_RCVBUF , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_SNDLOWAT , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_RCVLOWAT , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_SNDTIMEO , { SOCKOPT_TYPE_TIMEVAL, } }, + { SOL_SOCKET , SO_RCVTIMEO , { SOCKOPT_TYPE_TIMEVAL, } }, + { SOL_SOCKET , SO_ERROR , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_TYPE , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_LISTENQLIMIT , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_LISTENQLEN , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_LISTENINCQLEN , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_FIB , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_USER_COOKIE , { SOCKOPT_TYPE_UINT32_T, } }, + { SOL_SOCKET , SO_PROTOCOL , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_TS_CLOCK , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_MAX_PACING_RATE , { SOCKOPT_TYPE_UINT32_T, } }, + { SOL_SOCKET , SO_DOMAIN , { SOCKOPT_TYPE_INT, } }, + { SOL_SOCKET , SO_SPLICE , { SOCKOPT_TYPE_SPLICE, } }, + { SOL_SOCKET , NET_RT_DUMP , { SOCKOPT_TYPE_DUMP, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_entry ipproto_ip[] =3D { + { IPPROTO_IP , IP_HDRINCL , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_TOS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_TTL , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RECVOPTS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_RECVRETOPTS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_RECVDSTADDR , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_RETOPTS , { SOCKOPT_TYPE_IP_OPTS, } }, + { IPPROTO_IP , IP_MULTICAST_TTL , { SOCKOPT_TYPE_U_INT, SOCKOP= T_TYPE_U_CHAR, } }, + { IPPROTO_IP , IP_MULTICAST_LOOP , { SOCKOPT_TYPE_U_INT, SOCKOP= T_TYPE_U_CHAR, } }, + { IPPROTO_IP , IP_ADD_MEMBERSHIP , { SOCKOPT_TYPE_IP_MREQ, } }, + { IPPROTO_IP , IP_DROP_MEMBERSHIP , { SOCKOPT_TYPE_IP_MREQ, } }, + { IPPROTO_IP , IP_MULTICAST_VIF , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RSVP_ON , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RSVP_OFF , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RSVP_VIF_ON , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RSVP_VIF_OFF , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_PORTRANGE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RECVIF , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_IPSEC_POLICY , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_ONESBCAST , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_BINDANY , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_ORIGDSTADDR , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_RECVTTL , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_MINTTL , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_DONTFRAG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RECVTOS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_ADD_SOURCE_MEMBERSHIP, { SOCKOPT_TYPE_IP_MREQ_S= OURCE, } }, + { IPPROTO_IP , IP_DROP_SOURCE_MEMBERSHIP, { SOCKOPT_TYPE_IP_MREQ_= SOURCE, } }, + { IPPROTO_IP , IP_BLOCK_SOURCE , { SOCKOPT_TYPE_IP_MREQ_SOURC= E, } }, + { IPPROTO_IP , IP_UNBLOCK_SOURCE , { SOCKOPT_TYPE_IP_MREQ_SOURC= E, } }, + { IPPROTO_IP , IP_MSFILTER , { SOCKOPT_TYPE___MSFILTERREQ= , } }, + { IPPROTO_IP , IP_VLAN_PCP , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_FLOWID , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_FLOWTYPE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RSSBUCKETID , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IP , IP_RECVFLOWID , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IP , IP_RECVRSSBUCKETID , { SOCKOPT_TYPE_BOOL, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_entry ipproto_ipv6[] =3D { + { IPPROTO_IPV6, IPV6_UNICAST_HOPS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_MULTICAST_IF , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_IPV6, IPV6_MULTICAST_HOPS , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_IPV6, IPV6_MULTICAST_LOOP , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_IPV6, IPV6_JOIN_GROUP , { SOCKOPT_TYPE_IPV6_MREQ, } = }, + { IPPROTO_IPV6, IPV6_LEAVE_GROUP , { SOCKOPT_TYPE_IPV6_MREQ, } = }, + { IPPROTO_IPV6, IPV6_PORTRANGE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, ICMP6_FILTER , { SOCKOPT_TYPE_ICMP6_FILTER,= } }, + { IPPROTO_IPV6, IPV6_CHECKSUM , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_V6ONLY , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_IPSEC_POLICY , { SOCKOPT_TYPE_SADB_X_POLICY= , } }, + { IPPROTO_IPV6, IPV6_RTHDRDSTOPTS , { SOCKOPT_TYPE_IP6_DEST, } }, + { IPPROTO_IPV6, IPV6_RECVPKTINFO , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVHOPLIMIT , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVRTHDR , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVHOPOPTS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVDSTOPTS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_USE_MIN_MTU , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVPATHMTU , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_PKTINFO , { SOCKOPT_TYPE_IN6_PKTINFO, = } }, + { IPPROTO_IPV6, IPV6_HOPLIMIT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_NEXTHOP , { SOCKOPT_TYPE_SOCKADDR, } }, + { IPPROTO_IPV6, IPV6_HOPOPTS , { SOCKOPT_TYPE_IP6_HBH, } }, + { IPPROTO_IPV6, IPV6_DSTOPTS , { SOCKOPT_TYPE_IP6_DEST, } }, + { IPPROTO_IPV6, IPV6_RTHDR , { SOCKOPT_TYPE_IP6_RTHDR, } = }, + { IPPROTO_IPV6, IPV6_RECVTCLASS , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_AUTOFLOWLABEL , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_TCLASS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_DONTFRAG , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_BINDANY , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_FLOWID , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_FLOWTYPE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_RSSBUCKETID , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_IPV6, IPV6_RECVFLOWID , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_RECVRSSBUCKETID, { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_ORIGDSTADDR , { SOCKOPT_TYPE_BOOL, } }, + { IPPROTO_IPV6, IPV6_VLAN_PCP , { SOCKOPT_TYPE_INT, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_entry ipproto_tcp[] =3D { + { IPPROTO_TCP , TCP_NODELAY , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_MAXSEG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_NOPUSH , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_NOOPT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_MD5SIG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_INFO , { SOCKOPT_TYPE_TCP_INFO, } }, + { IPPROTO_TCP , TCP_LOG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_TXTLS_MODE , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_RXTLS_MODE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_IWND_NB , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_IWND_NSEG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_LOGID_CNT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_USER_LOG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_MAXUNACKTIME , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_IDLE_REDUCE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_REMOTE_UDP_ENCAPS_PORT, { SOCKOPT_TYPE_INT, } = }, + { IPPROTO_TCP , TCP_DELACK , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_FIN_IS_RST , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_LOG_LIMIT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_SHARED_CWND_ALLOWED, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_PROC_ACCOUNTING , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_USE_CMP_ACKS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_PERF_INFO , { SOCKOPT_TYPE_TCP_PERF_INFO= , } }, + { IPPROTO_TCP , TCP_KEEPINIT , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_KEEPIDLE , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_KEEPINTVL , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_KEEPCNT , { SOCKOPT_TYPE_U_INT, } }, + { IPPROTO_TCP , TCP_FASTOPEN , { SOCKOPT_TYPE_TCP_FASTOPEN,= } }, + { IPPROTO_TCP , TCP_FUNCTION_BLK , { SOCKOPT_TYPE_TCP_FUNCTION_= SET, } }, + { IPPROTO_TCP , TCP_FUNCTION_ALIAS , { SOCKOPT_TYPE_TCP_FUNCTION_= SET, } }, + { IPPROTO_TCP , TCP_REUSPORT_LB_NUMA, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_MBUF_QUEUE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_TLP_REDUCE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_MAX_SEG, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_ALWAYS, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PRR_SENDALOT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_MIN_TO , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_EARLY_SEG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_REORD_THRESH, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_REORD_FADE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_TLP_THRESH , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PKT_DELAY , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_IWINTSO , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_STARTUP_PG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_DRAIN_PG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PROBE_RTT_INT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_STARTUP_LOSS_EXIT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_TSLIMITS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_OH , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_USEDEL_RATE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_MIN_RTO , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_MAX_RTO , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_ALGORITHM , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_PER_SEC, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_DEL_TAR, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_SEG_MAX, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_SEG_MIN, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PACE_CROSS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_TLP_USE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_TMR_PACE_OH , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_DO_DETECTION, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_RACK_RTT_USE, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_RETRAN_WTSO , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_DATA_AFTER_CLOSE, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PROBE_RTT_GAIN, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_PROBE_RTT_LEN, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_SEND_IWND_IN_TSO, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_USE_RACK_RR , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_HDWR_PACE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_UTTER_MAX_TSO, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_EXTRA_STATE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_FLOOR_MIN_TSO, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_MIN_TOPACEOUT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_TSTMP_RAISES, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_POLICER_DETECT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_BBR_RACK_INIT_RATE, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_RR_CONF , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_GP_INCREASE_CA, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_GP_INCREASE_SS, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_GP_INCREASE_REC, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_FORCE_MSEG , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_RATE_CA, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_RATE_SS, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_RATE_REC, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_NO_PRR , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_NONRXT_CFG_RATE, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_SHARED_CWND_ENABLE, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_TIMELY_DYN_ADJ , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_NO_PUSH_AT_MAX, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_TO_FILL, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_SHARED_CWND_TIME_LIMIT, { SOCKOPT_TYPE_INT, } = }, + { IPPROTO_TCP , TCP_RACK_PROFILE , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_HDWR_RATE_CAP , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_PACING_RATE_CAP , { SOCKOPT_TYPE_UINT64_T, } }, + { IPPROTO_TCP , TCP_HDWR_UP_ONLY , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_ABC_VAL , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_REC_ABC_VAL , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_MEASURE_CNT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_DEFER_OPTIONS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACING_BETA, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACING_BETA_ECN, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_TIMER_SLOP , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_DSACK_OPT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_ENABLE_HYSTART, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_SET_RXT_OPTIONS, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_HI_BETA , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_SPLIT_LIMIT, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACING_DIVISOR, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_PACE_MIN_SEG, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_RACK_DGP_IN_REC , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_PACING_DND , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_SS_EEXIT , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_DGP_UPPER_BOUNDS, { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_NO_TIMELY , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_HONOR_HPTS_MIN , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_REC_IS_DYN , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_SIDECHAN_DIS , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_FILLCW_RATE_CAP , { SOCKOPT_TYPE_INT, } }, + { IPPROTO_TCP , TCP_GP_USE_LTBW , { SOCKOPT_TYPE_INT, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_entry ipproto_udp[] =3D { + { IPPROTO_UDP , UDP_ENCAP , { SOCKOPT_TYPE_INT, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_entry sol_local[] =3D { + { SOL_LOCAL , LOCAL_CREDS , { SOCKOPT_TYPE_INT, } }, + { SOL_LOCAL , LOCAL_CREDS_PERSISTENT, { SOCKOPT_TYPE_INT, } }, + { SOCK_LEVEL_NONE } +}; + +static struct sockopt_cache { + int level; + struct sockopt_entry *entry; +} so_cache[] =3D { + { SOL_SOCKET, sol_socket }, + { IPPROTO_IP, ipproto_ip }, + { IPPROTO_IPV6, ipproto_ipv6 }, + { IPPROTO_TCP, ipproto_tcp }, + { IPPROTO_UDP, ipproto_udp }, + { SOL_LOCAL, sol_local }, +}; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015793; cv=none; d=zohomail.com; s=zohoarc; b=V8IGOCqMwYsvIKClBlnb0L6TC5fQ/kSHxmAtcqwCeeP+PtLlsWq7VqqFo/0qqXFCcVX8Va1r1OLcLQbwtFmLyJofZywT1WVcDb20mq6CpwDjgLnv9d1D0AQ2K0i1/nDXB0RqEuAwJHbeaQuwWxeF/Mt0TS42+ke95N7FTfma2PY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015793; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=g9pMkQjbvCRyzCC8NY9CFRAVGzzfTcdxA6DGnN9j47c=; b=NlAEO45YcaFyEmmiY/nGDw6oD1Xj9gJ5jnkbUJtRz0uHluIqrdAe5x7TPONyod8X//FHB96fo1438Ce196lSYxj0wzvaCYvHcYkqKMjNV/Uuoa8bdg0RMmq6bjHuDN8E1Lxa5o6lIapjp0qlxr7epluXTcLTXRcnSAhuIhRDbC4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015793600989.628525856532; Sat, 20 Jun 2026 21:23:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9h9-0002z5-Mc; Sun, 21 Jun 2026 00:22:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h5-0002yS-BA for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:05 -0400 Received: from mail-oo1-xc35.google.com ([2607:f8b0:4864:20::c35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h3-0005Ad-Dx for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:03 -0400 Received: by mail-oo1-xc35.google.com with SMTP id 006d021491bc7-69d7aa0ac14so2520869eaf.3 for ; Sat, 20 Jun 2026 21:22:01 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.21.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:21:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015720; x=1782620520; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=g9pMkQjbvCRyzCC8NY9CFRAVGzzfTcdxA6DGnN9j47c=; b=Ab2k9jGWylnusIE9lvd8XXFuEJ+OxxLze9LAteEm73fEUbPmc5f8uKx4r91fHYah9c Oaxm8tW9SSLPQ7oP5OJOx+keB2Q5Z7uOTRx4jATOk6yUDfPPM7+bv78v4C90lhUz8k/0 Idu5lEIUsENJ533ew+GGEmESI4qGlZTe+zWNkMi966fI8O4pEefW+WG7Dadq5xsHkurA jKWPJTOZAx+5IKQShEYDP8eGEdBf+kJKWA4lI5xU8IkJFPc4s2k3XacRM3eMbVzSTz62 lXaINe0UE/ABU8FNUD2RF2ddp886VhFqnO8B3kXAPw9CoFaSLwHv7HTsM0Wg7uX4V93R Yi4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015720; x=1782620520; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=g9pMkQjbvCRyzCC8NY9CFRAVGzzfTcdxA6DGnN9j47c=; b=pyYHZWPoGa9CYfhLxn2x8hyAE6dZfNuqzdVahC3fQXRkYg/vI45hDhvlSF8ZWj8ayi M5Jp9cAkFwjfb2q9QqLcZ/OOojv+aBvnBJcvWqJDZhrUrTzJKeqnnpwZEaiuHMhts4OP v2IWsqJaoOtJZEYSKWPz6Uq2cHstVelcoitxvfo75vYoOwLgCgvG5fcQ0CEIus6ARl3E lsrgs7kZTyY0FacrjrYti0/VO+GBRm8F2Q2aFFAxXpy/AEI2JMISi5fdD0pJ3djQESrx GKiZ/4MKPwtlwwUn5NkVARxJhwPpvrJ2bmYwNxMd+HmJK1+1lc3sUHuFFcLOaTA8EPhm 8kXg== X-Gm-Message-State: AOJu0YzWCI7/r3LOB28rZOmC+ggv+iqqUtezqjAJy+gQGgzHAuMhToUA ACUe7kuhxZPX00lsCUjBJXDCK+SLZeuETHc+2DfP0Gk3S2BjDm+e0NxNsY4wmkR/K5k= X-Gm-Gg: AfdE7cmHcRXFDA4uJs6x7VCXkoRi/gVdZo2JQhCADxUvCStPDrubSsoUvz53ZkuyjnY D/CJrTGTYD5ocvDsUDzLaMritKWq2MN8w9s2qYMvQIBzAjnLfHyOZohCLJUoLmV71jlT/NVLwJT rz6AHTbE0mD8o7784rFWfcaX586LrrYAenr8Heyw9yhB6dAr5mEqTbj+t74DpkVf7q6zkvZ4X6W 55CbkpQhaXbgQJ7l6mdjbpLt0s1bOApo+KbxBbd7O43zbi+3GtKnj7VRu0rS8+EYWDT96x9QUs/ s0uuiAgjRZTQHVhsinu0/yvQcFE2gg5orJh8Q1BJOgOt+36lXZQAcFfypZWQB1KTUyfP+698jIz 7/DO2PLH3Mn+984PJp/QWLy+R/EAJi8ZoEGgSz0JdmnghjZrIoy4XKG4o3ZMaZKqKQPALCMjK6J E= X-Received: by 2002:a4a:ec4b:0:b0:68a:daca:94d8 with SMTP id 006d021491bc7-6a0eb300044mr4479980eaf.12.1782015720303; Sat, 20 Jun 2026 21:22:00 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:02 -0600 Subject: [PATCH v3 15/40] bsd-user: Implement both getsockopt and setsockopt MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-15-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7385; i=imp@bsdimp.com; h=from:subject:message-id; bh=zL2J55rvu1tUCnrynrgzeb4o1brjwtYqdonYadiQvSQ=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+Y3sIVnbfqrYQcvT2MFI2gEic38R1UJc9Y TeOQ+Si+q+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR ACFoEAC2UU2fpXKw0bm5XDvDc3WEHnM3ojkahp6QM25g53UWMTPlEDVtLHpODgaOV1hV+g4Ba4R AArY81rn8J4yM3BCX4uxGOhd8PIe5dv7FB7jLXVtmuCsnkJWi/OUnKKm5H6vWeh1eLRl43bZo0O hkE7gxPrH77uJQqWU6ewPOlISQyUUlfw5N6S1cpcHsQFUs1BoN8ewPKsb0StJk5mSWLlaL7n0xm bAKbJBXGOIQmBYlu5yZCQAGuJ776rfRtCqMzSctKqP8o6e1zyzyLs2gx5ghpXpYdwNvdWpeqSJt NegXkSidymC+igrykBAFFHu5ifnyEv/vUHhrI99UYDD8e/SeLUVT47K15sDmarmsjxlOmlTbcMl x3YeAvgl/l+ao2U1ATg0g5VbKvI5RdlVWNSY1gd9RKMfk0RE3Yug8atwhme8eNCRL1Ktwla5bme fPoOi+273VEeXAy8Ld4HhdtXIf7RREMW19oS8Tn5zlMAzGOobuPI/NO5BSp1sskGeV9mSXy/4SD sv6QMh7BdyNdhCHyl1x/2X0xd4S17Cjnm2Dm6jU5TmAAicgYyY0dwr6IG6ySDJ8THr7hSwrMzen BVPfAOvQ+cgQ0OwSKAtM8uZ2t83AaEQcxaykHe8CnxrSxPsV2bfJ92QQhlUafM/VvU+omy2pJWF q2hDEKCj824s5Rg== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c35; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc35.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015794455154100 Implement get/setsockopt with the generated file describing the socket options. This uses a table driven conversion. At the moment, we only implement the simple types. For 64 on 64 with the same endian, we also try to just copy in/out since the representation should be the same. Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-socket.h | 199 +++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 199 insertions(+) diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h index 279157dd05..30d62ebaf1 100644 --- a/bsd-user/freebsd/os-socket.h +++ b/bsd-user/freebsd/os-socket.h @@ -14,6 +14,7 @@ #include =20 #include "qemu-os.h" +#include "os-sockopt.h" =20 ssize_t safe_recvmsg(int s, struct msghdr *msg, int flags); ssize_t safe_sendmsg(int s, const struct msghdr *msg, int flags); @@ -138,5 +139,203 @@ static abi_long do_sendrecvmsg(int fd, abi_ulong targ= et_msg, return ret; } =20 +static inline struct sockopt_entry *get_sockopt_entry(int level) +{ + for (int i =3D 0; i < ARRAY_SIZE(so_cache); i++) { + if (so_cache[i].level =3D=3D level) { + return so_cache[i].entry; + } + } + return NULL; +} + +/* setsockopt(2) */ +static inline abi_long do_bsd_setsockopt(int sockfd, int level, int optnam= e, + abi_ulong optval_addr, socklen_t optlen) +{ + abi_long ret; + int val; + u_char ch; + uint64_t val64; + struct sockopt_entry *e =3D get_sockopt_entry(level); + void *p; + + if (e =3D=3D NULL) { + gemu_log("Unsupported setsockopt level=3D%d optname=3D%d\n", + level, optname); + return -TARGET_ENOPROTOOPT; + } + + while (e->level !=3D SOCK_LEVEL_NONE && e->optname !=3D optname) { + e++; + } + + if (e->level =3D=3D SOCK_LEVEL_NONE) { + gemu_log("Unsupported setsockopt level=3D%d optname=3D%d\n", + level, optname); + return -TARGET_ENOPROTOOPT; + } + + for (int i =3D 0; i < ARRAY_SIZE(e->type) && e->type[i] !=3D 0; i++) { + switch (e->type[i]) { + case SOCKOPT_TYPE_BOOL: + case SOCKOPT_TYPE_INT: + case SOCKOPT_TYPE_U_INT: + case SOCKOPT_TYPE_UINT32_T: + if (optlen !=3D sizeof(int)) { + continue; + } + if (get_user_u32(val, optval_addr)) { + return -TARGET_EFAULT; + } + return get_errno(setsockopt(sockfd, level, optname, &val, size= of(val))); + case SOCKOPT_TYPE_U_CHAR: + if (optlen !=3D sizeof(u_char)) { + continue; + } + if (get_user_u8(ch, optval_addr)) { + return -TARGET_EFAULT; + } + return get_errno(setsockopt(sockfd, level, optname, &ch, sizeo= f(ch))); + case SOCKOPT_TYPE_UINT64_T: + if (optlen !=3D sizeof(uint64_t)) { + continue; + } + if (get_user_u64(val64, optval_addr)) { + return -TARGET_EFAULT; + } + return get_errno(setsockopt(sockfd, level, optname, &val64, si= zeof(val64))); + default: +#if HOST_LONG_BITS !=3D TARGET_ABI_BITS || HOST_BIG_ENDIAN !=3D TARGET_BIG= _ENDIAN + gemu_log("Unsupported setsockopt level=3D%d optname=3D%d since= host and target differ\n", + level, optname); + return -TARGET_ENOPROTOOPT; +#endif + break; + } + } + + /* + * When bit size and endian are the same, the structures are the same = (we hope). + */ + p =3D lock_user(VERIFY_READ, optval_addr, optlen, 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(setsockopt(sockfd, level, optname, p, optlen)); + unlock_user(p, optval_addr, 0); + return ret; +} + +/* getsockopt(2) */ +static inline abi_long do_bsd_getsockopt(int sockfd, int level, int optnam= e, + abi_ulong optval_addr, abi_ulong optlen) +{ + abi_long ret; + int val; + u_char ch; + socklen_t len; + uint64_t val64; + struct sockopt_entry *e =3D get_sockopt_entry(level); + void *p; + + =20 + if (e =3D=3D NULL) { + gemu_log("Unsupported getsockopt level=3D%d optname=3D%d\n", + level, optname); + return -TARGET_ENOPROTOOPT; + } + + while (e->level !=3D SOCK_LEVEL_NONE && e->optname !=3D optname) { + e++; + } + + if (e->level =3D=3D SOCK_LEVEL_NONE) { + gemu_log("Unsupported getsockopt level=3D%d optname=3D%d\n", + level, optname); + return -TARGET_ENOPROTOOPT; + } + + if (get_user_u32(len, optlen)) { + return -TARGET_EFAULT; + } + + for (int i =3D 0; i < ARRAY_SIZE(e->type) && e->type[i] !=3D 0; i++) { + switch (e->type[i]) { + case SOCKOPT_TYPE_BOOL: + case SOCKOPT_TYPE_INT: + case SOCKOPT_TYPE_U_INT: + case SOCKOPT_TYPE_UINT32_T: + if (len !=3D sizeof(int)) { + continue; + } + ret =3D get_errno(getsockopt(sockfd, level, optname, &val, &le= n)); + if (ret < 0) { + return ret; + } + if (len =3D=3D sizeof(int)) { + if (put_user_u32(val, optval_addr)) { + return -TARGET_EFAULT; + } + goto done; + } + continue; + case SOCKOPT_TYPE_U_CHAR: + if (len !=3D sizeof(u_char)) { + continue; + } + ret =3D get_errno(getsockopt(sockfd, level, optname, &ch, &len= )); + if (ret < 0) { + return ret; + } + if (len =3D=3D sizeof(u_char)) { + if (put_user_u8(ch, optval_addr)) { + return -TARGET_EFAULT; + } + goto done; + } + continue; + case SOCKOPT_TYPE_UINT64_T: + if (len !=3D sizeof(uint64_t)) { + continue; + } + ret =3D get_errno(getsockopt(sockfd, level, optname, &val64, &= len)); + if (ret < 0) { + return ret; + } + if (len =3D=3D sizeof(uint64_t)) { + if (put_user_u64(val64, optval_addr)) { + return -TARGET_EFAULT; + } + goto done; + } + continue; + default: +#if HOST_LONG_BITS !=3D TARGET_ABI_BITS || HOST_BIG_ENDIAN !=3D TARGET_BIG= _ENDIAN + gemu_log("Unsupported getsockopt level=3D%d optname=3D%d since= host and target differ\n", + level, optname); + return -TARGET_ENOPROTOOPT; +#endif + break; + } + } + + /* + * When bit size and endian are the same, the structures are the same,= and + * if not that is handled above. + */ + p =3D lock_user(VERIFY_WRITE, optval_addr, len, 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(getsockopt(sockfd, level, optname, p, &len)); + unlock_user(p, optval_addr, ret < 0 ? 0 : len); +done: + if (put_user_u32(len, optlen)) { + return -TARGET_EFAULT; + } + return ret; +} + =20 #endif /* BSD_USER_FREEBSD_OS_SOCKET_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015987; cv=none; d=zohomail.com; s=zohoarc; b=aGLXnQshRqq8/6vlTppDatqjEOKq3T6CRFuMhqTL9djkrS2rxnxqq7tdzDKoiiR+Hhhw49rG7NOJduIENf//BHKub2DzwrwMjiGdcNaicR/Q5fBHn5V0Psfi28R/qf2ewA3FWkIAhJIllIV1plAjZBLgGZPxfIQ4yl/Z8GxWWO0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015987; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=5AEqQNr8VLxyEg30sVvmd/ilyg9Zn0MVds35QNF1zw4=; b=dA9VcxdOW66fegrgpIQ7VhEQuPQjeV4bpx2qB3McyNhXW05nratO5paH3hv9ojUIBMkDbwHUVxmOpgdtiMpslCsaPNxi9k7TeozRLPwbmvmThHffF4zKuyWWAFDYhxJlsnRzBCbisnUjxK5pL7mr9ctbcuAu7+MkYMhINutt8zo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015987153301.2625928939334; Sat, 20 Jun 2026 21:26:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hE-0002zO-Jy; Sun, 21 Jun 2026 00:22:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h7-0002yV-6y for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:05 -0400 Received: from mail-oo1-xc29.google.com ([2607:f8b0:4864:20::c29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h5-0005CA-9n for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:04 -0400 Received: by mail-oo1-xc29.google.com with SMTP id 006d021491bc7-69de16f5f79so1792932eaf.0 for ; Sat, 20 Jun 2026 21:22:02 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015722; x=1782620522; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5AEqQNr8VLxyEg30sVvmd/ilyg9Zn0MVds35QNF1zw4=; b=UUc3tRZ0NQpoHCX7/IwCmw/+dGGjm+y1/83f92/Sn6VBcwcZa21hU7LXUOHz7D0jd+ qna9BHaFL8ud0HJcPiXvzNz2sqonkJYIc+7ts9YO2Wm8ZdsatVXOQX2pHW9lbDtOfBCB 0gyMsJWw0SRVBS8yBuyr0URBZoyjLzT6tHLlCOedEPEOjB1MOkS04ZVFozVTSQMtm6B7 NmgcNNVJWpxfcWgpqdhrOm/4sxMc6UhO10ZLxjkXUUdy7S+jCwRjOMAFSRlsTEbR8RFC kAXX+okXY1IUM94L1pKRV5T1Oq6UYhHtL7oyqdmX+xVljWzCoFfZ640B8CltgGSHnl0L q9EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015722; x=1782620522; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=5AEqQNr8VLxyEg30sVvmd/ilyg9Zn0MVds35QNF1zw4=; b=l2RrTBIlwpGgfirtpStp9N9O84ww2GLCJcGssdfNmgsmSukVcchaWhgQIDQOfss0Y+ BSRtQtHmGeVAeu2NQhqCrZdmVfHlhl8ilZUip8nwOevEyYIu3f6E12wgG0LpjRLyPS0Y OFBeQiHt4eVaLoLNyg16BzSNLSSUGdjc9QzKFLmfr6GMjyFRr3Wb/0Rvj1WPa0ARYAj2 qTPIUEqGZtgV9MHv8Zc7tQmZOFi8JnBwzQ/LdFu49v4ap4Up6U+H9MUV8U+b8tYmE8tP lqVAnVDCedQ0dv6o28trn0FCRaMXJCERqtYSeUwcJS7ojwSunNdYxPV54FzC8An4s3ql 9cYg== X-Gm-Message-State: AOJu0YxFogDiUKIzFgVFTcJJ7IwmGMGr0tdUJx3LAfza0E4/azjT83Hy 761yG12ZFMTYc94FbOkIJfdLUG+7tsyNP4YQ9O4LcucjW2sxx2vzp3sa7DkUjNFscq0= X-Gm-Gg: AfdE7cnlKnY8Mns/nNHbrvOrGiTP2q7io7EntNVPTEx5JhmUG+g+eko3KrnaAnoEmOX Bx4iJE0PyQ5f8agTNAAuJOsHQ922U97lkJ11I5QoKUZXlCxt8gfvgpmGcdOGy4Up5cdCOJaPJBj krM14E2TgA7wiXruRkvMbiDt5qf5ruV0ri4mWfIfoFl+8NSVxUSP+ttqxnlManZ86VGtoHXGtnN 3+0IJdPm+Ljb7coYXaW9Ust3nzgpV4mDmQbcSbW8IAntRZ2D1qvcVzRqbehL4WKIPFTxVMCni5m NvcQ+7aMt5AAmWmeJcjLTmg2+v/gcBYLCD5UySJq6DtZNuZfTowJ/TUUEmUHHJZqxPAj4qXLDNZ ysHVsStXsbVeG2YLzmPWkYGKTOfVcJAem1ZiprIUTO6cDBnuengbBM9vWrWLVb5Be6zoQnE/v6h M= X-Received: by 2002:a05:6820:4dfa:b0:6a0:b186:2bd3 with SMTP id 006d021491bc7-6a0ddedf035mr6636387eaf.12.1782015722046; Sat, 20 Jun 2026 21:22:02 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:03 -0600 Subject: [PATCH v3 16/40] bsd-user: Add FreeBSD socket helpers and sockaddr conversion MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-16-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7369; i=imp@bsdimp.com; h=from:subject:message-id; bh=lFg4vCIs68uCUNNZmKVN2eYOr/5K1QflLLCgwRfYb3I=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+6E6h6nlMVdUw48XnjlhG7Fk5arnfsLjh3 Zrg9YKhaI6JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR ALo3EADKAYCUSt/tXgmMWEZfOHmPO6y1AT9/zFCm4T+o002CLUyyW6pwzupd7NlikH5W50ggjt2 V8celQ9LYpbBC6rwdqTYcqQ622JV5VQk5yuWw6lZn5ZmtlpUg0vdmnC/Nr1RBGpE6yUkMNmj1yk mptzhJBkOAAunrDzhtqRBGiQUSzvQjrCh6yBY6dIl8SD5sT6QIVJKAmy2PNHvXykVvPCEh9Y3Hq FPTpLYVJrbazU1o73nDBcLrunyCKDa2dgw3tR6d0ndWUhakdog2u37bWmtWrfWWIhTq8vR8Qu+d aW5XfSIKX0XzpFGxInE721WhkhuPgLnsCHcQ/iw6wH4Kq3BBvDZV/GSjLl6t1XgwtDw8uweWNRg gUF2x+jExq33Lit9BtDrZKavjK8fUaMjaKwXsx7q34wbJyTFSY2/EiSy+pWtx+dmmMWPck11uEz xHsrcey+WpYuUMm3VkVMhMPBXNJ9pifpN+Roey/OYsr5safdq4Y++EwEhSyH4FQNv/NCq/pA+80 3h8rTqChc/+9I/VuaLY5Wb6Dz9p5mHHss3ZrRUiDhawb9G79sErik5XKvKDG2w8LPkvH7jfWpQS a1axJzcy6kFF9skkeO4q3hZTJf98Jge/wN5goAgP7YumnebFo1FLVMWU/st8ZySvemqRdyyIDeT 2/1j9NvprVVkNvg== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c29; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc29.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015989365154100 Complete os-socket.h with setfib, bindat, connectat, and accept4. Add bsd-socket.c with target_to_host_sockaddr, host_to_target_sockaddr, and target_to_host_ip_mreq helper functions, and add it to the build. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/bsd-socket.c | 98 ++++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-socket.h | 83 +++++++++++++++++++++++++++++++++++++ bsd-user/meson.build | 1 + bsd-user/qemu-bsd.h | 8 ++++ 4 files changed, 190 insertions(+) diff --git a/bsd-user/bsd-socket.c b/bsd-user/bsd-socket.c new file mode 100644 index 0000000000..cc45400e4c --- /dev/null +++ b/bsd-user/bsd-socket.c @@ -0,0 +1,98 @@ +/* + * BSD socket system call related helpers + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" + +#include +#include +#include +#include + +#include "qemu.h" +#include "qemu-bsd.h" + +/* + * socket conversion + */ +abi_long target_to_host_sockaddr(struct sockaddr *addr, abi_ulong target_a= ddr, + socklen_t len) +{ + const socklen_t unix_maxlen =3D sizeof(struct sockaddr_un); + sa_family_t sa_family; + struct target_sockaddr *target_saddr; + + target_saddr =3D lock_user(VERIFY_READ, target_addr, len, 1); + if (target_saddr =3D=3D 0) { + return -TARGET_EFAULT; + } + + sa_family =3D target_saddr->sa_family; + + /* + * Oops. The caller might send a incomplete sun_path; sun_path + * must be terminated by \0 (see the manual page), but unfortunately + * it is quite common to specify sockaddr_un length as + * "strlen(x->sun_path)" while it should be "strlen(...) + 1". We will + * fix that here if needed. + */ + if (target_saddr->sa_family =3D=3D AF_UNIX) { + if (len < unix_maxlen && len > 0) { + char *cp =3D (char *)target_saddr; + + if (cp[len - 1] && !cp[len]) { + len++; + } + } + if (len > unix_maxlen) { + len =3D unix_maxlen; + } + } + + memcpy(addr, target_saddr, len); + addr->sa_family =3D sa_family; /* type uint8_t */ + addr->sa_len =3D target_saddr->sa_len; /* type uint8_t */ + unlock_user(target_saddr, target_addr, 0); + + return 0; +} + +abi_long host_to_target_sockaddr(abi_ulong target_addr, struct sockaddr *a= ddr, + socklen_t len) +{ + struct target_sockaddr *target_saddr; + + target_saddr =3D lock_user(VERIFY_WRITE, target_addr, len, 0); + if (target_saddr =3D=3D 0) { + return -TARGET_EFAULT; + } + memcpy(target_saddr, addr, len); + target_saddr->sa_family =3D addr->sa_family; /* type uint8_t */ + target_saddr->sa_len =3D addr->sa_len; /* type uint8_t */ + unlock_user(target_saddr, target_addr, len); + + return 0; +} + +abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, abi_ulong target_a= ddr, + socklen_t len) +{ + struct target_ip_mreqn *target_smreqn; + + target_smreqn =3D lock_user(VERIFY_READ, target_addr, len, 1); + if (target_smreqn =3D=3D 0) { + return -TARGET_EFAULT; + } + mreqn->imr_multiaddr.s_addr =3D target_smreqn->imr_multiaddr.s_addr; + mreqn->imr_address.s_addr =3D target_smreqn->imr_address.s_addr; + if (len =3D=3D sizeof(struct target_ip_mreqn)) { + mreqn->imr_ifindex =3D tswap32(target_smreqn->imr_ifindex); + } + unlock_user(target_smreqn, target_addr, 0); + + return 0; +} + diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h index 30d62ebaf1..0b41e87b68 100644 --- a/bsd-user/freebsd/os-socket.h +++ b/bsd-user/freebsd/os-socket.h @@ -337,5 +337,88 @@ done: return ret; } =20 +/* setfib(2) */ +static inline abi_long do_freebsd_setfib(abi_long fib) +{ + + return get_errno(setfib(fib)); +} + +/* bindat(2) */ +static inline abi_long do_freebsd_bindat(int fd, int sockfd, + abi_ulong target_addr, socklen_t addrlen) +{ + abi_long ret; + void *addr; + + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + + addr =3D alloca(addrlen + 1); + ret =3D target_to_host_sockaddr(addr, target_addr, addrlen); + if (is_error(ret)) { + return ret; + } + + return get_errno(bindat(fd, sockfd, addr, addrlen)); +} + +/* connectat(2) */ +static inline abi_long do_freebsd_connectat(int fd, int sockfd, + abi_ulong target_addr, socklen_t addrlen) +{ + abi_long ret; + void *addr; + + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + addr =3D alloca(addrlen + 1); + + ret =3D target_to_host_sockaddr(addr, target_addr, addrlen); + + if (is_error(ret)) { + return ret; + } + + return get_errno(connectat(fd, sockfd, addr, addrlen)); +} + +/* accept4(2) */ +static inline abi_long do_freebsd_accept4(int fd, abi_ulong target_addr, + abi_ulong target_addrlen_addr, int flags) +{ + socklen_t addrlen; + void *addr; + abi_long ret; + + if (target_addr =3D=3D 0) { + return get_errno(accept(fd, NULL, NULL)); + } + /* return EINVAL if addrlen pointer is invalid */ + if (get_user_u32(addrlen, target_addrlen_addr)) { + return -TARGET_EINVAL; + } + if ((int)addrlen < 0) { + return -TARGET_EINVAL; + } + if (!access_ok(VERIFY_WRITE, target_addr, addrlen)) { + return -TARGET_EINVAL; + } + addr =3D alloca(addrlen); + + ret =3D get_errno(accept4(fd, addr, &addrlen, flags)); + if (!is_error(ret)) { + if (is_error(host_to_target_sockaddr(target_addr, addr, addrlen)))= { + close(ret); + ret =3D -TARGET_EFAULT; + } else if (put_user_u32(addrlen, target_addrlen_addr)) { + close(ret); + ret =3D -TARGET_EFAULT; + } + } + return ret; +} =20 #endif /* BSD_USER_FREEBSD_OS_SOCKET_H */ diff --git a/bsd-user/meson.build b/bsd-user/meson.build index 2abcae5122..ab6ddf2e9f 100644 --- a/bsd-user/meson.build +++ b/bsd-user/meson.build @@ -11,6 +11,7 @@ bsd_user_ss.add(files( 'bsd-mem.c', 'bsd-misc.c', 'bsd-proc.c', + 'bsd-socket.c', 'bsdload.c', 'elfload.c', 'main.c', diff --git a/bsd-user/qemu-bsd.h b/bsd-user/qemu-bsd.h index cdd27b44b4..253e32500e 100644 --- a/bsd-user/qemu-bsd.h +++ b/bsd-user/qemu-bsd.h @@ -32,6 +32,14 @@ int host_to_target_waitstatus(int status); void h2g_rusage(const struct rusage *rusage, struct target_freebsd_rusage *target_rusage); =20 +/* bsd-socket.c */ +abi_long target_to_host_sockaddr(struct sockaddr *addr, abi_ulong target_a= ddr, + socklen_t len); +abi_long host_to_target_sockaddr(abi_ulong target_addr, struct sockaddr *a= ddr, + socklen_t len); +abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, abi_ulong target_a= ddr, + socklen_t len); + /* bsd-misc.c */ abi_long host_to_target_uuid(abi_ulong target_addr, struct uuid *host_uuid= ); =20 --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015782; cv=none; d=zohomail.com; s=zohoarc; b=WMe6u8oiirOMwFKOC6AV6VP2BNOXlXZfvnK4WUSevu4M5LgokMH/iEEyLaCavvaV5dwN2kFHr38s+ZHDjEy4x1OicuGTehovs5QsHfyq0gnE5rG0XrtOj7A2W/A5mE64Olztr0Vqbcp1KkwCIiMb958EYkoSbqrIbCxn+alwi5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015782; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=PDA57y7T/u82EOrhccnp/KOrt4ISbcqtkgZL3o0RYiM=; b=A4qTBxaI5bgkBd6Oa0JTRDRkgx2oF6tbAMTTnoghpb/GPZproP+fsZvMCfgX7n7MNOiwssgsfrEWLPjYouvf5dHN2D0XvZeFNdwNPOKT5A95n+B992EzlTyzdavnR4SbuU5epqUVIrETq3dFS6ht2cUT7+mNON9VyCMO16RcJT8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015782668288.53135753069546; Sat, 20 Jun 2026 21:23:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hC-0002zF-2c; Sun, 21 Jun 2026 00:22:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9h9-0002yw-9S for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:07 -0400 Received: from mail-oo1-xc32.google.com ([2607:f8b0:4864:20::c32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h6-0005DM-Sz for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:06 -0400 Received: by mail-oo1-xc32.google.com with SMTP id 006d021491bc7-6a0e55e82d0so1037012eaf.1 for ; Sat, 20 Jun 2026 21:22:04 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015724; x=1782620524; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=PDA57y7T/u82EOrhccnp/KOrt4ISbcqtkgZL3o0RYiM=; b=MEP8ilpSglREeag4/imMCrUcXxsCc9Lu70i2Gk6KKF9DPOrw7eLVP3g7r/Zixnwbsr qLCQcFgKyDxknZE7eVVrDBhS58QUNY7ubsutFQBVMspefKiCsGR7Hm8Bv/k3VVDCCAs4 J1LSpTeiZfQf+wFRHGM1C41wI1w/kPj1gHE4dfPSgPaY7k3uf5PV/sV7v+Zc4XyI00Dn W8qT4b7IEvgOXqp1NrJjj5AK+IdguXyRgMrHt5RjUHGoFSH8SinWik4qF1uWPbh58DBv fX0rV3JECgSaUdT5A6FQ33a+Enn5mBChGDXJxPbfkcGJzNi+DPnzd5k8tMH3RtT9l/mZ VzhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015724; x=1782620524; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=PDA57y7T/u82EOrhccnp/KOrt4ISbcqtkgZL3o0RYiM=; b=R9JmWadXi95821eOh0LHGbc/pNt1X30VcqqDiiQlAQU1SbnaobrE9nw1ICV2hW/3S9 4XcGV2aqrBtNwgHavfJhIBoiPpNvMO0GH1dmq+G5Wg/ySt0ajjCJlWBaPBxaP7qhDGS3 w7J5dZAmC0Dhaaf1magABEOG0QLjG9G6sIbbLczU5/UEw7Pc/vUT2+57E9CHwrT5t89A omjKngO5kncnRY5QQ5rwNzWo6ClYLKklpoBO1KUCnfFGt3NKlUwCudbO2QvEU7HBlV6D 74f11bAWVT8JAv00Zw3GZ3j36URhLzjsYtvw/qoayzlU4OMhxwzKHtI7N2XTgXUrlqpL SWWw== X-Gm-Message-State: AOJu0YwxhV72GaI+5iBUKJ+mnLz9PEWWFYq6/EnL1w3L/VCGoQq1BJLo iqs+3hkHVOCGR4vmYOP2qex4GkyQmqYwdIRZ6DyLgd89WUx4mcBLaWqsoTG02yD/I0g= X-Gm-Gg: AfdE7clufVJ7GaOgwmoUEixp7CtnL3vmqmBRgp/XbNw51voihIFpE1BfhhInbkPNJOI HCGhC6A3dk7hxhfAaLhbGfFimsrBuTTNJc+WG1ESawWHk2OW5QITM/tgr3OTffYzkwbbiWdnSoZ C5PBCp1d46iqbkz2d/vlGToUkqYEoUhorp5Rxv35ELRVvhcXKXkfEdGgi12C0jDV7qkHsbzs4eo 3Z0qoLocwMh4XM0lw8dslUEjrluPNEYAuOzqUpH1KYbOf2we8uvGxldf+L1ZDlY6CLwu+KkMOPK tAUC3kgt+vC3vHWCRuxiKmAPcxq12diFqUxOBObnbofPUSIy2sw180I6JpWMxJBbfjVjuUSyYrV De3iqnrqz5RkRiW5n714cgPrAITiquoCI1CMJZll91FcxwRCShqxnOx2f+KAZBjTbenboiuXTjb w= X-Received: by 2002:a4a:e909:0:b0:69d:7a88:9cde with SMTP id 006d021491bc7-6a0d8cd334amr7753533eaf.26.1782015723649; Sat, 20 Jun 2026 21:22:03 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:04 -0600 Subject: [PATCH v3 17/40] bsd-user: Add os-socket.c with cmsg conversion functions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-17-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans , Michal Meloun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=11621; i=imp@bsdimp.com; h=from:subject:message-id; bh=rvWzWDb5MGyZlxapoym65Xxltnm6yr7kYGOaJpB4ubs=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+xqSJars/upLdB1zC1C4fCz5uiaE/naX8a lTbuDOM0P+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR AHgCEACCG7saicQ2ZLtqFBfqMS2wdj5kiEQ8L9klRdNnkaTz4azvBTfVTlyGKeAy0ppG0DXtd5g /DIDHBI88uGDpqKAiadczQIRhCktxa3D+odd2/GAQPLpW+la6H3i5A4w8VUHevDhArjeZU5wodE 125trfIL//9/g7vnpS96gY+CtWbKuRtpr3LkvzvOBWsaJlcKTYAnpAnEld8AWjS5AJVDKqjzsyZ mSZ9WlnlgMebjuVd3YsWAGMQPhtmOesQHtQztCGSe1r2qp3tJGJ7UYsWG1GhKhUtLfZqKGY1L3W E+IwrWPec3kNbl8WB8529Ph8QaAobY9iqAR3B4ajfQpywHg8XDKaNSqdqp7/UhHWu9cXTgLechF pCa2z3+WyEldIyby0tknW0P4nzga/x40kJKd+4zKZjF+Cp1hZrppjWB972Vo9zymsY1Pxb2YjYI hrxMmJMD22DdsiXJkTUWRZC4ShCZ6jWCV+FNoswxxnRY/fj0QmnbSQx1ZTImYQVC1NTgNWYb549 zT6HTwrbLUXOnGz1mQhfv2I1BvCHam1meujJZYkyjyYJx4JeUePalQ9BGsbITYT7MLbm0Mlw7jj 1uRb8D6MZymUmwMi1wkhaeEk9EQVegUlKlTkUSleNjkINLbZV/YyIGK+/oa8MyjaS9kybCpgmX5 IKdZWJUScH4nlDw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c32; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc32.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015784725154100 Add target-to-host and host-to-target control message conversion functions (t2h_freebsd_cmsg and h2t_freebsd_cmsg) for sendmsg/recvmsg support, and add os-socket.c to the FreeBSD build. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Signed-off-by: Michal Meloun Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/meson.build | 3 +- bsd-user/freebsd/os-socket.c | 239 +++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-socket.h | 13 ++- 3 files changed, 250 insertions(+), 5 deletions(-) diff --git a/bsd-user/freebsd/meson.build b/bsd-user/freebsd/meson.build index 38f2debf7e..83593a1e20 100644 --- a/bsd-user/freebsd/meson.build +++ b/bsd-user/freebsd/meson.build @@ -4,8 +4,9 @@ bsd_syscall_nr =3D custom_target('bsd-syscall-h', command: [sh, meson.current_source_dir() / 'scripts/syscallhdr.sh', '@= INPUT@', '@OUTPUT@', 'FREEBSD']) =20 bsd_user_ss.add(files( - 'os-stat.c', 'os-proc.c', + 'os-socket.c', + 'os-stat.c', 'os-sys.c', 'os-syscall.c'), bsd_syscall_nr diff --git a/bsd-user/freebsd/os-socket.c b/bsd-user/freebsd/os-socket.c new file mode 100644 index 0000000000..9c723d7608 --- /dev/null +++ b/bsd-user/freebsd/os-socket.c @@ -0,0 +1,239 @@ +/* + * FreeBSD socket related system call helpers + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" + +#include +#include +#include + +#include "qemu.h" +#include "qemu-os.h" + +abi_long t2h_freebsd_cmsg(struct msghdr *msgh, + struct target_msghdr *target_msgh); +abi_long h2t_freebsd_cmsg(struct target_msghdr *target_msgh, + struct msghdr *msgh); + +abi_long t2h_freebsd_cmsg(struct msghdr *msgh, + struct target_msghdr *target_msgh) +{ + struct cmsghdr *cmsg =3D CMSG_FIRSTHDR(msgh); + socklen_t msg_controllen; + abi_ulong target_cmsg_addr; + struct target_cmsghdr *target_cmsg, *target_cmsg_start; + socklen_t space =3D 0; + + msg_controllen =3D tswap32(target_msgh->msg_controllen); + if (msg_controllen < sizeof(struct target_cmsghdr)) { + goto the_end; + } + target_cmsg_addr =3D tswapal(target_msgh->msg_control); + target_cmsg =3D lock_user(VERIFY_READ, target_cmsg_addr, msg_controlle= n, 1); + target_cmsg_start =3D target_cmsg; + if (!target_cmsg) { + return -TARGET_EFAULT; + } + + while (cmsg && target_cmsg) { + void *data =3D CMSG_DATA(cmsg); + void *target_data =3D TARGET_CMSG_DATA(target_cmsg); + int len =3D (unsigned char *)(target_cmsg) + + tswap32(target_cmsg->cmsg_len) - (unsigned char *)target_data; + + space +=3D CMSG_SPACE(len); + if (space > msgh->msg_controllen) { + space -=3D CMSG_SPACE(len); + /* + * This is a QEMU bug, since we allocated the payload area our= selves + * (unlike overflow in host-to-target conversion, which is jus= t the + * guest giving us a buffer that's too small). It can't happen= for + * the payload types we currently support; if it becomes an is= sue in + * future we would need to improve our allocation strategy to + * something more intelligent than "twice the size of the targ= et + * buffer we're reading from". + */ + gemu_log("Host cmsg overflow\n"); + break; + } + + if (tswap32(target_cmsg->cmsg_level) =3D=3D TARGET_SOL_SOCKET) { + cmsg->cmsg_level =3D SOL_SOCKET; + } else { + cmsg->cmsg_level =3D tswap32(target_cmsg->cmsg_level); + } + cmsg->cmsg_type =3D tswap32(target_cmsg->cmsg_type); + cmsg->cmsg_len =3D CMSG_LEN(len); + + if (cmsg->cmsg_level =3D=3D SOL_SOCKET && cmsg->cmsg_type =3D=3D S= CM_RIGHTS) { + int *fd =3D (int *)data; + int *target_fd =3D (int *)target_data; + int i, numfds =3D len / sizeof(int); + + for (i =3D 0; i < numfds; i++) { + __get_user(fd[i], target_fd + i); + } + } else if ((cmsg->cmsg_level =3D=3D SOL_SOCKET) && + (cmsg->cmsg_type =3D=3D SCM_TIMESTAMP) && + (len =3D=3D sizeof(struct target_freebsd_timeval))) { + /* copy struct timeval to host */ + struct timeval *tv =3D (struct timeval *)data; + struct target_freebsd_timeval *target_tv =3D + (struct target_freebsd_timeval *)target_data; + __get_user(tv->tv_sec, &target_tv->tv_sec); + __get_user(tv->tv_usec, &target_tv->tv_usec); + } else { + gemu_log("Unsupported target ancillary data: %d/%d\n", + cmsg->cmsg_level, cmsg->cmsg_type); + memcpy(data, target_data, len); + } + + cmsg =3D CMSG_NXTHDR(msgh, cmsg); + target_cmsg =3D TARGET_CMSG_NXTHDR(target_msgh, target_cmsg, + target_cmsg_start); + } + unlock_user(target_cmsg_start, target_cmsg_addr, 0); +the_end: + msgh->msg_controllen =3D space; + return 0; +} + +abi_long h2t_freebsd_cmsg(struct target_msghdr *target_msgh, + struct msghdr *msgh) +{ + struct cmsghdr *cmsg =3D CMSG_FIRSTHDR(msgh); + socklen_t msg_controllen; + abi_ulong target_cmsg_addr; + struct target_cmsghdr *target_cmsg, *target_cmsg_start; + socklen_t space =3D 0; + + msg_controllen =3D tswap32(target_msgh->msg_controllen); + if (msg_controllen < sizeof(struct target_cmsghdr)) { + goto the_end; + } + target_cmsg_addr =3D tswapal(target_msgh->msg_control); + target_cmsg =3D lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controll= en, 0); + target_cmsg_start =3D target_cmsg; + if (!target_cmsg) { + return -TARGET_EFAULT; + } + + while (cmsg && target_cmsg) { + void *data =3D CMSG_DATA(cmsg); + void *target_data =3D TARGET_CMSG_DATA(target_cmsg); + int len =3D (unsigned char *)(cmsg) + cmsg->cmsg_len - + (unsigned char *)data; + + int tgt_len, tgt_space; + + /* + * We never copy a half-header but may copy half-data; this is Lin= ux's + * behaviour in put_cmsg(). Note that truncation here is a guest p= roblem + * (which we report to the guest via the CTRUNC bit), unlike trunc= ation + * in target_to_host_cmsg, which is a QEMU bug. + */ + if (msg_controllen < sizeof(struct target_cmsghdr)) { + target_msgh->msg_flags |=3D tswap32(MSG_CTRUNC); + break; + } + + if (cmsg->cmsg_level =3D=3D SOL_SOCKET) { + target_cmsg->cmsg_level =3D tswap32(TARGET_SOL_SOCKET); + } else { + target_cmsg->cmsg_level =3D tswap32(cmsg->cmsg_level); + } + target_cmsg->cmsg_type =3D tswap32(cmsg->cmsg_type); + + /* + * Payload types which need a different size of payload on the tar= get + * must adjust tgt_len here. + */ + tgt_len =3D len; + switch (cmsg->cmsg_level) { + case SOL_SOCKET: + switch (cmsg->cmsg_type) { + case SCM_TIMESTAMP: + tgt_len =3D sizeof(struct target_freebsd_timeval); + break; + default: + break; + } + break; + default: + break; + } + + if (msg_controllen < TARGET_CMSG_LEN(tgt_len)) { + target_msgh->msg_flags |=3D tswap32(MSG_CTRUNC); + tgt_len =3D msg_controllen - sizeof(struct target_cmsghdr); + } + + /* + * We must now copy-and-convert len bytes of payload into tgt_len = bytes + * of destination space. Bear in mind that in both source and + * destination we may be dealing with a truncated value! + */ + switch (cmsg->cmsg_level) { + case SOL_SOCKET: + switch (cmsg->cmsg_type) { + case SCM_RIGHTS: + { + int *fd =3D (int *)data; + int *target_fd =3D (int *)target_data; + int i, numfds =3D tgt_len / sizeof(int); + + for (i =3D 0; i < numfds; i++) { + __put_user(fd[i], target_fd + i); + } + break; + } + case SCM_TIMESTAMP: + { + struct timeval *tv =3D (struct timeval *)data; + struct target_freebsd_timeval *target_tv =3D + (struct target_freebsd_timeval *)target_data; + + if (len !=3D sizeof(struct timeval) || + tgt_len !=3D sizeof(struct target_freebsd_timeval)) { + goto unimplemented; + } + + /* copy struct timeval to target */ + __put_user(tv->tv_sec, &target_tv->tv_sec); + __put_user(tv->tv_usec, &target_tv->tv_usec); + break; + } + default: + goto unimplemented; + } + break; + default: + unimplemented: + gemu_log("Unsupported host ancillary data: %d/%d\n", + cmsg->cmsg_level, cmsg->cmsg_type); + memcpy(target_data, data, MIN(len, tgt_len)); + if (tgt_len > len) { + memset(target_data + len, 0, tgt_len - len); + } + } + + target_cmsg->cmsg_len =3D tswap32(TARGET_CMSG_LEN(tgt_len)); + tgt_space =3D TARGET_CMSG_SPACE(tgt_len); + if (msg_controllen < tgt_space) { + tgt_space =3D msg_controllen; + } + msg_controllen -=3D tgt_space; + space +=3D tgt_space; + cmsg =3D CMSG_NXTHDR(msgh, cmsg); + target_cmsg =3D TARGET_CMSG_NXTHDR(target_msgh, target_cmsg, + target_cmsg_start); + } + unlock_user(target_cmsg_start, target_cmsg_addr, space); +the_end: + target_msgh->msg_controllen =3D tswap32(space); + return 0; +} diff --git a/bsd-user/freebsd/os-socket.h b/bsd-user/freebsd/os-socket.h index 0b41e87b68..a85263e9b5 100644 --- a/bsd-user/freebsd/os-socket.h +++ b/bsd-user/freebsd/os-socket.h @@ -19,9 +19,14 @@ ssize_t safe_recvmsg(int s, struct msghdr *msg, int flags); ssize_t safe_sendmsg(int s, const struct msghdr *msg, int flags); =20 +abi_long t2h_freebsd_cmsg(struct msghdr *msgh, + struct target_msghdr *target_msgh); +abi_long h2t_freebsd_cmsg(struct target_msghdr *target_msgh, + struct msghdr *msgh); + /* do_sendrecvmsg_locked() Must return target values and target errnos. */ -static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp, - int flags, int send) +static inline abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr = *msgp, + int flags, int send) { abi_long ret, len; struct msghdr msg; @@ -122,8 +127,8 @@ out2: } =20 =20 -static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, - int flags, int send) +static inline abi_long do_sendrecvmsg(int fd, abi_ulong target_msg, + int flags, int send) { abi_long ret; struct target_msghdr *msgp; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015830; cv=none; d=zohomail.com; s=zohoarc; b=m06ltMktFQXpZ0zI6SLFtzYAywpxMzpnjlhkB105HSr8GLLLtstOUzZAU+ivgf+kDRE3cTZRa74i3MpUXQRSMK+shMg6Q0HyQA5wsgjXyyluWiXI6HguTELqnLkwtYg5fyVRwyEDMutUbJ6FTBP2OSwUO6Atw2zfdVNpM+er5xs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015830; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=IZqvz8h4UtlNJLGSNtv/wFdOOIsa8XLH9YYwsbluMaw=; b=IAfCFRqD4ql2iEghMqEzGuXGcTvV04/Zn1pSNEr3Cq8AlvIQ2U+WJX9sihny/Zo1tXx+JR6eXDRBldFRjmilQEx1b1x9MJTswgaEqbangCRDesLcTkxYJ+LJFTujadREtQ7k1y5NlA+FygIud3KuiDLGXAgq11qw0J2JOmp/ygg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015830808290.95218844149156; Sat, 20 Jun 2026 21:23:50 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hF-000307-9T; Sun, 21 Jun 2026 00:22:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hA-0002z8-LH for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:08 -0400 Received: from mail-oa1-x29.google.com ([2001:4860:4864:20::29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9h8-0005Dh-Lx for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:08 -0400 Received: by mail-oa1-x29.google.com with SMTP id 586e51a60fabf-4474073fa81so558514fac.3 for ; Sat, 20 Jun 2026 21:22:06 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015725; x=1782620525; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=IZqvz8h4UtlNJLGSNtv/wFdOOIsa8XLH9YYwsbluMaw=; b=saNQY43syGty2lSh9AF+IFT1BiAxMKe0sAxozstK3AA1n+UY0OfDUpf3miT+dSzfBL qTEQa0cNsqPEaYfG1L4x3WbJaXRQEif0aKAPpOK9WiZCBPNeFLek3+2cbalyfhrnLRat sqgRZAAvFfj/B+qRHJfdUzDlqHDuXeVqnBqZ42iKb0gUofa65oBeu7hZX86xuLFKibbx ja/nlGxt8nMxyPFc8TVYX3TYbTgU75pGTQEL3xObOHlARkE3aiDgPA84b6EPStd17A5T zyqDDNzZMGfwBExkSs24TtNQAaL0+/gJG/NMz45ljy/NLxGp6sBRWJVS4XkmHSQbMcTA xXOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015725; x=1782620525; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=IZqvz8h4UtlNJLGSNtv/wFdOOIsa8XLH9YYwsbluMaw=; b=NKl+dFSHPZNNd+EHVZJTMnrbyCTQoUALaDzX5VcsJRSqi6/+bHmYAs4Z4Y+2zojTGa U/NcmQcIsLvVxjybKgoxjI2sMZrnQCDyMFIOFY/oui2nJucogEXbiXa6kwnOMXU3JlW/ MBmOXFW79cH0q0FtFFC+W13UxAyRf/nNODsRKzJB8SVj3NW+UVh0WmanlTuuu2NqY2ra iC1gaHC0uO6Cbpw+tjva2Zd1owx9D+17yqDyRJiat3oAb5rtnG5cHEBZuWxvYqCRM70q IaxOp9cMt1SvAYvE3Y1zhboqmwUscWPssTJbwBOscgCMIgXsKbvkFoXnrSiskqxTx5OM Z5wg== X-Gm-Message-State: AOJu0YxPiJm+yujeF3Yh0ja1kY/Z5nLSuXTS3gNK1uLg8v/D8yTJDZhv AwqmZLTQQKoRNIL1xcY07EUkImoWwtvcQKUG35Oz57bnapKcFxUslmWh+wjbUFBQUWg= X-Gm-Gg: AfdE7cnR2OeRGUdL+jBRN4p2Le3+o2lCUHi7ZdU+9gp7UxuCQcxDk8PHcmT+NQKVxzf P0N5Ev1B99InT/8FVAPGsc1hxLNnwjCxn7KjMRX+hanuZDLALtJXiMpkh4pSaioaL++QtpUoc4Z QAhosYFVvoLt51hzhXwRnMP3Taub5OAf2F9mGWq8xgbI+2MruxCXvC20JunhuynMEnCQ6Jy3/bf ymeR7o34fKqgM41IZg9Isoa1XV/HUYSN2UbLUZDfRpqRqH6EPLqTTvZIHEC7qaKVlPkociXyLPy EHu3YNAkidr64PeyAY+wfrK2XAsMo53dx2f+3KGUPS5jRD2enGM9xpVfSNk2fHvDRkRKdeAAln2 fQ9lsWUGxOT0unD1mdGyE3wConFedHtsJRqNOcvU7i+JwL0shgmqlh7ffgA99DJenySbYNQherR k= X-Received: by 2002:a05:6820:190f:b0:6a0:c3ed:be45 with SMTP id 006d021491bc7-6a0d8d5d523mr6997500eaf.54.1782015725055; Sat, 20 Jun 2026 21:22:05 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:05 -0600 Subject: [PATCH v3 18/40] bsd-user: Add socket system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-18-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3630; i=imp@bsdimp.com; h=from:subject:message-id; bh=ZBAbJNClrfqHZU5D4NHPAXLrCS68cI/JIVaNW7vuVuc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z+kel8YPw0ignOYE6oJN0w7kL+/w4Vg9FIy vvn3w35gBuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfgAKCRBsHNEofbAR APSHEADRX8V7CDPqYk+uoCCcFiAyqjome/BlQOOf+gQVTN4bQrsbinwkom1XtjZT6WPz+piyn45 PXcmWUlKYf3xINht6qejJn+JFNEvY4FAT8k+CwQZMymi8go3goBxei4imvaWE2z1T2NWB0Chv/O 37mrFwyMmHrftvtBUCu9BX8rbRNldizmDzDjbF1rsm22a5/Ndi/gPHA8M7o+C/Y5ekfYi0GmgdG Km4pgWzcACTSs5gkUm+vw6h6jVdYxwWbgD7nG4Pl6H1ZkpNP1w7/48E/QktzRAp3JF+AtKhxlkY KYmZNeYXah75U9tQm2z/6mo6C3UAqbDJD6cvk8RqKLmZe+ORrDLL8s8F/7Y+fJZscBRXgJqV1OM mRPabb+8Pp+kX/kzPxwFNcNcQdK2V/uenTTyRhWCQknPdvOqY36X5jFLCo/5olxA+8r+ppKooZs GU4019btM2TtOxCyae50UOawzOPjUFzgleuLvveaDMgIPeqr02P6gH6sNWmngrKMayAvVFIWIHU 0RDxpoRDqWB92DyWRSghX/FkLUZurdRVdMYTKumvRUBlRnjckQIVEQwJ7Ak3F0S1iemrteRaLrf m8NXgrLj9uGiLsbjZoVuAE7MrAPku1njMGtPoS/cptpNfMFzPvnivWiNeGhU4N+0GX2PCxi6crW kNT8YvNx7u5vNoA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::29; envelope-from=imp@bsdimp.com; helo=mail-oa1-x29.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015833254154100 Wire up socket-related system calls in the FreeBSD syscall dispatcher: accept, accept4, bind, bindat, connect, connectat, getpeername, getsockname, getsockopt, setsockopt, listen, recvfrom, recvmsg, sendmsg, sendto, socket, socketpair, shutdown, and setfib. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 79 +++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 79 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 46fee46336..5d3a66e360 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -1073,6 +1073,85 @@ static abi_long freebsd_syscall(CPUArchState *env, i= nt num, abi_long arg1, ret =3D do_freebsd_pdkill(arg1, arg2); break; =20 + /* + * socket related system calls + */ + case TARGET_FREEBSD_NR_accept: /* accept(2) */ + ret =3D do_bsd_accept(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_accept4: /* accept4(2) */ + ret =3D do_freebsd_accept4(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_bind: /* bind(2) */ + ret =3D do_bsd_bind(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_bindat: /* bindat(2) */ + ret =3D do_freebsd_bindat(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_connect: /* connect(2) */ + ret =3D do_bsd_connect(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_connectat: /* connectat(2) */ + ret =3D do_freebsd_connectat(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_getpeername: /* getpeername(2) */ + ret =3D do_bsd_getpeername(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getsockname: /* getsockname(2) */ + ret =3D do_bsd_getsockname(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getsockopt: /* getsockopt(2) */ + ret =3D do_bsd_getsockopt(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_setsockopt: /* setsockopt(2) */ + ret =3D do_bsd_setsockopt(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_listen: /* listen(2) */ + ret =3D get_errno(listen(arg1, arg2)); + break; + + case TARGET_FREEBSD_NR_recvfrom: /* recvfrom(2) */ + ret =3D do_bsd_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6); + break; + + case TARGET_FREEBSD_NR_recvmsg: /* recvmsg(2) */ + ret =3D do_sendrecvmsg(arg1, arg2, arg3, 0); + break; + + case TARGET_FREEBSD_NR_sendmsg: /* sendmsg(2) */ + ret =3D do_sendrecvmsg(arg1, arg2, arg3, 1); + break; + + case TARGET_FREEBSD_NR_sendto: /* sendto(2) */ + ret =3D do_bsd_sendto(arg1, arg2, arg3, arg4, arg5, arg6); + break; + + case TARGET_FREEBSD_NR_socket: /* socket(2) */ + ret =3D do_bsd_socket(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_socketpair: /* socketpair(2) */ + ret =3D do_bsd_socketpair(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_shutdown: /* shutdown(2) */ + ret =3D do_bsd_shutdown(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_setfib: /* setfib(2) */ + ret =3D do_freebsd_setfib(arg1); + break; + /* * sys{ctl, arch, call} */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015826; cv=none; d=zohomail.com; s=zohoarc; b=D5DRh5/mZONpUVAwcm6SnYatSUIvNW1O8rtr+rAlUbIoaBxeUyNyKTZaZm+kHh9wTYljeyqF390gD44gLoLVMDsqtg5ysjyttq1HgcdfnVamd/Aw4o64WOXidbR+BcuRvj8AajYim+qA72Aunnxu1iw6lBKvDeprwoxaE8IhXcU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015826; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=/w2l1J64qfg21P2/IVcoiYALy0cgARIS1Qjr30kbu70=; b=T0pGoBwPjaXHl5v6NRfnMEcGRwxpdB4xyLvzUM1+ImvF33Synz6IjHGwlPsSYFZfvY4OPdL1WvZGiqOOwI95a7MmNZlovqTwbnPu6WkF1ZAgUDUBPvPDheerMK8IE1kaNWGz7d9c41o/VXZu1S0ySVNI55GVAc9gzCq7Mtu8d8k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015826964962.9094380684687; Sat, 20 Jun 2026 21:23:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hG-00031P-Nk; Sun, 21 Jun 2026 00:22:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hD-0002zN-2g for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:12 -0400 Received: from mail-oa1-x43.google.com ([2001:4860:4864:20::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hA-0005E4-EK for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:10 -0400 Received: by mail-oa1-x43.google.com with SMTP id 586e51a60fabf-43d3a0dabb0so2244844fac.1 for ; Sat, 20 Jun 2026 21:22:07 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015727; x=1782620527; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=/w2l1J64qfg21P2/IVcoiYALy0cgARIS1Qjr30kbu70=; b=d6+wJ+DX+4zY3AdKQLy/HoLD5k1Tigh1aAmusoA2iB3sFusn2whfHvSjR/Tw0Ro+kL oe0EBpJoYr91ZG7bZAQcQgOvqXUUKCfUgHUcjwTeSRD9PjjZKUadaV64ERiBuuQLN0U8 gufFWW4/j/58UTx8L8bWnFwhu0J6cNxdzkvSQz1yp1Nw0Tg9BuHAj9MKeXLSUvugFZAX rQTik16yL7EKklFAT/9tNRpnap9kG9WbVXVdnBlHnKn8npU9DZuCtqCIMrNrVVZJcin7 mh7Jr6CF5WdqSRtt4OWW77FpyEVv+Pc0eGeF1tAlSPh6AK8wr5d3v88BOX6/pWvh5PRG tCcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015727; x=1782620527; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/w2l1J64qfg21P2/IVcoiYALy0cgARIS1Qjr30kbu70=; b=QULwRORm4lUJ5zL0xAv1cTg4ZSl41YdPW7ZxgCir0G7zgYcL//wufJxLvepuHVyGN5 8HZmtChLl3RPVt+mP1FkhnKn/PbfC9udx+YPViT/McYE22dA1xwRd3WmD6lh8/I4wGkN nehr+gloUadxMOC4XSaVabfb9jjUtP6st35MEHBlaZQzbf8iZIRYwtQdFwokf/xVeABr dLmgfb0FhxC5oGGQTMj/tjhk82tvCvRcHBW8a2CTlKsTd7fxWTUvEOjSBUWnfDk8jTvh DT10e9o7yztUfDDr57PmKD+jY3lHCUPidDYDaoN++XBDI7z+UCl980XYxtUZ+b9fLJc9 +OwQ== X-Gm-Message-State: AOJu0Yz4SCdIWK5ZQusXgP6l0NON0AL33zv0RWQ8+ho8u0lwQnZh1NgN P9nNGimrKr+HofKTN3XZZQQg2+Za+PqVpmbaWnAOnV7QNH+KrGoDnEeKr9xTX26LaL1KL0aelzS Mk/qnT9xNZfmU X-Gm-Gg: AfdE7cltdwaG/fG8kKVZsUSZ6t/0HnbWOGCQcYZjpBaJbLbR+vehKRdJofxmt2/M/QD utw2k8JmopmjSIAoZAreS+wf5XIgYoJfsFqEVQkp/rZzY1LzpTRKPV5BPm+lLIO3FiMXcQf7sx3 xJdduvMQhsu3xPYoYMTfLIJdFxaJ4Feoxstm5mCQ3EThLFpbsj11/Pwm8IJUlxmnhDxwUtgGc8X dUABc5QCxN/PaYujUFnZamTu0YM/gBvcjaBuWL57GdrGbv8WDMxamPQrRAF20Fv5LmMKS3Sc0td KPednFm50huncZYO4rcRRh/QtlSvoLjPOESxO1KQJtWVAqWBMi4U1rphsi3fJRpJohNwGxyClic tAfg1arc/OwNCBs0LxtUFh/4gQntaoWq6ETuolu8arMBgckopJgsJc/jtagT19ofCsmpDWsTrTa Q= X-Received: by 2002:a05:6820:88f:b0:696:17a6:c06f with SMTP id 006d021491bc7-6a0d8d94badmr7660494eaf.12.1782015726667; Sat, 20 Jun 2026 21:22:06 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:06 -0600 Subject: [PATCH v3 19/40] bsd-user: Add os-time.h with clock and time-of-day functions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-19-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Sean Bruno , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=7998; i=imp@bsdimp.com; h=from:subject:message-id; bh=ELfPXFxSrTKKfO8VRBS4dJaUcu7uSG5piMSKgxBy3n0=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/1fWG/OGVAXwuBRBKm9FDj7VY57K0nX8bK bUefFAGdTuJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR ACcHD/953asvEm/bKugHSUoEqlbEYObbvDdfT50OKSQfZB8+aIwUBt1FdOqkmA3rYjchdLlWBpS RlpPZP5FVrgfG6sVlEHGHMAer+Eo2ewhsxKOLNDplTs7AwfhVKVtPCdV7E/cD3huFVtoF2s/BYr PsVL1TNKijXtYUPHz/Xh+JrsyeuQO45lc/njSMW7ry8BTDY+1RZHO5IspUSTTC+edj2lGXDXRaE hTsDsOUXsW+hTnAIDI9a4C1GwBn4ZCa+RzRAl4CSge4WV7M1wsJI4EWU4hO83E3MFZSjIYPtiXi HM5aUn2cvJqf3Sw74lexsJ4Mmf/Def+JRMocKVBSniUDK1cXdxYZ7SLt5Q7T9sdC8MlJbNZZ1vA HRCx3ys69ULlcjrlRkbDRrcG43XAfNIwr1/01mODAFWsdVf9Dz+R/ijBkIjaNMya19Ls4HaFXvU Jc2PLZu2hUQ3GdVMdydGOjnObVtXjVRATlZsmi3ufDGbFWFF6xTynPlcVQfOLse6KQ6qY7lUdUN 8MOEw++k5foqHxXgNJ7ipjThLqaJdLPiyhKySUcc4kl+MPKFu/GbSN5JE+1CH5sFEZ+LqILME3b agmqBIGbX02iso8ubr+bOSYZPlUEHVwHkalM5c27QWRvAzXntPbh/cCiMo744/xndKANZ0AQzc1 IZZA/JiJluQWC6A== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::43; envelope-from=imp@bsdimp.com; helo=mail-oa1-x43.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015829004154100 Add the first part of FreeBSD time support: nanosleep, clock_nanosleep, clock_gettime, clock_settime, clock_getres, gettimeofday, settimeofday, adjtime, ntp_adjtime, and ntp_gettime. Also add safe_syscall wrappers for nanosleep, clock_nanosleep, and kevent. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Sean Bruno Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 9 ++ bsd-user/freebsd/os-time.h | 225 ++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 234 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 5d3a66e360..6fbd2da261 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -89,6 +89,15 @@ safe_syscall6(ssize_t, sendto, int, fd, const void *, bu= f, size_t, len, int, safe_syscall3(ssize_t, recvmsg, int, s, struct msghdr *, msg, int, flags); safe_syscall3(ssize_t, sendmsg, int, s, const struct msghdr *, msg, int, f= lags); =20 +/* used in os-time */ +safe_syscall2(int, nanosleep, const struct timespec *, rqtp, struct timesp= ec *, + rmtp); +safe_syscall4(int, clock_nanosleep, clockid_t, clock_id, int, flags, + const struct timespec *, rqtp, struct timespec *, rmtp); +safe_syscall6(int, kevent, int, kq, const struct kevent *, changelist, + int, nchanges, struct kevent *, eventlist, int, nevents, + const struct timespec *, timeout); + /* used in os-proc */ safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options, struct rusage *, rusage); diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h new file mode 100644 index 0000000000..e387441d86 --- /dev/null +++ b/bsd-user/freebsd/os-time.h @@ -0,0 +1,225 @@ +/* + * FreeBSD time related system call shims + * + * Copyright (c) 2013-2015 Stacey Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef FREEBSD_OS_TIME_H +#define FREEBSD_OS_TIME_H + +#include +#include +#include +#include +#include +#include +#include + +#include "qemu.h" +#include "qemu-os.h" + +#include "bsd-socket.h" + +int safe_clock_nanosleep(clockid_t clock_id, int flags, + const struct timespec *rqtp, struct timespec *rmtp); +int safe_nanosleep(const struct timespec *rqtp, struct timespec *rmtp); +int safe_kevent(int, const struct kevent *, int, struct kevent *, int, + const struct timespec *); + +int __sys_ktimer_create(clockid_t, struct sigevent *restrict, + int *restrict); +int __sys_ktimer_gettime(int, struct itimerspec *); +int __sys_ktimer_settime(int, int, const struct itimerspec *restrict, + struct itimerspec *restrict); +int __sys_ktimer_delete(int); + +/* nanosleep(2) */ +static inline abi_long do_freebsd_nanosleep(abi_long arg1, abi_long arg2) +{ + abi_long ret; + struct timespec req, rem; + + ret =3D t2h_freebsd_timespec(&req, arg1); + if (!is_error(ret)) { + ret =3D get_errno(safe_nanosleep(&req, &rem)); + if (ret =3D=3D -TARGET_EINTR && arg2) { + if (h2t_freebsd_timespec(arg2, &rem) !=3D 0) { + ret =3D -TARGET_EFAULT; + } + } + } + + return ret; +} + +/* clock_nanosleep(2) */ +static inline abi_long do_freebsd_clock_nanosleep(abi_long arg1, abi_long = arg2, + abi_long arg3, abi_long arg4) +{ + struct timespec req, rem; + abi_long ret; + int clkid, flags; + + clkid =3D arg1; + /* XXX Translate? */ + flags =3D arg2; + ret =3D t2h_freebsd_timespec(&req, arg3); + if (!is_error(ret)) { + ret =3D get_errno(safe_clock_nanosleep(clkid, flags, &req, &rem)); + if (ret =3D=3D -TARGET_EINTR && arg4) { + if (h2t_freebsd_timespec(arg4, &rem) !=3D 0) { + ret =3D -TARGET_EFAULT; + } + } + } + + return ret; +} + +/* clock_gettime(2) */ +static inline abi_long do_freebsd_clock_gettime(abi_long arg1, abi_long ar= g2) +{ + abi_long ret; + struct timespec ts; + + ret =3D get_errno(clock_gettime(arg1, &ts)); + if (!is_error(ret)) { + if (h2t_freebsd_timespec(arg2, &ts) !=3D 0) { + return -TARGET_EFAULT; + } + } + + return ret; +} + +/* clock_settime(2) */ +static inline abi_long do_freebsd_clock_settime(abi_long arg1, abi_long ar= g2) +{ + struct timespec ts; + + if (t2h_freebsd_timespec(&ts, arg2) !=3D 0) { + return -TARGET_EFAULT; + } + + return get_errno(clock_settime(arg1, &ts)); +} + +/* clock_getres(2) */ +static inline abi_long do_freebsd_clock_getres(abi_long arg1, abi_long arg= 2) +{ + abi_long ret; + struct timespec ts; + + ret =3D get_errno(clock_getres(arg1, &ts)); + if (!is_error(ret)) { + if (h2t_freebsd_timespec(arg2, &ts) !=3D 0) { + return -TARGET_EFAULT; + } + } + + return ret; +} + +/* gettimeofday(2) */ +static inline abi_long do_freebsd_gettimeofday(abi_ulong arg1, abi_ulong a= rg2) +{ + abi_long ret; + struct timeval tv; + struct timezone tz, *target_tz; /* XXX */ + + if (arg2 !=3D 0) { + if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) { + return -TARGET_EFAULT; + } + __get_user(tz.tz_minuteswest, &target_tz->tz_minuteswest); + __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); + unlock_user_struct(target_tz, arg2, 1); + } + ret =3D get_errno(gettimeofday(&tv, arg2 !=3D 0 ? &tz : NULL)); + if (!is_error(ret)) { + if (h2t_freebsd_timeval(&tv, arg1)) { + return -TARGET_EFAULT; + } + } + + return ret; +} + +/* settimeofday(2) */ +static inline abi_long do_freebsd_settimeofday(abi_long arg1, abi_long arg= 2) +{ + struct timeval tv; + struct timezone tz, *target_tz; /* XXX */ + + if (arg2 !=3D 0) { + if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) { + return -TARGET_EFAULT; + } + __get_user(tz.tz_minuteswest, &target_tz->tz_minuteswest); + __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); + unlock_user_struct(target_tz, arg2, 1); + } + if (t2h_freebsd_timeval(&tv, arg1)) { + return -TARGET_EFAULT; + } + + return get_errno(settimeofday(&tv, arg2 !=3D 0 ? &tz : NULL)); +} + +/* adjtime(2) */ +static inline abi_long do_freebsd_adjtime(abi_ulong target_delta_addr, + abi_ulong target_old_addr) +{ + abi_long ret; + struct timeval host_delta, host_old; + + ret =3D t2h_freebsd_timeval(&host_delta, target_delta_addr); + if (is_error(ret)) { + return ret; + } + + if (target_old_addr) { + ret =3D get_errno(adjtime(&host_delta, &host_old)); + if (is_error(ret)) { + return ret; + } + ret =3D h2t_freebsd_timeval(&host_old, target_old_addr); + } else { + ret =3D get_errno(adjtime(&host_delta, NULL)); + } + + return ret; +} + +/* ntp_adjtime(2) */ +static inline abi_long do_freebsd_ntp_adjtime(abi_ulong target_tx_addr) +{ + abi_long ret; + struct timex host_tx; + + ret =3D t2h_freebsd_timex(&host_tx, target_tx_addr); + if (ret =3D=3D 0) { + ret =3D get_errno(ntp_adjtime(&host_tx)); + } + + return ret; +} + +/* ntp_gettime(2) */ +static inline abi_long do_freebsd_ntp_gettime(abi_ulong target_ntv_addr) +{ + abi_long ret; + struct ntptimeval host_ntv; + + ret =3D get_errno(ntp_gettime(&host_ntv)); + if (!is_error(ret)) { + ret =3D h2t_freebsd_ntptimeval(target_ntv_addr, &host_ntv); + } + + return ret; +} + + + +#endif /* FREEBSD_OS_TIME_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015788; cv=none; d=zohomail.com; s=zohoarc; b=DRE0VRZPlFy3xuBgwig7mJaXMtJDIP/AtcMZTiyZr6Q9IkzMJUKCavp0iS0i2W4S2FxPA6wuENger+wfbycCk2HpaLXt3pMAufXb+yxvkW90+pFkLnBgjkJ3cv5jol0Depad8+5cgDtpIuYet1RbncVb0k3t6WTvp2ZZIfg992o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=nd668SF+lm2kq08PKi7pg1iSuAwXi3sSQJZZ4SwfLHE=; b=lcYJzNGRmLGJgZ+HiSntrLjqtZl1bIo1Xvz8qYRUCCRo/FCWrF+DMcczv8tfBQGM78iD0k7UwKCQUE83xySg2OvivxkdUg1h9HdH1Jqh6w20ab0bLVaUNgMz2DS22FvWLn15T0aQRNczA4qLXmcSWSD53LVzZs9XdDQXKTJN/7M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015788701550.2444605785739; Sat, 20 Jun 2026 21:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hG-00030u-4J; Sun, 21 Jun 2026 00:22:14 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hD-0002zP-3L for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:12 -0400 Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hB-0005ER-DO for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:10 -0400 Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-69e1f777bcaso2930231eaf.1 for ; Sat, 20 Jun 2026 21:22:09 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015728; x=1782620528; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=nd668SF+lm2kq08PKi7pg1iSuAwXi3sSQJZZ4SwfLHE=; b=w86ISdq0Fjh9Ct4+fiRhFdoH3ac2JPU2gbPCtymrZ3+2l+gyWFywdCI3+h7nizdSxh 5DZK+fUIOWzzQRMfCYnz9EThdGrrO+duNWtSezLDJpRLFT0fYjBOyfhmDEVP3f4Mpnff HkO2BCLikMSTHe35hFCH1VuBzTzvSxaYm5ZjcX2qQF0A+CP+MkUAlHWDCKam5t63ffOv pTZVgE3+uKdLoUEH7PdnFbrpBr8cDD1cujdR42N6MB24fS3w47SQW5t94B01bZy/wP67 yQ8TcfLYUxOoZGG4lIbtg0F02IbChWEDVMsDxSBY8mtqKnJpxCJQL7H76w6IvMnXp8KJ s4Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015728; x=1782620528; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=nd668SF+lm2kq08PKi7pg1iSuAwXi3sSQJZZ4SwfLHE=; b=ARasOyWpT17t9iI/EZy31w5Ka3grHB8GaJ9oIpzT3FLHgiEyE6s1+MUUUBeHWyyqT6 mrNjMw5ZPFfL6uRYe6hyvL54X0/duF2anLLB+vPlLe7SVo1W4F1rTlcGqzZvhXnGDvDM qq32RaDnYO//NBVrZTA0E8jj6XLjfRe3Bqgpoe0GkrnH5xqWWvJNz369eK4qFbEnsF8N K+xgPbKCwyqFJSZU671k7RUHzivk7K3NRciMvIysRMVgAkgt/rQpm4E3nedjEvUzMoA6 4QxnezTkycwcQEssACvIdAqNCsNdpBivHbP85pXXMUEyiQMrcKsuzKW0E3JpbPvLzbVn qnew== X-Gm-Message-State: AOJu0Yy5Q92lN4sSFAz88cmO3NLQyzlTnycRfF0SiTbgN3xQ4zlSm5ex cphrIzgqYSSOq0qaqatNGtKjXya8kgpafUkDNuOL+lnRkbUExU9kWx8It5lVBBhfldfbpabGix2 up7Hk9OIWcg== X-Gm-Gg: AfdE7cnfQ5sIM8vWRq3g8J9G4IkMP67KQR5R2NHH+ByR8yoVqQ03tj1BJPwcpYrno/5 iv2kIAv03py+ipiQIWDOfE0HzSOxUKu3loDe8G737v61/cAPnq8CWArohzPexASrNn3upOfOEdH qCa8Ou4MpBOwQ9i/JDwxE628MwMwu8dG21TYvBzyZw57cbCmjGzp6xxQVWaNLJUUQFhHzxF94gq EPASImJ05wZPJqJRzJzgFCC4EKyzu5pL/E1Ttk34WLDM4cLfoIEl+/V6i1dTrQS2pWVWJr+fhNG maDyAAajYDQR6+5dX0k+MxvrLyCGkfCswBk1GKYuGEbV1hFQqtRojz1RM6jtmN9X/SDsT68Pf8t btIt4bC5GHcbldBrKbGWOtFIb7RaX61Ggy2wGUsZeqMjHEXA/cV1v6LVBJYPjJ+S7btMLfDASXz Q= X-Received: by 2002:a05:6820:2229:b0:696:13e9:6863 with SMTP id 006d021491bc7-6a0d9fb7a6emr5251545eaf.2.1782015728418; Sat, 20 Jun 2026 21:22:08 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:07 -0600 Subject: [PATCH v3 20/40] bsd-user: Add utimes, futimes, and ktimer functions to os-time.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-20-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6639; i=imp@bsdimp.com; h=from:subject:message-id; bh=9GsekxgX59ibndkwRpMW3vsambWIIfF/h5FULyJCcSY=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/JsnMXKIhwHeW0Gt7jmihrB5Y/LnbEH193 3kSYQ5zxpiJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR AM7ZD/wKr3YL9BXiKiPoWV4EPwpE2xktMSnzg/mOmqjOEsWrB84LCSM9ls48EiJenVmp6E04DTu rlN6VKp7OC8dnUL2CUQdvDE5xG75ppDHj7CM7ZBukkjGOd/5/o4Za3Qu1VmSCB2vSxKF57AZEP+ XgACqAFVdCtjwxKnNTnmvP4BApDGZdDWO3dEBSVbwrpVzFBdAHU2pNEf6VW3H00J/IJaecYyIw7 6bQ8KIKFqo3KDvAI484Cv5dp5F//VL60Vr70nPPEWB4PSvatD02LMS5m0veoMk/SGmDQYYoPTAU qx8tI+Wz4sh3E7950jNOryRrjTRhJYuFeO/vuCYJJ8zHTCTNy0eaahBJ5zcIon0xlLs52mKtR3G 0BJrAmfuaHAHqYS2EW8HzzRM7QJDIkogLPXvPf3OWqp/oNvyMdsjxKcXA7aV4iM2yF+kQ31QqcB chTzqZGQEVz06rzToIBJPrv5/BDPSU40ygOiOeP2vCqP7qp/+jTmNKATnSn5mR7xTwagyLXq6we 781tFIDCPyyCo38F4dJyTO9K1VTWawuGGOWTMV4nIfq2Rf5gMCSnUSDU+wz67cDis6jdeLcEpWC gMErQySbwbCvMKF5I2fNmR3GInVlVcvvIynMBV7HIphuB/hrzKbgEvPIlsHHcdQEpiTzGEosB6q Gi9fWKV2QHs940A== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2c; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015790355154100 Add time-related system call shims: utimes, lutimes, futimes, futimesat, ktimer_create, ktimer_delete, ktimer_settime, and ktimer_gettime. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-time.h | 212 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 212 insertions(+) diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h index e387441d86..06104a5b7d 100644 --- a/bsd-user/freebsd/os-time.h +++ b/bsd-user/freebsd/os-time.h @@ -221,5 +221,217 @@ static inline abi_long do_freebsd_ntp_gettime(abi_ulo= ng target_ntv_addr) } =20 =20 +/* utimes(2) */ +static inline abi_long do_freebsd_utimes(abi_long arg1, abi_long arg2) +{ + abi_long ret; + void *p; + struct timeval *tvp, tv[2]; + + if (arg2 !=3D 0) { + if (t2h_freebsd_timeval(&tv[0], arg2) || + t2h_freebsd_timeval(&tv[1], arg2 + + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(utimes(p, tvp)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* lutimes(2) */ +static inline abi_long do_freebsd_lutimes(abi_long arg1, abi_long arg2) +{ + abi_long ret; + void *p; + struct timeval *tvp, tv[2]; + + if (arg2 !=3D 0) { + if (t2h_freebsd_timeval(&tv[0], arg2) || + t2h_freebsd_timeval(&tv[1], arg2 + + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(lutimes(p, tvp)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* futimes(2) */ +static inline abi_long do_freebsd_futimes(abi_long arg1, abi_long arg2) +{ + struct timeval *tvp, tv[2]; + + if (arg2 !=3D 0) { + if (t2h_freebsd_timeval(&tv[0], arg2) || + t2h_freebsd_timeval(&tv[1], arg2 + + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + return get_errno(futimes(arg1, tvp)); +} + +/* futimesat(2) */ +static inline abi_long do_freebsd_futimesat(abi_long arg1, abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *p; + struct timeval *tvp, tv[2]; + + if (arg3 !=3D 0) { + if (t2h_freebsd_timeval(&tv[0], arg3) || + t2h_freebsd_timeval(&tv[1], arg3 + + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + p =3D lock_user_string(arg2); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(futimesat(arg1, p, tvp)); + unlock_user(p, arg2, 0); + + return ret; +} + +/* timer_create(2) */ +static inline abi_long do_freebsd_ktimer_create(abi_long arg1, abi_long ar= g2, + abi_long arg3) +{ + /* args: clockid_t clockid, struct sigevent *sevp, int *timerid */ + abi_long ret; + + struct sigevent host_sevp =3D { 0 }, *phost_sevp =3D NULL; + + int clkid =3D arg1; + int timer_index =3D next_free_host_timer(); + + if (timer_index < 0) { + ret =3D -TARGET_EAGAIN; + } else { + int *phtimer =3D g_posix_timers + timer_index; + + if (arg2) { + phost_sevp =3D &host_sevp; + ret =3D target_to_host_sigevent(phost_sevp, arg2); + if (ret !=3D 0) { + g_posix_timers[timer_index] =3D 0; + return -TARGET_EFAULT; + } + } + + ret =3D get_errno(__sys_ktimer_create(clkid, phost_sevp, phtimer)); + if (ret) { + phtimer =3D NULL; + } else { + if (put_user(TIMER_MAGIC | timer_index, arg3, int)) { + __sys_ktimer_delete(g_posix_timers[timer_index]); + g_posix_timers[timer_index] =3D 0; + ret =3D -TARGET_EFAULT; + } + } + } + return ret; +} + +/* timer_delete(2) */ +static inline abi_long do_freebsd_ktimer_delete(abi_long arg1) +{ + /* args: int timerid */ + abi_long ret; + int timerid =3D get_timer_id(arg1); + + if (timerid < 0) { + ret =3D timerid; + } else { + int htimer =3D g_posix_timers[timerid]; + ret =3D get_errno(__sys_ktimer_delete(htimer)); + g_posix_timers[timerid] =3D 0; + } + return ret; +} + +/* timer_settime(2) */ +static inline abi_long do_freebsd_ktimer_settime(abi_long arg1, abi_long a= rg2, + abi_long arg3, abi_long arg4) +{ + /* + * args: int timerid, int flags, const struct itimerspec *new_value, + * struct itimerspec * old_value + */ + abi_long ret; + int timerid =3D get_timer_id(arg1); + + if (timerid < 0) { + ret =3D timerid; + } else if (arg3 =3D=3D 0) { + ret =3D -TARGET_EINVAL; + } else { + int htimer =3D g_posix_timers[timerid]; + struct itimerspec hspec_new =3D {{0},}, hspec_old =3D {{0},}; + + if (target_to_host_itimerspec(&hspec_new, arg3)) { + return -TARGET_EFAULT; + } + ret =3D get_errno( + __sys_ktimer_settime(htimer, arg2, &hspec_new, &hspec_old)); + if (arg4 && host_to_target_itimerspec(arg4, &hspec_old)) { + return -TARGET_EFAULT; + } + } + return ret; +} + +/* timer_gettime(2) */ +static inline abi_long do_freebsd_ktimer_gettime(abi_long arg1, abi_long a= rg2) +{ + /* args: int timerid, struct itimerspec *curr_value */ + abi_long ret; + int timerid =3D get_timer_id(arg1); + + if (timerid < 0) { + ret =3D timerid; + } else if (!arg2) { + ret =3D -TARGET_EFAULT; + } else { + int htimer =3D g_posix_timers[timerid]; + struct itimerspec hspec; + ret =3D get_errno(__sys_ktimer_gettime(htimer, &hspec)); + if (!is_error(ret)) { + ret =3D host_to_target_itimerspec(arg2, &hspec); + } + } + return ret; +} + =20 #endif /* FREEBSD_OS_TIME_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015813; cv=none; d=zohomail.com; s=zohoarc; b=LD05SOkfZRa5R/pmMlbtwnWEW9l//JejNVRhG5iNlQ+R7fRBsgx57XY9CJMbVE+pqAdFMfdrkJuL4hcpWyMsiHqTJFbcPn8xEsMEnaU/3UD6wpyQfPnRhjDaDDkjTq7MbB6T6HcDnTI6hByMC93bEafq86VV1Qx7NcYQCtqewp8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015813; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=xp2PW1UQBDltfWrkoKTSVa6VIpi6uaQyLkZXDXJeAPI=; b=CAViGIzgLw3yBsm7e6KhmjuTrFsSfTl/aaTIdHojyzdiiI71ptnMvQuzm8Q19bdc/sKNArCupeI+kbymopDxhy509B8uJU0VvHOMXPN5Nyd5pYvsj3NDs9Eug3uPI0KNM8Ee1yBmWA2dNkpUcQKr7NRp/yAtydxEnSniZNcJwbk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015813021453.7782172713122; Sat, 20 Jun 2026 21:23:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hK-00032b-AS; Sun, 21 Jun 2026 00:22:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hG-000319-Eb for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:14 -0400 Received: from mail-oo1-xc2a.google.com ([2607:f8b0:4864:20::c2a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hE-0005En-5t for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:14 -0400 Received: by mail-oo1-xc2a.google.com with SMTP id 006d021491bc7-6a0eb989530so433108eaf.0 for ; Sat, 20 Jun 2026 21:22:10 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015730; x=1782620530; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xp2PW1UQBDltfWrkoKTSVa6VIpi6uaQyLkZXDXJeAPI=; b=qBn0+N0UszMhLLxqXPQrJwk2Wx0yeO8LEtS/zyfg6sGrEz8N1bb5BJMWtI5y+F7xse jyZl8uUT/jz2jW02R6oeZ5xLhI+AOrgKT2SxuvkV/Ap/IwH+viY0yrgGCGJgO9r2CQOF wCfhcNg7UiR+PZmPxnqVHA9Dhz5R/TJNlEAaFz6Secp6YDbZZu4V42x6GPsRN2ItzJdh MG00XxYxMqvKN7CrPo9bAA2oqefvE3v+v5BF5iIrRvrt1+11arrPDNZ3Kubz8XY+LPbe VIBnDpX/cb3+SmnYr0TNVmCWO1Bp2ltjuAUE7SX2cLC3JAtpgTtXU4aE62SCEJkknBF4 /0ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015730; x=1782620530; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=xp2PW1UQBDltfWrkoKTSVa6VIpi6uaQyLkZXDXJeAPI=; b=bIyCE0ttoUTztHeHBA9WiFRjuKBhHDvIw34j2RnhgvK+N/ZY5B1dpdeP70MED892wK G5SYh/z/3yxO+5YWKEWLoymjl6UispGxPer3okdlxdzVjvAElVPIg4xgl+2PP73TPWK+ SrQBej4wtEj9tcNwAt+EOFZSyIyclwv6JDqNbXNUl5VE1LVIT36pa0Ntw6YW8unzQ4Ms ptm4qM+smF2bsPIVsdE8WA9+GfBxQAnAGZRsMwFfgxvawyXh9MwNW4UFBNMgWCivSXEU HUbr5jHYAy80Q8G1cNmM2qOUHA5URG+3GFsAly+ASgxZgoDtn14IofLYSM3Kh+JMidS2 U4KQ== X-Gm-Message-State: AOJu0YzA0G0ifMSm2ZZ4zgEHkJQgfVaGL4/Y0wqyAX9ldr9BbKhjwZgF ++3oh4yk6/frPFQIkhtCOwEPBBQoHeqeTyQui64yBWBfeVOs4BxwZYmq6UUTixeTcSgWrm2ebJJ Y4cqI/VugmA== X-Gm-Gg: AfdE7ckFEppExADKF4xGVWoyKU4iX0qdvXHKeJ8UDdcNrijSltjSnOlabGXlnavoHHq yZ00m4M1Pnhb8Bm6iObOhRoS20WJd2JJRKdX3ZubrwI3T5ZcMNH2tLc/JCHlksjWwWwJiEHhyIz F27r8hOcMgaRUQ7A76O2oT6WLnf4rxsLPvSXZIfG6ucYDoev2J+HvARFTlID8785UcsamQ5YaFG yjUhJp/ze5SZFqlC7vzMKj00XAMnkW5HwOO05bciN5+dClvpOX95otvVJLcENppwHsUTCuKzST6 lIgOnrnVmZBtqYeDzKomwOhzW1KFP574ZO9+gHRLAxHlYewvUejmjQQ2ab+Epz+D1tWKI2wz6S4 /9Wmu8/IEdCV21RSZoMKPKB3Dik7eaNHxQjtXhZ/rkPEh6em8k/elsOLCrx9yL/AiEN/E8BXH9j 4= X-Received: by 2002:a05:6820:206:b0:6a0:fdc4:115d with SMTP id 006d021491bc7-6a0fdc411efmr896010eaf.47.1782015729897; Sat, 20 Jun 2026 21:22:09 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:08 -0600 Subject: [PATCH v3 21/40] bsd-user: Add select, pselect, and ppoll to os-time.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-21-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6810; i=imp@bsdimp.com; h=from:subject:message-id; bh=KLkGmYaTpJcDwjXumJN4nwyOJ9HgTF7+CflZ752H6KQ=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/OZI0ScbeWEhveAqBopcqU04ELxcddns5W KZTAsZFv9WJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR AM9mD/0f5wOCqDNxWnmJ8pz2d/d5Rcvdii5qrkcawHErFhAh0dVBUVILRm523Ru66Hp5ZpS1/Te nTV7efsMhhrCitRoWoj46U9Bkur5sRfWRy1pRGUZeMcF9hklDL42Hy1z+snMml/kLM5N9vgN1Zo EsO4o7zfVld6mBsqnx9W9kOG2TkUKmQXFve4k+OfZE1pR3dTFIUTu6IJNi+Z4HDlhQRRJkNAor5 3XlBK5ZqJJaiVdNaScFrghouq+Vd/u64DYvkS60FqkBFr5Mwy18iY9i/7TOZdNoacNO72oqkEq4 1+uDtA9ipQaUCncZieoEv6ZBLDA74kYe4cIeYwf1Gi2x2jA1SQ18H2VAzaKca8Td7iOrsN5Nu+l cMjeVisjglqY0ngPqLdb5DmHBkusN3lYABWVqtWCVDIPT5nmfl9gE81C3merDAigcXsmUswGMvK YTkT9Vi46MNbPJsNHPZg9KG8NqLyvXsvXm2eyMKgSgX9fBkPYtmbsX8qkL+MhcjzsEeKrTy0P+Z ZZukDpzPkvszri0SeFCKGpQtXWC6FABkSoM2nJgvniai+TytdiL50uBOY9WYFTMoQZScJVJqKoK f8tT0Mez08oQ0IhIYUPDyXblGdU/MIWrJ/cqFoxxvXvZwjEwqEWJKHstXEmMUe/3+4XVScuf/oZ rB/Rn7M3kNYlrog== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2a; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2a.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015814731154100 Add I/O multiplexing system call shims: select, pselect, and ppoll with proper fd_set, timespec/timeval, and signal mask conversion. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-time.h | 202 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 202 insertions(+) diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h index 06104a5b7d..5f537fac40 100644 --- a/bsd-user/freebsd/os-time.h +++ b/bsd-user/freebsd/os-time.h @@ -433,5 +433,207 @@ static inline abi_long do_freebsd_ktimer_gettime(abi_= long arg1, abi_long arg2) return ret; } =20 +/* select(2) */ +static inline abi_long do_freebsd_select(CPUArchState *env, int n, + abi_ulong rfd_addr, abi_ulong wfd_addr, abi_ulong efd_addr, + abi_ulong target_tv_addr) +{ + fd_set rfds, wfds, efds; + fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; + struct timeval tv, *tvp; + abi_long ret, error; + + ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); + if (ret !=3D 0) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); + if (ret !=3D 0) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); + if (ret !=3D 0) { + return ret; + } + + if (target_tv_addr !=3D 0) { + if (t2h_freebsd_timeval(&tv, target_tv_addr)) { + return -TARGET_EFAULT; + } + tvp =3D &tv; + } else { + tvp =3D NULL; + } + + ret =3D get_errno(safe_select(n, rfds_ptr, wfds_ptr, efds_ptr, tvp)); + + if (!is_error(ret)) { + if (rfd_addr !=3D 0) { + error =3D copy_to_user_fdset(rfd_addr, &rfds, n); + if (error !=3D 0) { + return error; + } + } + if (wfd_addr !=3D 0) { + error =3D copy_to_user_fdset(wfd_addr, &wfds, n); + if (error !=3D 0) { + return error; + } + } + if (efd_addr !=3D 0) { + error =3D copy_to_user_fdset(efd_addr, &efds, n); + if (error !=3D 0) { + return error; + } + } + if (target_tv_addr !=3D 0) { + error =3D h2t_freebsd_timeval(&tv, target_tv_addr); + if (is_error(error)) { + return error; + } + } + } + return ret; +} + +/* pselect(2) */ +static inline abi_long do_freebsd_pselect(CPUArchState *env, int n, + abi_ulong rfd_addr, abi_ulong wfd_addr, abi_ulong efd_addr, + abi_ulong ts_addr, abi_ulong set_addr) +{ + CPUState *cpu =3D env_cpu(env); + TaskState *tstate =3D cpu->opaque; + fd_set rfds, wfds, efds; + fd_set *rfds_ptr, *wfds_ptr, *efds_ptr; + sigset_t *set_ptr; + struct timespec ts, *ts_ptr; + void *p; + abi_long ret, error; + + ret =3D copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n); + if (is_error(ret)) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n); + if (is_error(ret)) { + return ret; + } + ret =3D copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n); + if (is_error(ret)) { + return ret; + } + + /* Unlike select(), pselect() uses struct timespec instead of timeval = */ + if (ts_addr) { + if (t2h_freebsd_timespec(&ts, ts_addr)) { + return -TARGET_EFAULT; + } + ts_ptr =3D &ts; + } else { + ts_ptr =3D NULL; + } + + if (set_addr !=3D 0) { + p =3D lock_user(VERIFY_READ, set_addr, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&tstate->sigsuspend_mask, p); + unlock_user(p, set_addr, 0); + set_ptr =3D &tstate->sigsuspend_mask; + } else { + set_ptr =3D NULL; + } + + ret =3D get_errno(safe_pselect(n, rfds_ptr, wfds_ptr, efds_ptr, ts_ptr, + set_ptr)); + if (ret !=3D -TARGET_ERESTART) { + tstate->in_sigsuspend =3D true; + } + if (!is_error(ret)) { + if (rfd_addr !=3D 0) { + error =3D copy_to_user_fdset(rfd_addr, &rfds, n); + if (is_error(error)) { + return error; + } + } + if (wfd_addr !=3D 0) { + error =3D copy_to_user_fdset(wfd_addr, &wfds, n); + if (is_error(error)) { + return error; + } + } + if (efd_addr !=3D 0) { + error =3D copy_to_user_fdset(efd_addr, &efds, n); + if (is_error(error)) { + return error; + } + } + } + return ret; +} + +/* ppoll(2) */ +static inline abi_long do_freebsd_ppoll(CPUArchState *env, abi_long arg1, + abi_long arg2, abi_ulong arg3, abi_ulong arg4) +{ + CPUState *cpu =3D env_cpu(env); + TaskState *tstate =3D cpu->opaque; + abi_long ret; + nfds_t i, nfds =3D arg2; + struct pollfd *pfd; + struct target_pollfd *target_pfd; + struct timespec ts, *ts_ptr; + sigset_t *set_ptr; + void *p; + + target_pfd =3D lock_user(VERIFY_WRITE, arg1, + sizeof(struct target_pollfd) * nfds, 1); + if (!target_pfd) { + return -TARGET_EFAULT; + } + pfd =3D alloca(sizeof(struct pollfd) * nfds); + for (i =3D 0; i < nfds; i++) { + pfd[i].fd =3D tswap32(target_pfd[i].fd); + pfd[i].events =3D tswap16(target_pfd[i].events); + } + + /* Unlike poll(), ppoll() uses struct timespec. */ + if (arg3) { + if (t2h_freebsd_timespec(&ts, arg3)) { + return -TARGET_EFAULT; + } + ts_ptr =3D &ts; + } else { + ts_ptr =3D NULL; + } + + if (arg4 !=3D 0) { + p =3D lock_user(VERIFY_READ, arg4, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&tstate->sigsuspend_mask, p); + unlock_user(p, arg4, 0); + set_ptr =3D &tstate->sigsuspend_mask; + } else { + set_ptr =3D NULL; + } + + ret =3D get_errno(ppoll(pfd, nfds, ts_ptr, set_ptr)); + if (ret !=3D -TARGET_ERESTART) { + tstate->in_sigsuspend =3D true; + } + if (!is_error(ret)) { + for (i =3D 0; i < nfds; i++) { + target_pfd[i].revents =3D tswap16(pfd[i].revents); + } + } + unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds); + + return ret; +} + +/* kqueue(2) */ =20 #endif /* FREEBSD_OS_TIME_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015988; cv=none; d=zohomail.com; s=zohoarc; b=Pcju1qDgqB27rJJu40J/7hBC0Aq1GvFbFC28aDN/fSC/E+4LiHuQm/x9ayRPG0o8GUB9SO8TPixq7g8DFgrUKAa56zsnRx20XRDVMquExMdM6jYFOG1pdrZVXmNQpF3z3UQViVdKvPo0z7FdOowMlnO0/1J6LTgG61/r0FGiW4g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015988; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fZtTWxiy3Ogv5B/0u608EIP34SRmRANB8iJf3S8OoUw=; b=XjJgNddMPZwa7zkLZ9K+uq6WsRisKbGyVe7Y+janANLiLrll5R9Ovtro7BIpDzAgDc9IHrGSWrZACnlSleE4O42vuMLxW3glhCN27YCpKj4Ul5ChptDOJIBZEz5jqikgM9qZmpDSYG61/+ROzXZxtY6leuYi6BmhdMBvGauJQhY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178201598856657.44569255335057; Sat, 20 Jun 2026 21:26:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hI-00032Y-Oz; Sun, 21 Jun 2026 00:22:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hG-00031S-Us for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:14 -0400 Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hE-0005FJ-Ve for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:14 -0400 Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-69de16f5e80so1814182eaf.0 for ; Sat, 20 Jun 2026 21:22:12 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015732; x=1782620532; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fZtTWxiy3Ogv5B/0u608EIP34SRmRANB8iJf3S8OoUw=; b=kWLzoQgOwh4thukWBr1GZkYt5gr7D3EDtXHPnKpvLBv640Kn0yzxJj44PoR4vi/K9M oRm8+nJ3GjpTaOswOZkHejkh3rzcPaD0JsJvJxZ0Cxjuxqn7Zfokg6YW87VQby+acsgh AcHefaG8em/OrvQZcJwmVEQmtAd8E0Qbzur2QAhbrUttuRkpC8oZagT1d7R/VzBEQqh1 AxwvaA5ijGeFn4rwUqQkppiKMEiNiEiLzH+yGFULo/lS+z136G1CPNvgxwQhY6deRFrd 9pfn0RfjfCzcuLhwHyTp7a2pjgThCagr8RuyYFmhhl9z4Vbez8lIl4Wv8TgEGCcfwD2h nW8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015732; x=1782620532; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=fZtTWxiy3Ogv5B/0u608EIP34SRmRANB8iJf3S8OoUw=; b=WPP+7GtUDzmK57xpjbTpv6mBUmo6JybEoVtRShhGpuhdNFDLyLlmymcpFHSJU2aZox gxtz0IoOf135GcX+9JWNXIctl6aOzxJPxa4BBoQdjYpoTOAxvxBqeA4q+ePhlIhHb3aI aJ5NJQeXdcIMNbT93cWHn4GxTJIRYfeHxCffBkFf4+06LtamUsJ4rOJZWdfYfNQLBwxK xuNbEYAJpwEu+av17E+ixeWCP4GkzB9pdnLeuk4vsOQ2v7LwYCr9+Fine9VpfXCMk5Oq V2QycDoclyIXX5PuY14L7prqlZPFBJkdgSaGv8A3mSK7gGM3vcZTN6nS7o1xrUtaF9NC ngEQ== X-Gm-Message-State: AOJu0YzodGDDahpyvRdl5AJ4AFWA8nRK6+QTPFn6A9Tmks1pfgIrV9Wl BSozzYPgY9ou3lidsNoAwZs0jL0zOVjIg8Trf0znAnLD9Cu4pI6N3vSptulIeoyCDiE= X-Gm-Gg: AfdE7clyBCBFeVXcAsSnZuRSyt2ifYVxD7MDhyHxs9p8T4rVAjol/GTnpAGVXuoBX2c VtEwRAEcKoNwVu2jKLDBleCvqOsUrrCdmCBLWE3JhO6P74ZQExzfzDzWhZphcjzWDd/pjm7Tzbv 75EwB2vrUmnpp9s3oObFPXI1bZqLDssgumiqT1BdGAS/IEcENWFgQ+a0wKzRbbYZKYBkkFit8E5 yNW+X/j7sypOmiiIbz9cO/v1CLdEkTQQwwe6uV0njb/B+MyybtIlWeXUwS4OXaRDG2+SqU3AIZT G/QtjvGnMfPF0bs9CZoj1Rf/14JgJJ7rpQw7kJW966BXbzRSyNzepUSLujGC9sWymOeWXltQJn7 mczWqK6gb/YU0K25CKYlFs6XBGJ9RIDVAlSPROClVGkxEr57b4G3evGkgiGJGlj6EF1IhKeTWnK s= X-Received: by 2002:a05:6820:4c09:b0:69d:9c7d:3346 with SMTP id 006d021491bc7-6a0d88787e6mr8205749eaf.12.1782015731752; Sat, 20 Jun 2026 21:22:11 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:09 -0600 Subject: [PATCH v3 22/40] bsd-user: Add kqueue and kevent functions to os-time.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-22-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Sean Bruno , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8128; i=imp@bsdimp.com; h=from:subject:message-id; bh=oomaEER0LpPMa4qFyXb1t1OChGdT1wqYWjUwZX0tLhc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/Lx8CpF4JmHBs8FA2PCXNbLkX6ukL9XmIb Mhd2/NoqcaJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR ANl2D/0YigkDyVkOz0VK3EYPLasrFbvMAl24gM2Art/vGi4xEjpWnwGl1xGgRhUHwBQTOMjgKIP 3PgXzTRSZh+ggIe814gI6uakbTGEFFQlcZAgWDNOfGyUvt8xl612440E6c6P+h+D0HQh39KYzt4 PRvzP2HS9vb2pTZWzAs9Oat0HCg8LErJd+iF9JzBbGaUGEp9PDUe6FtRuoc0CUshSRHHfLMnHcg ZardfSCDIAw3837gPjHqdIciTZDEOMTfQDaQirB/ryyZSptsxPkZK4dXas7Dz8pupfI9cEvtKGn EQzR+8CjOKtf9qfAuzJ4Hw/5ntfXq0nckXTbyjOw/l/nUGlj+67I/JOuHWggmB4YHxTf2o0pzdH v/TN5Hs/hum9tGDEcV8uhdsuhb7RgoaPWEFHS/Qfs2BSSPlILLkcUt4+lqRtkVjoolIMJn99SpL ZX/504gzvc6bwDUxhOZgB0pfy7AVcTlG5v3NzBE/lu69SPqhPK56Pc4+Bl2LMeoI959/7seP8QG sEDM+IiBq5eXYgsW537VFezYFGxfi3QMasxptYXvpiYLsmtOkplziUN9+QtFUIEF4pmpzrn70mS 0rIYLZi5UKlL+7YtTOOijuOrojKv+e3i4ovL7iHBB8s3+PkiLSgnN7+Gt9fGBbWIrUh7LdhgIpm 6bL11yEr+gwi9rw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2c; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015989272154100 Add event notification system call shims: kqueue, freebsd11_kevent (legacy 32-bit data field), and kevent (with 64-bit ext fields). Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Sean Bruno Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-time.h | 173 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 173 insertions(+) diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h index 5f537fac40..302872dd8e 100644 --- a/bsd-user/freebsd/os-time.h +++ b/bsd-user/freebsd/os-time.h @@ -635,5 +635,178 @@ static inline abi_long do_freebsd_ppoll(CPUArchState = *env, abi_long arg1, } =20 /* kqueue(2) */ +static inline abi_long do_freebsd_kqueue(void) +{ + + return get_errno(kqueue()); +} + +/* kevent(2) */ +/* XXX Maybe some day, consolidate these two... */ +static inline abi_long do_freebsd_freebsd11_kevent(abi_long arg1, + abi_ulong arg2, abi_long arg3, abi_ulong arg4, abi_long arg5, abi_long= arg6) +{ + abi_long ret; + struct kevent *changelist =3D NULL, *eventlist =3D NULL; + struct target_freebsd11_kevent *target_changelist, *target_eventlist; + struct timespec ts; + int i; + + if (arg3 !=3D 0) { + target_changelist =3D lock_user(VERIFY_READ, arg2, + sizeof(*target_changelist) * arg3, 1= ); + if (target_changelist =3D=3D NULL) { + return -TARGET_EFAULT; + } + + changelist =3D alloca(sizeof(struct kevent) * arg3); + memset(changelist, '\0', sizeof(struct kevent) * arg3); + for (i =3D 0; i < arg3; i++) { + __get_user(changelist[i].ident, &target_changelist[i].ident); + __get_user(changelist[i].filter, &target_changelist[i].filter); + __get_user(changelist[i].flags, &target_changelist[i].flags); + __get_user(changelist[i].fflags, &target_changelist[i].fflags); + __get_user(changelist[i].data, &target_changelist[i].data); + /* __get_user(changelist[i].udata, &target_changelist[i].udata= ); */ +#if TARGET_ABI_BITS =3D=3D 32 + changelist[i].udata =3D (void *)(uintptr_t)target_changelist[i= ].udata; + tswap32s((uint32_t *)&changelist[i].udata); +#else + changelist[i].udata =3D (void *)(uintptr_t)target_changelist[i= ].udata; + tswap64s((uint64_t *)&changelist[i].udata); +#endif + } + unlock_user(target_changelist, arg2, 0); + } + + if (arg5 !=3D 0) { + eventlist =3D alloca(sizeof(struct kevent) * arg5); + } + if (arg6 !=3D 0) { + if (t2h_freebsd_timespec(&ts, arg6)) { + return -TARGET_EFAULT; + } + } + ret =3D get_errno(safe_kevent(arg1, changelist, arg3, eventlist, arg5, + arg6 !=3D 0 ? &ts : NULL)); + + if (arg5 =3D=3D 0) { + return ret; + } + + if (!is_error(ret)) { + target_eventlist =3D lock_user(VERIFY_WRITE, arg4, + sizeof(*target_eventlist) * arg5, 0); + if (target_eventlist =3D=3D NULL) { + return -TARGET_EFAULT; + } + for (i =3D 0; i < ret; i++) { + __put_user(eventlist[i].ident, &target_eventlist[i].ident); + __put_user(eventlist[i].filter, &target_eventlist[i].filter); + __put_user(eventlist[i].flags, &target_eventlist[i].flags); + __put_user(eventlist[i].fflags, &target_eventlist[i].fflags); + __put_user(eventlist[i].data, &target_eventlist[i].data); + /* __put_user(eventlist[i].udata, &target_eventlist[i].udata);= */ +#if TARGET_ABI_BITS =3D=3D 32 + tswap32s((uint32_t *)&eventlist[i].udata); + target_eventlist[i].udata =3D (uintptr_t)eventlist[i].udata; +#else + tswap64s((uint64_t *)&eventlist[i].udata); + target_eventlist[i].udata =3D (uintptr_t)eventlist[i].udata; +#endif + } + unlock_user(target_eventlist, arg4, + sizeof(*target_eventlist) * ret); + } + return ret; +} + +/* kevent(2) */ +static inline abi_long do_freebsd_kevent(abi_long arg1, abi_ulong arg2, + abi_long arg3, abi_ulong arg4, abi_long arg5, abi_long arg6) +{ + abi_long ret; + struct kevent *changelist =3D NULL, *eventlist =3D NULL; + struct target_freebsd_kevent *target_changelist, *target_eventlist; + struct timespec ts; + int i; + + if (arg3 !=3D 0) { + target_changelist =3D lock_user(VERIFY_READ, arg2, + sizeof(struct target_freebsd_kevent) * arg3, 1); + if (target_changelist =3D=3D NULL) { + return -TARGET_EFAULT; + } + + changelist =3D alloca(sizeof(struct kevent) * arg3); + for (i =3D 0; i < arg3; i++) { + __get_user(changelist[i].ident, &target_changelist[i].ident); + __get_user(changelist[i].filter, &target_changelist[i].filter); + __get_user(changelist[i].flags, &target_changelist[i].flags); + __get_user(changelist[i].fflags, &target_changelist[i].fflags); + __get_user(changelist[i].data, &target_changelist[i].data); + /* __get_user(changelist[i].udata, &target_changelist[i].udata= ); */ +#if TARGET_ABI_BITS =3D=3D 32 + changelist[i].udata =3D (void *)(uintptr_t)target_changelist[i= ].udata; + tswap32s((uint32_t *)&changelist[i].udata); +#else + changelist[i].udata =3D (void *)(uintptr_t)target_changelist[i= ].udata; + tswap64s((uint64_t *)&changelist[i].udata); +#endif + __get_user(changelist[i].ext[0], &target_changelist[i].ext[0]); + __get_user(changelist[i].ext[1], &target_changelist[i].ext[1]); + __get_user(changelist[i].ext[2], &target_changelist[i].ext[2]); + __get_user(changelist[i].ext[3], &target_changelist[i].ext[3]); + } + unlock_user(target_changelist, arg2, 0); + } + + if (arg5 !=3D 0) { + eventlist =3D alloca(sizeof(struct kevent) * arg5); + } + if (arg6 !=3D 0) { + if (t2h_freebsd_timespec(&ts, arg6)) { + return -TARGET_EFAULT; + } + } + ret =3D get_errno(safe_kevent(arg1, changelist, arg3, eventlist, arg5, + arg6 !=3D 0 ? &ts : NULL)); + + if (arg5 =3D=3D 0) { + return ret; + } + + if (!is_error(ret)) { + target_eventlist =3D lock_user(VERIFY_WRITE, arg4, + sizeof(struct target_freebsd_kevent) * arg5, 0); + if (target_eventlist =3D=3D NULL) { + return -TARGET_EFAULT; + } + for (i =3D 0; i < ret; i++) { + __put_user(eventlist[i].ident, &target_eventlist[i].ident); + __put_user(eventlist[i].filter, &target_eventlist[i].filter); + __put_user(eventlist[i].flags, &target_eventlist[i].flags); + __put_user(eventlist[i].fflags, &target_eventlist[i].fflags); + __put_user(eventlist[i].data, &target_eventlist[i].data); + /* __put_user(eventlist[i].udata, &target_eventlist[i].udata);= */ +#if TARGET_ABI_BITS =3D=3D 32 + tswap32s((uint32_t *)&eventlist[i].udata); + target_eventlist[i].udata =3D (uintptr_t)eventlist[i].udata; +#else + tswap64s((uint64_t *)&eventlist[i].udata); + target_eventlist[i].udata =3D (uintptr_t)eventlist[i].udata; +#endif + __put_user(eventlist[i].ext[0], &target_eventlist[i].ext[0]); + __put_user(eventlist[i].ext[1], &target_eventlist[i].ext[1]); + __put_user(eventlist[i].ext[2], &target_eventlist[i].ext[2]); + __put_user(eventlist[i].ext[3], &target_eventlist[i].ext[3]); + } + unlock_user(target_eventlist, arg4, + sizeof(struct target_freebsd_kevent) * ret); + } + return ret; +} + +/* sigtimedwait(2) */ =20 #endif /* FREEBSD_OS_TIME_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016018; cv=none; d=zohomail.com; s=zohoarc; b=diY2rJnEk+2pHtZ0qAv1Q1v8tLkgw48EgMxmuEt/Vv3BIf6g1f/0vGtt7dw5343Ax/cIACJerBFnspgFWy5lDhm8PUbtcveF+L3KimKSIeB3laoDpqev9fOM2+NCnYM2JdSP0yneSHgfF5CMaGgHetKGR+MX+CwMCJSbN8nDapk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016018; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ZeLri0UoJ+LgD9fWncJ4nGz+W8q9eJoDlnOI4fc143k=; b=OuP6NUk2rAqCUnxJZQGPLySBkJ7SmGuoyqHMncWdGwrBjVFgBO58P7qEbUvwC5rTcn3I7bpreiFjOyk4DSFOSCoL4ZBBMm79A+qnTLzxN0g+NK85kXVgrVrNVBs/0UyipuivCn5opYwVTnADaPyumRRgP7Jo2BzP/Kf5K7LqJO0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016018834305.34627193557606; Sat, 20 Jun 2026 21:26:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hO-00033D-KF; Sun, 21 Jun 2026 00:22:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hI-00032I-CN for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:16 -0400 Received: from mail-oo1-xc41.google.com ([2607:f8b0:4864:20::c41]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hG-0005Fc-DX for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:16 -0400 Received: by mail-oo1-xc41.google.com with SMTP id 006d021491bc7-6a0c604b9cfso2769672eaf.0 for ; Sat, 20 Jun 2026 21:22:14 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015733; x=1782620533; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ZeLri0UoJ+LgD9fWncJ4nGz+W8q9eJoDlnOI4fc143k=; b=jij5pyWFpKhW/orH9oMQJpgnMyyU2/JLefl1MCab1eGhachPTVdmTerZxqG4veS/nE 6Q/y61rcL6zmgZWgmINaE8M1eI8D/h4GtzSi8Q/pR3932hNakushVoFy2uYCeylLKW8x N6bfhQ4oWbcz5k41jV5SpjXwa2QCwtIsgW/Edbpv3mvhK3Yg587baozQTMdKWKrwg35L AVuO/jOJlFp9Ok6VFt1GXG7ZFa4CRgZ52ujhIcD7VEIdsA9+CRqzlRsLT5hB8P7Pg8jG eZa2UpcN7BVTQEv5QIYVfRSa+WjMXWuT0ZkKLu941QP/Aly4K38epUEnE1d7s8hgHxvS 0hYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015733; x=1782620533; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ZeLri0UoJ+LgD9fWncJ4nGz+W8q9eJoDlnOI4fc143k=; b=CAAitAnC2aPVZol8sesdVYxKcHlZY/bi3iVV/XapFhVSlDCeA41Gi0SfMQjfbAbTR8 5STec796YQ0hWIyjf2DdonrDnRJOiKhBfwkMAzsyePMGCzdUpv6xbfGwEUbYulf0u8Oo mQkpY4cDZ46+yem9dDlvH5zXv5GTiWhRz0flL3GzE7WRQQ6IduGi5/3QPtHUbFvZ20Tn f8X5C65iv/vhbpMVKPbg2UkxryP9H8bHbUo/rfFB4dJWPPkh/qBnRdoQ0BIXC5Ajpxxh ZT1Xdmolf1Rh/ZnFLlM42lLmzWIINE8dLU2YrgDyTIQlxVKtls9qHYiGHU/51Rjvv0Tp uXTA== X-Gm-Message-State: AOJu0Yz+fnQHC5tarSXgv66Ni/kziux74ORWpo3vXT9hqMJy5MCEorSh 3yafcgrbt2kO01ZBUuXexVC1dw5edep/PqZM07iIwUMzjZlkixRuN0yzL+L2SzhcHWM= X-Gm-Gg: AfdE7clrB++HM0/g7Msrokr8uUHygm8827twERhwevLvgQSHBO3Tgwx16JskYcMhlS3 3CDUgNTOhMGah7mVAwlemY6LyFGUNmRlyuDqTUBGQ0zTYCXS1sZB6Jrid1mBUGR5RIREkP0FwCS OhBPri7MabcNC0h6YC2NABoU8VvVIc8erEE4oJ1HOT0rsNd83ze2FNTkkYtH3mDkx2LDRXDyvbJ xORFO7Yl9Z8YL4mJz5wRDZvoj1E1xfqLMuP+Km6kqbI8dZ6pe8PzkwSf5oMn0ZCZJTbq7I/MyTu T00Nbo0QgWr7hMmit52JrqQZsPG1wBXGQph5EHKWNcQolqT1PQWyM48bIZyG4YIIocksX8q6sTL JaB0fmEzj10e8iKmFsW+t7tR02wbZ/OUYM3as4Hvm0uQQqOW3MGBeNfZMSvrvSAkFUS4lXvPM3W Y= X-Received: by 2002:a05:6820:2d05:b0:6a0:c75f:112b with SMTP id 006d021491bc7-6a0eb55d46amr4527436eaf.50.1782015733346; Sat, 20 Jun 2026 21:22:13 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:10 -0600 Subject: [PATCH v3 23/40] bsd-user: Add sigtimedwait, itimer, and futimens to os-time.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-23-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8202; i=imp@bsdimp.com; h=from:subject:message-id; bh=D6fEn5Wv+jGArcpmWZAyFs6/+mAY1PpuHu0njk7ak3E=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/RQVAW+QVvzT/m5uf1r0+sy3w+33DyOt1G ycZ4laJOj+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR APkKD/4l2DpNDuw4XwLkjnLURy8ys3QFzvuzXjpboDfaksP1eJ7V2f5eHEoVe7TWDm4RowRMM1P 9DQCd6qpwkTejf8iZfBrQnfCQbAg89qGsp4G/Vdwhs8mV1LFhrXQ06oF0Kvkvuvg+Ps8mcZ0FxQ 7uVqGfi1nsFjNPB/az6a2q9nhGMf4xaqxWXOXC8zUTsfduZ1JuLxVuwVDlDzXOOvonZNEGnaXVP MT5cz6//XUoePmm0QlDuPGjdu7FpoHCcXO+VBg5hl6wKJoz3ph2raasDQArz71RM412BHxeIRqT 0sj9+Uv3r4FVqeoaSl7yzTnSVscYWZ8WvO6uAv2qV1R9c08ikTHXUsKiaS12ZVNhf/0UKNsHUBq v0XOEWYfmw1zmlaZJ0Vx9EScXftON4Bwnh70I0DNwfsiQfTe2cmTGGNCknHoZ7fuI8LqmFaiW/L dFdvdAbCiEdZFvz3QukjdCiRvOEa+mxhNfoQLzEkrvY15l2+ILM/Uv2Nh7zTs85BAXYYyjrY+R6 7weEnuK6CCQbs0rWGinOFg5ApooyJ5KYNN2zqYhJOK38r2O1w4URSYqjX+CW4512xVDLPAwqa35 /Y7tkyF1icJspnw/NUrPDeZrWojfVgwwqAJQL3eXTDA5vbsOFftJf0jNiLui5oNbSQc09FJusHp +VQnYZeHSC2d+5Q== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c41; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc41.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016019802154100 Complete os-time.h with sigtimedwait, setitimer, getitimer, clock_getcpuclockid2, futimens, and utimensat system call shims. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-time.h | 194 +++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 184 insertions(+), 10 deletions(-) diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h index 302872dd8e..05cb5db7d1 100644 --- a/bsd-user/freebsd/os-time.h +++ b/bsd-user/freebsd/os-time.h @@ -128,19 +128,19 @@ static inline abi_long do_freebsd_gettimeofday(abi_ul= ong arg1, abi_ulong arg2) struct timeval tv; struct timezone tz, *target_tz; /* XXX */ =20 - if (arg2 !=3D 0) { - if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) { - return -TARGET_EFAULT; - } - __get_user(tz.tz_minuteswest, &target_tz->tz_minuteswest); - __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); - unlock_user_struct(target_tz, arg2, 1); - } ret =3D get_errno(gettimeofday(&tv, arg2 !=3D 0 ? &tz : NULL)); if (!is_error(ret)) { if (h2t_freebsd_timeval(&tv, arg1)) { return -TARGET_EFAULT; } + if (arg2 !=3D 0) { + if (!lock_user_struct(VERIFY_WRITE, target_tz, arg2, 0)) { + return -TARGET_EFAULT; + } + __put_user(tz.tz_minuteswest, &target_tz->tz_minuteswest); + __put_user(tz.tz_dsttime, &target_tz->tz_dsttime); + unlock_user_struct(target_tz, arg2, 1); + } } =20 return ret; @@ -153,12 +153,12 @@ static inline abi_long do_freebsd_settimeofday(abi_lo= ng arg1, abi_long arg2) struct timezone tz, *target_tz; /* XXX */ =20 if (arg2 !=3D 0) { - if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 0)) { + if (!lock_user_struct(VERIFY_READ, target_tz, arg2, 1)) { return -TARGET_EFAULT; } __get_user(tz.tz_minuteswest, &target_tz->tz_minuteswest); __get_user(tz.tz_dsttime, &target_tz->tz_dsttime); - unlock_user_struct(target_tz, arg2, 1); + unlock_user_struct(target_tz, arg2, 0); } if (t2h_freebsd_timeval(&tv, arg1)) { return -TARGET_EFAULT; @@ -601,6 +601,7 @@ static inline abi_long do_freebsd_ppoll(CPUArchState *e= nv, abi_long arg1, /* Unlike poll(), ppoll() uses struct timespec. */ if (arg3) { if (t2h_freebsd_timespec(&ts, arg3)) { + unlock_user(target_pfd, arg1, 0); return -TARGET_EFAULT; } ts_ptr =3D &ts; @@ -611,6 +612,7 @@ static inline abi_long do_freebsd_ppoll(CPUArchState *e= nv, abi_long arg1, if (arg4 !=3D 0) { p =3D lock_user(VERIFY_READ, arg4, sizeof(target_sigset_t), 1); if (p =3D=3D NULL) { + unlock_user(target_pfd, arg1, 0); return -TARGET_EFAULT; } target_to_host_sigset(&tstate->sigsuspend_mask, p); @@ -808,5 +810,177 @@ static inline abi_long do_freebsd_kevent(abi_long arg= 1, abi_ulong arg2, } =20 /* sigtimedwait(2) */ +static inline abi_long do_freebsd_sigtimedwait(abi_ulong arg1, abi_ulong a= rg2, + abi_ulong arg3) +{ + abi_long ret; + void *p; + sigset_t set; + struct timespec uts, *puts; + siginfo_t uinfo; + + p =3D lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + target_to_host_sigset(&set, p); + unlock_user(p, arg1, 0); + if (arg3) { + puts =3D &uts; + ret =3D t2h_freebsd_timespec(puts, arg3); + if (ret !=3D 0) { + return ret; + } + } else { + puts =3D NULL; + } + ret =3D get_errno(sigtimedwait(&set, &uinfo, puts)); + if (!is_error(ret) && arg2) { + p =3D lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + host_to_target_siginfo(p, &uinfo); + unlock_user(p, arg2, sizeof(target_siginfo_t)); + } + return ret; +} + +/* setitimer(2) */ +static inline abi_long do_freebsd_setitimer(int arg1, abi_ulong arg2, + abi_ulong arg3) +{ + abi_long ret =3D 0; + struct itimerval value, ovalue, *pvalue; + + if (arg2) { + pvalue =3D &value; + if (t2h_freebsd_timeval(&pvalue->it_interval, arg2) || + t2h_freebsd_timeval(&pvalue->it_value, + arg2 + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + } else { + pvalue =3D NULL; + } + ret =3D get_errno(setitimer(arg1, pvalue, &ovalue)); + if (!is_error(ret) && arg3) { + if (h2t_freebsd_timeval(&ovalue.it_interval, arg3) || + h2t_freebsd_timeval(&ovalue.it_value, + arg3 + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + } + return ret; +} + +/* getitimer(2) */ +static inline abi_long do_freebsd_getitimer(int arg1, abi_ulong arg2) +{ + abi_long ret =3D 0; + struct itimerval value; + + ret =3D get_errno(getitimer(arg1, &value)); + if (!is_error(ret) && arg2) { + if (h2t_freebsd_timeval(&value.it_interval, arg2) || + h2t_freebsd_timeval(&value.it_value, + arg2 + sizeof(struct target_freebsd_timeval))) { + return -TARGET_EFAULT; + } + } + return ret; +} + +/* clock_getcpuclockid2(id_t, int, clockid_t *) Not documented. */ +static inline abi_long do_freebsd_clock_getcpuclockid2(abi_ulong arg1, + abi_ulong arg2, abi_ulong arg3, abi_ulong arg4) +{ + abi_long ret =3D 0; + id_t id; /* 64-bit value */ + int which; + abi_ulong target_clk_id_addr; + clockid_t clk_id; + +#if TARGET_ABI_BITS =3D=3D 32 + id =3D (id_t)target_arg64(arg1, arg2); + which =3D (int)arg3; + target_clk_id_addr =3D arg4; +#else + id =3D (id_t)arg1; + which =3D (int)arg2; + target_clk_id_addr =3D arg3; +#endif + + if (target_clk_id_addr =3D=3D 0) { + return -TARGET_EINVAL; + } + + switch (which) { + case TARGET_CPUCLOCK_WHICH_PID: + ret =3D get_errno(clock_getcpuclockid2(id, CPUCLOCK_WHICH_PID, &cl= k_id)); + break; + + case TARGET_CPUCLOCK_WHICH_TID: + ret =3D get_errno(clock_getcpuclockid2(id, CPUCLOCK_WHICH_TID, &cl= k_id)); + break; + + default: + ret =3D -TARGET_EINVAL; + break; + } + + if (!ret && put_user_s32(clk_id, target_clk_id_addr)) { + ret =3D -TARGET_EFAULT; + } + + return ret; +} + +static inline abi_long do_freebsd_futimens(abi_ulong arg1, + abi_ulong arg2) +{ + struct timespec *tvp, tv[2]; + + if (arg2 !=3D 0) { + if (t2h_freebsd_timespec(&tv[0], arg2) || + t2h_freebsd_timespec(&tv[1], arg2 + + sizeof(struct target_freebsd_timespec))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + return get_errno(futimens(arg1, tvp)); +} + +static inline abi_long do_freebsd_utimensat(abi_ulong arg1, + abi_ulong arg2, abi_ulong arg3, abi_ulong arg4) +{ + abi_long ret =3D 0; + void *p; + struct timespec *tvp, tv[2]; + + if (arg3 !=3D 0) { + if (t2h_freebsd_timespec(&tv[0], arg3) || + t2h_freebsd_timespec(&tv[1], arg3 + + sizeof(struct target_freebsd_timespec))) { + return -TARGET_EFAULT; + } + tvp =3D tv; + } else { + tvp =3D NULL; + } + + p =3D lock_user_string(arg2); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(utimensat(arg1, p, tvp, + target_to_host_bitmask(arg4, fcntl_flags_tbl))); + unlock_user(p, arg2, 0); + return ret; +} =20 #endif /* FREEBSD_OS_TIME_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015843; cv=none; d=zohomail.com; s=zohoarc; b=RUjCvwB1Czf3QtpPe5dFOCiMNRq+YB1gjOtFwx9TMZHKhXTBlD1vSgQJlFgT9xP5SkjU+VHS71MZKBMVad3NVLzWxcxfxwAvYKrQKslhnoB9UgYAJuvozOKIZFZYw/nnDobzL6acqPop1dnkXw6+XOn7LYg7MewOJgSpOtftyaM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015843; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BDz37YC4bcgkW0tuPGKW/LUaIeLYBTqWDlCJVuRS06g=; b=bbgVMVSL+mNpQEeExjcE7qG7/1Y3dg7pgNLfNZgBrYAJWLagmdiQqzEq8PI+FYaogMjfjCbLvkhXNfboIzc5uvdW2j+1bTHtjMW4U3FpWNjbZ8nwE4/kzi8ZhiENPcYWxLCmjHblH5PWh7CgwD0f3kH0RVlLH/itB5ONZQ43xPM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015843124299.5573095182382; Sat, 20 Jun 2026 21:24:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hT-00034e-GJ; Sun, 21 Jun 2026 00:22:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hK-00032r-SU for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:18 -0400 Received: from mail-oo1-xc42.google.com ([2607:f8b0:4864:20::c42]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hI-0005G7-BJ for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:18 -0400 Received: by mail-oo1-xc42.google.com with SMTP id 006d021491bc7-6a0e55e82d0so1037056eaf.1 for ; Sat, 20 Jun 2026 21:22:15 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015735; x=1782620535; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BDz37YC4bcgkW0tuPGKW/LUaIeLYBTqWDlCJVuRS06g=; b=i3W25EFCgpzEAjGt9dfiys0d+i9fOh/IkA+PwJbxym4809wGjidZ5dqFiSzYbgW0TP 7Pq4vO/enH3muS40bQt4/yjkdw23tC4HD8LYEXgyXZwu6HascAxrfk0EHehOJYe6dThm jbOBO76HUVosYuEQjbgvtnjFmbJl87BHZ5baAqmeOoU1K6YVis3ib5HvBE69XKSkgGpm REN2exNz2jd8C8n37A6dOILs+bvfPViXoEdC3vZItgqx5VWJDNxC7cnuayRMs2TFwWAG 3lgOT9R56NefBcv+K2wTBc2G3Kczm0a/mnsjVv73+qaxZAa5XJ4beN6tG7UTJ5CTAApH Xa0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015735; x=1782620535; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=BDz37YC4bcgkW0tuPGKW/LUaIeLYBTqWDlCJVuRS06g=; b=JWSfP48iF8Ypez/ZqODacVRQGPSNKnZ2vG6GeUI9pFTTfXA/QauCf8xGAOVPKYx3c+ OAq7tYn8Qf9YCTALoNn5dzjKFT+26UP2SA0xDuewtIeup9Rmg7Vkxzq2B8DGMfv8eeOB Wgr3IU5PbrcOSfYMSlskvRDQHg/r3isQrvPMec/vLg78BOFIn4RH5aUCVFXHc0pojzp1 17PjQRdO5BK7LL0GIFpiWDGhcBr+uflBVo2r6X1QVxbPFWz5Z/0t6Z0nSAUr4yo5JHvs b5ySd7Q3tff6TljlCpZFLMgmscgjoqYBYqmzOj4JQ23Ad7Hw1pb1o830l5zSbUy67pMx ikrQ== X-Gm-Message-State: AOJu0Yxde00t1/csiOncP19Vi1rWwwiSGFjFSFqRiO6cOOXvnLXTwPcA CNkrvd7apOazmAybt17HXolovsdAIfdne7OeCf/8T+sfPeLWLyER3Mc97s34mXJv8/8= X-Gm-Gg: AfdE7clxrgbRBsVtZFvp5nwnyxAeiENQOjnirlYmj47Q8g4i0MHZiGW+MD1aoHFLSHi E3/qbzeZTXUyLKNr/BTUpPf+gFXIq2YJoVnBFPoVT+yShZK/H8/DC2qvGHRWtk0LIZuVl+7osKY v+oVdu1mv0ygMAUm9VhexMywK2Fyg6d+aYtMZik6jDn99FjHeVN/sBXt5oq03CfQAlh4GCUFcXS CsHwe6c8HALymTvzMPxA8gGhsAiNo+JFyiunP0OGmW7YbYEmAkNxRsOOgTA+ZypL3NIdK+cks3/ 2FrNMwuBxnbceTLnLAMnHsszJyiLYJBaZTOKMwxagM+uWjWCBek/JcmA79ILFJ+h/1KHxIVHYJF bNkN2Cg17P3W0Xw9N4glNQLvq5yH9pmOIe9JO194/7F6QEaMEJEq/w04YlAn7wklzbudeuXeYM1 I= X-Received: by 2002:a05:6820:1994:b0:69e:59af:ec9d with SMTP id 006d021491bc7-6a0d8cd2456mr8235016eaf.31.1782015734954; Sat, 20 Jun 2026 21:22:14 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:11 -0600 Subject: [PATCH v3 24/40] bsd-user: Add os-time.c and time-related type definitions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-24-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , =?utf-8?q?Mika=C3=ABl_Urankar?= , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=13573; i=imp@bsdimp.com; h=from:subject:message-id; bh=ruW/yBlErjC5oIhCWPmQ7M5tE5ufI83JOXS54syPx3c=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/G7fWECIaPWQPx6F4eNgwzoDKODzsrc49t 7RIQ6PB+Z+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR AB+VD/9iC13nUiIo7GM1iCpi2yolVvxvRCbbwAwKBDZ1yoNygvFYz2tmKXkLemHVG3HQM0WGWdR u6i1tufeUpGJKojrtvUVxuYoDYL9GRyG7aLZ7E36pEfRTV8fotPslaRpJl1bw8Lifgx+fzdjKhU NE96vcFRIQs4oTgNh6JwVV6yeV0cVkEymwXsmhez7cxUdvHCi7uSnLMc0zohvJ1iKQ5CMrufk7t xrWIQB/4b35TXZQCtYJHf0Qtxfj2tQr7qdDuDco0dWsn9k1dHkzun/GUOMmULMF7e02C83mTaAj Wd4pCjTejYY9iDr2QzAIEXEi3qSYrtk0Zq9HTtdB3FZgT20hzLspxPBexCTTgO1Dhz/EauSgN2r lS5PejbhqE78MltuJ+4mrNiDqyjtV1fD88p4xPAshiePuCWLzCfOXfuwa5MeIHgOH38QN9WkgU2 MejCLZVDs0WsQf5vFAcnI6mNcQ9ZuS/fg0VjmoJduyk83/njgsb46HLGFzHZk51YKzeSOIJuNfB quXnUAnD/KjRwA6/jsAjFi5QGnpZszUBdd88DLRn8XbT5M+piTXEASuDRqyqcncTJtKI9G/PEk9 P299N0tJWRLO9hVTgC8ln3ceqYSBVVPKxGFl7ixpcn/Oaae58UP+p042BkR/f/0rKyLtCgSAUJU 5+/X3P7CFOYrhXw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c42; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc42.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015846415154100 Add os-time.c with time conversion helpers (t2h/h2t functions for timespec, timeval, timex, ntptimeval, itimerspec) and POSIX timer helper functions. Also add target_freebsd_timex, target_freebsd_ntptimeval, target_freebsd_itimerspec, kevent structures, and timer definitions to syscall_defs.h. Signed-off-by: Stacey Son Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/meson.build | 3 +- bsd-user/freebsd/os-syscall.c | 2 + bsd-user/freebsd/os-time.c | 347 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-time.h | 3 + 4 files changed, 354 insertions(+), 1 deletion(-) diff --git a/bsd-user/freebsd/meson.build b/bsd-user/freebsd/meson.build index 83593a1e20..163d5657db 100644 --- a/bsd-user/freebsd/meson.build +++ b/bsd-user/freebsd/meson.build @@ -8,6 +8,7 @@ bsd_user_ss.add(files( 'os-socket.c', 'os-stat.c', 'os-sys.c', - 'os-syscall.c'), + 'os-syscall.c', + 'os-time.c'), bsd_syscall_nr ) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 6fbd2da261..020d16fda3 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -98,6 +98,8 @@ safe_syscall6(int, kevent, int, kq, const struct kevent *= , changelist, int, nchanges, struct kevent *, eventlist, int, nevents, const struct timespec *, timeout); =20 +int g_posix_timers[32] =3D { 0, } ; + /* used in os-proc */ safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options, struct rusage *, rusage); diff --git a/bsd-user/freebsd/os-time.c b/bsd-user/freebsd/os-time.c new file mode 100644 index 0000000000..0dae7dc008 --- /dev/null +++ b/bsd-user/freebsd/os-time.c @@ -0,0 +1,347 @@ +/* + * FreeBSD time related system call helpers + * + * Copyright (c) 2013-2015 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" + +#include +#include +#include +#include +#include +#include + +#include "qemu.h" +#include "qemu-os.h" + +/* + * FreeBSD time conversion functions + */ +abi_long t2h_freebsd_timeval(struct timeval *tv, abi_ulong target_tv_addr) +{ + struct target_freebsd_timeval *target_tv; + + if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(tv->tv_sec, &target_tv->tv_sec); + __get_user(tv->tv_usec, &target_tv->tv_usec); + unlock_user_struct(target_tv, target_tv_addr, 0); + + return 0; +} + +abi_long h2t_freebsd_timeval(struct timeval *tv, abi_ulong target_tv_addr) +{ + struct target_freebsd_timeval *target_tv; + + if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(tv->tv_sec, &target_tv->tv_sec); + __put_user(tv->tv_usec, &target_tv->tv_usec); + unlock_user_struct(target_tv, target_tv_addr, 1); + + return 0; +} + +abi_long t2h_freebsd_timespec(struct timespec *ts, abi_ulong target_ts_add= r) +{ + struct target_freebsd_timespec *target_ts; + + if (!lock_user_struct(VERIFY_READ, target_ts, target_ts_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(ts->tv_sec, &target_ts->tv_sec); + __get_user(ts->tv_nsec, &target_ts->tv_nsec); + unlock_user_struct(target_ts, target_ts_addr, 0); + + return 0; +} + +abi_long h2t_freebsd_timespec(abi_ulong target_ts_addr, struct timespec *t= s) +{ + struct target_freebsd_timespec *target_ts; + + if (!lock_user_struct(VERIFY_WRITE, target_ts, target_ts_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(ts->tv_sec, &target_ts->tv_sec); + __put_user(ts->tv_nsec, &target_ts->tv_nsec); + unlock_user_struct(target_ts, target_ts_addr, 1); + + return 0; +} + +abi_long t2h_freebsd_umtx_time(abi_ulong target_ut_addr, + abi_ulong target_ut_size, void *host_t, size_t *host_tsz) +{ + abi_long ret; + + if (target_ut_size <=3D sizeof(struct target_freebsd_timespec)) { + ret =3D t2h_freebsd_timespec((struct timespec *)host_t, target_ut_= addr); + if (ret =3D=3D 0) { + *host_tsz =3D sizeof(struct timespec); + } + return ret; + } else { + struct target_freebsd__umtx_time *target_ut; + struct _umtx_time *ut =3D (struct _umtx_time *)host_t; + + if (!lock_user_struct(VERIFY_READ, target_ut, target_ut_addr, 1)) { + return -TARGET_EFAULT; + } + if (t2h_freebsd_timespec(&ut->_timeout, h2g(&target_ut->_timeout))= ) { + unlock_user_struct(target_ut, target_ut_addr, 0); + return -TARGET_EFAULT; + } + __get_user(ut->_flags, &target_ut->_flags); + __get_user(ut->_clockid, &target_ut->_clockid); + unlock_user_struct(target_ut, target_ut_addr, 0); + + if (target_ut_size > sizeof(struct target_freebsd__umtx_time)) { + *host_tsz =3D sizeof(struct _umtx_time) + sizeof(struct timesp= ec); + } else { + *host_tsz =3D sizeof(struct _umtx_time); + } + + return 0; + } +} + +abi_long t2h_freebsd_timex(struct timex *host_tx, abi_ulong target_tx_addr) +{ + struct target_freebsd_timex *target_tx; + + if (!lock_user_struct(VERIFY_READ, target_tx, target_tx_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(host_tx->modes, &target_tx->modes); + __get_user(host_tx->offset, &target_tx->offset); + __get_user(host_tx->freq, &target_tx->freq); + __get_user(host_tx->maxerror, &target_tx->maxerror); + __get_user(host_tx->esterror, &target_tx->esterror); + __get_user(host_tx->status, &target_tx->status); + __get_user(host_tx->constant, &target_tx->constant); + __get_user(host_tx->precision, &target_tx->precision); + __get_user(host_tx->tolerance, &target_tx->tolerance); + __get_user(host_tx->ppsfreq, &target_tx->ppsfreq); + __get_user(host_tx->jitter, &target_tx->jitter); + __get_user(host_tx->shift, &target_tx->shift); + __get_user(host_tx->stabil, &target_tx->stabil); + __get_user(host_tx->jitcnt, &target_tx->jitcnt); + __get_user(host_tx->calcnt, &target_tx->calcnt); + __get_user(host_tx->errcnt, &target_tx->errcnt); + __get_user(host_tx->stbcnt, &target_tx->stbcnt); + unlock_user_struct(target_tx, target_tx_addr, 0); + + return 0; +} + +abi_long h2t_freebsd_timex(abi_ulong target_tx_addr, struct timex *host_tx) +{ + struct target_freebsd_timex *target_tx; + + if (!lock_user_struct(VERIFY_WRITE, target_tx, target_tx_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_tx->modes, &target_tx->modes); + __put_user(host_tx->offset, &target_tx->offset); + __put_user(host_tx->freq, &target_tx->freq); + __put_user(host_tx->maxerror, &target_tx->maxerror); + __put_user(host_tx->esterror, &target_tx->esterror); + __put_user(host_tx->status, &target_tx->status); + __put_user(host_tx->constant, &target_tx->constant); + __put_user(host_tx->precision, &target_tx->precision); + __put_user(host_tx->tolerance, &target_tx->tolerance); + __put_user(host_tx->ppsfreq, &target_tx->ppsfreq); + __put_user(host_tx->jitter, &target_tx->jitter); + __put_user(host_tx->shift, &target_tx->shift); + __put_user(host_tx->stabil, &target_tx->stabil); + __put_user(host_tx->jitcnt, &target_tx->jitcnt); + __put_user(host_tx->calcnt, &target_tx->calcnt); + __put_user(host_tx->errcnt, &target_tx->errcnt); + __put_user(host_tx->stbcnt, &target_tx->stbcnt); + unlock_user_struct(target_tx, target_tx_addr, 1); + + return 0; +} + +abi_long h2t_freebsd_ntptimeval(abi_ulong target_ntv_addr, + struct ntptimeval *ntv) +{ + struct target_freebsd_ntptimeval *target_ntv; + + if (!lock_user_struct(VERIFY_WRITE, target_ntv, target_ntv_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(ntv->time.tv_sec, &target_ntv->time.tv_sec); + __put_user(ntv->time.tv_nsec, &target_ntv->time.tv_nsec); + __put_user(ntv->maxerror, &target_ntv->maxerror); + __put_user(ntv->esterror, &target_ntv->esterror); + __put_user(ntv->tai, &target_ntv->tai); + __put_user(ntv->time_state, &target_ntv->time_state); + unlock_user_struct(target_ntv, target_ntv_addr, 1); + + return 0; +} + +/* + * select(2) fdset copy functions + */ +abi_ulong copy_from_user_fdset(fd_set *fds, abi_ulong target_fds_addr, int= n) +{ + int i, nw, j, k; + abi_ulong b, *target_fds; + + nw =3D (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS; + target_fds =3D lock_user(VERIFY_READ, target_fds_addr, + sizeof(abi_ulong) * nw, 1); + if (target_fds =3D=3D NULL) { + return -TARGET_EFAULT; + } + FD_ZERO(fds); + k =3D 0; + for (i =3D 0; i < nw; i++) { + /* grab the abi_ulong */ + __get_user(b, &target_fds[i]); + for (j =3D 0; j < TARGET_ABI_BITS; j++) { + /* check the bit inside the abi_ulong */ + if ((b >> j) & 1) { + FD_SET(k, fds); + } + k++; + } + } + unlock_user(target_fds, target_fds_addr, 0); + + return 0; +} + +abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr, + abi_ulong target_fds_addr, int n) +{ + + if (target_fds_addr) { + if (copy_from_user_fdset(fds, target_fds_addr, n)) { + return -TARGET_EFAULT; + } + *fds_ptr =3D fds; + } else { + *fds_ptr =3D NULL; + } + + return 0; +} + +abi_long copy_to_user_fdset(abi_ulong target_fds_addr, const fd_set *fds, = int n) +{ + int i, nw, j, k; + abi_long v; + abi_ulong *target_fds; + + nw =3D (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS; + target_fds =3D lock_user(VERIFY_WRITE, target_fds_addr, + sizeof(abi_ulong) * nw, 0); + if (target_fds =3D=3D NULL) { + return -TARGET_EFAULT; + } + k =3D 0; + for (i =3D 0; i < nw; i++) { + v =3D 0; + for (j =3D 0; j < TARGET_ABI_BITS; j++) { + v |=3D ((FD_ISSET(k, fds) !=3D 0) << j); + k++; + } + __put_user(v, &target_fds[i]); + } + unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw); + + return 0; +} + +abi_int next_free_host_timer(void) +{ + int k ; + /* FIXME: Does finding the next free slot require a lock? */ + for (k =3D 0; k < ARRAY_SIZE(g_posix_timers); k++) { + if (g_posix_timers[k] =3D=3D 0) { + g_posix_timers[k] =3D 1; + return k; + } + } + return -1; +} + +int host_to_target_timerid(int timerid) +{ + int k; + + for (k =3D 0; k < ARRAY_SIZE(g_posix_timers); k++) { + if (g_posix_timers[k] =3D=3D timerid) { + return TIMER_MAGIC | k; + } + } + + return -1; +} + +abi_long target_to_host_itimerspec(struct itimerspec *host_itspec, + abi_ulong target_addr) +{ + struct target_freebsd_itimerspec *target_itspec; + + if (!lock_user_struct(VERIFY_READ, target_itspec, target_addr, 1)) { + return -TARGET_EFAULT; + } + + host_itspec->it_interval.tv_sec =3D + tswapal(target_itspec->it_interval.tv_sec); + host_itspec->it_interval.tv_nsec =3D + tswapal(target_itspec->it_interval.tv_nsec); + host_itspec->it_value.tv_sec =3D tswapal(target_itspec->it_value.tv_se= c); + host_itspec->it_value.tv_nsec =3D tswapal(target_itspec->it_value.tv_n= sec); + + unlock_user_struct(target_itspec, target_addr, 0); + return 0; +} + +abi_long host_to_target_itimerspec(abi_ulong target_addr, + struct itimerspec *host_its) +{ + struct target_freebsd_itimerspec *target_itspec; + + if (!lock_user_struct(VERIFY_WRITE, target_itspec, target_addr, 0)) { + return -TARGET_EFAULT; + } + + target_itspec->it_interval.tv_sec =3D tswapal(host_its->it_interval.tv= _sec); + target_itspec->it_interval.tv_nsec =3D tswapal(host_its->it_interval.t= v_nsec); + + target_itspec->it_value.tv_sec =3D tswapal(host_its->it_value.tv_sec); + target_itspec->it_value.tv_nsec =3D tswapal(host_its->it_value.tv_nsec= ); + + unlock_user_struct(target_itspec, target_addr, 1); + return 0; +} + +/* Convert QEMU provided timer ID back to internal 16bit index format */ +int get_timer_id(abi_long arg) +{ + int timerid =3D arg; + + if ((timerid & TIMER_MAGIC_MASK) !=3D TIMER_MAGIC) { + return -TARGET_EINVAL; + } + + timerid &=3D 0xffff; + + if (timerid >=3D ARRAY_SIZE(g_posix_timers)) { + return -TARGET_EINVAL; + } + + return timerid; +} diff --git a/bsd-user/freebsd/os-time.h b/bsd-user/freebsd/os-time.h index 05cb5db7d1..213bd16850 100644 --- a/bsd-user/freebsd/os-time.h +++ b/bsd-user/freebsd/os-time.h @@ -202,6 +202,9 @@ static inline abi_long do_freebsd_ntp_adjtime(abi_ulong= target_tx_addr) if (ret =3D=3D 0) { ret =3D get_errno(ntp_adjtime(&host_tx)); } + if (!is_error(ret)) { + ret =3D h2t_freebsd_timex(target_tx_addr, &host_tx); + } =20 return ret; } --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015788; cv=none; d=zohomail.com; s=zohoarc; b=RvaFmDbHnzPZ53uH7GD1ArqeBVCpMptqQ1dzOFYP5PcErbw7e41mKVLcMGQsgqY9cS7dcZevRJ8ZpuK3xA7kEnmA9di4fQk91DQZrHfFd+Y9tbgifaDq1Cg+H3byboPBlC+lXzhB0m27W6sv6hV+itaIRupCQmkHbcnXxnoBe8c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015788; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qJdpcnA/pubOSjeaUNEhasCsXKeN7JqeeghV9uwvoN0=; b=Dm6bM+cfn2bQSuYdlaCd+Z7PLguTZOedB8ItQM1K44W898axKgmKziD/dvg9udrWqgsy50OeaGxpC0JHAzgCgHNhpXbM9sMhdUh0qnkpizlC7U4BjIYI9k0ig1oH/aIPFbzlvHgE4JC5jdzW7n5kflsS9tu9XrREn4HXIout3RE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015788909954.2950418425378; Sat, 20 Jun 2026 21:23:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hS-00034Z-GE; Sun, 21 Jun 2026 00:22:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hM-00033H-9G for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:20 -0400 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hJ-0005GR-JO for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:20 -0400 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-6a0a38a013eso2732365eaf.0 for ; Sat, 20 Jun 2026 21:22:17 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015736; x=1782620536; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qJdpcnA/pubOSjeaUNEhasCsXKeN7JqeeghV9uwvoN0=; b=KYrj40PnBbnWeoRJPy5pjQs4TAa3+3O+2jAMiMfWtPW7Lp/yMPjFWtgYfDconOxsWI FNMG+UutjoRRFWZlkcMJepaHtj4mztaN307T1Ppm9G22i5HSWbYmgRdmP8MV7n6FHZnx lmWPGcXK2LNXsE3rNtyY17qBzJKIShg9ONVk3xiddpkd10CcGee8AxGJ4BlM71LwRJSE pLeNJPS07HUygYl2Go/DlBdkAX8sieh8B+PlSnN3VT3LFbmU8bNsU0HrfKk7Yj7evBih naXUvW7VP0saEk1MbAJsLRwE9q3WcZGh3SsE2+xZJd1D1CaEpykpLoKMPPkwp+kITQWg t71g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015736; x=1782620536; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=qJdpcnA/pubOSjeaUNEhasCsXKeN7JqeeghV9uwvoN0=; b=BX6/qnd9iNUd+ZaNRHidtOvK3aD4puzdVzIg0pN7BBlQjN/6qo3OP+BzWXgnqj+eDD xBCzpXHpGfm25usTjYZS3js6r9sbq3Z9BHhwbFNMELFgc/y1rudcTrZpPlw37Thf/L4B nCULF9/jeMBVviyIPOxNwQX4H/bEHZ4aGsn3CMm9OuhoW7t/K8jqayfr0wKDy358Jjmw cNOhBAmHp6bJJegEB9/qiO5DlTzTFdZpwiNWfAipSyUyTIQlHph/LQmOSbooAUCGrS6l dMLgKYVtVI2iQnrmitwo7UUvynApqTJMuXKY9hm6mjuu9rwa4v1gbCFMKD3KpEsRtncH joKQ== X-Gm-Message-State: AOJu0YxUfYa29NecSbKpwwX0hAlwg9yqTSWWfITUsKsLN55fXK6iYJFe ajURQc2w7Ut9cR5wxoz+bnHLxh5Jd0JHkQhV02ijJxEtdhcjWpAWorn4diHgrNg/y9Q= X-Gm-Gg: AfdE7cn6gmA/gWEsb41vUr7Pa8FDvGZ49EP6cXKchBdlzNj4wqRYpU1AYDSXIRActU7 H6QmSF1/PpuHtXXYBSvHVgBRj0f/6TG6w4G6G1LmncUQre3PBhLbwkDu97wAufls0N9Bwc++Xsy XkxcpX/KNREkNxodWjxZKqjmSMrlj+DYkxbdaMvIcJS06noSnrG0dLiOQsXZ212DqPsEds5DBZs i5bU/mmx6IMrXFu9Radue2z7ARrPmoHkjK/eomX97fJSIXMNA37SZV3bhVPfSw2D/CcTAd2KsxF c/L+OXVP+wpc1q4ZFcwFVAhka4Al0KGoJzTO52lSoY/cYJTeqgyyj6QiEihvWAoJGrbr7V956+m v5e7AFV0p7iIt/8mZ0JLSaBXLbLAoXz4uklhfVrrElo6CNaOk6QfhBKFEpkiscuN1t+Ljlsae9G o= X-Received: by 2002:a05:6820:81d3:b0:69e:3360:6338 with SMTP id 006d021491bc7-6a0da0c155bmr5704070eaf.13.1782015736275; Sat, 20 Jun 2026 21:22:16 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:12 -0600 Subject: [PATCH v3 25/40] bsd-user: Add time system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-25-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5728; i=imp@bsdimp.com; h=from:subject:message-id; bh=y3Vuu7lK1MqMZYO2mhPEDp/h9PnmLtrlbeRS6fMLxGc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2Z/ZzFAEz+l2ztNNvfOEk/3vXnJOO9EgVtBk TBRWKpxgjqJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmfwAKCRBsHNEofbAR AKBwD/97NQqFj5diIIfG4Lb4Cr0wSoO7XgoxucI3OoXfVar+31R8N4GbrCYpPzyT4GHnhwsH+ca 8Bpt1BMfL7b5Kvc1LScOXeHy53jJM/akyOYywdD7WPzYnl1FUnF559kk3B4O9Vw0Bk8ONx563CU j+J/BMiD8JPMjM3lUCJNN7739SJyCeUWer2S++1M9AxJKiPDhP8IjBd/c5iLBm7HgrV8WPDsZbb nJXoINYJ76KwHr7T1ZhwuGZ9LGRdCSY+W1Jpu6Kl0UwxjkjVkWauvWuBu8Lau51EIjXK28sYmv2 bEQDkEwgIHm/eFlsGaMHB5scpYT94yXhtfrkRmjd18bL0f2hNvsKbfJE5aGhAHhtA3+vWyvHafd BM7qxfeJuMSg9awVW20dlw+RwcCfL97ojEZOQn3Y3ni+rwPaFLrnyxfxKxIShChtPpyrS7iK068 kdeTYV2cGgtF+FtK84B7exQMBx1CBSoT5nEHgTHoLUrv+Uw/DYDl+GDXw/I8stUn8Hu6YQW19nJ nTlm8DPveya1kyJpJ1We0x0BxPariP9XQ/0x+1RIDq+kpcnVwm1PUdLDpbumjnM38xaUE4ma7Hg O0hzM1xM/BTDzRWAtHDp2iKfks4yoZ+Xsjot19QfT6aHZ0jCc4WqSWlhrYa0SVfY4pYHNfFR1um JEi8VPMqglkzOpQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c30; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015790450154100 Wire up time-related system calls in the FreeBSD syscall dispatcher: nanosleep, clock_nanosleep, clock_gettime, clock_settime, clock_getres, gettimeofday, settimeofday, adjtime, ntp_adjtime, ntp_gettime, clock_getcpuclockid2, utimes, lutimes, futimes, futimesat, ktimer_create, ktimer_delete, ktimer_settime, ktimer_gettime, select, pselect, ppoll, kqueue, freebsd11_kevent, kevent, setitimer, getitimer, futimens, utimensat, and sigtimedwait. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 124 ++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 124 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 020d16fda3..cc66be3b7c 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -48,6 +48,7 @@ #include "os-signal.h" #include "os-file.h" #include "os-socket.h" +#include "os-time.h" #include "os-misc.h" =20 /* I/O */ @@ -1037,9 +1038,132 @@ static abi_long freebsd_syscall(CPUArchState *env, = int num, abi_long arg1, ret =3D do_bsd_getdtablesize(); break; =20 + /* + * time related system calls. + */ + case TARGET_FREEBSD_NR_nanosleep: /* nanosleep(2) */ + ret =3D do_freebsd_nanosleep(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_clock_nanosleep: /* clock_nanosleep(2) */ + ret =3D do_freebsd_clock_nanosleep(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_clock_gettime: /* clock_gettime(2) */ + ret =3D do_freebsd_clock_gettime(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_clock_settime: /* clock_settime(2) */ + ret =3D do_freebsd_clock_settime(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_clock_getres: /* clock_getres(2) */ + ret =3D do_freebsd_clock_getres(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_gettimeofday: /* gettimeofday(2) */ + ret =3D do_freebsd_gettimeofday(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_settimeofday: /* settimeofday(2) */ + ret =3D do_freebsd_settimeofday(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_adjtime: /* adjtime(2) */ + ret =3D do_freebsd_adjtime(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_ntp_adjtime: /* ntp_adjtime(2) */ + ret =3D do_freebsd_ntp_adjtime(arg1); + break; + + case TARGET_FREEBSD_NR_clock_getcpuclockid2: /* Not documented. */ + ret =3D do_freebsd_clock_getcpuclockid2(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_ntp_gettime: /* ntp_gettime(2) */ + ret =3D do_freebsd_ntp_gettime(arg1); + break; + + case TARGET_FREEBSD_NR_utimes: /* utimes(2) */ + ret =3D do_freebsd_utimes(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_lutimes: /* lutimes(2) */ + ret =3D do_freebsd_lutimes(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_futimes: /* futimes(2) */ + ret =3D do_freebsd_futimes(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_futimesat: /* futimesat(2) */ + ret =3D do_freebsd_futimesat(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_ktimer_create: /* timer_create(2) */ + ret =3D do_freebsd_ktimer_create(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_ktimer_delete: /* timer_delete(2) */ + ret =3D do_freebsd_ktimer_delete(arg1); + break; + + case TARGET_FREEBSD_NR_ktimer_settime: /* timer_settime(2) */ + ret =3D do_freebsd_ktimer_settime(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_ktimer_gettime: /* timer_gettime(2) */ + ret =3D do_freebsd_ktimer_gettime(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_select: /* select(2) */ + ret =3D do_freebsd_select(env, arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_pselect: /* pselect(2) */ + ret =3D do_freebsd_pselect(env, arg1, arg2, arg3, arg4, arg5, arg6= ); + break; + + case TARGET_FREEBSD_NR_ppoll: /* ppoll(2) */ + ret =3D do_freebsd_ppoll(env, arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_kqueue: /* kqueue(2) */ + ret =3D do_freebsd_kqueue(); + break; + + case TARGET_FREEBSD_NR_freebsd11_kevent: /* kevent(2) */ + ret =3D do_freebsd_freebsd11_kevent(arg1, arg2, arg3, arg4, arg5, = arg6); + break; + + case TARGET_FREEBSD_NR_kevent: /* kevent(2) */ + ret =3D do_freebsd_kevent(arg1, arg2, arg3, arg4, arg5, arg6); + break; + + case TARGET_FREEBSD_NR_setitimer: /* setitimer(2) */ + ret =3D do_freebsd_setitimer(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getitimer: /* getitimer(2) */ + ret =3D do_freebsd_getitimer(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_futimens: /* futimens(2) */ + ret =3D do_freebsd_futimens(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_utimensat: /* utimensat(2) */ + ret =3D do_freebsd_utimensat(arg1, arg2, arg3, arg4); + break; + /* * signal system calls */ + case TARGET_FREEBSD_NR_sigtimedwait: /* sigtimedwait(2) */ + ret =3D do_freebsd_sigtimedwait(arg1, arg2, arg3); + break; + case TARGET_FREEBSD_NR_sigaction: /* sigaction(2) */ ret =3D do_bsd_sigaction(arg1, arg2, arg3); break; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015785; cv=none; d=zohomail.com; s=zohoarc; b=lLe7yC9QhCCf2fVbLD04lB3qx1a89XioYN3dcv35HjcZ5a1QPSF4/yhWhXyQ7T5GoU8OvnTZnTa6cxXk/O6xuY2T0t8VDp3ZqZxHhLdOeMSMIbifAo/Tn8VgH1ZAbNY+xbu11qQKXn15nMyDuNS09+Xa3eBD3u+hxh+xpJtMEEY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015785; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UjN9Lj6CRIZkO6eSwN2LZNNxHatuBucXujeKYt2epOE=; b=ACIopsg96PcC5RvAgLMrAlhBup5zj8PNYUfca8+BxuXD/SbMi0l4ekvSEHX5E3r93xtYZou6Kzu74P5ZKEUvFAI5Zi2hsx8mSxTqf5RXmXnx2Bg/XPGRE0SSjjqB06Ue7SIaoGjEjWDX0mZ4XhF3j5crcND8E8d4+Cd3Z0jVaIc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015785323449.52820518131443; Sat, 20 Jun 2026 21:23:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hW-00034h-Ac; Sun, 21 Jun 2026 00:22:31 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hM-00033Q-TP for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:20 -0400 Received: from mail-oa1-x2d.google.com ([2001:4860:4864:20::2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hK-0005Gn-V0 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:20 -0400 Received: by mail-oa1-x2d.google.com with SMTP id 586e51a60fabf-447046c980aso1585680fac.1 for ; Sat, 20 Jun 2026 21:22:18 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015738; x=1782620538; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=UjN9Lj6CRIZkO6eSwN2LZNNxHatuBucXujeKYt2epOE=; b=jrBvcQBiB7Vp/RWkKqekzD0reWv2c62tq9uOfKQ60K7/NE+pXAlKz6QQwQ3Ttg5Uk+ f9PIOrU7hzuQvO49/7z+JAPZOm/pGGaAuBbV7KkYTKVQFC5syo6MF4mR8FQpvcP7W8Uy 3RpLq++XYDDazkpkB/Z7IgPdz+ktz8aOcntMFgMf2g5ulR08es56PdjJTxlOUQgTqdoQ /BVOQ6fYXsEOz6m6IlrFl+pB1Tc1gKQrTTa0X9JznmaYwouC43CmG2aZCmT9yVASe0OO jwMO0BmvIRASAqrlvLN/SI2N5lhFE6x90RPsUvqfZML0L8MhueFyGJqzAUvYSNUvQ2El psiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015738; x=1782620538; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=UjN9Lj6CRIZkO6eSwN2LZNNxHatuBucXujeKYt2epOE=; b=OqqeQ2YeCsbV+70s6DkvP8QvsquDnWe/V3NxM5LwJ0KIA7pZcznM/xirJUybz4yv3c TYBcL3OO7+ZGHWqDXoNtqn2VmuW13k6IgEACxBxLDQAXgfv3ESIl+ESo4Rwu4UQ0qbVX gb0SYPG4h0RJ6OjiCiYAyjBmNfvOrqvshC8KztLn0/EmUK6FTNWyhmvCc2cN0GKHLvWn ldHTMaNBCj4HKwxLluiumOdrr7J6e71tFx2mYiP4BZOSSpEL3UY2Ifp/2VhPoSMxqWRe pTignGM+X9vkYWAu0va0qNouLu/n+HveYatJ5kwOl9gfiwEcpkYeOwHsOBP0jzSBpk2b qK+g== X-Gm-Message-State: AOJu0YwkgVt+yFTWdHKmxrimFgSrnnu0zUlnrCNS7i11gS5I709p9blF fpR1gEwDSIumnfgtXvliEPIbzpdunaA4Jsv5QG5ylt9mHkK/EZeRbpc1m2HFtTzO3U8= X-Gm-Gg: AfdE7cnBNv0THz88WAgy39eXNnA0IC/J1qEI7/RM6IYvaK375yWEraOdRwXEwTKey7R GFf9uumFwMNJtr0LXUlA7HUad1c7Em5/esEARlYWygvMWPpaawPErLsvTibEIcrfWAu9d5A1y8O 3FIRSoiM9veyzz1ZSCVf7b4N08EBjslLg2WeJbMjBzNxGvCSrYTBgDk8cDx1zdVmc+d5DK+LJCX 9vpgAMSEa3P289QN/V+C8Rk1P6ahf72YtqeIRSdqBBotKK/BtoewqkEBpMW1twG1nBqU8UEFNNP INVSwweKBdiw7esBtQ3lhO+1iManZLuXGsyyrdiKr5oAI6aHRdRzExmnhKNPbTtnDwugHaRrPAi +lv0N3AyuxDeaEgs4wglB39A25QngCejU/JUtsubpQQzlF9fWjnVF2Z0ubvEUHj4QjdCd8JYq7A Q= X-Received: by 2002:a05:6820:6ac8:b0:696:806e:fd6 with SMTP id 006d021491bc7-6a0d8d08c96mr7103927eaf.40.1782015737751; Sat, 20 Jun 2026 21:22:17 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:13 -0600 Subject: [PATCH v3 26/40] bsd-user: Add thread, umtx, and ACL type definitions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-26-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5941; i=imp@bsdimp.com; h=from:subject:message-id; bh=DkOdsmDodR6NsS9KAlFPGyeDTFdGshISXXa9GaUsHwk=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aAVenTwaikcSi3FliivOyEpZRFvraaHEYHF nBPUb044mSJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AGvUEACtTI/tN7UqwxbzjG1xgPqyK1X9jzi+g/AzP7WnUfkF5G7xfamUr6sOmNnjJJximhAtg2l ebW0oTRl95A3wQcoUELwJDAWpjYnPR9yLqjzX1GrF/d8O7meAfH3vIP4T1G4pLoJkgsQXIk1nIv IUjX11n7beItIvNAPMDS1u7ceN/R83jet2WJa7Jywq/W+/zZF9C9VK5KEtDYSCCk9gUrnwSQzVA NNwrwSJqHhkL+c+6t9zlthNujx4qG3NXwSuNwRymyPtXzD4awdgIh9uHmeeJL7AafOYvRZAZqLY aFbJPRIzEtul/DZg88GW1h4HrRyCZcAh9RHQyvUc1peNVVDiPZ8dQetxuNh/nOFMB+gboIHnHta JAM+vNZjJHIKCgnLaeMgo24MJtT8oYaIvQgLJchPzaEJZ/5GyiW5PdTJOqQHaz3nt26+ER8zcAN S3kVrLFXJo7XNB18xydaFqdd1XqRDThlQAjW+M3YLCMmebatIXWBz7yHFFTfLK64vkcdfY7pbxZ s2kK30454mKCLElrTYugF4VCfax8HEdBFSdRhhOQwkAdvEhAgxelnSSPVvy4KiyH3iybcSVHFuJ iraYrOhB7ZHi0/Ehuy3VnvBFlgmTfGXflsFi2ml54jUcpODorq5SyGVgB5aSyaVFU+cjdCWf0qA iUdirWJGf4h4fuw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::2d; envelope-from=imp@bsdimp.com; helo=mail-oa1-x2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015788418154100 Add target_freebsd_thr_param, target_freebsd_rtprio, new_freebsd_thread_info_t, TARGET_UMTX_OP_* opcodes, umutex/urwlock flags, and target_freebsd_acl structures to syscall_defs.h. Add forward declarations for os-time.c, os-socket.c, os-thread.c, and os-extattr.c functions to qemu-os.h. Add thread and umtx function declarations to qemu.h. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/freebsd/qemu-os.h | 48 ++++++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/qemu.h | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/bsd-user/freebsd/qemu-os.h b/bsd-user/freebsd/qemu-os.h index 12adc50928..b1ff5c0cd5 100644 --- a/bsd-user/freebsd/qemu-os.h +++ b/bsd-user/freebsd/qemu-os.h @@ -32,6 +32,54 @@ =20 struct freebsd11_stat; =20 +/* os-time.c */ +abi_long t2h_freebsd_timeval(struct timeval *tv, abi_ulong target_tv_addr); +abi_long h2t_freebsd_timeval(struct timeval *tv, abi_ulong target_tv_addr); + +abi_long t2h_freebsd_timespec(struct timespec *ts, abi_ulong target_ts_add= r); +abi_long h2t_freebsd_timespec(abi_ulong target_ts_addr, struct timespec *t= s); + +abi_long t2h_freebsd_umtx_time(abi_ulong target_ut_addr, + abi_ulong target_ut_size, void *host_t, size_t *host_tsz); + +abi_long t2h_freebsd_timex(struct timex *host_tx, abi_ulong target_tx_addr= ); +abi_long h2t_freebsd_timex(abi_ulong target_tx_addr, struct timex *host_tx= ); + +abi_long h2t_freebsd_ntptimeval(abi_ulong target_ntv_addr, + struct ntptimeval *ntv); + +abi_ulong copy_from_user_fdset(fd_set *fds, abi_ulong target_fds_addr, int= n); +abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr, + abi_ulong target_fds_addr, int n); +abi_long copy_to_user_fdset(abi_ulong target_fds_addr, const fd_set *fds, + int n); + +abi_int next_free_host_timer(void); +int host_to_target_timerid(int timerid); +abi_long target_to_host_itimerspec(struct itimerspec *host_itspec, + abi_ulong target_addr); +abi_long host_to_target_itimerspec(abi_ulong target_addr, + struct itimerspec *host_its); +int get_timer_id(abi_long arg); + +/* os-socket.c */ +abi_long t2h_freebsd_cmsg(struct msghdr *msgh, + struct target_msghdr *target_msgh); +abi_long h2t_freebsd_cmsg(struct target_msghdr *target_msgh, + struct msghdr *msgh); + +/* os-thread.c */ +abi_long t2h_freebsd_rtprio(struct rtprio *host_rtp, abi_ulong target_addr= ); +abi_long h2t_freebsd_rtprio(abi_ulong target_addr, struct rtprio *host_rtp= ); +abi_long do_freebsd_thr_new(CPUArchState *env, abi_ulong target_param_addr, + int32_t param_size); + +/* os-extattr.c */ +struct acl; +abi_long t2h_freebsd_acl(struct acl *host_acl, abi_ulong target_addr); +abi_long h2t_freebsd_acl(abi_ulong target_addr, struct acl *host_acl); +abi_long t2h_freebsd_acl_type(acl_type_t *host_type, abi_long target_type); + /* os-stat.c */ abi_long h2t_freebsd11_stat(abi_ulong target_addr, struct freebsd11_stat *host_st); diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index 60d1adf560..069baa7011 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -249,6 +249,47 @@ abi_long do_freebsd_sysctlbyname(CPUArchState *env, ab= i_ulong namep, abi_ulong newlen); abi_long do_freebsd_sysarch(CPUArchState *env, abi_long arg1, abi_long arg= 2); =20 +/* os-thread.c */ +extern pthread_mutex_t *new_freebsd_thread_lock_ptr; +extern pthread_mutex_t *freebsd_umtx_wait_lck_ptr; +void *new_freebsd_thread_start(void *arg); +abi_long freebsd_lock_umtx(abi_ulong target_addr, abi_long tid, + size_t tsz, void *t); +abi_long freebsd_unlock_umtx(abi_ulong target_addr, abi_long id); +abi_long freebsd_umtx_wait(abi_ulong targ_addr, abi_ulong id, + size_t tsz, void *t); +abi_long freebsd_umtx_wake(abi_ulong target_addr, uint32_t n_wake); +abi_long freebsd_umtx_wake_unsafe(abi_ulong target_addr, uint32_t n_wake); +abi_long freebsd_umtx_mutex_wake(abi_ulong target_addr, abi_long val); +abi_long freebsd_umtx_wait_uint(abi_ulong obj, uint32_t val, size_t tsz, + void *t); +abi_long freebsd_umtx_wait_uint_private(abi_ulong obj, uint32_t val, + size_t tsz, void *t); +abi_long freebsd_umtx_wake_private(abi_ulong obj, uint32_t val); +abi_long freebsd_umtx_nwake_private(abi_ulong obj, uint32_t val); +abi_long freebsd_umtx_mutex_wake2(abi_ulong obj, uint32_t val); +abi_long freebsd_umtx_sem2_wait(abi_ulong obj, size_t tsz, void *t); +abi_long freebsd_umtx_sem2_wake(abi_ulong obj); +abi_long freebsd_umtx_sem_wait(abi_ulong obj, size_t tsz, void *t); +abi_long freebsd_umtx_sem_wake(abi_ulong obj); +abi_long freebsd_lock_umutex(abi_ulong target_addr, uint32_t id, + void *ts, size_t tsz, int mode, abi_ulong val); +abi_long freebsd_unlock_umutex(abi_ulong target_addr, uint32_t id); +abi_long freebsd_cv_wait(abi_ulong target_ucond_addr, + abi_ulong target_umtx_addr, struct timespec *ts, int wflags); +abi_long freebsd_cv_signal(abi_ulong target_ucond_addr); +abi_long freebsd_cv_broadcast(abi_ulong target_ucond_addr); +abi_long freebsd_rw_rdlock(abi_ulong target_addr, long fflag, + size_t tsz, void *t); +abi_long freebsd_rw_wrlock(abi_ulong target_addr, long fflag, + size_t tsz, void *t); +abi_long freebsd_rw_unlock(abi_ulong target_addr); +abi_long freebsd_umtx_shm(abi_ulong target_addr, long fflag); +abi_long freebsd_umtx_robust_list(abi_ulong target_addr, size_t rbsize); +abi_long freebsd_set_ceiling(abi_ulong target_addr, uint32_t ceiling, + uint32_t *old_ceiling); +CPUArchState *cpu_copy(CPUArchState *env); + /* user access */ =20 #define VERIFY_READ PAGE_READ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015813; cv=none; d=zohomail.com; s=zohoarc; b=NHYgKjEdZqh928Rsegw9isOu6PYBzEyOffpRSVnOagfmNeXcBqmF/Z1a530aKHEPN/H5NJLn2T1iithTa6eAMAH8PCCNQTqMA47g98amUA1BiOjTjFgaoxUaSpDCdGMMAvOByg+MnERR9iSdPeWaXcn/76brEM8oukDTNHkaYkw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015813; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LlKlNKCcfcg7uKfhDKsp+7NtoCqHPRF95hiLVxo7EAM=; b=H4j7SfHWwGpwglb4oVr9YHnC1kktNGtz5SUEG3IjVwgIDgDiZedzfEDGAVpq6peu2l2G+2Bn2HtYqI6ba1VOVGDLn0Ajw3oCJEP9S0YvJnQQIEuWzd8vKLlFrWtHJiXqxH3JL9nDFJbf6wS5L/qYO3DglcCFPezME1fQNgeov9k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015813704860.8881183084794; Sat, 20 Jun 2026 21:23:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hb-00039N-VG; Sun, 21 Jun 2026 00:22:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hO-00033w-Vw for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:25 -0400 Received: from mail-oo1-xc2e.google.com ([2607:f8b0:4864:20::c2e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hM-0005HI-IE for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:22 -0400 Received: by mail-oo1-xc2e.google.com with SMTP id 006d021491bc7-69e8aa31e9fso1620712eaf.2 for ; Sat, 20 Jun 2026 21:22:20 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015739; x=1782620539; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=LlKlNKCcfcg7uKfhDKsp+7NtoCqHPRF95hiLVxo7EAM=; b=vdeGR2DlCqTkSOrxsVLuYO4qEk5fYn6tB7VKf/l2gtmRkS2v9ex7bLrvADWTNoYyh1 QS4VdcQ5NArxWtcGRJ3O0Yj5SG/kcUCWkOS0j7LYYTnJsfmuIlVo4mevaIh+rJo9zBQq qv57rFMKXWgUDl0QTgQHr08MhXmLjbL+PxmD/q1zGAw4krXVHwO7xmN+xfL4nH/JMidZ yJ1YfkLAvJeiDEPGUI8bYAv3az0sJkK8RNkIhzced3t0u1Yb5LlpReLMomSq/D49O74+ Mp9cRqu6sqTWXJ/yR9uRtg5L1o90lGENXBNEwdeECBNohqr5ZL6RFlKf1jVihidxZQSt WAWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015739; x=1782620539; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LlKlNKCcfcg7uKfhDKsp+7NtoCqHPRF95hiLVxo7EAM=; b=BBBtegqmXKX25xRxQBu774RBImWrY+CDoyLuptwN/zp9lo8uiKZSFevNDTfV0LcMnl PQmENaG+2fOQBGdeyuvluUD2zbskd1lEjZc2ZoQbChiab/lEiRfy/NV1yY08Hpcfn7QQ O4zWhmEu4C+vDYolRxzeWqzWHD4OZa1sqsvMPmxaXIQVwRgHBpn04hZiWbQ8wYcLUGlb X09ZX64ouZdbV8NBAu4iOlezbhmuylXPZ+wWzhE3Z4aZUpw5AVb+1biem45PFoe0RW4Z KhRRHDNFmD4+FPXB71JMje4VbYujiNv/nsc+XpzqXezxTFSgtn2Q+8LI0sRZ0+O9f2gX D+Ng== X-Gm-Message-State: AOJu0Yw9BYd83N8kp7DIKWdulHdNtoYkHf/he/CXP9VpzOHT7WjHB3+X YNYVGmx5EMUWGJa2cd0doV72x0x4Gm7x3lKITL7ztnpcG2TFJZnKETf3TWg0pzUyaTs= X-Gm-Gg: AfdE7clSUhzMR+oa7H0ABpqCCveligPh+YndIqClCEGxP/wWxsVHQ1BYtzGV6zZJ3+0 E8XPkAgPKo9GaKz/byJu5os1gFSPVsHz++i/eHNi4FpUbQ5ohM9wJCbIbYFD8cDiGxQC2jx9ztG dL3v+8apjdXFcLtbZA7hwCcKIKPp+9pQs8hSw70pAlmTg8R4anx5ch/kwtr4pDhQIndE2YbRrx4 D0KE6xOWVjlJceEBKlgssuPqWKoQMax9lQXJ6SCmw7ijG66wPxMxGwXUL+7X+BZVHLp6sD1JcPp iRw4zkZHRY8GDJZt7PXdGH1Qs6s+ZB5xG74ni7YzLnUxfzgP+DcNysKHAVUQV0qbv6LfjhL3N1/ fL0XhrUo3HT0/0rLTsoAJIdSHtE8R/CD/z65JVSH1cg5M8iptz4iY0sReMyifPwIX8xRwN2LiNU Y= X-Received: by 2002:a05:6820:81cd:b0:69e:89dd:175a with SMTP id 006d021491bc7-6a0ddef3fb9mr6288024eaf.20.1782015739317; Sat, 20 Jun 2026 21:22:19 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:14 -0600 Subject: [PATCH v3 27/40] bsd-user: Add cpu_copy and make init_task_state non-static MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-27-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2812; i=imp@bsdimp.com; h=from:subject:message-id; bh=WlR6Q9GQWWWUTxlkqv6eVWPHCyQJru+tkKYNMUnnttg=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aASMqYbslykVIN/Ltv/uw6YOx7dqTd1xxnd VVmWeL9riqJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AGSOD/9zGr/xitovDTtpfuBTB2o/Ne4yZaVL+Elt2gv918sixNlFsgg4wyBk8Ik5WTJ/xFsIg04 ZvXtgwiIgLUU2KEA5xtC2z5LJWmuwwO1qB9jeRXNTQ52GNoTuhkTfo8fwxaPKLYSAsV/R3oWdKF Ity5iADYxaadchUkTsGxt+QZYONzhgujj2mrhj4b3eHzpzejRHihH0Sgrn7uuoOlnqNvT1CvgbW wKIDMVVvTr9p+d/8srmkHex3LgjEBCnGhL7S1Qn7ayoUZqTv9ru9l3OobZpmjGl1nD97apZh/r9 996A51WxgjOAdNaWWTbAtgCs4ytd0XGraFbkGgajRCLS5kc0536pDr58HeSB3SgwJED55Vfvw1J UpPA5Y70VMQVkgAHflutBDAoZU3qTkFWHrRCH2xVxksPWNC/te8Jg5e/1MsCfp4BSYpAfpTZDbN sDAKYrMlSQUzE7RhyZTuIpEzLB8EoseZv+Voh/15wnSUaGJtIN/qEZ2au2bLNSzGbPjggf3k0qu k2RlvjHmzG3K0t1agb7ZLaSi0R8UyLiIYcac6sLK0oOsR541b6jwqcuR7NdGeT7ZrQW6Ts+hcm3 WFbrb2I1dFCX+ogiaLThlHCC5JAEw/4ukImfzzxife/xNTGb3QMRMBwSXxxGjC9sZaGXzWzHInC 1mFFOY2eOfMD6BQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2e; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2e.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015816770154100 Add cpu_copy() function for thread creation support and make init_task_state() non-static so it can be called from os-thread.c. Move cpu_type to file scope so cpu_copy() can access it. Signed-off-by: Stacey Son Assisted-by: Claude Opus 4.6 (1M context) Reviewed-by: Pierrick Bouvier Signed-off-by: Warner Losh Acked-by: Richard Henderson Reviewed-by: Richard Henderson --- bsd-user/main.c | 32 ++++++++++++++++++++++++++++++-- bsd-user/qemu.h | 1 + 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index 4f1544342e..9dff2cbcb7 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -50,6 +50,7 @@ #include "qemu/guest-random.h" #include "gdbstub/user.h" #include "exec/page-vary.h" +#include "exec/watchpoint.h" =20 #include "host-os.h" #include "target_arch_cpu.h" @@ -216,7 +217,7 @@ bool qemu_cpu_is_self(CPUState *cpu) } =20 /* Assumes contents are already zeroed. */ -static void init_task_state(TaskState *ts) +void init_task_state(TaskState *ts) { ts->sigaltstack_used =3D (struct target_sigaltstack) { .ss_sp =3D 0, @@ -225,6 +226,34 @@ static void init_task_state(TaskState *ts) }; } =20 +static const char *cpu_type; + +CPUArchState *cpu_copy(CPUArchState *env) +{ + CPUState *cpu =3D env_cpu(env); + CPUState *new_cpu =3D cpu_create(cpu_type); + CPUArchState *new_env =3D cpu_env(new_cpu); + CPUBreakpoint *bp; + + /* Reset non arch specific state */ + cpu_reset(new_cpu); + + new_cpu->tcg_cflags =3D cpu->tcg_cflags; + memcpy(new_env, env, sizeof(CPUArchState)); + + /* + * Clone all break/watchpoints. + * Note: Once we support ptrace with hw-debug register access, make su= re + * BP_CPU break/watchpoints are handled correctly on clone. + */ + QTAILQ_INIT(&new_cpu->breakpoints); + QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) { + cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL); + } + + return new_env; +} + static QemuPluginList plugins =3D QTAILQ_HEAD_INITIALIZER(plugins); =20 void gemu_log(const char *fmt, ...) @@ -257,7 +286,6 @@ int main(int argc, char **argv) { const char *filename; const char *cpu_model; - const char *cpu_type; const char *log_file =3D NULL; const char *log_mask =3D NULL; const char *seed_optarg =3D NULL; diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h index 069baa7011..d2dd8c2ee8 100644 --- a/bsd-user/qemu.h +++ b/bsd-user/qemu.h @@ -122,6 +122,7 @@ struct TaskState { struct target_sigaltstack sigaltstack_used; } __attribute__((aligned(16))); =20 +void init_task_state(TaskState *ts); void stop_all_tasks(void); extern const char *interp_prefix; extern const char *qemu_uname_release; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015991; cv=none; d=zohomail.com; s=zohoarc; b=kzDeD9vvYB4/hV0EjVsDtyZB/JxP8SnXekexuDQ4ZNW+qhtj1JL+bV4I3POgomdPnuxKgJRcdpXWIfbK4Kjo8GfzhSjV40VMnKbkOUWdl9u05xK+Rw7gvWOGBALoJ/mnVJYd+zdFl9csb9woLAhycPJ/HbPN/J1scdQPQxc/peo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015991; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tlmzIUL4F6F4ICZ1PklXabenJHTG/7qkC9iqTezRffI=; b=Qo9clXjltzmKfiHmEZGDYzTgQWiGUh+1g59LjEmv42LmzO5qRawT7mmQkWfMyfwLh9nTQ0L+bRRkIElRxUMsUlx5BlT9O4WQF8NEZNKdqXVc2fNba5GdtDxjZ6o9cATLp+tKrbNu+dkXztuEr+Z3Vki0EtLsk1d7H8f8+oDJhPs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015991617764.8520293767439; Sat, 20 Jun 2026 21:26:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hY-00036N-2T; Sun, 21 Jun 2026 00:22:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hR-000340-3k for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:25 -0400 Received: from mail-oa1-x30.google.com ([2001:4860:4864:20::30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hO-0005Hv-MR for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:24 -0400 Received: by mail-oa1-x30.google.com with SMTP id 586e51a60fabf-447046c980aso1585690fac.1 for ; Sat, 20 Jun 2026 21:22:22 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015741; x=1782620541; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=tlmzIUL4F6F4ICZ1PklXabenJHTG/7qkC9iqTezRffI=; b=qlZw0io58Hs1KVxnX/OXmjnQfr3zndMH2DdQISYFFBY6Isirq8uLFAQq/Pq3NQV0h0 WTDWz/dxL0935OlPk+5uMRG4gtZZFtohytZlWv4+sdClR/0215BzXOBlHxmtGvPXCfUA Biit9qoS4yDSNPAieGr4dW4kK7zgIb183dHNqc2x+KdHYFrtBGb/0BtVsOv/PfuYywk3 qZKnWgrlaoCWgulP42IuhkRPhfQM44zPraJwMvrWSRgMOfBaI4QCv9qnvFxEk+y5imyb Sl7JQwdis2lD8KtSusyNZKrSkFO8PSZY6N25S1e9dTMi6DHAcwvV735Vz6/sFibdvjm3 wrPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015741; x=1782620541; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=tlmzIUL4F6F4ICZ1PklXabenJHTG/7qkC9iqTezRffI=; b=H6gCKqaq+tDg+JFPIoiBI8Kg03vBXGg3CpPVxd7KuBtnWzGpYSt2YTAJ5n1QFhJMvp yGBYaCdu7+TrBEG6pdxO/bL1fkTp9/wkCS1iFGZZ36iAElpKaZrL5UA+ggGfe1/8LIjQ EpTAvSu5z2HNZSjJF7RvT0wHC0DXCN5cx8Ts35rk8fJJTKS/078bgcaXUeA9m1dgQU/5 J4gEBV5KXbZ8vd5tm0N7LHxdPtNbBHnha8wFXCPru4zVyk/av4qfaBSDKLjgEpzo4H0l BP21ZvbS3MRbvPpKIih4Jx0weLmwQgJ/9ZuIAuytJRQapGzvHK2++quODDb7q1mPPyQK LclQ== X-Gm-Message-State: AOJu0YwDwZbSo0W7OKU6SzvFOv/qKSA9ChY7qbczYdZv5G4uEeugT6Xy wt2hPyESyTAyqQ4gIwoC0q+1+uoiAIrWCAPKRb4r4vHfBjd8hOdnSSKp2RrT8qtG8v0= X-Gm-Gg: AfdE7cmC3YgreCixw2OOtl+Xb7N9zVsXHEYd8jMT0Rp6RxZj1xA+oJ5p/B32330z7Ff mSv69+3Br81uS78N11k3LaAXthQiEa3eeJHmMhXN51xwtfBzNplBXYim+vYiQ82nxE9rdtobxv5 S/BXuIkDMG0m1d2P07sQA2nzGEa5xXjRwGpqoU6UDAARJC0NbA4Mi2ET7ms0+VVhqKe8Z339BTH A8PZVhOJ81wobUzU9glWWW6ca0liW/+JD08YnRQqj/L1X+5DXzcrtwEK0KRGd77AGzd16ysFbU/ jWNEVjGkwLV08xMogBc4SyqQd3xYo73obP4hWbdZ3KJHu+BS04VN6vKN+1at6+i/2Cm5iKSbbHn Y/iDvs0ARYVsJPwAnDdiQ0cxkSFWPQEosZk4cpnPfU3orJ9Tgzr0LGeF5ZgLKKbY6KR968Ktb1q I= X-Received: by 2002:a05:6820:8189:b0:69d:c3a9:4ddb with SMTP id 006d021491bc7-6a0d8cc9943mr8214542eaf.35.1782015741091; Sat, 20 Jun 2026 21:22:21 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:15 -0600 Subject: [PATCH v3 28/40] bsd-user: Add os-thread.h with thr and context functions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-28-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans , Jessica Clarke , Michal Meloun X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8528; i=imp@bsdimp.com; h=from:subject:message-id; bh=L4ILbGJVV2CdpkkVG6MZp0lbSZ61Qkm2kcWY7Igooio=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aAZOCorbGSHNK09nfft6YnlavU+xR2R2p1g VXW6/y+wCyJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AOYTD/97BTfZcNF1NE5Beo2FuXOHD0S6fLQWZHsTUTuqI3Kvek85kLLm9hc7hzqnvwnfp+DHAt4 t5kgHiJ8sT+Db6Tk7bOcdFeNZ/nhgiwPbtLH+J27oBRq2fmzWNBZcQDNqv9JyAQ7f14YVBBoMOj twMLYxahbdu99pbqyqYKgwREm4gs7ij4OozmPMFCyI+xbih1erBFABSSrHkGAOLtNx3muMqbqzy 2I5SQK3wc00cyyRF6raCWAOiRRRvg6l9jouxyziAnbZbFTz0+Sy51WA+zMNBo46Ze2zEFo0sLmi XCpOmkcskFUaCe+YaRkJXzy3TirSrH0GYwa4YD1O7ap2bodRnMZK5HLVVic1Rrqfz+F456lESBW 0b5XfYHL5tDXA06SfL6fAkhJ/M6MVwaP9bzuZrjBc+0lKCmHJVuv5EFYROhUZALDRls7Vu40sTE HAj17kJB8cuE86ATRwHV1ABRndac4HC/nRZgrf0ma3q/luIb8XXrgwnCc8nr7qzXI7W8+OtN/Ld fBEnRqFuQ7Dh6ymZmBmwJ7yqKOvJHGt7hcHDnU5HVJDRPoPkUSqKmIbbfPsZSls/7IB1f4qjEcX oiF+E+08qH/0cnQjuIxSG18fkHD1+YD6ArgJfV2ArsHuf/62A1O3w1kl22LphgVzHD+aoTmiDhn bmwRw5jdLj4/otw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::30; envelope-from=imp@bsdimp.com; helo=mail-oa1-x30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015993389154100 Add thread management system call shims: thr_self, thr_exit, thr_kill, thr_kill2, thr_suspend, thr_wake, thr_set_name, rtprio_thread, getcontext, setcontext, and swapcontext. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Signed-off-by: Jessica Clarke Signed-off-by: Michal Meloun Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 6 ++ bsd-user/freebsd/os-thread.h | 244 ++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 250 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index cc66be3b7c..f2c3ff25e8 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -49,6 +49,7 @@ #include "os-file.h" #include "os-socket.h" #include "os-time.h" +#include "os-thread.h" #include "os-misc.h" =20 /* I/O */ @@ -90,6 +91,11 @@ safe_syscall6(ssize_t, sendto, int, fd, const void *, bu= f, size_t, len, int, safe_syscall3(ssize_t, recvmsg, int, s, struct msghdr *, msg, int, flags); safe_syscall3(ssize_t, sendmsg, int, s, const struct msghdr *, msg, int, f= lags); =20 +/* used in os-thread */ +safe_syscall1(int, thr_suspend, struct timespec *, timeout); +safe_syscall5(int, _umtx_op, void *, obj, int, op, unsigned long, val, voi= d *, + uaddr, void *, uaddr2); + /* used in os-time */ safe_syscall2(int, nanosleep, const struct timespec *, rqtp, struct timesp= ec *, rmtp); diff --git a/bsd-user/freebsd/os-thread.h b/bsd-user/freebsd/os-thread.h new file mode 100644 index 0000000000..d3f1f01b13 --- /dev/null +++ b/bsd-user/freebsd/os-thread.h @@ -0,0 +1,244 @@ +/* + * FreeBSD thread and user mutex related system call shims + * + * Copyright (c) 2013-2015 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef FREEBSD_OS_THREAD_H +#define FREEBSD_OS_THREAD_H + +#include +#include +#include + +#include "qemu.h" +#include "qemu-os.h" + +int safe_thr_suspend(struct timespec *timeout); +int safe__umtx_op(void *, int, unsigned long, void *, void *); + +#if defined(HOST_BIG_ENDIAN) =3D=3D defined(TARGET_BIG_ENDIAN) && \ + (TARGET_ABI_BITS =3D=3D HOST_LONG_BITS || defined(UMTX_OP__32BIT)) +#define _UMTX_OPTIMIZED +#if defined(TARGET_ABI32) +#define QEMU_UMTX_OP(n) (UMTX_OP__32BIT | (n)) +#else +#define QEMU_UMTX_OP(n) (n) +#endif /* TARGET_ABI32 */ +#else +#define QEMU_UMTX_OP(n) (n) +#endif + +static inline abi_long do_freebsd_thr_self(abi_ulong target_id) +{ + abi_long ret; + long tid; + + ret =3D get_errno(thr_self(&tid)); + if (!is_error(ret)) { + if (put_user_sal(tid, target_id)) { + return -TARGET_EFAULT; + } + } + return ret; +} + +static inline abi_long do_freebsd_thr_exit(CPUArchState *env, + abi_ulong tid_addr) +{ + CPUState *cpu =3D env_cpu(env); + TaskState *ts; + + if (block_signals()) { + return -TARGET_ERESTART; + } + + pthread_mutex_lock(new_freebsd_thread_lock_ptr); + + ts =3D cpu->opaque; + + if (tid_addr) { + /* Signal target userland that it can free the stack. */ + if (!put_user_sal(1, tid_addr)) { + freebsd_umtx_wake_unsafe(tid_addr, INT_MAX); + } + } + + object_unparent(OBJECT(env_cpu(env))); + object_unref(OBJECT(env_cpu(env))); + /* + * At this point the CPU should be unrealized and removed + * from cpu lists. We can clean-up the rest of the thread + * data without the lock held. + */ + + pthread_mutex_unlock(new_freebsd_thread_lock_ptr); + + thread_cpu =3D NULL; + g_free(ts); + rcu_unregister_thread(); + pthread_exit(NULL); + /* Doesn't return */ + return 0; +} + +static inline abi_long do_freebsd_thr_kill(long id, int sig) +{ + + return get_errno(thr_kill(id, target_to_host_signal(sig))); +} + +static inline abi_long do_freebsd_thr_kill2(pid_t pid, long id, int sig) +{ + + return get_errno(thr_kill2(pid, id, target_to_host_signal(sig))); +} + +static inline abi_long do_freebsd_thr_suspend(abi_ulong target_ts) +{ + abi_long ret; + struct timespec ts; + + if (target_ts !=3D 0) { + if (t2h_freebsd_timespec(&ts, target_ts)) { + return -TARGET_EFAULT; + } + ret =3D get_errno(safe_thr_suspend(&ts)); + } else { + ret =3D get_errno(safe_thr_suspend(NULL)); + } + return ret; +} + +static inline abi_long do_freebsd_thr_wake(long tid) +{ + + return get_errno(thr_wake(tid)); +} + +static inline abi_long do_freebsd_thr_set_name(long tid, abi_ulong target_= name) +{ + abi_long ret; + void *p; + + p =3D lock_user_string(target_name); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(thr_set_name(tid, p)); + unlock_user(p, target_name, 0); + + return ret; +} + +static inline abi_long do_freebsd_rtprio_thread(int function, lwpid_t lwpi= d, + abi_ulong target_addr) +{ + int ret; + struct rtprio rtp; + + ret =3D t2h_freebsd_rtprio(&rtp, target_addr); + if (!is_error(ret)) { + ret =3D get_errno(rtprio_thread(function, lwpid, &rtp)); + } + if (!is_error(ret)) { + ret =3D h2t_freebsd_rtprio(target_addr, &rtp); + } + return ret; +} + +static inline abi_long do_freebsd_getcontext(CPUArchState *env, abi_ulong = arg1) +{ + abi_long ret; + target_ucontext_t *ucp; + sigset_t sigmask; + + if (arg1 =3D=3D 0) { + return -TARGET_EINVAL; + } + ret =3D do_sigprocmask(0, NULL, &sigmask); + if (!is_error(ret)) { + ucp =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_ucontext_t), 0= ); + if (ucp =3D=3D 0) { + return -TARGET_EFAULT; + } + ret =3D get_mcontext(env, &ucp->uc_mcontext, TARGET_MC_GET_CLEAR_R= ET); + host_to_target_sigset(&ucp->uc_sigmask, &sigmask); + memset(ucp->__spare__, 0, sizeof(ucp->__spare__)); + unlock_user(ucp, arg1, sizeof(target_ucontext_t)); + } + return ret; +} + +static inline abi_long do_freebsd_setcontext(CPUArchState *env, abi_ulong = arg1) +{ + abi_long ret; + target_ucontext_t *ucp; + sigset_t sigmask; + if (arg1 =3D=3D 0) { + return -TARGET_EINVAL; + } + ucp =3D lock_user(VERIFY_READ, arg1, sizeof(target_ucontext_t), 1); + if (ucp =3D=3D 0) { + return -TARGET_EFAULT; + } + ret =3D set_mcontext(env, &ucp->uc_mcontext, 0); + target_to_host_sigset(&sigmask, &ucp->uc_sigmask); + unlock_user(ucp, arg1, 0); + if (!is_error(ret)) { + (void)do_sigprocmask(SIG_SETMASK, &sigmask, NULL); + } + return ret =3D=3D 0 ? -TARGET_EJUSTRETURN : ret; +} + +/* swapcontext(2) */ +static inline abi_long do_freebsd_swapcontext(CPUArchState *env, abi_ulong= arg1, + abi_ulong arg2) +{ + abi_long ret; + target_ucontext_t *ucp; + sigset_t sigmask; + + if (arg1 =3D=3D 0 || arg2 =3D=3D 0) { + return -TARGET_EINVAL; + } + /* Save current context in arg1. */ + ret =3D do_sigprocmask(0, NULL, &sigmask); + if (!is_error(ret)) { + ucp =3D lock_user(VERIFY_WRITE, arg1, sizeof(target_ucontext_t), 0= ); + if (ucp =3D=3D 0) { + return -TARGET_EFAULT; + } + ret =3D get_mcontext(env, &ucp->uc_mcontext, TARGET_MC_GET_CLEAR_R= ET); + host_to_target_sigset(&ucp->uc_sigmask, &sigmask); + memset(ucp->__spare__, 0, sizeof(ucp->__spare__)); + unlock_user(ucp, arg1, sizeof(target_ucontext_t)); + } + if (is_error(ret)) { + return ret; + } + + /* Restore the context in arg2 to the current context. */ + ucp =3D lock_user(VERIFY_READ, arg2, sizeof(target_ucontext_t), 1); + if (ucp =3D=3D 0) { + return -TARGET_EFAULT; + } + ret =3D set_mcontext(env, &ucp->uc_mcontext, 0); + target_to_host_sigset(&sigmask, &ucp->uc_sigmask); + unlock_user(ucp, arg2, 0); + if (!is_error(ret)) { + (void)do_sigprocmask(SIG_SETMASK, &sigmask, NULL); + } + return ret =3D=3D 0 ? -TARGET_EJUSTRETURN : ret; +} + + +#define safe_g2h_untagged(x) ((x) !=3D 0 ? g2h_untagged(x) : NULL) + +/* + * undocumented _umtx_op(void *obj, int op, u_long val, void *uaddr, + * void *target_time); + */ + +#endif /* FREEBSD_OS_THREAD_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015999; cv=none; d=zohomail.com; s=zohoarc; b=OYlbGonc5L2Htb7QL7HkDHCB53WF1gRDCWoVXOGSWUKml5h5eDoAhRPdTg1ZYYU0Lwc32oydQvVntTTIQdQy01YD4A/+7K97MY2gWy5zvd46NidEOJRnU12ylDYVeNg+9Q9mCOCx0qCe5mRaLGr5ylMv4BXkRvjGioIK5vmY2Yg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015999; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3oObxpLj8nYhSS5eWFV4JzUsYWuFhvft7QmFGBajXwY=; b=D/K2mOEVjssPhWflUzBzN1F5mzz6GmzgqvLGIx8+mEgDUmn9WW3ZDuqSJVHKw9I3yyy1Z488flKnot8DgZwgKcB9Y368YsuV1Lz3tujsEV9rCws5sExiphjdx8RZempTMX/av3SqiejPDUgqOoyuwr59OwcSO0aEExSY/a5UmlE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015999316503.26234566897256; Sat, 20 Jun 2026 21:26:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hd-0003Ba-6x; Sun, 21 Jun 2026 00:22:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hW-00036H-C0 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:31 -0400 Received: from mail-oo1-xc44.google.com ([2607:f8b0:4864:20::c44]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hQ-0005Ic-Ga for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:29 -0400 Received: by mail-oo1-xc44.google.com with SMTP id 006d021491bc7-6a0eb989530so433125eaf.0 for ; Sat, 20 Jun 2026 21:22:23 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015743; x=1782620543; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=3oObxpLj8nYhSS5eWFV4JzUsYWuFhvft7QmFGBajXwY=; b=iTQ9oDHjgimLP2YZ29Sl58H4Ul6Oq6NenlTUFeby28Im/6DzzRdsywY9RmD/RqOw2F 1wbek0XJqYnQ+cWMyUA/vnjGBuTkrEDfcOnZTrPlTtA6rL1AvPr/U7tM6JdL0g6r6RcX 6u4kmVz0KrN+TUR/rhd3syfHq8ZabmN7oUT76XbrkFOD7Liigs0t79LsyjzGrSI06/iz v8AFvSW3498hLLx+vM95rSgwN81L3OiwIFpBqJoX6+DBph66wtHLkDxB3vv0iHyCltiH XZrPs+JLKW1EO+UgaqWkeaaW00uqD3FpEIBYnF1rVP5KeoMK+5c4NlgjDXPQuQHN/UQx 2KKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015743; x=1782620543; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=3oObxpLj8nYhSS5eWFV4JzUsYWuFhvft7QmFGBajXwY=; b=c6AOZE2NHRpp8lwFHfedu49VDmLTlbFwroclemCF3ryocZW3wwigAgOM+C2k9IWyCa Xm3g3nw5kKAwPcRh4079LljVyvgWEdgxq0klnAjaI8UWnbFq6S136NCFTlECM5kHeyro 0+EJgKwMwkr9hFe26pJ2wsx1MUGLG1rMIdCq/7jsQ90WlmG7vKSMFbBBHryW/6ct6qhQ rE/0CwEe2UfBZHdI5vfnZE8u5Fe5Qm2RSctNBigsne10AI7TKJEx8LngP9n+BoktqkNq iRfMgkDXKSgegqXElQLKUweg0sIf9K+bQ30UHwgmcBasIqFJa9a+ZmGskfEIgQa7/9gk W2Bg== X-Gm-Message-State: AOJu0YySqRul0+xWx7Lcqj1ZdhsmHzwDTZ12LSLx1TkvRW4Mzq8YtsTO +/2HcaDNi5f3E1YuPKL14AY3cs6OsLGmt4oECQyI3ZGh5nljBHlxu91pnmUxGc8b2bs= X-Gm-Gg: AfdE7cl4aAuPyE6y1xA3SdbIAqIQvXXzTwTZIn46kiLAg5LXwLUzqtlTNu98OjJaJ2e 4d33RFCp3gkv24CZtpcn9tuaaJcKhpfcqSd2h5QV2EZyZLH1y+y0mIMuBMS51u8BjT67XYymEME iIlu5HFNAEbH5Pj+HR19SbUvHDOTjHqbtORlk4tURVXmXDpMacT9Rq5cNyFCNhnPl0TVmQN6i/c E9MKC63Fi1F9HpaknhrYpQSTrwVwNmK30LAHD1C9Vc8+fu4cOqvU0U8/JNc/20c8gX2fvmy8UjB 3kj8/Kulxj6bXByHlZWFlgE9Te61HEBp9r0tK0/B8K+7gtgN5HFr0CrSscyOVSCPd/uE1acUWPL MVzEleKtz0VNLHtndVt5VR9dEURMjoIqvi3dLMXir7nKOIgev7OYp/9+Y3dtdK+Srg2o0YMap5y w= X-Received: by 2002:a05:6820:198f:b0:694:6acf:a420 with SMTP id 006d021491bc7-6a0d88787fcmr7977324eaf.15.1782015742770; Sat, 20 Jun 2026 21:22:22 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:16 -0600 Subject: [PATCH v3 29/40] bsd-user: Add do_freebsd__umtx_op to os-thread.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-29-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans , Jessica Clarke , Sean Bruno X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=72546; i=imp@bsdimp.com; h=from:subject:message-id; bh=MQKXFhl3QW01f3iV8CF2mBbhYDfUQ8EkOGn94AYVzsc=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aAtFzd0ysiLi+g9mSY+lRMHPjXHC/kcXOhI wRRvhM9NumJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AEhsEACKghZVhMO5NSPog193ysU4FMsPQg7Eqaf/oeCEGUi+7XRxxe4kKwa4XSWn1zHFk8mHeOc GTxXZd5LBd4FNOZ5leoMc9aMthWFn+Uv2T593j8vNxpk+Aj6OjpVnPzFT+VmEL+0idkTct8ATbd eRTc4MQ7a3DZiLWL0F1h7ixQ1mbfTTKU3NqQhGauBe0gucRAZ46XUvOgbVLRpFcaKrmCqpnxZ+7 whw928rhmcxZ4RrXyNXEUG0PfKd2z+KOd3Q+B43jfatCwUF1iQk3Ov/WT5Q562//KJxu8w6EcX4 SG/rZ4C/NXFV5sijcsEOMWHrvglmuAoMFHHRIFXfs4SiuWRNZyO0ji+ld9OUxC8uPZJWNPRiVOu Q3lvrH3GPWb17UbnF6nPjZSKIYyZuxn2j8p3bk3VAqs6qxNzW2zxXL3gmwZ4AVk/CU0tMvNEy9n aDqd9wws543RX8A2xPhEHfEyCUii0yXeqWakNKwR+4xERU4Kyy1r9dUoBbdUGJKPciJXJZqm3WJ Tu4iyz7aNNGgj0I8ZfqgHJtEvlfkDgv1iCyBBUx45uHeF06SMH/b+L0aUwsTEgRhMHHbGX2I1dS c7pFzCyq9T4YyBXMp7pBkXUZaDG0e3rfscaZIkAF8R+3qO6oGeUush/98TcQWgSLssYuZ2Y/+98 rHaSl33nRbPLf1g== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c44; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc44.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_FILL_THIS_FORM_SHORT=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016001406154100 Add the _umtx_op system call implementation with support for UMTX lock/unlock, mutex operations, condition variables, reader-writer locks, semaphores, shared memory, and robust lists. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Signed-off-by: Jessica Clarke Signed-off-by: Sean Bruno Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/meson.build | 1 + bsd-user/freebsd/os-thread.c | 1682 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-thread.h | 352 +++++++++ 3 files changed, 2035 insertions(+) diff --git a/bsd-user/freebsd/meson.build b/bsd-user/freebsd/meson.build index 163d5657db..db531604ad 100644 --- a/bsd-user/freebsd/meson.build +++ b/bsd-user/freebsd/meson.build @@ -9,6 +9,7 @@ bsd_user_ss.add(files( 'os-stat.c', 'os-sys.c', 'os-syscall.c', + 'os-thread.c', 'os-time.c'), bsd_syscall_nr ) diff --git a/bsd-user/freebsd/os-thread.c b/bsd-user/freebsd/os-thread.c new file mode 100644 index 0000000000..63c17e10d0 --- /dev/null +++ b/bsd-user/freebsd/os-thread.c @@ -0,0 +1,1682 @@ +/* + * FreeBSD thr emulation support code + * + * Copyright (c) 2013-2015 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" + +#include + +#include "qemu.h" +#include "qemu-os.h" +#include "signal-common.h" +#include "target_arch_cpu.h" +#include "target_arch_thread.h" +#include "tcg/startup.h" +#include "exec/tb-flush.h" + +#include "os-thread.h" + +/* #define DEBUG_UMTX(...) fprintf(stderr, __VA_ARGS__) */ +/* #define DEBUG_UMTX(...) qemu_log(__VA_ARGS__) */ +#define DEBUG_UMTX(...) + +#define DETECT_DEADLOCK 0 +#define DEADLOCK_TO 1200 + +#define NEW_STACK_SIZE 0x40000 + +/* sys/_umtx.h */ +struct target_umtx { + abi_ulong u_owner; /* Owner of the mutex. */ +}; + +struct target_umutex { + uint32_t m_owner; /* Owner of the mutex */ + uint32_t m_flags; /* Flags of the mutex */ + uint32_t m_ceiling[2]; /* Priority protect ceiling */ + abi_ulong m_rb_lnk; /* Robust linkage. */ +#if TARGET_ABI_BITS =3D=3D 32 + uint32_t m_pad; +#endif + uint32_t m_spare; + uint32_t m_count; /* QEMU-internal; takes one spare. */ +}; + +struct target_ucond { + uint32_t c_has_waiters; /* Has waiters in kernel */ + uint32_t c_flags; /* Flags of the condition variable */ + uint32_t c_clockid; /* Clock id */ + uint32_t c_spare[1]; +}; + +struct target_urwlock { + uint32_t rw_state; + uint32_t rw_flags; + uint32_t rw_blocked_readers; + uint32_t rw_blocked_writers; + uint32_t rw_spare[4]; +}; + +struct target__usem { + uint32_t _has_waiters; + uint32_t _count; + uint32_t _flags; +}; + +struct target__usem2 { + uint32_t _count; + uint32_t _flags; +}; + +struct target_umtx_robust_lists_params { + abi_ulong robust_list_offset; +#if TARGET_ABI_BITS =3D=3D 32 + uint32_t m_pad1; +#endif + abi_ulong robust_priv_list_offset; +#if TARGET_ABI_BITS =3D=3D 32 + uint32_t m_pad2; +#endif + abi_ulong robust_inact_offset; +#if TARGET_ABI_BITS =3D=3D 32 + uint32_t m_pad3; +#endif +}; + +/* + * !!! These mutexes must be reset in fork_end() (in bsd-user/main.c). + */ +static pthread_mutex_t new_thread_lock =3D PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t *new_freebsd_thread_lock_ptr =3D &new_thread_lock; +static pthread_mutex_t umtx_wait_lck =3D PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t *freebsd_umtx_wait_lck_ptr =3D &umtx_wait_lck; + +static void rtp_to_schedparam(const struct rtprio *rtp, int *policy, + struct sched_param *param) +{ + + switch (rtp->type) { + case RTP_PRIO_REALTIME: + *policy =3D SCHED_RR; + param->sched_priority =3D RTP_PRIO_MAX - rtp->prio; + break; + + case RTP_PRIO_FIFO: + *policy =3D SCHED_FIFO; + param->sched_priority =3D RTP_PRIO_MAX - rtp->prio; + break; + + default: + *policy =3D SCHED_OTHER; + param->sched_priority =3D 0; + break; + } +} + +void *new_freebsd_thread_start(void *arg) +{ + new_freebsd_thread_info_t *info =3D arg; + CPUArchState *env; + CPUState *cpu; + long tid; + + rcu_register_thread(); + tcg_register_thread(); + env =3D info->env; + cpu =3D env_cpu(env); + thread_cpu =3D cpu; + (void)thr_self(&tid); + + /* copy out the child TID to both locations */ + if (info->param.child_tid) { + put_user_ual(tid, info->param.child_tid); + } + if (info->param.parent_tid) { + put_user_ual(tid, info->param.parent_tid); + } + + /* Set arch dependent registers to start thread. */ + target_thread_set_upcall(env, info->param.start_func, info->param.arg, + info->param.stack_base, info->param.stack_size); + target_cpu_set_tls(env, info->param.tls_base); + + /* Enable signals */ + sigprocmask(SIG_SETMASK, &info->sigmask, NULL); + /* Signal to the parent that we're ready. */ + pthread_mutex_lock(&info->mutex); + pthread_cond_broadcast(&info->cond); + pthread_mutex_unlock(&info->mutex); + /* Wait until the parent has finished. */ + pthread_mutex_lock(new_freebsd_thread_lock_ptr); + pthread_mutex_unlock(new_freebsd_thread_lock_ptr); + + cpu_loop(env); + /* never exits */ + + return NULL; +} + +/* + * FreeBSD user mutex (_umtx) emulation + */ +static int tcmpset_al(abi_ulong *addr, abi_ulong a, abi_ulong b) +{ + abi_ulong current =3D tswapal(a); + abi_ulong new =3D tswapal(b); + +#ifdef TARGET_ABI32 + return atomic_cmpset_acq_32(addr, current, new); +#else + return atomic_cmpset_acq_64(addr, current, new); +#endif +} + +#ifdef _UMTX_OPTIMIZED +static int optimized_umtx_op(abi_ulong obj, int op, abi_ulong val, + void *uaddr1, void *uaddr2) +{ + + return get_errno(safe__umtx_op(g2h_untagged(obj), QEMU_UMTX_OP(op), va= l, + uaddr1, uaddr2)); +} + +#else /* !_UMTX_OPTIMIZED */ + +/* + * _cv_mutex keeps other threads from doing a signal or broadcast until + * the thread is actually asleep and ready. This is a global mutex for all + * condition vars so I am sure performance may be a problem if there are l= ots + * of CVs. + * + */ +static struct umutex _cv_mutex; + +static int tcmpset_32(uint32_t *addr, uint32_t a, uint32_t b) +{ + uint32_t current =3D tswap32(a); + uint32_t new =3D tswap32(b); + + return atomic_cmpset_acq_32(addr, current, new); +} + +#endif /* _UMTX_OPTIMIZED */ + +static abi_long _umtx_wait_uint(uint32_t *addr, uint32_t target_val, + size_t tsz, void *t, const char *where) +{ +#if DETECT_DEADLOCK + abi_long ret; + long cnt =3D 0; + + /* target_val has already been tswap'ed. */ + if (t =3D=3D NULL) { + struct timespec ts; + + ts.tv_sec =3D 5; + ts.tv_nsec =3D 0; + + do { + if (target_val !=3D *addr) { + return 0; + } + + ret =3D get_errno(safe__umtx_op(addr, QEMU_UMTX_OP(UMTX_OP_WAI= T_UINT), + target_val, NULL, &ts)); + + if (ret !=3D -TARGET_ETIMEDOUT) { + return ret; + } + if (cnt++ > DEADLOCK_TO) { + fprintf(stderr, "QEMU: Deadlock in %s from %s\n", + __func__, where); + abort(); + } + } while (1); + } else +#endif + return get_errno(safe__umtx_op(addr, QEMU_UMTX_OP(UMTX_OP_WAIT_UIN= T), + target_val, (void *)tsz, t)); +} + +abi_long freebsd_umtx_wait_uint(abi_ulong obj, uint32_t target_val, + size_t tsz, void *t) +{ + /* target_val has already been tswap'ed. */ + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, %d, %p)\n", __func__, + g2h_untagged(obj), UMTX_OP_WAIT_UINT, target_val, (int)tsz,= t); + + return _umtx_wait_uint(g2h_untagged(obj), target_val, tsz, t, __func__= ); +} + +static abi_long _umtx_wait_uint_private(uint32_t *addr, uint32_t target_va= l, + size_t tsz, void *t, const char *where) +{ +#if DETECT_DEADLOCK + abi_long ret; + long cnt =3D 0; + + /* target_val has already been tswap'ed. */ + if (t =3D=3D NULL) { + struct timespec ts; + + ts.tv_sec =3D 5; + ts.tv_nsec =3D 0; + + do { + if (target_val !=3D *addr) { + return 0; + } + + ret =3D get_errno(safe__umtx_op(addr, + QEMU_UMTX_OP(UMTX_OP_WAIT_UINT_PRIVATE), target_val, NULL, + &ts)); + + if (ret !=3D -TARGET_ETIMEDOUT) { + return ret; + } + if (cnt++ > DEADLOCK_TO) { + fprintf(stderr, "QEMU: Deadlock in %s from %s\n", __func__, + where); + abort(); + } + } while (1); + } else +#endif /* DETECT_DEADLOCK */ + { + return get_errno(safe__umtx_op(addr, + QEMU_UMTX_OP(UMTX_OP_WAIT_UINT_PRIVATE), target_val, (void *)t= sz, + t)); + } +} + +abi_long freebsd_umtx_wait_uint_private(abi_ulong obj, uint32_t target_val, + size_t tsz, void *t) +{ + DEBUG_UMTX(" %s: _umtx_op(%p (%u), %d, 0x%x, %d, %p= )\n", + __func__, g2h_untagged(obj), tswap32(*(uint32_t *)g2h_untagged(obj= )), + UMTX_OP_WAIT_UINT_PRIVATE, target_val, (int)tsz, t); + + return _umtx_wait_uint_private(g2h_untagged(obj), target_val, tsz, t, + __func__); +} + +static abi_long _umtx_wait(abi_ulong *addr, abi_ulong target_val, size_t t= sz, + void *t, const char *where) +{ +#if DETECT_DEADLOCK + abi_long ret; + long cnt =3D 0; + + /* target_val has already been tswap'ed. */ + + if (t =3D=3D NULL) { + struct timespec ts; + + ts.tv_sec =3D 5; + ts.tv_nsec =3D 0; + + do { + if (target_val !=3D *addr) { + return 0; + } + + ret =3D get_errno(safe__umtx_op(addr, QEMU_UMTX_OP(UMTX_OP_WAI= T), + target_val, NULL, &ts)); + if (ret !=3D -TARGET_ETIMEDOUT) { + return ret; + } + + if (cnt++ > DEADLOCK_TO) { + fprintf(stderr, "QEMU: Deadlock in %s from %s\n", __func__, + where); + abort(); + } + } while (1); + } else +#endif /* DETECT_DEADLOCK */ + { + return get_errno(safe__umtx_op(addr, QEMU_UMTX_OP(UMTX_OP_WAIT), + target_val, (void *)tsz, t)); + } +} + +abi_long freebsd_umtx_wait(abi_ulong targ_addr, abi_ulong target_id, size_= t tsz, + void *t) +{ + + /* target_id has already been tswap'ed. */ + + /* We want to check the user memory but not lock it. We might sleep. = */ + if (!access_ok(VERIFY_READ, targ_addr, sizeof(abi_ulong))) { + return -TARGET_EFAULT; + } + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, %d, %p)\n", + __func__, g2h_untagged(targ_addr), UMTX_OP_WAIT, (long long)target= _id, + (int)tsz, t); + return _umtx_wait(g2h_untagged(targ_addr), target_id, tsz, t, __func__= ); +} + + +abi_long freebsd_umtx_wake_private(abi_ulong obj, uint32_t val) +{ + + DEBUG_UMTX(" %s: _umtx_op(%p (%d), %d, %u, NULL, NULL)\n= ", + __func__, g2h_untagged(obj), tswap32(*(uint32_t *)g2h_untagged(obj= )), + UMTX_OP_WAKE_PRIVATE, val); + return get_errno(safe__umtx_op(g2h_untagged(obj), + QEMU_UMTX_OP(UMTX_OP_WAKE_PRIVATE), val, NULL, NULL)); +} + +#if defined(UMTX_OP_NWAKE_PRIVATE) +#define BATCH_SIZE 128 +abi_long freebsd_umtx_nwake_private(abi_ulong target_array_addr, uint32_t = num) +{ +#ifdef _UMTX_OPTIMIZED + abi_ulong *tp; + uintptr_t uaddrs[BATCH_SIZE]; + int count, error, i, j; + + if (!access_ok(VERIFY_READ, target_array_addr, num * sizeof(abi_ulong)= )) { + return -TARGET_EFAULT; + } + + /* + * If we haven't relocated the guest, there's a 1:1 mapping so we can = avoid + * having to g2h_untagged() each address and just pass it through as-i= s. + */ + if (!have_guest_base && !reserved_va) { + return optimized_umtx_op(target_array_addr, UMTX_OP_NWAKE_PRIVATE,= num, + NULL, NULL); + } + + tp =3D (abi_ulong *)g2h_untagged(target_array_addr); + for (i =3D 0, count =3D num; i < num; i +=3D BATCH_SIZE, count -=3D BA= TCH_SIZE) { + for (j =3D i; j < i + MIN(BATCH_SIZE, count); j++) { + uaddrs[j % BATCH_SIZE] =3D (uintptr_t)g2h_untagged(tp[j]); + } + + /* + * This one should not be passed as compat32 at this point; we've + * converted them all to host pointers. + */ + error =3D get_errno(safe__umtx_op(uaddrs, UMTX_OP_NWAKE_PRIVATE, + MIN(BATCH_SIZE, count), NULL, NULL)); + if (is_error(error)) { + return error; + } + } + + return 0; +#else + int i; + abi_ulong *uaddr; + abi_long ret =3D 0; + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL) Wakin= g: ", + __func__, g2h_untagged(target_array_addr), UMTX_OP_NWAKE_PRIVATE, = num); + + if (!access_ok(VERIFY_READ, target_array_addr, num * sizeof(abi_ulong)= )) { + return -TARGET_EFAULT; + } + + uaddr =3D (abi_ulong *)g2h_untagged(target_array_addr); + for (i =3D 0; i < (int32_t)num; i++) { + DEBUG_UMTX("%p (%u) ", g2h_untagged(tswapal(uaddr[i])), + tswap32(*(uint32_t *)g2h_untagged(tswapal(uaddr[i])))); + ret =3D get_errno(safe__umtx_op(g2h_untagged(tswapal(uaddr[i])), + UMTX_OP_WAKE_PRIVATE, INT_MAX, NULL, NULL)); + if (is_error(ret)) { + DEBUG_UMTX("\n"); + return ret; + } + } + DEBUG_UMTX("\n"); + return ret; +#endif /* _UMTX_OPTIMIZED */ +} +#endif /* UMTX_OP_NWAKE_PRIVATE */ + +#if defined(UMTX_OP_MUTEX_WAKE2) +abi_long freebsd_umtx_mutex_wake2(abi_ulong target_addr, uint32_t flags) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_umutex)= )) { + return -TARGET_EFAULT; + } + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_MUTEX_WAKE2, flags); + return optimized_umtx_op(target_addr, UMTX_OP_MUTEX_WAKE2, flags, NULL, + NULL); +#else + uint32_t count, owner, *addr; + struct target_umutex *target_umutex; + + if (!lock_user_struct(VERIFY_WRITE, target_umutex, target_addr, 1)) { + return -TARGET_EFAULT; + } + pthread_mutex_lock(&umtx_wait_lck); + __get_user(count, &target_umutex->m_count); + __get_user(owner, &target_umutex->m_owner); + while ((owner & TARGET_UMUTEX_CONTESTED) =3D=3D 0 && (count > 1 || + (count =3D=3D 1 && (owner & ~TARGET_UMUTEX_CONTESTED) !=3D 0))= ) { + if (tcmpset_32(&target_umutex->m_owner, owner, + (owner | TARGET_UMUTEX_CONTESTED))) + break; + + /* owner has changed */ + __get_user(owner, &target_umutex->m_owner); + } + pthread_mutex_unlock(&umtx_wait_lck); + addr =3D &target_umutex->m_owner; + /* tcmpset_32 above writes to guest, and addr is just a key below */ + unlock_user_struct(target_umutex, target_addr, 0); + + return get_errno(safe__umtx_op(addr, UMTX_OP_WAKE_PRIVATE, 1, NULL, + NULL)); +#endif /* _UMTX_OPTIMIZED */ +} +#endif /* UMTX_OP_MUTEX_WAKE2 */ + +abi_long freebsd_umtx_sem2_wait(abi_ulong obj, size_t tsz, void *t) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, obj, sizeof(struct target__usem2))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(obj, UMTX_OP_SEM2_WAIT, 1, + (void *)(uintptr_t)tsz, t); +#else + struct target__usem2 *t__usem2; + uint32_t count, flags; + uint32_t *addr; + abi_long ret =3D 0; + + if (!lock_user_struct(VERIFY_WRITE, t__usem2, obj, 0)) { + return -TARGET_EFAULT; + } + + /* + * Make sure the count field has the has USEM_HAS_WAITERS flag set + * so userland will always call freebsd_umtx_sem2_wake(). + */ + for (;;) { + __get_user(count, &t__usem2->_count); + if (USEM_COUNT(count) !=3D 0) { + unlock_user_struct(t__usem2, obj, 1); + return 0; + } + if ((count & USEM_HAS_WAITERS) !=3D 0) { + break; + } + if (tcmpset_32(&t__usem2->_count, count, (count | USEM_HAS_WAITERS= ))) { + break; + } + } + + __get_user(flags, &t__usem2->_flags); + addr =3D &t__usem2->_count; + unlock_user_struct(t__usem2, obj, 1); + + if ((flags & USYNC_PROCESS_SHARED) =3D=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %p)\n", + __func__, addr, UMTX_OP_WAIT_UINT_PRIVATE, (int)tsz, t); + +#if DETECT_DEADLOCK + if (t !=3D NULL) { + ret =3D _umtx_wait_uint_private(addr, tswap32(USEM_HAS_WAITERS= ), tsz, + t, __func__); + } else { + for (;;) { + struct timespec ts; + + ts.tv_sec =3D 120; + ts.tv_nsec =3D 0; + + ret =3D _umtx_wait_uint_private(addr, tswap32(USEM_HAS_WAI= TERS), + 0, (void *)&ts, __func__); + if (ret =3D=3D 0) { + break; + } + if (ret !=3D -ETIMEDOUT) { + break; + } + if (!lock_user_struct(VERIFY_READ, t__usem2, obj, 1)) { + return -TARGET_EFAULT; + } + __get_user(count, &t__usem2->_count); + unlock_user_struct(t__usem2, obj, 0); + if (USEM_COUNT(count) !=3D 0) { + fprintf(stderr, "QEMU:(%s) TIMEOUT (count!=3D0)\n", __= func__); + ret =3D 0; + break; + } + if (ret =3D=3D -ETIMEDOUT) { + fprintf(stderr, "QEMU:(%s) TIMEOUT (exiting)\n", __fun= c__); + exit(-1); + } + } + } +#else + ret =3D _umtx_wait_uint_private(addr, tswap32(USEM_HAS_WAITERS), + tsz, t, __func__); +#endif /* DETECT_DEADLOCK */ + } else { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %p)\n", + __func__, addr, UMTX_OP_WAIT_UINT, (int)tsz, t); +#if DETECT_DEADLOCK + if (t !=3D NULL) { + ret =3D _umtx_wait_uint(addr, tswap32(USEM_HAS_WAITERS), tsz, = t, + __func__); + } else { + for (;;) { + struct timespec ts; + + ts.tv_sec =3D 120; + ts.tv_nsec =3D 0; + + ret =3D _umtx_wait_uint(addr, tswap32(USEM_HAS_WAITERS), 0, + (void *)&ts, __func__); + if (ret =3D=3D 0) { + break; + } + if (ret !=3D -ETIMEDOUT) { + break; + } + if (!lock_user_struct(VERIFY_READ, t__usem2, obj, 1)) { + return -TARGET_EFAULT; + } + __get_user(count, &t__usem2->_count); + unlock_user_struct(t__usem2, obj, 0); + if (USEM_COUNT(count) !=3D 0) { + fprintf(stderr, "QEMU:(%s) TIMEOUT (count!=3D0)\n", __= func__); + ret =3D 0; + break; + } + if (ret =3D=3D -ETIMEDOUT) { + fprintf(stderr, "QEMU:(%s) TIMEOUT (exiting)\n", __fun= c__); + exit(-1); + } + } + } +#else + ret =3D _umtx_wait_uint(addr, tswap32(USEM_HAS_WAITERS), tsz, t, + __func__); +#endif /* DETECT_DEADLOCK */ + } + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_umtx_sem2_wake(abi_ulong obj) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_READ, obj, sizeof(struct target__usem2))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(obj, UMTX_OP_SEM2_WAKE, 1, NULL, NULL); +#else + struct target__usem2 *t__usem2; + uint32_t *addr, flags; + abi_long ret; + + if (!lock_user_struct(VERIFY_READ, t__usem2, obj, 1)) { + return -TARGET_EFAULT; + } + + __get_user(flags, &t__usem2->_flags); + addr =3D &t__usem2->_count; + unlock_user_struct(t__usem2, obj, 0); + + if ((flags & USYNC_PROCESS_SHARED) =3D=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, addr, UMTX_OP_WAKE_PRIVATE, INT_MAX); + ret =3D get_errno(safe__umtx_op(addr, UMTX_OP_WAKE_PRIVATE, INT_MA= X, NULL, + NULL)); + } else { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, addr, UMTX_OP_WAKE, INT_MAX); + ret =3D get_errno(safe__umtx_op(addr, UMTX_OP_WAKE, INT_MAX, NULL,= NULL)); + } + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_umtx_sem_wait(abi_ulong obj, size_t tsz, void *t) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, obj, sizeof(struct target__usem))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(obj, UMTX_OP_SEM_WAIT, 1, + (void *)(uintptr_t)tsz, t); +#else + struct target__usem *t__usem; + uint32_t count, flags, *addr; + abi_long ret; + + if (!lock_user_struct(VERIFY_WRITE, t__usem, obj, 0)) { + return -TARGET_EFAULT; + } + + __get_user(count, &t__usem->_count); + if (count !=3D 0) { + unlock_user_struct(t__usem, obj, 1); + return 0; + } + + /* + * Make sure the _has_waiters field is set so userland will always + * call freebsd_umtx_sem_wake(). + */ + __put_user(1, &t__usem->_has_waiters); + + __get_user(flags, &t__usem->_flags); + addr =3D &t__usem->_count; + unlock_user_struct(t__usem, obj, 1); + + if ((flags & USYNC_PROCESS_SHARED) =3D=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, &t__usem->_count, UMTX_OP_WAKE_PRIVATE, = 0); + ret =3D _umtx_wait_uint_private(addr, 0, tsz, t, __func__); + } else { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, &t__usem->_count, UMTX_OP_WAKE, 0); + ret =3D _umtx_wait_uint(addr, 0, tsz, t, __func__); + } + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_umtx_sem_wake(abi_ulong obj) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, obj, sizeof(struct target__usem))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(obj, UMTX_OP_SEM_WAKE, 1, NULL, NULL); +#else + struct target__usem *t__usem; + uint32_t flags, *addr; + abi_long ret; + + if (!lock_user_struct(VERIFY_READ, t__usem, obj, 1)) { + return -TARGET_EFAULT; + } + __get_user(flags, &t__usem->_flags); + addr =3D &t__usem->_count; + unlock_user_struct(t__usem, obj, 0); + + if ((flags & USYNC_PROCESS_SHARED) =3D=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, &t__usem->_count, UMTX_OP_WAKE_PRIVATE, = 1); + ret =3D get_errno(safe__umtx_op(addr, UMTX_OP_WAKE_PRIVATE, 1,= NULL, + NULL)); + } else { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, %d, NULL, NULL)\n", + __func__, &t__usem->_count, UMTX_OP_WAKE, 1); + ret =3D get_errno(safe__umtx_op(addr, UMTX_OP_WAKE, 1, NULL, N= ULL)); + } + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long t2h_freebsd_rtprio(struct rtprio *host_rtp, abi_ulong target_addr) +{ + struct target_freebsd_rtprio *target_rtp; + + if (!lock_user_struct(VERIFY_READ, target_rtp, target_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(host_rtp->type, &target_rtp->type); + __get_user(host_rtp->prio, &target_rtp->prio); + unlock_user_struct(target_rtp, target_addr, 0); + return 0; +} + +abi_long h2t_freebsd_rtprio(abi_ulong target_addr, struct rtprio *host_rtp) +{ + struct target_freebsd_rtprio *target_rtp; + + if (!lock_user_struct(VERIFY_WRITE, target_rtp, target_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(host_rtp->type, &target_rtp->type); + __put_user(host_rtp->prio, &target_rtp->prio); + unlock_user_struct(target_rtp, target_addr, 1); + return 0; +} + +/* XXX We should never see this? OP_LOCK and OP_UNLOCK are now RESERVED{0,= 1} */ +abi_long freebsd_lock_umtx(abi_ulong target_addr, abi_long id, size_t tsz, + void *t) +{ + abi_long ret; + abi_long owner; + + gemu_log("This is unreachable."); + + /* + * XXX Note that memory at umtx_addr can change and so we need to be + * careful and check for faults. + */ + for (;;) { + struct target_umtx *target_umtx; + + if (!lock_user_struct(VERIFY_WRITE, target_umtx, target_addr, 0)) { + return -TARGET_EFAULT; + } + /* Check the simple uncontested case. */ + if (tcmpset_al(&target_umtx->u_owner, + TARGET_UMTX_UNOWNED, id)) { + unlock_user_struct(target_umtx, target_addr, 1); + return 0; + } + /* Check to see if the lock is contested but free. */ + __get_user(owner, &target_umtx->u_owner); + + if (TARGET_UMTX_CONTESTED =3D=3D owner) { + if (tcmpset_al(&target_umtx->u_owner, TARGET_UMTX_CONTESTED, + id | TARGET_UMTX_CONTESTED)) { + unlock_user_struct(target_umtx, target_addr, 1); + return 0; + } + /* We failed because it changed on us, restart. */ + unlock_user_struct(target_umtx, target_addr, 1); + continue; + } + + /* Set the contested bit and sleep. */ + do { + __get_user(owner, &target_umtx->u_owner); + if (owner & TARGET_UMTX_CONTESTED) { + break; + } + } while (!tcmpset_al(&target_umtx->u_owner, owner, + owner | TARGET_UMTX_CONTESTED)); + + __get_user(owner, &target_umtx->u_owner); + unlock_user_struct(target_umtx, target_addr, 1); + + /* Byte swap, if needed, to match what is stored in user mem. */ + owner =3D tswapal(owner); + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_WAIT, + (long long)owner); + ret =3D _umtx_wait(g2h_untagged(target_addr), owner, tsz, t, __fun= c__); + if (is_error(ret)) { + return ret; + } + } +} + +/* XXX We should never see this? OP_LOCK and OP_UNLOCK are now RESERVED{0,= 1} */ +abi_long freebsd_unlock_umtx(abi_ulong target_addr, abi_long id) +{ + abi_ulong owner; + struct target_umtx *target_umtx; + + gemu_log("This is unreachable."); + if (!lock_user_struct(VERIFY_WRITE, target_umtx, target_addr, 0)) { + return -TARGET_EFAULT; + } + __get_user(owner, &target_umtx->u_owner); + if ((owner & ~TARGET_UMTX_CONTESTED) !=3D id) { + unlock_user_struct(target_umtx, target_addr, 1); + return -TARGET_EPERM; + } + /* Check the simple uncontested case. */ + if ((owner & ~TARGET_UMTX_CONTESTED) =3D=3D 0) { + if (tcmpset_al(&target_umtx->u_owner, owner, + TARGET_UMTX_UNOWNED)) { + unlock_user_struct(target_umtx, target_addr, 1); + return 0; + } + } + /* This is a contested lock. Unlock it. */ + __put_user(TARGET_UMTX_UNOWNED, &target_umtx->u_owner); + unlock_user_struct(target_umtx, target_addr, 1); + + /* Wake up all those contesting it. */ + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_WAKE, 0); + return get_errno(safe__umtx_op(g2h_untagged(target_addr), + QEMU_UMTX_OP(UMTX_OP_WAKE), 0, 0, 0)); +} + +abi_long freebsd_umtx_wake(abi_ulong target_addr, uint32_t n_wake) +{ + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_WAKE, n_wake); + return get_errno(safe__umtx_op(g2h_untagged(target_addr), + QEMU_UMTX_OP(UMTX_OP_WAKE), n_wake, NULL, 0)); +} + +abi_long freebsd_umtx_wake_unsafe(abi_ulong target_addr, uint32_t n_wake) +{ + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_WAKE, n_wake); + return get_errno(_umtx_op(g2h_untagged(target_addr), + QEMU_UMTX_OP(UMTX_OP_WAKE), n_wake, NULL, 0)); +} + +abi_long freebsd_umtx_mutex_wake(abi_ulong obj, abi_long val) +{ + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, NULL, NULL)\n", + __func__, g2h_untagged(obj), UMTX_OP_WAKE, (long long)val); + return get_errno(safe__umtx_op(g2h_untagged(obj), + QEMU_UMTX_OP(UMTX_OP_MUTEX_WAKE), val, NULL, NULL)); +} + +abi_long freebsd_lock_umutex(abi_ulong target_addr, uint32_t id, + void *ts, size_t tsz, int mode, abi_ulong val) +{ +#ifdef _UMTX_OPTIMIZED + int op; + + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_umutex)= )) { + return -TARGET_EFAULT; + } + + switch (mode) { + case TARGET_UMUTEX_WAIT: + op =3D UMTX_OP_MUTEX_WAIT; + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, %p, %p)\n", + __func__, g2h_untagged(target_addr), op, (long long)val, + (void *)(uintptr_t)tsz, ts); + break; + case TARGET_UMUTEX_TRY: + op =3D UMTX_OP_MUTEX_TRYLOCK; + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, %p, %p)\n= ", + __func__, g2h_untagged(target_addr), op, (long long)val, + (void *)(uintptr_t)tsz, ts); + break; + default: + op =3D UMTX_OP_MUTEX_LOCK; + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%llx, %p, %p)\n", + __func__, g2h_untagged(target_addr), op, (long long)val, + (void *)(uintptr_t)tsz, ts); + break; + } + + return optimized_umtx_op(target_addr, op, val, (void *)(uintptr_t)tsz,= ts); +#else + struct target_umutex *target_umutex; + uint32_t owner, flags, count, *addr; + int ret =3D 0; + + if (!lock_user_struct(VERIFY_WRITE, target_umutex, target_addr, 0)) { + return -TARGET_EFAULT; + } + + for (;;) { + + __get_user(owner, &target_umutex->m_owner); + + if ((owner & ~TARGET_UMUTEX_CONTESTED) =3D=3D 0) { + /* Lock is unowned. */ + if (TARGET_UMUTEX_WAIT =3D=3D mode) { + /* Waiting on an unlocked mutex; bail out. */ + unlock_user_struct(target_umutex, target_addr, 1); + return 0; + } + + /* Attempt to acquire it, preserve the contested bit ("owner")= . */ + while ((owner & ~TARGET_UMUTEX_CONTESTED) =3D=3D 0 && + !tcmpset_32(&target_umutex->m_owner, owner, owner | id= )) { + __get_user(owner, &target_umutex->m_owner); + } + + if ((owner & ~TARGET_UMUTEX_CONTESTED) =3D=3D 0) { + /* + * The acquire succeeded, because we didn't observe owner = with + * a different id. + */ + unlock_user_struct(target_umutex, target_addr, 1); + return 0; + } + + /* Otherwise, someone beat us to it; carry on. */ + } + + __get_user(flags, &target_umutex->m_flags); + if ((flags & TARGET_UMUTEX_ERROR_CHECK) !=3D 0 && + (owner & ~TARGET_UMUTEX_CONTESTED) =3D=3D id) { + unlock_user_struct(target_umutex, target_addr, 1); + return -TARGET_EDEADLK; + } + + if (TARGET_UMUTEX_TRY =3D=3D mode) { + unlock_user_struct(target_umutex, target_addr, 1); + return -TARGET_EBUSY; + } + + /* Set the contested bit and sleep. */ + while ((owner & TARGET_UMUTEX_CONTESTED) =3D=3D 0) { + if (tcmpset_32(&target_umutex->m_owner, owner, + owner | TARGET_UMUTEX_CONTESTED)) { + /* + * Keep our local view of owner consistent with what we th= ink + * we've set it to. We're about to sleep on it, and we do= n't + * really want a spurious return from _umtx_op because of = this. + */ + owner |=3D TARGET_UMUTEX_CONTESTED; + + break; + } else { + __get_user(owner, &target_umutex->m_owner); + } + } + + /* + * If it changed during the above loop, we may be able to acquire = now. + */ + if ((owner & ~TARGET_UMUTEX_CONTESTED) =3D=3D 0) { + continue; + } + + pthread_mutex_lock(&umtx_wait_lck); + __get_user(count, &target_umutex->m_count); + count++; + __put_user(count, &target_umutex->m_count); + pthread_mutex_unlock(&umtx_wait_lck); + + addr =3D &target_umutex->m_owner; + + /* addr used only as key below, not dereferenced */ + unlock_user_struct(target_umutex, target_addr, 1); + + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, %d, %jx) " + "count =3D %d\n", __func__, g2h_untagged(target_addr), + UMTX_OP_WAIT_PRIVATE, tswap32(target_umutex->m_owner), tsz, + (uintmax_t)ts, count); + ret =3D _umtx_wait_uint_private(addr, owner, tsz, (void *)ts, __fu= nc__); + + if (!lock_user_struct(VERIFY_WRITE, target_umutex, target_addr, 0)= ) { + return -TARGET_EFAULT; + } + + pthread_mutex_lock(&umtx_wait_lck); + __get_user(count, &target_umutex->m_count); + count--; + __put_user(count, &target_umutex->m_count); + pthread_mutex_unlock(&umtx_wait_lck); + if (ret !=3D 0) { + unlock_user_struct(target_umutex, target_addr, 1); + break; + } + } + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_unlock_umutex(abi_ulong target_addr, uint32_t id) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_umutex)= )) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_addr, UMTX_OP_MUTEX_UNLOCK, 0, NULL, N= ULL); +#else + struct target_umutex *target_umutex; + uint32_t count, owner, *addr, flags; + + if (!lock_user_struct(VERIFY_WRITE, target_umutex, target_addr, 0)) { + return -TARGET_EFAULT; + } + /* Make sure we own this mutex. */ + __get_user(owner, &target_umutex->m_owner); + if ((owner & ~TARGET_UMUTEX_CONTESTED) !=3D id) { + unlock_user_struct(target_umutex, target_addr, 1); + return -TARGET_EPERM; + } + pthread_mutex_lock(&umtx_wait_lck); + __get_user(count, &target_umutex->m_count); + + /* Unlock it; set the contested bit as needed. */ + flags =3D TARGET_UMUTEX_UNOWNED; + if (count > 1) { + flags |=3D TARGET_UMUTEX_CONTESTED; + } + __put_user(flags, &target_umutex->m_owner); + pthread_mutex_unlock(&umtx_wait_lck); + + addr =3D &target_umutex->m_owner; + + /* addr is used only as a key, so we can unlock before we use it below= */ + unlock_user_struct(target_umutex, target_addr, 1); + + /* + * And wake up any that may be contested it. We used to only do this = if the + * lock wasn't contested coming in, but that could have changed in the + * interim. Unconditionally issue the wakeup, in conjunction with the + * previous change of owner this should catch all cases. + */ + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_addr), UMTX_OP_WAKE, 0); + return get_errno(safe__umtx_op(addr, UMTX_OP_WAKE_PRIVATE, 1, NULL, NU= LL)); +#endif /* _UMTX_OPTIMIZED */ +} + +/* + * wflags CVWAIT_CHECK_UNPARKING, CVWAIT_ABSTIME, CVWAIT_CLOCKID + */ +abi_long freebsd_cv_wait(abi_ulong target_ucond_addr, + abi_ulong target_umtx_addr, struct timespec *ts, int wflags) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_ucond_addr, + sizeof(struct target_ucond))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_ucond_addr, UMTX_OP_CV_WAIT, wflags, + g2h_untagged(target_umtx_addr), ts); +#else + abi_long ret; + long tid; + struct target_ucond *target_ucond; + + if (!lock_user_struct(VERIFY_WRITE, target_ucond, target_ucond_addr, 0= )) { + return -TARGET_EFAULT; + } + + /* Check the clock ID if needed. */ + if ((wflags & TARGET_CVWAIT_CLOCKID) !=3D 0) { + uint32_t clockid; + + __get_user(clockid, &target_ucond->c_clockid); + if (clockid >=3D CLOCK_THREAD_CPUTIME_ID) { + /* Only HW clock id will work. */ + unlock_user_struct(target_ucond, target_ucond_addr, 1); + return -TARGET_EINVAL; + } + } + + thr_self(&tid); + + /* Lock the _cv_mutex so we can safely unlock the user mutex */ + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_LOCK, 0, NULL, NULL); + + /* Set c_has_waiters before releasing the user mutex! */ + __put_user(1, &target_ucond->c_has_waiters); + + /* unlock the user mutex */ + ret =3D freebsd_unlock_umutex(target_umtx_addr, tid); + if (is_error(ret)) { + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_UNLOCK, 0, NULL, NULL); + unlock_user_struct(target_ucond, target_ucond_addr, 1); + return ret; + } + + /* UMTX_OP_CV_WAIT unlocks _cv_mutex */ + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, %p, NULL)\n", + __func__, g2h_untagged(target_ucond_addr), UMTX_OP_CV_WAIT, wflags, + &_cv_mutex); + ret =3D safe__umtx_op(g2h_untagged(target_ucond_addr), UMTX_OP_CV_WAIT, + wflags, &_cv_mutex, ts); + + if (is_error(ret)) { + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_UNLOCK, 0, NULL, NULL); + unlock_user_struct(target_ucond, target_ucond_addr, 1); + return ret; + } + ret =3D freebsd_lock_umutex(target_umtx_addr, tid, NULL, 0, TARGET_UMU= TEX_TRY, + 0); + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_UNLOCK, 0, NULL, NULL); + unlock_user_struct(target_ucond, target_ucond_addr, 1); + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_cv_signal(abi_ulong target_ucond_addr) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_ucond_addr, + sizeof(struct target_ucond))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_ucond_addr, UMTX_OP_CV_SIGNAL, 0, NULL, + NULL); +#else + abi_long ret; + + if (!access_ok(VERIFY_WRITE, target_ucond_addr, + sizeof(struct target_ucond))) { + return -TARGET_EFAULT; + } + + /* Lock the _cv_mutex to prevent a race in do_cv_wait(). */ + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_LOCK, 0, NULL, NULL); + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_ucond_addr), UMTX_OP_CV_SIGNAL, = 0); + ret =3D get_errno(safe__umtx_op(g2h_untagged(target_ucond_addr), + UMTX_OP_CV_SIGNAL, 0, NULL, NULL)); + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_UNLOCK, 0, NULL, NULL); + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_cv_broadcast(abi_ulong target_ucond_addr) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_ucond_addr, + sizeof(struct target_ucond))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_ucond_addr, UMTX_OP_CV_BROADCAST, 0, N= ULL, + NULL); +#else + int ret; + + if (!access_ok(VERIFY_WRITE, target_ucond_addr, + sizeof(struct target_ucond))) { + return -TARGET_EFAULT; + } + + /* Lock the _cv_mutex to prevent a race in do_cv_wait(). */ + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_LOCK, 0, NULL, NULL); + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, g2h_untagged(target_ucond_addr), UMTX_OP_CV_BROADCAST, 0= ); + ret =3D get_errno(safe__umtx_op(g2h_untagged(target_ucond_addr), + UMTX_OP_CV_BROADCAST, 0, NULL, NULL)); + safe__umtx_op(&_cv_mutex, UMTX_OP_MUTEX_UNLOCK, 0, NULL, NULL); + + return ret; +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_rw_rdlock(abi_ulong target_addr, long fflag, size_t tsz, + void *t) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_urwlock= ))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_addr, UMTX_OP_RW_RDLOCK, fflag, + (void *)(uintptr_t)tsz, t); +#else + struct target_urwlock *target_urwlock; + uint32_t flags, wrflags; + uint32_t state; + uint32_t blocked_readers; + abi_long ret; + + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, target_addr, 0)) { + return -TARGET_EFAULT; + } + + __get_user(flags, &target_urwlock->rw_flags); + wrflags =3D TARGET_URWLOCK_WRITE_OWNER; + if (!(fflag & TARGET_URWLOCK_PREFER_READER) && + !(flags & TARGET_URWLOCK_PREFER_READER)) { + wrflags |=3D TARGET_URWLOCK_WRITE_WAITERS; + } + for (;;) { + __get_user(state, &target_urwlock->rw_state); + /* try to lock it */ + while (!(state & wrflags)) { + if (TARGET_URWLOCK_READER_COUNT(state) =3D=3D + TARGET_URWLOCK_MAX_READERS) { + unlock_user_struct(target_urwlock, + target_addr, 1); + return -TARGET_EAGAIN; + } + if (tcmpset_32(&target_urwlock->rw_state, state, + (state + 1))) { + /* The acquired succeeded. */ + unlock_user_struct(target_urwlock, + target_addr, 1); + return 0; + } + __get_user(state, &target_urwlock->rw_state); + } + /* set read contention bit */ + if (!tcmpset_32(&target_urwlock->rw_state, state, + state | TARGET_URWLOCK_READ_WAITERS)) { + /* The state has changed. Start over. */ + continue; + } + + /* contention bit is set, increase read waiter count */ + __get_user(blocked_readers, &target_urwlock->rw_blocked_readers); + while (!tcmpset_32(&target_urwlock->rw_blocked_readers, + blocked_readers, blocked_readers + 1)) { + __get_user(blocked_readers, &target_urwlock->rw_blocked_reader= s); + } + + ret =3D 0; + while (state & wrflags) { + /* sleep/wait */ + unlock_user_struct(target_urwlock, target_addr, 1); + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x (0x%x), NULL, NUL= L)\n", + __func__, &target_urwlock->rw_state, + UMTX_OP_WAIT_UINT, tswap32(state), + target_urwlock->rw_state); + ret =3D _umtx_wait_uint(&target_urwlock->rw_state, tswap32(sta= te), + tsz, t, __func__); + if (is_error(ret)) { + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, + target_addr, 0)) { + return ret; + } + goto rdlock_decrement; + } + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, target_add= r, + 0)) { + return -TARGET_EFAULT; + } + __get_user(state, &target_urwlock->rw_state); + } + + /* decrease read waiter count */ +rdlock_decrement: + __get_user(blocked_readers, &target_urwlock->rw_blocked_readers); + while (!tcmpset_32(&target_urwlock->rw_blocked_readers, + blocked_readers, (blocked_readers - 1))) { + __get_user(blocked_readers, &target_urwlock->rw_blocked_reader= s); + } + if (blocked_readers =3D=3D 1) { + /* clear read contention bit */ + __get_user(state, &target_urwlock->rw_state); + while (!tcmpset_32(&target_urwlock->rw_state, state, + state & ~TARGET_URWLOCK_READ_WAITERS)) { + __get_user(state, &target_urwlock->rw_state); + } + } + if (is_error(ret)) { + /* tcmpset_32 operates on the target memory, so don't double c= opy */ + unlock_user_struct(target_urwlock, target_addr, 0); + return ret; + } + } +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_rw_wrlock(abi_ulong target_addr, long fflag, size_t tsz, + void *t) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_urwlock= ))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_addr, UMTX_OP_RW_WRLOCK, fflag, + (void *)(uintptr_t)tsz, t); +#else + struct target_urwlock *target_urwlock; + uint32_t blocked_readers, blocked_writers; + uint32_t state; + abi_long ret; + + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, target_addr, 0)) { + return -TARGET_EFAULT; + } + blocked_readers =3D 0; + for (;;) { + __get_user(state, &target_urwlock->rw_state); + while (!(state & TARGET_URWLOCK_WRITE_OWNER) && + TARGET_URWLOCK_READER_COUNT(state) =3D=3D 0) { + if (tcmpset_32(&target_urwlock->rw_state, state, + state | TARGET_URWLOCK_WRITE_OWNER)) { + unlock_user_struct(target_urwlock, target_addr, 1); + return 0; + } + __get_user(state, &target_urwlock->rw_state); + } + + if (!(state & (TARGET_URWLOCK_WRITE_OWNER | + TARGET_URWLOCK_WRITE_WAITERS)) && + blocked_readers !=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, &target_urwlock->rw_state, UMTX_OP_WAKE, + tswap32(state)); + ret =3D get_errno(safe__umtx_op(&target_urwlock->rw_state, + UMTX_OP_WAKE, INT_MAX, NULL, NULL)); + unlock_user_struct(target_urwlock, target_addr, ret =3D=3D 0); + return ret; + } + /* re-read the state */ + __get_user(state, &target_urwlock->rw_state); + + /* and set TARGET_URWLOCK_WRITE_WAITERS */ + while (((state & TARGET_URWLOCK_WRITE_OWNER) || + TARGET_URWLOCK_READER_COUNT(state) !=3D 0) && + (state & TARGET_URWLOCK_WRITE_WAITERS) =3D=3D 0) { + if (tcmpset_32(&target_urwlock->rw_state, state, + state | TARGET_URWLOCK_WRITE_WAITERS)) { + break; + } + __get_user(state, &target_urwlock->rw_state); + } + + /* contention bit is set, increase write waiter count */ + __get_user(blocked_writers, &target_urwlock->rw_blocked_writers); + while (!tcmpset_32(&target_urwlock->rw_blocked_writers, + blocked_writers, blocked_writers + 1)) { + __get_user(blocked_writers, &target_urwlock->rw_blocked_writer= s); + } + + /* sleep */ + ret =3D 0; + while ((state & TARGET_URWLOCK_WRITE_OWNER) || + (TARGET_URWLOCK_READER_COUNT(state) !=3D 0)) { + unlock_user_struct(target_urwlock, target_addr, 1); + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x(0x%x), NULL, NULL= )\n", + __func__, &target_urwlock->rw_blocked_writers, + UMTX_OP_WAIT_UINT, tswap32(state), + target_urwlock->rw_state); + ret =3D _umtx_wait_uint(&target_urwlock->rw_state, + tswap32(state), tsz, t, __func__); + if (is_error(ret)) { + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, + target_addr, 0)) { + return ret; + } + goto wrlock_decrement; + } + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, target_add= r, + 0)) { + return -TARGET_EFAULT; + } + __get_user(state, &target_urwlock->rw_state); + } + + /* decrease the write waiter count */ +wrlock_decrement: + __get_user(blocked_writers, &target_urwlock->rw_blocked_writers); + while (!tcmpset_32(&target_urwlock->rw_blocked_writers, + blocked_writers, (blocked_writers - 1))) { + __get_user(blocked_writers, &target_urwlock->rw_blocked_writer= s); + } + if (blocked_writers =3D=3D 1) { + /* clear write contention bit */ + __get_user(state, &target_urwlock->rw_state); + while (!tcmpset_32(&target_urwlock->rw_state, state, + state & ~TARGET_URWLOCK_WRITE_WAITERS)) { + __get_user(state, &target_urwlock->rw_state); + } + __get_user(blocked_readers, &target_urwlock->rw_blocked_reader= s); + } else { + blocked_readers =3D 0; + } + if (is_error(ret)) { + /* tcmpset_32 operates on the target memory, so don't double c= opy */ + unlock_user_struct(target_urwlock, target_addr, 0); + return ret; + } + } +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long freebsd_rw_unlock(abi_ulong target_addr) +{ +#ifdef _UMTX_OPTIMIZED + if (!access_ok(VERIFY_WRITE, target_addr, sizeof(struct target_urwlock= ))) { + return -TARGET_EFAULT; + } + + return optimized_umtx_op(target_addr, UMTX_OP_RW_UNLOCK, 0, NULL, NULL= ); +#else + struct target_urwlock *target_urwlock; + uint32_t flags, state, count =3D 0; + + if (!lock_user_struct(VERIFY_WRITE, target_urwlock, target_addr, 0)) { + return -TARGET_EFAULT; + } + + __get_user(flags, &target_urwlock->rw_flags); + __get_user(state, &target_urwlock->rw_state); + + if (state & TARGET_URWLOCK_WRITE_OWNER) { + for (;;) { + if (!tcmpset_32(&target_urwlock->rw_state, state, + state & ~TARGET_URWLOCK_WRITE_OWNER)) { + /* + * Update the state here because we want to make sure that + * another thread didn't unste the flag from underneath us. + * If they did, we throw EPERM as the kernel does. + */ + __get_user(state, &target_urwlock->rw_state); + if (!(state & TARGET_URWLOCK_WRITE_OWNER)) { + unlock_user_struct(target_urwlock, target_addr, 1); + return -TARGET_EPERM; + } + } else { + break; + } + } + } else if (TARGET_URWLOCK_READER_COUNT(state) !=3D 0) { + /* decrement reader count */ + for (;;) { + if (!tcmpset_32(&target_urwlock->rw_state, state, (state - 1)= )) { + /* + * Just as in the branch above; we update the state here b= ecause + * we want to make sure the reader count didn't hit 0 whil= e we + * are still trying to decrement this. The kernel also ret= urns + * EPERM here. + */ + __get_user(state, &target_urwlock->rw_state); + if (TARGET_URWLOCK_READER_COUNT(state) =3D=3D 0) { + unlock_user_struct(target_urwlock, target_addr, 1); + return -TARGET_EPERM; + } + } else { + break; + } + } + } else { + unlock_user_struct(target_urwlock, target_addr, 1); + return -TARGET_EPERM; + } + + if (!(flags & TARGET_URWLOCK_PREFER_READER)) { + if (state & TARGET_URWLOCK_WRITE_WAITERS) { + count =3D 1; + } else if (state & TARGET_URWLOCK_READ_WAITERS) { + count =3D INT_MAX; + } + } else { + if (state & TARGET_URWLOCK_READ_WAITERS) { + count =3D INT_MAX; + } else if (state & TARGET_URWLOCK_WRITE_WAITERS) { + count =3D 1; + } + } + + /* rw_state used below as key only */ + unlock_user_struct(target_urwlock, target_addr, 1); + if (count !=3D 0) { + DEBUG_UMTX(" %s: _umtx_op(%p, %d, 0x%x, NULL, NULL)\n", + __func__, &target_urwlock->rw_state, UMTX_OP_WAKE, count); + return get_errno(safe__umtx_op(&target_urwlock->rw_state, UMTX_OP_= WAKE, + count, NULL, NULL)); + } else { + return 0; + } +#endif /* _UMTX_OPTIMIZED */ +} + +abi_long +freebsd_umtx_shm(abi_ulong target_addr, long fflag) +{ + + return get_errno(safe__umtx_op(NULL, QEMU_UMTX_OP(UMTX_OP_SHM), fflag, + g2h_untagged(target_addr), NULL)); +} + +abi_long +freebsd_umtx_robust_list(abi_ulong target_addr, size_t rbsize) +{ +#ifdef _UMTX_OPTIMIZED + struct target_umtx_robust_lists_params *tparams; + struct umtx_robust_lists_params hparams; + abi_long error; + + if (rbsize < sizeof(*tparams)) { + return -TARGET_EINVAL; + } + + if (!lock_user_struct(VERIFY_READ, tparams, target_addr, 1)) { + return -TARGET_EFAULT; + } + + hparams.robust_list_offset =3D + (uintptr_t)g2h_untagged(tparams->robust_list_offset); + hparams.robust_priv_list_offset =3D + (uintptr_t)g2h_untagged(tparams->robust_priv_list_offset); + hparams.robust_inact_offset =3D + (uintptr_t)g2h_untagged(tparams->robust_inact_offset); + + error =3D optimized_umtx_op(0, UMTX_OP_ROBUST_LISTS, sizeof(hparams), + &hparams, NULL); + unlock_user_struct(tparams, target_addr, 0); + return error; +#else + gemu_log("safe__umtx_op(..., UMTX_OP_ROBUST_LISTS. ...) not supported= \n"); + return -TARGET_EOPNOTSUPP; +#endif +} + +abi_long do_freebsd_thr_new(CPUArchState *env, + abi_ulong target_param_addr, int32_t param_size) +{ + new_freebsd_thread_info_t info; + pthread_attr_t attr; + TaskState *ts; + CPUArchState *new_env; + CPUState *new_cpu; + struct target_freebsd_thr_param *target_param; + abi_ulong target_rtp_addr; + struct target_freebsd_rtprio *target_rtp; + struct rtprio *rtp_ptr, rtp; + CPUState *cpu =3D env_cpu(env); + TaskState *parent_ts =3D (TaskState *)cpu->opaque; + sigset_t sigmask; + struct sched_param sched_param; + int sched_policy; + int ret =3D 0; + + memset(&info, 0, sizeof(info)); + + if (!lock_user_struct(VERIFY_READ, target_param, target_param_addr, 1)= ) { + return -TARGET_EFAULT; + } + info.param.start_func =3D tswapal(target_param->start_func); + info.param.arg =3D tswapal(target_param->arg); + info.param.stack_base =3D tswapal(target_param->stack_base); + info.param.stack_size =3D tswapal(target_param->stack_size); + info.param.tls_base =3D tswapal(target_param->tls_base); + info.param.tls_size =3D tswapal(target_param->tls_size); + info.param.child_tid =3D tswapal(target_param->child_tid); + info.param.parent_tid =3D tswapal(target_param->parent_tid); + info.param.flags =3D tswap32(target_param->flags); + target_rtp_addr =3D info.param.rtp =3D tswapal(target_param->rtp); + unlock_user_struct(target_param, target_param_addr, 0); + + thr_self(&info.parent_tid); + + if (target_rtp_addr) { + if (!lock_user_struct(VERIFY_READ, target_rtp, target_rtp_addr, 1)= ) { + return -TARGET_EFAULT; + } + rtp.type =3D tswap16(target_rtp->type); + rtp.prio =3D tswap16(target_rtp->prio); + unlock_user_struct(target_rtp, target_rtp_addr, 0); + rtp_ptr =3D &rtp; + } else { + rtp_ptr =3D NULL; + } + + /* Create a new CPU instance. */ + ts =3D g_malloc0(sizeof(TaskState)); + init_task_state(ts); + + /* Grab a mutex so that thread setup appears atomic. */ + pthread_mutex_lock(new_freebsd_thread_lock_ptr); + + /* + * If this is our first additional thread, we need to ensure we + * generate code for parallel execution and flush old translations. + * Do this now so that the copy gets CF_PARALLEL too. + */ + if (!(cpu->tcg_cflags & CF_PARALLEL)) { + cpu->tcg_cflags |=3D CF_PARALLEL; + tb_flush__exclusive_or_serial(); + } + + new_env =3D cpu_copy(env); + + new_cpu =3D env_cpu(new_env); + new_cpu->opaque =3D ts; + ts->bprm =3D parent_ts->bprm; + ts->info =3D parent_ts->info; + ts->signal_mask =3D parent_ts->signal_mask; + ts->ts_tid =3D qemu_get_thread_id(); + + pthread_mutex_init(&info.mutex, NULL); + pthread_mutex_lock(&info.mutex); + pthread_cond_init(&info.cond, NULL); + info.env =3D new_env; + + /* XXX check return values... */ + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, NEW_STACK_SIZE); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + if (rtp_ptr) { + rtp_to_schedparam(&rtp, &sched_policy, &sched_param); + pthread_attr_setschedpolicy(&attr, sched_policy); + pthread_attr_setschedparam(&attr, &sched_param); + } + + /* + * It is not safe to deliver signals until the child has finished + * initializing, so temporarily block all signals. + */ + sigfillset(&sigmask); + sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask); + + ret =3D pthread_create(&info.thread, &attr, new_freebsd_thread_start, = &info); + + sigprocmask(SIG_SETMASK, &info.sigmask, NULL); + pthread_attr_destroy(&attr); + if (ret =3D=3D 0) { + /* Wait for the child to initialize. */ + pthread_cond_wait(&info.cond, &info.mutex); + } else { + /* Creation of new thread failed. */ + object_unparent(OBJECT(new_cpu)); + object_unref(OBJECT(new_cpu)); + g_free(ts); + ret =3D -host_to_target_errno(ret); + } + + pthread_mutex_unlock(&info.mutex); + pthread_cond_destroy(&info.cond); + pthread_mutex_destroy(&info.mutex); + pthread_mutex_unlock(new_freebsd_thread_lock_ptr); + + return ret; +} diff --git a/bsd-user/freebsd/os-thread.h b/bsd-user/freebsd/os-thread.h index d3f1f01b13..4258b24095 100644 --- a/bsd-user/freebsd/os-thread.h +++ b/bsd-user/freebsd/os-thread.h @@ -240,5 +240,357 @@ static inline abi_long do_freebsd_swapcontext(CPUArch= State *env, abi_ulong arg1, * undocumented _umtx_op(void *obj, int op, u_long val, void *uaddr, * void *target_time); */ +static inline abi_long do_freebsd__umtx_op(abi_ulong obj, int op, abi_ulon= g val, + abi_ulong uaddr, abi_ulong target_time) +{ + abi_long ret; +#ifndef _UMTX_OPTIMIZED + struct _umtx_time ut[2]; + struct timespec ts; + size_t utsz; + long tid; +#endif + + switch (op) { + case TARGET_UMTX_OP_WAIT: + /* args: obj *, val, (void *)sizeof(ut), ut * */ +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_umtx_wait(obj, val, uaddr, + safe_g2h_untagged(target_time)); +#else + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_umtx_wait(obj, tswapal(val), utsz, &ut); + } else { + ret =3D freebsd_umtx_wait(obj, tswapal(val), 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_WAKE: + /* args: obj *, nr_wakeup */ + ret =3D freebsd_umtx_wake(obj, val); + break; + + case TARGET_UMTX_OP_MUTEX_LOCK: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_lock_umutex(obj, 0, safe_g2h_untagged(target_time)= , uaddr, + 0, val); +#else + ret =3D get_errno(thr_self(&tid)); + if (is_error(ret)) { + return ret; + } + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_lock_umutex(obj, tid, ut, utsz, 0, tswapal(val= )); + } else { + ret =3D freebsd_lock_umutex(obj, tid, NULL, 0, 0, tswapal(val)= ); + } +#endif + break; + + case TARGET_UMTX_OP_MUTEX_UNLOCK: +#ifdef _UMTX_OPTIMIZED + ret =3D freebsd_unlock_umutex(obj, 0); +#else + ret =3D get_errno(thr_self(&tid)); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_unlock_umutex(obj, tid); +#endif + break; + + case TARGET_UMTX_OP_MUTEX_TRYLOCK: +#ifdef _UMTX_OPTIMIZED + ret =3D freebsd_lock_umutex(obj, 0, NULL, 0, TARGET_UMUTEX_TRY, va= l); +#else + ret =3D get_errno(thr_self(&tid)); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_lock_umutex(obj, tid, NULL, 0, TARGET_UMUTEX_TRY, + tswapal(val)); +#endif + break; + + case TARGET_UMTX_OP_MUTEX_WAIT: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_lock_umutex(obj, 0, safe_g2h_untagged(target_time)= , uaddr, + TARGET_UMUTEX_WAIT, val); +#else + ret =3D get_errno(thr_self(&tid)); + if (is_error(ret)) { + return ret; + } + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_lock_umutex(obj, tid, ut, utsz, TARGET_UMUTEX_= WAIT, + tswapal(val)); + } else { + ret =3D freebsd_lock_umutex(obj, tid, NULL, 0, TARGET_UMUTEX_W= AIT, + tswapal(val)); + } +#endif + break; + + case TARGET_UMTX_OP_MUTEX_WAKE: + /* Don't need to do access_ok(). */ + ret =3D freebsd_umtx_mutex_wake(obj, val); + break; + + case TARGET_UMTX_OP_SET_CEILING: + ret =3D 0; /* XXX quietly ignore these things for now */ + break; + + case TARGET_UMTX_OP_CV_WAIT: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_cv_wait(obj, uaddr, safe_g2h_untagged(target_time)= , val); +#else + /* + * Initialization of the struct conv is done by + * bzero'ing everything in userland. + */ + if (target_time !=3D 0) { + if (t2h_freebsd_timespec(&ts, target_time)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_cv_wait(obj, uaddr, &ts, val); + } else { + ret =3D freebsd_cv_wait(obj, uaddr, NULL, val); + } +#endif + break; + + case TARGET_UMTX_OP_CV_SIGNAL: + /* + * XXX + * User code may check if c_has_waiters is zero. Other + * than that it is assume that user code doesn't do + * much with the struct conv fields and is pretty + * much opauque to userland. + */ + ret =3D freebsd_cv_signal(obj); + break; + + case TARGET_UMTX_OP_CV_BROADCAST: + /* + * XXX + * User code may check if c_has_waiters is zero. Other + * than that it is assume that user code doesn't do + * much with the struct conv fields and is pretty + * much opauque to userland. + */ + ret =3D freebsd_cv_broadcast(obj); + break; + + case TARGET_UMTX_OP_WAIT_UINT: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_umtx_wait_uint(obj, val, uaddr, + safe_g2h_untagged(target_time)); +#else + if (!access_ok(VERIFY_READ, obj, sizeof(abi_ulong))) { + return -TARGET_EFAULT; + } + /* args: obj *, val, (void *)sizeof(ut), ut * */ + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_umtx_wait_uint(obj, tswap32((uint32_t)val), + utsz, &ut); + } else { + ret =3D freebsd_umtx_wait_uint(obj, tswap32((uint32_t)val), 0,= NULL); + } +#endif + break; + + case TARGET_UMTX_OP_WAIT_UINT_PRIVATE: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_umtx_wait_uint_private(obj, val, uaddr, + safe_g2h_untagged(target_time)); +#else + if (!access_ok(VERIFY_READ, obj, sizeof(abi_ulong))) { + return -TARGET_EFAULT; + } + /* args: obj *, val, (void *)sizeof(ut), ut * */ + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_umtx_wait_uint_private(obj, tswap32((uint32_t)= val), + utsz, &ut); + } else { + ret =3D freebsd_umtx_wait_uint_private(obj, tswap32((uint32_t)= val), + 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_WAKE_PRIVATE: + /* Don't need to do access_ok(). */ + ret =3D freebsd_umtx_wake_private(obj, val); + break; + + case TARGET_UMTX_OP_RW_RDLOCK: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_rw_rdlock(obj, val, uaddr, + safe_g2h_untagged(target_time)); +#else + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_rw_rdlock(obj, val, utsz, &ut); + } else { + ret =3D freebsd_rw_rdlock(obj, val, 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_RW_WRLOCK: +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_rw_wrlock(obj, val, uaddr, + safe_g2h_untagged(target_time)); +#else + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_rw_wrlock(obj, val, utsz, &ut); + } else { + ret =3D freebsd_rw_wrlock(obj, val, 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_RW_UNLOCK: + ret =3D freebsd_rw_unlock(obj); + break; + +#ifdef UMTX_OP_MUTEX_WAKE2 + case TARGET_UMTX_OP_MUTEX_WAKE2: + ret =3D freebsd_umtx_mutex_wake2(obj, val); + break; +#endif /* UMTX_OP_MUTEX_WAKE2 */ + +#ifdef UMTX_OP_NWAKE_PRIVATE + case TARGET_UMTX_OP_NWAKE_PRIVATE: + ret =3D freebsd_umtx_nwake_private(obj, val); + break; +#endif /* UMTX_OP_NWAKE_PRIVATE */ + + case TARGET_UMTX_OP_SEM2_WAIT: + /* args: obj *, val, (void *)sizeof(ut), ut * */ +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok( + (uaddr > sizeof(struct target_freebsd__umtx_time) ? VERIFY_WRI= TE : + VERIFY_READ), target_time, uaddr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_umtx_sem2_wait(obj, uaddr, + safe_g2h_untagged(target_time)); +#else + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + /* Kernel writes out the ut[1] if utsz >=3D _umtx_time + times= pec. */ + ret =3D freebsd_umtx_sem2_wait(obj, utsz, ut); + if (ret =3D=3D -TARGET_EINTR && (ut[0]._flags & UMTX_ABSTIME) = =3D=3D 0 && + utsz >=3D sizeof(struct target_freebsd__umtx_time) + + sizeof(struct target_freebsd_timespec)) { + abi_ulong cret; + + cret =3D h2t_freebsd_timespec(target_time + + sizeof(struct target_freebsd__umtx_time), &ut[1]._time= out); + if (is_error(cret)) { + ret =3D cret; + } + } + } else { + ret =3D freebsd_umtx_sem2_wait(obj, 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_SEM2_WAKE: + /* Don't need to do access_ok(). */ + ret =3D freebsd_umtx_sem2_wake(obj); + break; + case TARGET_UMTX_OP_SEM_WAIT: + /* args: obj *, val, (void *)sizeof(ut), ut * */ +#ifdef _UMTX_OPTIMIZED + if (target_time !=3D 0 && !access_ok(VERIFY_READ, target_time, uad= dr)) { + return -TARGET_EFAULT; + } + ret =3D freebsd_umtx_sem_wait(obj, uaddr, safe_g2h_untagged(target= _time)); +#else + if (target_time !=3D 0) { + ret =3D t2h_freebsd_umtx_time(target_time, uaddr, ut, &utsz); + if (is_error(ret)) { + return ret; + } + ret =3D freebsd_umtx_sem_wait(obj, utsz, ut); + } else { + ret =3D freebsd_umtx_sem_wait(obj, 0, NULL); + } +#endif + break; + + case TARGET_UMTX_OP_SEM_WAKE: + /* Don't need to do access_ok(). */ + ret =3D freebsd_umtx_sem_wake(obj); + break; + case TARGET_UMTX_OP_SHM: + ret =3D freebsd_umtx_shm(uaddr, val); + break; + case TARGET_UMTX_OP_ROBUST_LISTS: + ret =3D freebsd_umtx_robust_list(uaddr, val); + break; + default: + return -TARGET_EINVAL; + } + return ret; +} =20 #endif /* FREEBSD_OS_THREAD_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015935; cv=none; d=zohomail.com; s=zohoarc; b=DPRvFr5kK56+b91EsA8QJx+7BJGIcwxbyz25BQ4Dn83xzDhhGxjyQxU8dx27La9Fh9r02/lhMl2RS1ab0JzpvqNEbSPXZNCnJqJZN1Zc7XCebsO4RyIH7Eu3DAHEtKipdKjc59hqQhqW3hI0yZS+bra2GsylRgvNavlWw6uyzhw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015935; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=VjcpVZ6ruto1s3vfaA9tu6Wodi+LdfzqPHS4wMxKL5U=; b=JESqvkx1Ui2woYx8nM60raHU4ZQx4LEzkQe0oF7iOZLOPeH8B9bJu9+wCfbTRSic7YypZwKYSjqmVEye8Q4A6CwXz5mbTF/756Lv6scJ0s9mqHQFTDYMmt+AqnKeSMu7Wb9iK10RJMb8zzRwRUxaycr6JJqTqlCV8HFQNNPMwJQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015935742884.4055427324078; Sat, 20 Jun 2026 21:25:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hc-0003B7-MR; Sun, 21 Jun 2026 00:22:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hU-00034f-23 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:28 -0400 Received: from mail-oo1-xc33.google.com ([2607:f8b0:4864:20::c33]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hR-0005J9-K1 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:26 -0400 Received: by mail-oo1-xc33.google.com with SMTP id 006d021491bc7-6a0e075cfafso712948eaf.3 for ; Sat, 20 Jun 2026 21:22:25 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015744; x=1782620544; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=VjcpVZ6ruto1s3vfaA9tu6Wodi+LdfzqPHS4wMxKL5U=; b=XsXW2exzjfs792Ll13pY/k731XjWi14FASOyjtIb6ZZ/3U+cQim7I0Orbkrwaj4qe6 iXwVYdwdrz+U3ebL/JtcVPqf8eqTcSIykQltru1xG5Aav2mNTfm1WT3QBuoxSHbhtDmt BVR+GnBfGXSOGGHvAIDrQR2gsB0gBO6UNFmc4SMRz1RXTSmY14mx4uh5S5F0f9n9IEiY jFKLTBj2XKJvk67vXiy7bQ79sv7CDcsc3P3SPiqHja/zHSHqsXYzl8ej0N13rkMEMGHE cBOKymtJFKq/ErPKZp8Eh4m2XvqwMLtqOChKpayaRjF8zo69HghGvrxOjN8bYLnwzfDc t6ZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015744; x=1782620544; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=VjcpVZ6ruto1s3vfaA9tu6Wodi+LdfzqPHS4wMxKL5U=; b=LuUWdjR8BisHZDQIF4odeWsQPWR0T8s58WBOEx2MGf497u57Vidv3UIHdDTtpNiVo0 Awrr2C2P0vARy07db6PxDI4fBMIJXEJkWnwwRdnuh2UM3sXOXv7dvxHcK04NySIuRKch FmNVRmeIyBdfd7r2OZobRnaKDOY4Uoippk5qERL5hQo0p39JhV3AtSSO+xfhQ13QzVSK lU35ew6DXeCxXH2TnoSVeFCsG8PABncDjlJLwDNTBsi+0q76ljnGublq/JpJ1a94Nd3e 7h+9uu4NWp/xjkX/ib3KjZz4hn5XEZRO2l9zPfgVan8/ZXhWLx8vdDvtE5ao1MBHbmq2 qj0w== X-Gm-Message-State: AOJu0Yy1KcBeZOZnAPYWf7j/d+BktdPsSmAzmNpwxJvQIlfw/0kEC43w QS+bXMufb0d7WnXI1VB+lO72qfkzv5mq5QWPmN5s0CE/DM2ImQvojxicseZBwty1mxY= X-Gm-Gg: AfdE7clNQa8s1RBt4+Q9Lktcdd0rZjXeG9r2HVnU38orim0nXCohH93MZ6av+/hXbbF +OCrrxFn9gPiEN+Tmi0iR8pPUBqJm/4L2LpIOGRNUNypO9rTZudDE2jpwN9F+c1HtgLF6ffc3gT CKOc3MoujcUVvHdQHwb9CAeCLz1B4fkA2Q/rJgESbYE4PtEQwb1966KOfW/khkjI4c9NB4ewOg8 6aXv3NiVb4QZTs7JOP76C9TdGA2He7gimyPV2KO1MgfJUmpDOYBMA8tQB9MzwWXyGDABbfUCvxn zKYFL2N0aKvVROIcGDmmjh7/Rnf1Wq12tdTQ72ZSw+ZIO9QSExKmZiLZDrRyjazZOb3uiKCpV68 gvBI0PVBfrd5qqDJlhUMUwuXjnsTBDGGVIJG7FaVcxysYUPtTqBw+XKvs7QOntZ0+dIysG0ROaj s= X-Received: by 2002:a05:6820:7088:20b0:6a0:ff94:df7b with SMTP id 006d021491bc7-6a0ff94e8dbmr216904eaf.35.1782015744211; Sat, 20 Jun 2026 21:22:24 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:17 -0600 Subject: [PATCH v3 30/40] bsd-user: Add thread system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-30-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2698; i=imp@bsdimp.com; h=from:subject:message-id; bh=asnQtYV47YyPo4EF9BS4x3B4tv7oCfQH0yj2OEdHsb0=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aAbbsuk7Zhm4WMPRFxS6Qa02NNcPOs3cKhs zdzaOyAUhyJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AO4MD/9wsNTq51t8hvcnYTniIpZYIJ1fno3acc6DRkwj0u067BFtdTgftEK+BOsGF5flAXOEMJ0 z5ssZwcKZSm0R+rXExwUdBQI6o0ZUBV0EUK4DGqTtD4MXLQA4qxirlvQuUG1ldW7gbT5Iea4LIO xhY28oIJBXp6AJOG93gddipuHHRD2VCutz22UNn3wgu9ZMsNRPbLABC1Gp6WOE9Ms8RxsU5YSo8 +2LGkyehNjDdWpKtuYY9QgC5L3lFmzNa9sXYYs/S+CJV1DcNoqVtAZFcQ3Advtm9W5HJBrkkGnj CpEDDmzeMkNsso+WyrPk8xOvJZ0A3E5JPi0vuuJKrxoYBHudl7HSppO6iRcCWC1PIJpPcNkb4em 58bWLPf1Csfr6dckC0x2R0bQ/ylbwfTKo3DOPVcllMExsBHG3UGpjnJIK9UaPUeaDLFqga7dJ2H xl0gcKK2cHQSfuVKrUm5ysVX7PJvwSYvULHU9ZvUiDTqVBlWDIvJ8F4on2yayJ+czgYzuel1bZZ y3VAPEFBNPnvJ0bYcVh0vppzJLsWu6mxecGNkHOKn+O0zDmREch8U+VGT08gephPj5tUIrZo94A aGg95rbNc5PhSyLaJtshqOZl4QKaM7Cq9dg4jjxuwDrD3JUJYywUFCirGdY5hiPIzJRvee2/JRy fclRR8p7V9KvgKg== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c33; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc33.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015938455154100 Wire up thread-related system calls: thr_new, thr_set_name, thr_self, thr_suspend, thr_wake, thr_kill, thr_kill2, thr_exit, rtprio_thread, getcontext, setcontext, swapcontext, and _umtx_op. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 55 +++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 55 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index f2c3ff25e8..0c729da0ab 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -1293,6 +1293,61 @@ static abi_long freebsd_syscall(CPUArchState *env, i= nt num, abi_long arg1, ret =3D do_freebsd_setfib(arg1); break; =20 + /* + * thread system calls + */ + case TARGET_FREEBSD_NR_thr_new: /* thr_new(2) */ + ret =3D do_freebsd_thr_new(env, arg1, arg2); + break; + + case TARGET_FREEBSD_NR_thr_set_name: /* thr_set_name(2) */ + ret =3D do_freebsd_thr_set_name(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_thr_self: /* thr_self(2) */ + ret =3D do_freebsd_thr_self(arg1); + break; + + case TARGET_FREEBSD_NR_thr_suspend: /* thr_suspend(2) */ + ret =3D do_freebsd_thr_suspend(arg1); + break; + + case TARGET_FREEBSD_NR_thr_wake: /* thr_wake(2) */ + ret =3D do_freebsd_thr_wake(arg1); + break; + + case TARGET_FREEBSD_NR_thr_kill: /* thr_kill(2) */ + ret =3D do_freebsd_thr_kill(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_thr_kill2: /* thr_kill2(2) */ + ret =3D do_freebsd_thr_kill2(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_thr_exit: /* thr_exit(2) */ + ret =3D do_freebsd_thr_exit(env, arg1); + break; + + case TARGET_FREEBSD_NR_rtprio_thread: /* rtprio_thread(2) */ + ret =3D do_freebsd_rtprio_thread(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getcontext: /* getcontext(2) */ + ret =3D do_freebsd_getcontext(env, arg1); + break; + + case TARGET_FREEBSD_NR_setcontext: /* setcontext(2) */ + ret =3D do_freebsd_setcontext(env, arg1); + break; + + case TARGET_FREEBSD_NR_swapcontext: /* swapcontext(2) */ + ret =3D do_freebsd_swapcontext(env, arg1, arg2); + break; + + case TARGET_FREEBSD_NR__umtx_op: /* undocumented */ + ret =3D do_freebsd__umtx_op(arg1, arg2, arg3, arg4, arg5); + break; + /* * sys{ctl, arch, call} */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015929; cv=none; d=zohomail.com; s=zohoarc; b=H4dFYVkLNiXbIWXOyBNo8iX+HxbLKWwjAb/QBd8eNso9v7qAiGFJJKLcsW96FPQoiNMXC92WYDFB+tVZmhWrWXICXfv6i9pQFyjC/bheh8PQyrtUFjtdZ8xJxdnszeldfI6MIC9Er+eggz70nYxHmbyRGzeSlQkZ9lfaSnWJ+yM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015929; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=3TxSIc//KvRCBTt8ON7Rqf9qcKkBcCSTr5Rkj6ICkpE=; b=Uiv92YVWJOCxCj7cx1FPng3ASl3MMmIhLrSLu4AIXmQGT2PzU3HDD8KPasgZNzvTVSfcPG1xhB/JwGrO7vKdURsr3+LW/85/Vd02tuCeD7DCG0/T9y0o9naxTf4ahKi7f+He6Hmui48mgfw7aRWVMqFAfhH7I3dhbYytBk+hAl0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17820159290513.8116698997451977; Sat, 20 Jun 2026 21:25:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hd-0003Bc-E0; Sun, 21 Jun 2026 00:22:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hW-00036I-C9 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:31 -0400 Received: from mail-oo1-xc2b.google.com ([2607:f8b0:4864:20::c2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hS-0005Ja-Oj for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:29 -0400 Received: by mail-oo1-xc2b.google.com with SMTP id 006d021491bc7-6a0edfe29ecso749684eaf.2 for ; Sat, 20 Jun 2026 21:22:26 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015745; x=1782620545; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=3TxSIc//KvRCBTt8ON7Rqf9qcKkBcCSTr5Rkj6ICkpE=; b=eL2I5Ttr4RUda/rCIhBVOCn5xgB/0Dlzpl+AgQc2k2PU/vn6ArQmSBI8nvrpE7A6La tC+ts1A6YFI5YYKPm9ZKlZ+hWbIFHMv+dUtPZuOhECtmfzES+ceUskNSQV8y+Qpa43dQ G+H/eFQK5dfFPptV8hqKYYy09HlLhQtmfmoE5l+6PuWrctdHEf5adplr7nBMw8SXPOJ+ kwzcW06opJ3I1lsvzH+xWZXKx+1wAXeMV2CjLpwI5ncJ/H6+C56aSv8fJoKBM8CDalLu iFBHxeysfKQfjTE4xYt4wxl4Mb1CVHrm1sc5QzaWxQnBPOzYIgpDLTI7VZAxN53NOVPO iC/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015745; x=1782620545; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=3TxSIc//KvRCBTt8ON7Rqf9qcKkBcCSTr5Rkj6ICkpE=; b=WOgPHwcnhZTir7n3gBo+srFdBASQnUuF6I+9JAnrl7J+T+jzmZ0yTVb/MZvwxMZLu1 lYSdsyaTtFnwM1fPp8pjX9odQTKdjxNErNONifBrNfwGw99vxUcxYc2Fvvqc09tFnXsS DVTrL5Q6VhDZZUfhiyZIEJB1qr/h3CrV02ZMSpFFXqKkM5HTPxHY5F+iTSaYD5YnvodY 0Fxu9lP3CB9+7BHmokcqtX4dnUSc+EUbKv+xPk7A6+vWbHV0Iq6hYlHT/S0p54iNXms6 tFNBlh4mjKijTncMJfVOSx5M+pvgaf2eK1j3m+TKFb7fVdZqt8wfBYJmFDDgC77dQ6Pj sAkQ== X-Gm-Message-State: AOJu0YxfjptJKoNs4fl4ingRxx+MTR0Tm4EHWQncxElp24GSbdJEKj/O T0bNaCoHB7xtLmIExnEUahRTmEcVtXtc8k44nHWhicoh1amyivmAmpAcpGF2hu0fSP0= X-Gm-Gg: AfdE7cnd1vUraofc/zmL57BcgvyOw1XZr17Yt191Or54aC/wdfoP18kWgZhJ77XIcAV AEf0nh/veYOZFJijsYC7ZB2B/AnekShFSYBxy8ykyEzDB6K2YKbL1yAWp8FSKGDANHAY9LI3w+d ycvqSlXCryNnf9Zb17rro3M4ad0S9hcfo6gY5HMvIziW3qaGSfmD44ERFXcZX0gRcae0Gq7wtdL lm0YBB8w5ZxScq0Yy3WWqIX90kZ913uDHuuQpN4vr3/r6LRbF4C+zHeAQ+E3pbAyE6Rbjl5fNur mvkzeQdTVs+rr1qvMNe+JGfhV/mKvR4EBw3AAouxoBmdDFszsqtNdrTqxdXFKTA8kWJbrVrRc4C 7I/CsTtItmvwMzI631XfHOW+6CDvLjU5WM+nwtarCJXI4iZtewBf3XblAaMl5gSIW+J6v49yA14 w= X-Received: by 2002:a05:6820:1899:b0:69d:ff0f:bf00 with SMTP id 006d021491bc7-6a0d8d4fd48mr7633446eaf.49.1782015745645; Sat, 20 Jun 2026 21:22:25 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:18 -0600 Subject: [PATCH v3 31/40] bsd-user: Add os-extattr.h with file and fd extattr functions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-31-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6717; i=imp@bsdimp.com; h=from:subject:message-id; bh=LUey6wJVSpmvZsd6fK9YF3w3PJFg68bn7AeYGLCH9GQ=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aA4PBdruLNNyczRlUuQgyJP3oMoT0w5eCh0 KapjVck3rWJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR ANECD/4jKAK5NHd44XReTT9y7LmYcl5VSHf4h1QN9dEw5oL0yJnVtipWO0dzCyKoe605KxHaosR Co47XZqAoTxlIzJ/9AYNJn8IJ+lhbWgFC5/Hec3wnOjKKEAAPSIUoPcOV1NAH/oqGop+jV0/EFa 9FpZPbBHYKe6030fMnZiuVpAysmboMbDOT2g1YatUrSrk+MNwu03GXB3jIwepEMTRMble3BXvBB i79TLmzmzTqhtPS+R0JOMF+cX/56xAnYnaplCQiHIfn4agEMjmri8pwKcS216b/V/MzkAqucao2 QKd7XDFsXuYjyJiwbpSrBwh00KzcBl2Np/+hBa7vt9ewZ6HDPgmGUv6dtBuReoNMjn9YU8nBH5r WZjqoqXuzIYsRqN65lh3sVxG0IeTCg6GHTl9EAYBsXAQ7RYp+qpPDAWr4mosQeoq+Y8kyU8NofD ijAZw1i2Lx2cd7Jdn0lPoPnAAEj8GnzV0Lg74swfeMIUT4z0oP4+ZDgVHoD1eHBayRnOAn+5at/ qouVSiDXeHHTUQEWoxE7hGmiJnfohEWFY1XgtKC+7Kpk3oAesoRrPdv4VcZDn5+Bkxo/JlP3fPa 1JjJAbIQgoa+w0VpPHeXig2Wji6yDF4pj6eE2GOMiDR9ysn9m4BDP5fIjbRKwjMsJxyIpEosbh0 RFe8YpggL3Vgd2w== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2b; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2b.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015930467154100 Add the first part of extended attribute support: extattrctl, extattr_set_file, extattr_get_file, extattr_delete_file, extattr_set_fd, extattr_get_fd, and extattr_delete_fd. Signed-off-by: Stacey Son Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-extattr.h | 208 ++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 208 insertions(+) diff --git a/bsd-user/freebsd/os-extattr.h b/bsd-user/freebsd/os-extattr.h new file mode 100644 index 0000000000..fb3ef27346 --- /dev/null +++ b/bsd-user/freebsd/os-extattr.h @@ -0,0 +1,208 @@ +/* + * FreeBSD extended attributes and ACL system call support + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include +#include + +/* extattrctl() */ +static inline abi_long do_freebsd_extattrctl(abi_ulong arg1, abi_ulong arg= 2, + abi_ulong arg3, abi_ulong arg= 4, + abi_ulong arg5) +{ + abi_long ret; + void *p, *a, *f; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + f =3D lock_user_string(arg3); + if (f =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg5); + if (a =3D=3D NULL) { + unlock_user(f, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattrctl(path(p), arg2, f, arg4, a)); + unlock_user(a, arg5, 0); + unlock_user(f, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_set_file(2) */ +static inline abi_long do_freebsd_extattr_set_file(abi_long arg1, + abi_long arg2, + abi_long arg3, + abi_long arg4, + abi_long arg5) +{ + abi_long ret; + void *p, *a, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + d =3D lock_user(VERIFY_READ, arg4, arg5, 1); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_set_file(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_get_file(2) */ +static inline abi_long do_freebsd_extattr_get_file(abi_long arg1, + abi_long arg2, + abi_long arg3, + abi_long arg4, + abi_long arg5) +{ + abi_long ret; + void *p, *a, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + if (arg4 && arg5 > 0) { + d =3D lock_user(VERIFY_WRITE, arg4, arg5, 0); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_get_file(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + } else { + ret =3D get_errno(extattr_get_file(path(p), arg2, a, NULL, arg5)); + } + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_delete_file(2) */ +static inline abi_long do_freebsd_extattr_delete_file(abi_long arg1, + abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *p, *a; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_delete_file(path(p), arg2, a)); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_set_fd(2) */ +static inline abi_long do_freebsd_extattr_set_fd(abi_long arg1, abi_long a= rg2, + abi_long arg3, abi_long a= rg4, + abi_long arg5) +{ + abi_long ret; + void *a, *d; + + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + return -TARGET_EFAULT; + } + d =3D lock_user(VERIFY_READ, arg4, arg5, 1); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_set_fd(arg1, arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + unlock_user(a, arg3, 0); + + return ret; +} + +/* extattr_get_fd(2) */ +static inline abi_long do_freebsd_extattr_get_fd(abi_long arg1, abi_long a= rg2, + abi_long arg3, abi_long a= rg4, + abi_long arg5) +{ + abi_long ret; + void *a, *d; + + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + return -TARGET_EFAULT; + } + + if (arg4 && arg5 > 0) { + d =3D lock_user(VERIFY_WRITE, arg4, arg5, 0); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_get_fd(arg1, arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + } else { + ret =3D get_errno(extattr_get_fd(arg1, arg2, a, NULL, arg5)); + } + unlock_user(a, arg3, 0); + + return ret; +} + +/* extattr_delete_fd(2) */ +static inline abi_long do_freebsd_extattr_delete_fd(abi_long arg1, + abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *a; + + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_delete_fd(arg1, arg2, a)); + unlock_user(a, arg3, 0); + + return ret; +} + + +#endif /* FREEBSD_OS_EXTATTR_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016018; cv=none; d=zohomail.com; s=zohoarc; b=fc6taNC6njO9Pt0CC3JKp8SLHAFGA/QoVc9y8fevtI0VDbaEmrc41k3njzM7r1Rn3HEbPcwrV6r7Wy1ixP0aP1xbBJbeojA5m9npQEglrxpmPATuP3GfyP5MbpxuAwyd0RojQzNtzqNPSPxknA7VTpdAoHdCyOE4IsaVjRXBxhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016018; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=6fL90qm028cjo/IJBtUKpLhGo6bIOnKXzc7SndzN8JA=; b=Du5KpoyJfd1m3XOGzdiO8lBhiOyLa47ft5GdCwcHv/DyUrZXs8m9XW2p10y4jKpyPnr+kWuKfIuW5KE76Es48kvzvvLJPLjESL+Og/OTuLeib90t8VUGIRHCIEmjmBwjxTnk2TElXnJaFnuQ0NzOmjIOK92YJATd4kjxSLGh7yg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016018788382.2718923732409; Sat, 20 Jun 2026 21:26:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9he-0003Bo-00; Sun, 21 Jun 2026 00:22:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hX-00036a-RK for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:31 -0400 Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hW-0005M4-2T for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:31 -0400 Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-6a0d414f71bso1165478eaf.2 for ; Sat, 20 Jun 2026 21:22:28 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015747; x=1782620547; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=6fL90qm028cjo/IJBtUKpLhGo6bIOnKXzc7SndzN8JA=; b=iC5sDqX8/H69VqCE+o7ezYDD79Ulhs1HLu9DJnrIk/SYpgVtc3xgTY5kRuL7BktZ0u +sQvEO3T++Z/AXRFEqAmLGAUUfKa45qlwLAIsGMBJoBqEEeTNYZeMeTZvGSxBahr95qD F/ue06CqVLAsMPP5AM3ybbl7asZAYrgALIInVuAx9llAEZm89hdgKvdnkM/lzzEExwiy yC6OyMER9lwhgYEXABxG0PbUEImwnwU+IlrJoU5n/pDFX/ImA+7Hj6hCRtg1ZU8XnN8R ex3rSaMyOX3D4NyB+aCXyw7fXbfuFW/TJJ0+NS6HiaOI1caxOI9ci29ncHd763KyL5mq ci7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015747; x=1782620547; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=6fL90qm028cjo/IJBtUKpLhGo6bIOnKXzc7SndzN8JA=; b=JL16ZTAPCk2mf2mMnJV8R0QXfdrEgeLDaVUb9bEKeg1EG8UOf8HysLVT5ZmszcOdgT kIMJbO1L90GLt1pAcdjvSwEX+XkapEJNI1Mu62Z1JJ1ez7vma7G19P/z3aIFCgaOnmzw Plul1ZpQRQRw9TF0C4Ef7JwN4f/Bpw7VWq2FX8vH38a2GzsDIo4Q5EfZp/QCq7J2d4z9 iCvjJSl+BLTM86Gud4VwGC3vTLO7T6KW/WPkmHFFE3mwjHjL6XbMlue9u/3KbyUirOS7 owrESgwfgNcsjbU6IOWm9E6IZLBuRZ47tQ0EGf5PpphIcxv2EMbbfAybUrcVj7QyDitg khJw== X-Gm-Message-State: AOJu0YzudbVHMYQcQ566vxS49dFeGnzX8/rvMUz4dXBBBp6bF9ncDvZb mWiWN1RIUYIVMx4yGHK/THOYeINnYWxHsJGLi+PKmRT+vl83WzOJQSsws+7BUjfh91s= X-Gm-Gg: AfdE7ckYTGaMRUWTlbron5czBkJNw5PZ81eaOB+U/65V3+u9bVaxzhkKUqhluYuQ1in HaLtL4xKpPJaeoyDg4S3QjeveYCmzYyKmQ/tumhyN7+tpnVwt20jRmrLYVT5QgxlnbI0ZCwXmoy hhtPcVm3SndxTL3q3v8KLh7m5LbHRIUmKa+DkXlYmOf2GAjMpJL65oGDBaiZI/D8wus967GGaww TmwMz/IqrIjyqNRRY27lUgQJghJOV+oqfUHT22kAHVSqDexZ+ca4LWLs4i87dwwazK5c4xqgZ3y ntehk0mqUZ0mG8F9bS3kn9QMTQkZPTF/RToor95wB1LDEwPGkodixqV/gFCze/tOOq8IEGhgl+z lVFJmsl8kXcv0vKo0OyEWPrJUcRJBSTUsl4LQcDd+MwZdMEAIWV4RLHY1HtUZfvFHAq+Mj+Y+9K 4= X-Received: by 2002:a05:6820:2212:b0:6a0:effa:f806 with SMTP id 006d021491bc7-6a0effaffafmr3463934eaf.50.1782015747363; Sat, 20 Jun 2026 21:22:27 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:19 -0600 Subject: [PATCH v3 32/40] bsd-user: Add link and list extattr functions to os-extattr.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-32-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5740; i=imp@bsdimp.com; h=from:subject:message-id; bh=b4SJfc5NVhpHg6uMrnU4XB/74u64XqiuNxTge050gMk=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aAsskoKfesAfHcF/iC5NmTA3Cb7xnj/1o+W JIZrJGxWQ+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR ADPUEACbaukbMg3KZ4OJyc8+n6qcAMu8UPFPuCb3W4YeqyRq7jD62PrIk1Ye/+mw4DbBpA4a17K IfzjRKbARsKYyp9CqMCysUutKlSc09LE62EAlT70TM79c3uOXYfhx8/aXsiMsj6YCi38I9M4Za0 bTD+dC0zP1D6A5CyXHoGM8eoi+1tvt5lg3VDUOTIE2Rp8F6dhdgLvkB9oOMHNc+SGj5NEjPFfr2 UinEEGST9qgI5Ze7kfX7sOrHEYUlw/cvZLTC6x5WTH7uba9SqZASEUmj44sfxRMUgQhy6/hlM85 aa71mh+JuZbJ3zkc31/AteBsFKOgqd1HF6KbQytNYd1iqTYb72zxSVFeS8ek/ilawodYXU2OqEY jVihMBEt0s+EiCEu+cdTINliJUqOep2NlFAeuX4ybC2DOUV5bjO6SBfr0oiHqDTXw1hm0+5EfiR xGGt9oinIsIghvy93krcsygVt5Qgiz56L717Is6mNqntuL/m3wCzxTAzyYuhG8AefMTc278wWwp PdYnkf5Cg6x8kZ/lB2sei6P0luRJbqvFyu7gOS5bgP22o86yZIiJQwugSz9eTQeiPb3fMstTe7y fev6Ocsh27HL30afZww0KW7CaND4k8DYlvL1oDo8LMVruUN/oNhl10pNSnUFAdq2zOQs0cEjH8h O9gxZkxBkj3wxTw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2c; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016019806154100 Add extattr_get_link, extattr_set_link, extattr_delete_link, extattr_list_fd, extattr_list_file, and extattr_list_link. Signed-off-by: Stacey Son Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-extattr.h | 172 ++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 172 insertions(+) diff --git a/bsd-user/freebsd/os-extattr.h b/bsd-user/freebsd/os-extattr.h index fb3ef27346..90f0c64c93 100644 --- a/bsd-user/freebsd/os-extattr.h +++ b/bsd-user/freebsd/os-extattr.h @@ -204,5 +204,177 @@ static inline abi_long do_freebsd_extattr_delete_fd(a= bi_long arg1, return ret; } =20 +/* extattr_get_link(2) */ +static inline abi_long do_freebsd_extattr_get_link(abi_long arg1, + abi_long arg2, + abi_long arg3, + abi_long arg4, + abi_long arg5) +{ + abi_long ret; + void *p, *a, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + if (arg4 && arg5 > 0) { + d =3D lock_user(VERIFY_WRITE, arg4, arg5, 0); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_get_link(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + } else { + ret =3D get_errno(extattr_get_link(path(p), arg2, a, NULL, arg5)); + } + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_set_link(2) */ +static inline abi_long do_freebsd_extattr_set_link(abi_long arg1, + abi_long arg2, + abi_long arg3, + abi_long arg4, + abi_long arg5) +{ + abi_long ret; + void *p, *a, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + d =3D lock_user(VERIFY_READ, arg4, arg5, 1); + if (d =3D=3D NULL) { + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_set_link(path(p), arg2, a, d, arg5)); + unlock_user(d, arg4, arg5); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_delete_link(2) */ +static inline abi_long do_freebsd_extattr_delete_link(abi_long arg1, + abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *p, *a; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + a =3D lock_user_string(arg3); + if (a =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_delete_link(path(p), arg2, a)); + unlock_user(a, arg3, 0); + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_list_fd(2) */ +static inline abi_long do_freebsd_extattr_list_fd( + abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4) +{ + abi_long ret; + void *d; + + if (arg3 && arg4 > 0) { + d =3D lock_user(VERIFY_WRITE, arg3, arg4, 0); + if (d =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_list_fd(arg1, arg2, d, arg4)); + unlock_user(d, arg3, arg4); + } else { + ret =3D get_errno(extattr_list_fd(arg1, arg2, NULL, arg4)); + } + return ret; +} + +/* extattr_list_file(2) */ +static inline abi_long do_freebsd_extattr_list_file( + abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4) +{ + abi_long ret; + void *p, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + if (arg3 && arg4 > 0) { + d =3D lock_user(VERIFY_WRITE, arg3, arg4, 0); + if (d =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_list_file(path(p), arg2, d, arg4)); + unlock_user(d, arg3, arg4); + } else { + ret =3D get_errno(extattr_list_file(path(p), arg2, NULL, arg4)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* extattr_list_link(2) */ +static inline abi_long do_freebsd_extattr_list_link( + abi_long arg1, abi_long arg2, abi_long arg3, abi_long arg4) +{ + abi_long ret; + void *p, *d; + + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + if (arg3 && arg4 > 0) { + d =3D lock_user(VERIFY_WRITE, arg3, arg4, 0); + if (d =3D=3D NULL) { + unlock_user(p, arg1, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(extattr_list_link(path(p), arg2, d, arg4)); + unlock_user(d, arg3, arg4); + } else { + ret =3D get_errno(extattr_list_link(path(p), arg2, NULL, arg4)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* + * Access Control Lists + */ + =20 #endif /* FREEBSD_OS_EXTATTR_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015867; cv=none; d=zohomail.com; s=zohoarc; b=ElwB1DIw7zxSZMJqUcz21WK0epfmwhncOQzpSKjXelLvOrY0mRlk3dHvKKvVcySlbrmJkt6i/M7tNoT6dTgR7LuOOO25aiYBcMjcq5WZDf2s2jmwO0F0/uUOrOU16QdJXFhkTAICM3tAp8ox1h20SGV+x6l0nr2DoYEIije6XKY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015867; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=cdGgw9J2TjefPWshhJlLv/nPFfs6MeB5pR26lmCLgWE=; b=IklI9Ta8+9ri60AXyThfTcN2jnByjPYWlP2FQgRAVqzf4JL4TGnzx+mfVk1dmFTvUzFdiHvuM/JfBLaBB0Bt2uarzI/4qBFOWny6I1nCalRkcnQ81588nya6k8PQSUYce0OzxOu1tiVcOFN8EYru5OqHjsnDiMr6434YFdLV+zc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178201586763670.81883283926811; Sat, 20 Jun 2026 21:24:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hc-0003AW-73; Sun, 21 Jun 2026 00:22:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hY-00036r-5T for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:32 -0400 Received: from mail-oo1-xc2d.google.com ([2607:f8b0:4864:20::c2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hW-0005Nc-9Q for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:31 -0400 Received: by mail-oo1-xc2d.google.com with SMTP id 006d021491bc7-6a0d414f71bso1165481eaf.2 for ; Sat, 20 Jun 2026 21:22:29 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015749; x=1782620549; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cdGgw9J2TjefPWshhJlLv/nPFfs6MeB5pR26lmCLgWE=; b=vFN3NT7NyY9i4Lvakw9RrPr4lth1kdDi48GK7kHY5GBmropwUCpOtvkXPTdb+yDhfU zSrDHgUzZ39iJJP2A2sywxvVY6ZHxmkhbohfeUrgnbghfVVTsn6H25KjACLrJ2mjEZcz cf68O8Folwp2pCQb18fKPIH3qZ4ufEJKfq2+gqhhJEzcl2TwqWa296zBfjhB3amtJmcZ LAd7aEGssrR9eiiufyQP1I8M69GUthAoe30nLJXM6Bv0xAYVa1kn5Tb5WPBLwxBcq2LD y44Gb4EIRMvRZvw6ujBUzJGw7L7zJ08ObeEdn0ys2jznMcTmNmXJNI4DpEQGlxif2D3z FwUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015749; x=1782620549; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=cdGgw9J2TjefPWshhJlLv/nPFfs6MeB5pR26lmCLgWE=; b=mqjCM/58O6GghM0luqIPVAsTRAmZLWAgtaIwNbI+ovaLmvKXgotyN4I4gqLb1e2Sui SkYtr3titMOogEPYkV19zbvWp0HDtPwvV3eIR5hx+AuYjrlLhLfUpdx43YmYLufZ9Eff IXI0iaGCZ/YFljglk/N8FZYkn6GHPyV1dxdsds46SYd34qETUUOBbb87/Y6Z6EB+4CL/ 7g9nmdqz+0fN46luhd+X8FG9ROIui4joLaawRpj1D+eR0OSM1FsnRbgdTJ/gzp/IKKX8 2iqz9ytO5GUKAqcAIZoCblRT25e9XlRAdncm7hyea8Hdb1i9zgGk72n28C9F74zKV9Rx Qwnw== X-Gm-Message-State: AOJu0YysQj4SsdyFC2/01rAAqfDhg+yyz5CLgv0FBcD2gK4diBGt64vl bBkaTad8bhoCfLBoiKhLRrtRXODM+osC2XqzlZX4T9oNHzOEnUr2Ks7/yMs7gLFWMQo= X-Gm-Gg: AfdE7cmzL/C3WkE5QL8ZeIRJnmvKWMb/ZuOBGy8rzfy/CR0WnPRrRsLfjf68jL74mmR D/ijVCCJ3mcpvRA9LikHuHh2g5L6yqmBqP0+li5zZnvSBz/q8hwfN4bif4chX7yhLVe13hLY/tw viRWD1rTBzXyco4TEbDaSM5T5G1FiTSfEOKv6Avc8Y6aDqMLaOCJEa9v2Wer10iqNKJNhtzEn/X wX7SgI194KBNVvebuJZNoZ0AgcKO4ixrcJQ76PbuZqx65ts7okBTo+U3HqiVWMP1QkqCIkyFo4E uoq11vtYY38PXrpUTL/5WnDULyjRyeC3AAEU/iDybQ3fMn+8e72yrHTiVwSUbPZCGkmJUnqniXf 1XsEcih9bbS+7TaT7gvLqBWeIsMYf/7UZzgRqwAdazqfgfap32iGxcKZCeNh6f7Jy+JrIL+Vupv o= X-Received: by 2002:a05:6820:60c:b0:6a0:e2f5:3b04 with SMTP id 006d021491bc7-6a0e2f53f33mr5062202eaf.20.1782015749069; Sat, 20 Jun 2026 21:22:29 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:20 -0600 Subject: [PATCH v3 33/40] bsd-user: Add ACL system call shims to os-extattr.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-33-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=9909; i=imp@bsdimp.com; h=from:subject:message-id; bh=Fes1JZRpOKohxHTDoJ0In8LBoQveGPHkqA4NLSjPKwI=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aASdymR+SnXBZ5H7+ZR6XzxFb4FJ4qGoIJa h/UnlpyaPaJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgAAKCRBsHNEofbAR AHWVD/9XveP4AzjpxwQGF1VdgVjPOasY/S7OhbCV6HyORlvO9HUgDduZMrbNRNgaTmNEXVd4bY2 uAMzIGPFOP/eCBMgGkqccgPkNn+5jmecwmjC9leOemaYJ9WeMkw+bwG3wUt0kFkar+ok2qvLEw3 KNxkBkdyEildkIHxUST9AIUN1t//H3SpI36muO0VNnhICWhPFHyWXwapsHXf/Y0LpQw0unQUvtk 4IwQSuVEO8KBaJ51KCPk4LCUovTMXsoaFDHuqlisQwHavbaaUv8WofcyBABggThukbSfd3UJp4W 4uo1ovsQdbtNYQbnO4SEgqx1AbpIiR4P5S1+T72uh7KA1FnCrdGqYropBsQ3nB7YMR3Nku5JEPc 9H66EXNFto00m5AcVGGgVEhqDYb/HA6pGF0vXhsXkkz/IZje5Lgczo06brqKxr/B2MIF7HnxCfD aaGLIBdJ+26exH37W9B6KiOK5bNzkt9tg1H58mi4yifIYBUkwOaD5Iw6SGsXqm86TCOo841HZ58 o3JYh6BXqO7z1caP9FkRnCgCX10q6QExvKuKzoJDYpXoedzcGwQ9OdajnEsfVqHMskfFBz/5mVq Q19/Mi4ZTSTAzEutmyFFMw/A8cufIP2ODn34mg0JT1K9MDnxE7JkxVI6Wnjy8gQXCPLMNm2xJEq mW07NBA5edwKlfQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2d; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015869718154100 Complete os-extattr.h with ACL operations: __acl_aclcheck_fd, __acl_aclcheck_file, __acl_aclcheck_link, __acl_delete_fd, __acl_delete_file, __acl_delete_link, __acl_get_fd, __acl_get_file, __acl_get_link, __acl_set_fd, __acl_set_file, and __acl_set_link. Signed-off-by: Stacey Son Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-extattr.h | 289 ++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 285 insertions(+), 4 deletions(-) diff --git a/bsd-user/freebsd/os-extattr.h b/bsd-user/freebsd/os-extattr.h index 90f0c64c93..b6fe9051f1 100644 --- a/bsd-user/freebsd/os-extattr.h +++ b/bsd-user/freebsd/os-extattr.h @@ -65,7 +65,7 @@ static inline abi_long do_freebsd_extattr_set_file(abi_lo= ng arg1, return -TARGET_EFAULT; } ret =3D get_errno(extattr_set_file(path(p), arg2, a, d, arg5)); - unlock_user(d, arg4, arg5); + unlock_user(d, arg4, 0); unlock_user(a, arg3, 0); unlock_user(p, arg1, 0); =20 @@ -151,7 +151,7 @@ static inline abi_long do_freebsd_extattr_set_fd(abi_lo= ng arg1, abi_long arg2, return -TARGET_EFAULT; } ret =3D get_errno(extattr_set_fd(arg1, arg2, a, d, arg5)); - unlock_user(d, arg4, arg5); + unlock_user(d, arg4, 0); unlock_user(a, arg3, 0); =20 return ret; @@ -267,7 +267,7 @@ static inline abi_long do_freebsd_extattr_set_link(abi_= long arg1, return -TARGET_EFAULT; } ret =3D get_errno(extattr_set_link(path(p), arg2, a, d, arg5)); - unlock_user(d, arg4, arg5); + unlock_user(d, arg4, 0); unlock_user(a, arg3, 0); unlock_user(p, arg1, 0); =20 @@ -376,5 +376,286 @@ static inline abi_long do_freebsd_extattr_list_link( * Access Control Lists */ =20 +/* __acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_aclcheck_fd(abi_long arg1, abi_long= arg2, + abi_long arg3) +{ + abi_long ret; + struct acl host_acl; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_aclcheck_fd(arg1, type, &host_acl)); + } + + return ret; +} + +/* __acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp= ); */ +static inline abi_long do_freebsd__acl_aclcheck_file(abi_long arg1, + abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *p; + struct acl host_acl; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_aclcheck_file(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* __acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp= ); */ +static inline abi_long do_freebsd__acl_aclcheck_link(abi_long arg1, + abi_long arg2, + abi_long arg3) +{ + abi_long ret; + void *p; + struct acl host_acl; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_aclcheck_link(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_delete_fd(int filedes, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_fd(abi_long arg1, abi_long a= rg2) +{ + abi_long ret; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + return get_errno(__acl_delete_fd(arg1, type)); +} + +/* int __acl_delete_file(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_file(abi_long arg1, + abi_long arg2) +{ + abi_long ret; + void *p; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(__acl_delete_file(path(p), type)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_delete_link(const char *path, acl_type_t type); */ +static inline abi_long do_freebsd__acl_delete_link(abi_long arg1, + abi_long arg2) +{ + abi_long ret; + void *p; + acl_type_t type; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(__acl_delete_link(path(p), type)); + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_fd(abi_long arg1, abi_long arg2, + abi_long arg3) +{ + abi_long ret; + acl_type_t type; + struct acl host_acl; + + memset(&host_acl, 0, sizeof(struct acl)); + host_acl.acl_maxcnt =3D ACL_MAX_ENTRIES; =20 -#endif /* FREEBSD_OS_EXTATTR_H */ + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret =3D get_errno(__acl_get_fd(arg1, type, &host_acl)); + if (!is_error(ret)) { + ret =3D h2t_freebsd_acl(arg3, &host_acl); + } + + return ret; +} + +/* __acl_get_file(const char *path, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_get_file(abi_long arg1, abi_long ar= g2, + abi_long arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + memset(&host_acl, 0, sizeof(struct acl)); + host_acl.acl_maxcnt =3D ACL_MAX_ENTRIES; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(__acl_get_file(path(p), type, &host_acl)); + if (!is_error(ret)) { + ret =3D h2t_freebsd_acl(arg3, &host_acl); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_get_link(const char *path, acl_type_t type, struct acl *aclp)= ; */ +static inline abi_long do_freebsd__acl_get_link(abi_long arg1, abi_long ar= g2, + abi_long arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + memset(&host_acl, 0, sizeof(struct acl)); + host_acl.acl_maxcnt =3D ACL_MAX_ENTRIES; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(__acl_get_link(path(p), type, &host_acl)); + if (!is_error(ret)) { + ret =3D h2t_freebsd_acl(arg3, &host_acl); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); */ +static inline abi_long do_freebsd__acl_set_fd(abi_long arg1, abi_long arg2, + abi_long arg3) +{ + abi_long ret; + acl_type_t type; + struct acl host_acl; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_set_fd(arg1, type, &host_acl)); + } + + return ret; +} + +/* int __acl_set_file(const char *path, acl_type_t type, struct acl *aclp)= ; */ +static inline abi_long do_freebsd__acl_set_file(abi_long arg1, abi_long ar= g2, + abi_long arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_set_file(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} + +/* int __acl_set_link(const char *path, acl_type_t type, struct acl *aclp)= ; */ +static inline abi_long do_freebsd__acl_set_link(abi_long arg1, abi_long ar= g2, + abi_long arg3) +{ + abi_long ret; + void *p; + acl_type_t type; + struct acl host_acl; + + ret =3D t2h_freebsd_acl_type(&type, arg2); + if (is_error(ret)) { + return ret; + } + p =3D lock_user_string(arg1); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D t2h_freebsd_acl(&host_acl, arg3); + if (!is_error(ret)) { + ret =3D get_errno(__acl_set_link(path(p), type, &host_acl)); + } + unlock_user(p, arg1, 0); + + return ret; +} --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016034; cv=none; d=zohomail.com; s=zohoarc; b=OQScKhYSK4b29S3Jw/cWdZc+axCT32kjk5VRVUpjy3UBEVj1gjgpdzp/mjVrtK/05BcQz2l54oCALYEPW89Csck5aS3ITQQfyoCV5/OuGD3nK/OnTKYTiNEatdWigj5CYHb7oMYY07i5MtdCerJzHR5sJkwMT1ZU2/NbWjhZIAE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016034; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=5qimRSElObv1x5nSEz2bAFqjoLHlEU4oNntYB0m/4Tg=; b=cFvSDF9bLC8pDwwsBIEI3zwANWNjYNzEXMYYInIXKIOziEVovVFbrUB213YPKj03/2WYCwKS56Au5sngjKCw2hTaf+Wjk6hK6vO4EcXK/+rCm92zBkbm31v5p/mY0/xAbkElfITjRZUJAN/ISv3Mv4bStiSzIO+fGf8WxquDrBw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782016034517570.9720750973472; Sat, 20 Jun 2026 21:27:14 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9he-0003CM-I2; Sun, 21 Jun 2026 00:22:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9ha-00039b-7Q for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:35 -0400 Received: from mail-oa1-x42.google.com ([2001:4860:4864:20::42]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hY-0005OD-CC for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:33 -0400 Received: by mail-oa1-x42.google.com with SMTP id 586e51a60fabf-4471c2ae049so1065646fac.2 for ; Sat, 20 Jun 2026 21:22:31 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015750; x=1782620550; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=5qimRSElObv1x5nSEz2bAFqjoLHlEU4oNntYB0m/4Tg=; b=CYOVfUoTxSQuafpp9QGlE79rNZwuhh9Bpm0s1D+hXM1zFIaGmOriyE2vHfeCnqLg3C 3XaO6daHJe/YCtN/8O9wm40RmQlrfbLDk+lUGK/x+70roKREU94gJ5hO4HZuEOrvWUeU m+hzFN1fvB/pxsAtI89YenDIoRt2u674bFj3IMPkzu6fuqhgN+JSkxKZeXKTZfbJxxja peyLBR6jyfEn4zfbFTxeU8ZL/INYVVoPgYdOuI5YNCBeai9dw/VUdIIplLWgM9ZZgLA7 anE8eO/R5/SErovIeIledRmB9aBn/k/4TSP0wXDe+UquLcLt6QlnEL01M/xDDO95Htvm FITA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015750; x=1782620550; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=5qimRSElObv1x5nSEz2bAFqjoLHlEU4oNntYB0m/4Tg=; b=r9dKCoEj50S+Fl08+vxCMWotAWd03Gqtd7Q92uWl/NRsaj1YrcKUIf1Bgs+IfXiimK u1QknKRfJ1wsJ4K8P08tu47Ptss/1CwSbCjmAU+Ve/sdWBzIsd+8lz9JoP3kHA44Z5V8 LJZBRm3remuBjdZBXjpBK8TWRZYEV9cNpQhbj1ty7FtOzElpV38AkvrxmWN0nWG2zvay WKhgwTV8rRY8GGY0dvJMv8Nk1/eKJOWucj6KGsjaKvKsNBsSVpkt74AZ0hFaAs+ws6No WZWS590PUyGmf+RFjuWipsZExRkCXDPZqS4kJ0/09X3/k1p0lXZTGzQSbUnShsb8paq8 nL5Q== X-Gm-Message-State: AOJu0YwbHUcuKuXhv8mw99r/5j0k19WrCiGmRn+wQLhtoLMj4zR2YZU6 Q9fY8Tyc7O4ow3tRK+yok/tG365lv//TSM9vgc9ewAvwJOvzbfVBAVAvM028AlayT9Y= X-Gm-Gg: AfdE7ckMWPtJDbFCX2E1Zs5+9k/5Sma27x2PrSTR/0I3uAXMJsAgI+LjQuB3/DxZYx3 JTY5jzyPaEN4KWTQAQAlL1kSRiPqnP4exCz5z3rFGB5TQX4MdL1PeWK8OFBLst/8dFVdTxTKiBU 1jzwDQWpimYoMz01Ot78aVmh13ILMe0L86Gb3xg2gbQ3HlLB7P4QM/9qQTHE5YSdnWaOYtKh8RC nZgYudvXCbX1JOcrhKbUDgIylkjNHlTcyq2yQNopmopOjdD2IrrG+q8YcgPLilseMKpnm21DqZK TBYlnMU62Sg4rPXfw+MGnx7ANj1cGgYAb1afSQsjNSKRoJHpnMwpsco6AW9OknMGNIJM4z6ll0p jR+siA6RJo1UfVApINBim5aUeOju6+OT15L3KFQUMrHz1zGIyoZLWZyDOQUHA2pKg1ejsoSWEw8 7ulhnGm14l7A== X-Received: by 2002:a05:6820:210a:b0:69e:98c0:4bc9 with SMTP id 006d021491bc7-6a0eb329e4dmr4141512eaf.19.1782015750569; Sat, 20 Jun 2026 21:22:30 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:21 -0600 Subject: [PATCH v3 34/40] bsd-user: Add os-extattr.c with ACL conversion functions MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-34-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5368; i=imp@bsdimp.com; h=from:subject:message-id; bh=ZIr7Yj40Tc7tAzlzobPhYQrM/hycg5Rm+eugHAV6nCs=; b=kA0DAAoBbBzRKH2wEQAByyZiAGo3ZoHID3EJbpp2jdOtJ4EwOIri4CUnLIPealmifT/jpgSjr 4kCMwQAAQoAHRYhBCA1+JSwCqPPfM3ht2wc0Sh9sBEABQJqN2aBAAoJEGwc0Sh9sBEAS9kP/RSn 1hzCK6/CByxmJq4ssTDSodX9ERP2ak7oaMBZenixA5aKR/SNGPQGlxmeXODIX4/OyQM03xlPV7n z6ZGYJp3B8CIXscBhmJypVUy+z3Iym/ekWDeuFIsstmJz1KzGZk6+zNN2WjuItjvxnupfVE+SYo BLT772OHeTE2jhVdihTDXYDNGEFc7AoA3jjXjGx3YiajXhFF6f5UflZtqRczVKjbF7Cmzlry4Mu 23BNbefD+83uDXBeu8kuY9AdI3/HBjWyfl3Ox3wQbLmRqosd1kEBgZ81HVhkbtgUo8dFnbOqfif DPgPspOwE/EmU+nIym75qTsE3N33KSzTpAEjIYdiJjnW8yl9bezyL1857buf9mWlLMlUIhM5XFJ D0vz5WD9FrLc6Knm2AzqkCSx/E1DAKKDX0z190gtSOLHrn+JzdOhkCNSqjsVN3CsAYjFJhMS0cH y4utncdATugz++R2COPnO+utpgvsLw/yDfjBWyx0iXDLphJWyn/2YTkaVi7PA5y2OqDKifRraPq 7ynCDlKfcuZxpBruMdeC9aPZ0IfzdYF3ERAenpsD2eqrVQ+q6sWWV9yG0UXVX41wtSemuTbApoi 5winY9ZaPVIjOLP9K6Ie9TAdiB8bs75mePZXj1BnKbHoBERmNyAs/Qb3Z+yqsN0TmqwzUq7gVct 9xfXT X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::42; envelope-from=imp@bsdimp.com; helo=mail-oa1-x42.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016036000154100 Add os-extattr.c with t2h_freebsd_acl, h2t_freebsd_acl, and t2h_freebsd_acl_type helper functions for ACL operations. Add os-extattr.c to the build and include os-extattr.h in the syscall dispatcher. Signed-off-by: Stacey Son Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/meson.build | 1 + bsd-user/freebsd/os-extattr.c | 118 ++++++++++++++++++++++++++++++++++++++= ++++ bsd-user/freebsd/os-syscall.c | 2 + 3 files changed, 121 insertions(+) diff --git a/bsd-user/freebsd/meson.build b/bsd-user/freebsd/meson.build index db531604ad..0fc779749d 100644 --- a/bsd-user/freebsd/meson.build +++ b/bsd-user/freebsd/meson.build @@ -4,6 +4,7 @@ bsd_syscall_nr =3D custom_target('bsd-syscall-h', command: [sh, meson.current_source_dir() / 'scripts/syscallhdr.sh', '@= INPUT@', '@OUTPUT@', 'FREEBSD']) =20 bsd_user_ss.add(files( + 'os-extattr.c', 'os-proc.c', 'os-socket.c', 'os-stat.c', diff --git a/bsd-user/freebsd/os-extattr.c b/bsd-user/freebsd/os-extattr.c new file mode 100644 index 0000000000..3456157b4d --- /dev/null +++ b/bsd-user/freebsd/os-extattr.c @@ -0,0 +1,118 @@ +/* + * FreeBSD extend attributes and ACL conversions + * + * Copyright (c) 2013 Stacey D. Son + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include "qemu/osdep.h" + +#ifndef _ACL_PRIVATE +#define _ACL_PRIVATE +#endif +#include + +#include "qemu.h" +#include "qemu-os.h" + +/* + * FreeBSD ACL conversion. + */ +abi_long t2h_freebsd_acl(struct acl *host_acl, abi_ulong target_addr) +{ + uint32_t i; + struct target_freebsd_acl *target_acl; + + if (!lock_user_struct(VERIFY_READ, target_acl, target_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(host_acl->acl_maxcnt, &target_acl->acl_maxcnt); + __get_user(host_acl->acl_cnt, &target_acl->acl_cnt); + + if (host_acl->acl_maxcnt > ACL_MAX_ENTRIES || + host_acl->acl_cnt > ACL_MAX_ENTRIES) { + unlock_user_struct(target_acl, target_addr, 0); + return -TARGET_EINVAL; + } + + for (i =3D 0; i < host_acl->acl_cnt; i++) { + __get_user(host_acl->acl_entry[i].ae_tag, + &target_acl->acl_entry[i].ae_tag); + __get_user(host_acl->acl_entry[i].ae_id, + &target_acl->acl_entry[i].ae_id); + __get_user(host_acl->acl_entry[i].ae_perm, + &target_acl->acl_entry[i].ae_perm); + __get_user(host_acl->acl_entry[i].ae_entry_type, + &target_acl->acl_entry[i].ae_entry_type); + __get_user(host_acl->acl_entry[i].ae_flags, + &target_acl->acl_entry[i].ae_flags); + } + + unlock_user_struct(target_acl, target_addr, 0); + return 0; +} + +abi_long h2t_freebsd_acl(abi_ulong target_addr, struct acl *host_acl) +{ + uint32_t i; + struct target_freebsd_acl *target_acl; + + if (host_acl->acl_maxcnt > ACL_MAX_ENTRIES || + host_acl->acl_cnt > ACL_MAX_ENTRIES) { + return -TARGET_EINVAL; + } + + if (!lock_user_struct(VERIFY_WRITE, target_acl, target_addr, 0)) { + return -TARGET_EFAULT; + } + + __put_user(host_acl->acl_maxcnt, &target_acl->acl_maxcnt); + __put_user(host_acl->acl_cnt, &target_acl->acl_cnt); + + for (i =3D 0; i < host_acl->acl_cnt; i++) { + __put_user(host_acl->acl_entry[i].ae_tag, + &target_acl->acl_entry[i].ae_tag); + __put_user(host_acl->acl_entry[i].ae_id, + &target_acl->acl_entry[i].ae_id); + __put_user(host_acl->acl_entry[i].ae_perm, + &target_acl->acl_entry[i].ae_perm); + __put_user(host_acl->acl_entry[i].ae_entry_type, + &target_acl->acl_entry[i].ae_entry_type); + __put_user(host_acl->acl_entry[i].ae_flags, + &target_acl->acl_entry[i].ae_flags); + } + + unlock_user_struct(target_acl, target_addr, 1); + return 0; +} + +abi_long t2h_freebsd_acl_type(acl_type_t *host_type, abi_long target_type) +{ + + switch (target_type) { + case TARGET_FREEBSD_ACL_TYPE_ACCESS_OLD: + *host_type =3D ACL_TYPE_ACCESS_OLD; + break; + + case TARGET_FREEBSD_ACL_TYPE_DEFAULT_OLD: + *host_type =3D ACL_TYPE_DEFAULT_OLD; + break; + + case TARGET_FREEBSD_ACL_TYPE_ACCESS: + *host_type =3D ACL_TYPE_ACCESS; + break; + + case TARGET_FREEBSD_ACL_TYPE_DEFAULT: + *host_type =3D ACL_TYPE_DEFAULT; + break; + + case TARGET_FREEBSD_ACL_TYPE_NFS4: + *host_type =3D ACL_TYPE_NFS4; + break; + + default: + return -TARGET_EINVAL; + } + return 0; +} + diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index 0c729da0ab..f385034a53 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ +#define _ACL_PRIVATE #include "qemu/osdep.h" #include "qemu/cutils.h" #include "qemu/path.h" @@ -43,6 +44,7 @@ #include "bsd-socket.h" =20 /* BSD dependent syscall shims */ +#include "os-extattr.h" #include "os-stat.h" #include "os-proc.h" #include "os-signal.h" --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015821; cv=none; d=zohomail.com; s=zohoarc; b=mpy/RWujBoOjzzJhkX+sk4lkVcbrEE+6YIy68xvIIzrJz/aXos3ivQ4XeIqysnRlmb9Wol31udswdHezDr6Cp7gqM39zVkqybs2ElP4UPJcGno9zDoF+a4jCadd/4wC1WnwL99Hffl+2YF6Ye564i627+l9nJDVhnMSv0wkBdio= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015821; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=07NCnQNKcY2tu2P/671mwrwbXA8HIGbGh2vpGFWag8s=; b=jZkKs/LXVzoitsiH62H1oYmkGSGP8ZlRNVORX45+EAA5+qSBLzAgQ727vEs3NzXf/zJOpxazm7d3WrLKQBnrDGJF2bg8enlqXCflOnKKmQ/c412/95awqckU16Yd9W1XEoxDBf0HPuaXnQveICtp1fTVE/q44nWldTy8SpGBMpU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015821379728.9215631229598; Sat, 20 Jun 2026 21:23:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hd-0003Bj-QG; Sun, 21 Jun 2026 00:22:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9ha-0003AM-Ko for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:35 -0400 Received: from mail-oo1-xc2d.google.com ([2607:f8b0:4864:20::c2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hZ-0005P2-2S for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:34 -0400 Received: by mail-oo1-xc2d.google.com with SMTP id 006d021491bc7-69dead44101so2845179eaf.3 for ; Sat, 20 Jun 2026 21:22:32 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015752; x=1782620552; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=07NCnQNKcY2tu2P/671mwrwbXA8HIGbGh2vpGFWag8s=; b=N0xuUT8TSp5ygQqtaAKWKPBsoizQCZngOYBet+nT3Wg764g6sGZQP/giOrj9k7Nr+b R+m9b5UEHoxIqxUFedE9tAL+qRx5+nyyjxpdp9YMt2ofKoQNNsPWUihmHyDsJtuz+B58 OlusCb5CTV5YWQnoAT+coq/VCW7Q/fR5QoQNAmCHtysbt/fMKwjj3KLbCKil/EWnbJr/ Rne/8+JcswbKZ9rep2c0Kccyd1RRDrFqDCYhNqnGzI9i0RrKvbhG6duzfE56oKRVn0Ic glyqz6QtfBSv1Rtd+2Voa56CbyRAPxIRIIkJrXAK6WL0FNs9VJkQVXaGEMeLYkPcOaB3 6DCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015752; x=1782620552; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=07NCnQNKcY2tu2P/671mwrwbXA8HIGbGh2vpGFWag8s=; b=n1nkVSZ1rfcLmCDEzZ/icH4YtqQyo6EPxdkzXEeBtiaMnLJbIClMOc2xhvCplcbWuc E0PsnWSn4BNpFCtY3ESsJLu4OYdmAsSf8QTho5vGC9p5al7hEr2LBhm2VHrDY1e3zLey HBYQrxLHZrX8HbsXDbJ0dOa9Mj3fR1eu0lVWQOTHp0eMf7u6NEsdX97tyXn7H4n55XQm MqXGMQGVdcHfP9ImgZ2SNe32e91hcqWgWhi/UBYoCi4X+/KzS6VeUUNtSxYiDOlN0Nkx 7Fc39uV/LJKSV58fc3DiUSlDjwDFZgE18d6Nunj/aTCcaQrH50jKyk8LDSazoMdSa1au kXaQ== X-Gm-Message-State: AOJu0YxjYYG8vi4JSKwDyP3LRF8hu9Ndd8ylTABfaCBKO1E861ZFvenb eEjsfjDGAaJQugJ7ZHlp0zo+J0kLzl5r5c4AeHFGrgfFIDHj/X7w36v9BS8XJ4r2l6uZ0sgzPS5 x3JDev7TOEg== X-Gm-Gg: AfdE7clBCsE7A71aFAdpSN85ncCk1ObKvUgntzpOtzhmBerUjFS8TIh5lW10Lm72jJ6 fVKci+3sgwJSO6vWqB2/zul4JyMOc1khlYchdehvIofJOHsNnnIynJgbLtIxg+8gmURwIQkwtA4 daO5lJHFdNphJumfL6HsboS/gw3aHq7DEdGPQ/0WWJfKqUR+a176JxhdsLb/C/+P60R24j5qxy/ /5kiTypZwHW0ntRRpS07mPICcgDwbhwZjQzEFBBGBTwyPxwjW9JwpKDg73RGcbUhuQW9KxzRHBe X/K9nx+GFcutdSNVq5dpzMM1zlYHjZVb+janVVhV3YiOEKLtths6qZafhgK/X2PbaXItXEan9If KRvG7Q6GonurzrXZFBoKbf9ADTcNPTiYgIHqgvbVTj7tH/WtmFEBbeHhZHRI43yljWJRNSOpvTA U= X-Received: by 2002:a05:6820:1c96:b0:6a0:b429:443d with SMTP id 006d021491bc7-6a0d886f688mr8123269eaf.12.1782015752027; Sat, 20 Jun 2026 21:22:32 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:22 -0600 Subject: [PATCH v3 35/40] bsd-user: Add extended attribute and ACL system call dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-35-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5000; i=imp@bsdimp.com; h=from:subject:message-id; bh=MTZxyxDjJ7bYe3mkPtrZ1xyzRZYw3H9BwtM2c07H+30=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aBzf9jeP/qx4lHz4KT0zeAXOsRbJEnFY53k HqDAUNVmf+JAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR ADIFEAC3L/zMTIP4BGaR3FGiflPeQE3OhDvdotzvA6OclMKcAyuchaa5ui5hzilMcPj3TvH/tJr hUX5oz/wg2FvpyNhhEnQflFOFelq/0BUkhb28ECwFgqknb6wHd0Is6w+hTwGNOsb09nLWCFg8P0 LI258F3JTfHF5Gf49Yxt1v/JKrn77LYLkTw/AtxKxmSVs8tBpLCKanzcogyJA66Dg8DUKA/q2m8 n0drhumTHBcH1t5xLo1o+oWQxpNdhp1zLKoFuYbf4V9tcvoVtGbDQ9O6O/Ux6cRWQ2CCmSJPoTJ hoaVulgMY76JAX7fYJD0BiTbH/sUyeXnhhs+kBX1Wdias9G+/O4rdDwTxFY/HhSALJ5OTIRnKxT freCOymcYWrscsXzO0nwoBNZ0If5n7AdssITIf+93Ls3OajEOZx8RzyzEtB7NzuIruXdUCyJ0Pn mwEZlX/xjc9feXcpVSwtYf7VVCJiXTweAjLiWDX9c5vppCZEZHkSQ5Lcw4l68GhiFy48gSsQjgF uNo6O3ihZoi1CvCZCEEs18p+/BumanMOhesmDeMX5MXQnrkWgA/2BuAMVXn4KANMCuySM2GRgu8 fXjTnUoZ9DnW+8NWSy+UYFbn5faaZwketFnODJt88pJyva8KfAdn9YGVSi/1wzVw7IvRxxXd2OU ziKkzoaUVfroFBQ== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2d; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015822895154100 Wire up extended attribute and ACL system calls: extattrctl, extattr_set/get/delete for file, fd, and link variants, extattr_list for fd, file, and link, and all __acl_* operations (aclcheck, delete, get, set for fd, file, and link). Signed-off-by: Stacey Son Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 103 ++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 103 insertions(+) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index f385034a53..a14efd3fd4 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -1365,6 +1365,109 @@ static abi_long freebsd_syscall(CPUArchState *env, = int num, abi_long arg1, ret =3D do_freebsd_sysarch(env, arg1, arg2); break; =20 + /* + * extended attributes and ACL system calls + */ + case TARGET_FREEBSD_NR_extattrctl: /* extattrctl() */ + ret =3D do_freebsd_extattrctl(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_set_file: /* extattr_set_file(2) */ + ret =3D do_freebsd_extattr_set_file(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_get_file: /* extattr_get_file(2) */ + ret =3D do_freebsd_extattr_get_file(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_delete_file: /* extattr_delete_file(2) = */ + ret =3D do_freebsd_extattr_delete_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_set_fd: /* extattr_set_fd(2) */ + ret =3D do_freebsd_extattr_set_fd(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_get_fd: /* extattr_get_fd(2) */ + ret =3D do_freebsd_extattr_get_fd(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_delete_fd: /* extattr_delete_fd(2) */ + ret =3D do_freebsd_extattr_delete_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_get_link: /* extattr_get_link(2) */ + ret =3D do_freebsd_extattr_get_link(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_set_link: /* extattr_set_link(2) */ + ret =3D do_freebsd_extattr_set_link(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_extattr_delete_link: /* extattr_delete_link(2) = */ + ret =3D do_freebsd_extattr_delete_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_extattr_list_fd: /* extattr_list_fd(2) */ + ret =3D do_freebsd_extattr_list_fd(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_list_file: /* extattr_list_file(2) */ + ret =3D do_freebsd_extattr_list_file(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_extattr_list_link: /* extattr_list_link(2) */ + ret =3D do_freebsd_extattr_list_link(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_fd: /* __acl_aclcheck_fd() */ + ret =3D do_freebsd__acl_aclcheck_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_file: /* __acl_aclcheck_file() */ + ret =3D do_freebsd__acl_aclcheck_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_aclcheck_link: /* __acl_aclcheck_link() */ + ret =3D do_freebsd__acl_aclcheck_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_delete_fd: /* __acl_delete_fd() */ + ret =3D do_freebsd__acl_delete_fd(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_delete_file: /* __acl_delete_file() */ + ret =3D do_freebsd__acl_delete_file(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_delete_link: /* __acl_delete_link() */ + ret =3D do_freebsd__acl_delete_link(arg1, arg2); + break; + + case TARGET_FREEBSD_NR___acl_get_fd: /* __acl_get_fd() */ + ret =3D do_freebsd__acl_get_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_get_file: /* __acl_get_file() */ + ret =3D do_freebsd__acl_get_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_get_link: /* __acl_get_link() */ + ret =3D do_freebsd__acl_get_link(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_fd: /* __acl_set_fd() */ + ret =3D do_freebsd__acl_set_fd(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_file: /* __acl_set_file() */ + ret =3D do_freebsd__acl_set_file(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___acl_set_link: /* __acl_set_link() */ + ret =3D do_freebsd__acl_set_link(arg1, arg2, arg3); + break; + default: qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num); ret =3D -TARGET_ENOSYS; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015936; cv=none; d=zohomail.com; s=zohoarc; b=SAb30263h6ufIomJwKD5k4ZV5zOB6jdZ9j07riNnWDEDzmGe5Qk6Fy9dcst3/jN3tHakb1p+522KSn9qnJZYpO1fhiW/uzjYzqzW3KygVF7nSbdvzdHZWe6BRjpFoT8E79SbndN5t2y4/6N/otnEjjuOBjOdMQSbwWJQ9zRAdDw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015936; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fgR9FqPxblaEbcpvXd6GbMYejR07Cu4OXenM9QjNQvw=; b=Vtk4kIzSXP27r5z7vtQo0rgFAydgZUFBiYJG6e7xsv64P7EAcX1WTgjjWUZwwA0+n59DgDd8eHRW+DtwAiwikQhiTG9+wrNMnsO1o9ULmq2sC0vRXdfDUR38fz8Q2AcTw1dK1S/71abDt2UuxUqbGQdJRVeKdtJTConpDwFPA9k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015936515110.1587145547287; Sat, 20 Jun 2026 21:25:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hk-0003FM-7m; Sun, 21 Jun 2026 00:22:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hd-0003Bb-AA for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:37 -0400 Received: from mail-oo1-xc36.google.com ([2607:f8b0:4864:20::c36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hb-0005Pc-0z for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:36 -0400 Received: by mail-oo1-xc36.google.com with SMTP id 006d021491bc7-6a0e3a9c3a1so585044eaf.1 for ; Sat, 20 Jun 2026 21:22:34 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015754; x=1782620554; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fgR9FqPxblaEbcpvXd6GbMYejR07Cu4OXenM9QjNQvw=; b=c4JYSjoBu1HA+8REMnLdXwlRrjcQG9NbhFTlbXne5oM+DocFt4vBRMuKkqgVTcQl2c pATvhIoFS2k/nFFKDxWQCb2lUWu45Ya6l/d0Hb/J0pHGZ0tOtErEi6GYt0LQE+x6SsL/ 2nXf/PHhq2w60BFV8f5EC2E3FGz25mssCfSrSgbBXxwjWEsCW6wH8w/PeDFeLyHEMbdy 0TazYEY4gHlXnht/2SlPuX+1sK0Dg5+Ztt5zf76tcD7CuPLBM4gxk+6hBqqRXxiS3/B6 20xbHlWFasKC/fbSbjO8J90T1wAApbU1OMfJvDgg3I3WlD+Fe7OXlVk5Hk73Uu4eGKda +Shw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015754; x=1782620554; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=fgR9FqPxblaEbcpvXd6GbMYejR07Cu4OXenM9QjNQvw=; b=JC0eKesDvLptrGRgyBq1JKaYGGxOPVA20n+Baiu059jZ2kBDy+12l1vZWjGBM1/umI 1jBKQaf1lSloVYXXxvsBwNljd3XUumLtbk+1mwBN0RPqp4iFiRemX1Buc6x/nMI66H/i yW4QjqQ2R4akZt61nNt28jREVDejAjcPFoH7Bou0a3FudYUYqBt4wevtIEND1b06QAHT CC/C2HT2XPZZ3bsxp8y4c8dJSO2HN0Wm9e+dkKn+CZyZwIxvNDXHTmaE0/zIghFf8blC 2XMBjwDmewPlNF5WohRuQllXK2a22OehpoZf8iwyYLke+ySXRdCgY93Ph36avvM2M7hk r+kw== X-Gm-Message-State: AOJu0Yxf4MjlaQ0uUEzxVx0Rt1JhO+Aoj3ruH6OTpnwzxsxdZoSsyNTK 45i2ROVGlm33b3nCeq2Wav6XGlZiXcItbDLNdpKbY40Msy96BosyDj/jdrQzpYdczfU= X-Gm-Gg: AfdE7ckVAkckduAaJbrpznA26Xs8pV6NTcltgYkiH0Dh//DcEcFGhI0pv8FSEX1BQHX 93XXB+zq9nV71hf/uW0cDstTgAG/auBe2mZiCK8AN+6Ft8eYTnAYBcAojodK8A1OA03cgEkbq+8 OWvpwxZo32RNz+Nno2MdDDYHLo3NFu4HNjNWf/siOYUtRYZ+HfUiUObL0+n+TdJSDxI6SsfW02y ubreWRUt88OwxWngsK2A1j3fa+2AGfxTAq/Y6y36H6TfyEzCfrs6rK33EvUw5FOl32SH3cqajRt N4p5eMN9ZsMsayyYQxhaUpdOK1qwbKkXfYmhHsM9qSLCApcMm6aQYpgO9Wicwl5U7C5EM1c4A3/ tnJEZq1ioyHdBKV4VQdl/sZXuyKZvcOqefeaYATbESGQJHaNu5rMDZDASJeVMqrEZZo2851bgF1 8= X-Received: by 2002:a05:6820:150f:b0:69e:41bf:fdc1 with SMTP id 006d021491bc7-6a0d887e3d7mr8708991eaf.19.1782015753866; Sat, 20 Jun 2026 21:22:33 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:23 -0600 Subject: [PATCH v3 36/40] bsd-user: Add scheduler and cpuset functions to os-misc.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-36-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Sean Bruno , =?utf-8?q?Mika=C3=ABl_Urankar?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=10894; i=imp@bsdimp.com; h=from:subject:message-id; bh=XqNZN2WsIzF97DyTlAXvg4woiy38ebLtVxbk1rVC1bs=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aBftezF+WJKpJuLCxGCzJ6lQScz93RjozYM 6IN/ONztwmJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR APOrEACgswzrvVIdi0PzydHKaAA6kI88bGE8GHnMxqZMUhJw15qvNRtI8HFgM8fKm0kqb70lEKH WRpsB6bDsV4i1zTPKThNz2s6kmSHZnrBKm4fefA3gctsj1vMj+kgRfXPCx9qv9Aj3flKMdfQPfq xUDr5ery6KFJEnqTy90kygbXiZ+DIC6SFiYPmIeKxTYYv2QfCdKpiONr5l49dw8KSB7Hkc/PtCu YVxI7v8imeILOzqz2idTvdSwnz+Z3i4MxEIzIv+LEYliBysy9WuEJ1+OwHUVm5SEouEbCVWKV8M cUvgu+vnnQZDSVqa3UK6AKtxitnnfMdP99C7aGaJt2InT/YHQDv4KpD8dMQCE+m5GZgn1dn6xhs fymqiM2fJt8XMMy2guW8rPzJ5xgGDDfXd1AxdIZAe38ggvN0kR+pSd7HnbWo0btDtSxuGYYs7tO hKPGFbbExQq7aECzV7T4phpqn2O95GHniPPjrhRrSLVk0WFa9fg6C+Q2BMnaRzMKA/UCmh5CLO+ HyyIUcK8BitTw0DNgnLOP2PO783w3NQyBaR83fP7tznUQxKc5inbW6WoA/pqHiE79/O0aQdj1mA T8dMuWKPxW+id/Fa25pNJWGf2TEWSW9+iyKgzAAlfhejIonpff7tWrJH1iN7LVN+4/LJbYzHbLF qi1PGtRECVJe8Mw== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c36; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc36.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015938527154100 Expand os-misc.h with scheduler functions (sched_setparam, sched_getparam, sched_setscheduler, sched_getscheduler, sched_rr_get_interval) and CPU affinity functions (cpuset, cpuset_setid, cpuset_getid, cpuset_getaffinity, cpuset_setaffinity). Also add sched_yield, sched_get_priority_min, and sched_get_priority_max to bsd-proc.h. Signed-off-by: Stacey Son Signed-off-by: Sean Bruno Signed-off-by: Mika=C3=ABl Urankar Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/bsd-proc.h | 18 +++ bsd-user/freebsd/os-misc.h | 284 +++++++++++++++++++++++++++++++++++++----= ---- 2 files changed, 252 insertions(+), 50 deletions(-) diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h index 7efc5b4c92..b9973dbedf 100644 --- a/bsd-user/bsd-proc.h +++ b/bsd-user/bsd-proc.h @@ -400,4 +400,22 @@ static inline abi_long do_bsd_setpriority(abi_long whi= ch, abi_long who, return get_errno(setpriority(which, who, prio)); } =20 +/* sched_yield(2) */ +static inline abi_long do_bsd_sched_yield(void) +{ + return get_errno(sched_yield()); +} + +/* sched_get_priority_min(2) */ +static inline abi_long do_bsd_sched_get_priority_min(int policy) +{ + return get_errno(sched_get_priority_min(policy)); +} + +/* sched_get_priority_max(2) */ +static inline abi_long do_bsd_sched_get_priority_max(int policy) +{ + return get_errno(sched_get_priority_max(policy)); +} + #endif /* !BSD_PROC_H */ diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h index d9979b2a8b..eea6371163 100644 --- a/bsd-user/freebsd/os-misc.h +++ b/bsd-user/freebsd/os-misc.h @@ -11,76 +11,260 @@ #include #include #include +#include =20 -/* - * shm_open2 isn't exported, but the __sys_ alias is. We can use either fo= r the - * static version, but to dynamically link we have to use the sys version. - */ -int __sys_shm_open2(const char *path, int flags, mode_t mode, int shmflags, - const char *); - -#if defined(__FreeBSD_version) && __FreeBSD_version >=3D 1300048 -/* shm_open2(2) */ -static inline abi_long do_freebsd_shm_open2(abi_ulong pathptr, abi_ulong f= lags, - abi_long mode, abi_ulong shmflags, abi_ulong nameptr) +/* sched_setparam(2) */ +static inline abi_long do_freebsd_sched_setparam(pid_t pid, + abi_ulong target_sp_addr) { - int ret; - void *uname, *upath; + abi_long ret; + struct sched_param host_sp; =20 - if (pathptr =3D=3D (uintptr_t)SHM_ANON) { - upath =3D SHM_ANON; - } else { - upath =3D lock_user_string(pathptr); - if (upath =3D=3D NULL) { - return -TARGET_EFAULT; - } + ret =3D get_user_s32(host_sp.sched_priority, target_sp_addr); + if (!is_error(ret)) { + ret =3D get_errno(sched_setparam(pid, &host_sp)); } + return ret; +} =20 - uname =3D NULL; - if (nameptr !=3D 0) { - uname =3D lock_user_string(nameptr); - if (uname =3D=3D NULL) { - unlock_user(upath, pathptr, 0); - return -TARGET_EFAULT; - } +/* sched_get_param(2) */ +static inline abi_long do_freebsd_sched_getparam(pid_t pid, + abi_ulong target_sp_addr) +{ + abi_long ret; + struct sched_param host_sp; + + ret =3D get_errno(sched_getparam(pid, &host_sp)); + if (!is_error(ret)) { + ret =3D put_user_s32(host_sp.sched_priority, target_sp_addr); } - ret =3D get_errno(__sys_shm_open2(upath, - target_to_host_bitmask(flags, fcntl_flags_tbl), mode, - target_to_host_bitmask(shmflags, shmflag_flags_tbl), uname= )); + return ret; +} + +/* sched_setscheduler(2) */ +static inline abi_long do_freebsd_sched_setscheduler(pid_t pid, int policy, + abi_ulong target_sp_addr) +{ + abi_long ret; + struct sched_param host_sp; =20 - if (upath !=3D SHM_ANON) { - unlock_user(upath, pathptr, 0); + ret =3D get_user_s32(host_sp.sched_priority, target_sp_addr); + if (!is_error(ret)) { + ret =3D get_errno(sched_setscheduler(pid, policy, &host_sp)); } - if (uname !=3D NULL) { - unlock_user(uname, nameptr, 0); + return ret; +} + +/* sched_getscheduler(2) */ +static inline abi_long do_freebsd_sched_getscheduler(pid_t pid) +{ + + return get_errno(sched_getscheduler(pid)); +} + +/* sched_rr_get_interval(2) */ +static inline abi_long do_freebsd_sched_rr_get_interval(pid_t pid, + abi_ulong target_ts_addr) +{ + abi_long ret; + struct timespec host_ts; + + ret =3D get_errno(sched_rr_get_interval(pid, &host_ts)); + if (!is_error(ret)) { + ret =3D h2t_freebsd_timespec(target_ts_addr, &host_ts); } return ret; } -#endif /* __FreeBSD_version >=3D 1300048 */ =20 -#if defined(__FreeBSD_version) && __FreeBSD_version >=3D 1300049 -/* shm_rename(2) */ -static inline abi_long do_freebsd_shm_rename(abi_ulong fromptr, abi_ulong = toptr, - abi_ulong flags) +/* cpuset(2) */ +static inline abi_long do_freebsd_cpuset(abi_ulong target_cpuid) { - int ret; - void *ufrom, *uto; + abi_long ret; + cpusetid_t setid; + + ret =3D get_errno(cpuset(&setid)); + if (is_error(ret)) { + return ret; + } + return put_user_s32(setid, target_cpuid); +} + +#define target_to_host_cpuset_which(hp, t) do { \ + (*hp) =3D t; \ +} while (0) =20 - ufrom =3D lock_user_string(fromptr); - if (ufrom =3D=3D NULL) { +#define target_to_host_cpuset_level(hp, t) do { \ + (*hp) =3D t; \ +} while (0) + +/* cpuset_setid(2) */ +static inline abi_long do_freebsd_cpuset_setid(CPUArchState *env, abi_long= arg1, + abi_ulong arg2, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + id_t id; /* 64-bit value */ + cpusetid_t setid; + cpuwhich_t which; + + target_to_host_cpuset_which(&which, arg1); +#if TARGET_ABI_BITS =3D=3D 32 + /* See if we need to align the register pairs */ + if (regpairs_aligned(env)) { + id =3D target_arg64(arg3, arg4); + setid =3D arg5; + } else { + id =3D target_arg64(arg2, arg3); + setid =3D arg4; + } +#else + id =3D arg2; + setid =3D arg3; +#endif + return get_errno(cpuset_setid(which, id, setid)); +} + +/* cpuset_getid(2) */ +static inline abi_long do_freebsd_cpuset_getid(abi_long arg1, abi_ulong ar= g2, + abi_ulong arg3, abi_ulong arg4, abi_ulong arg5) +{ + abi_long ret; + id_t id; /* 64-bit value */ + cpusetid_t setid; + cpuwhich_t which; + cpulevel_t level; + abi_ulong target_setid; + + target_to_host_cpuset_which(&which, arg1); + target_to_host_cpuset_level(&level, arg2); +#if TARGET_ABI_BITS =3D=3D 32 + id =3D target_arg64(arg3, arg4); + target_setid =3D arg5; +#else + id =3D arg3; + target_setid =3D arg4; +#endif + ret =3D get_errno(cpuset_getid(level, which, id, &setid)); + if (is_error(ret)) { + return ret; + } + return put_user_s32(setid, target_setid); +} + +static abi_long copy_from_user_cpuset_mask(cpuset_t *mask, + abi_ulong target_mask_addr) +{ + int i, j, k; + abi_ulong b, *target_mask; + + target_mask =3D lock_user(VERIFY_READ, target_mask_addr, + CPU_SETSIZE / 8, 1); + if (target_mask =3D=3D NULL) { return -TARGET_EFAULT; } - uto =3D lock_user_string(toptr); - if (uto =3D=3D NULL) { - unlock_user(ufrom, fromptr, 0); + CPU_ZERO(mask); + k =3D 0; + for (i =3D 0; i < ((CPU_SETSIZE / 8) / sizeof(abi_ulong)); i++) { + __get_user(b, &target_mask[i]); + for (j =3D 0; j < TARGET_ABI_BITS; j++) { + if ((b >> j) & 1) { + CPU_SET(k, mask); + } + k++; + } + } + unlock_user(target_mask, target_mask_addr, 0); + + return 0; +} + +static abi_long copy_to_user_cpuset_mask(abi_ulong target_mask_addr, + cpuset_t *mask) +{ + int i, j, k; + abi_ulong b, *target_mask; + + target_mask =3D lock_user(VERIFY_WRITE, target_mask_addr, + CPU_SETSIZE / 8, 0); + if (target_mask =3D=3D NULL) { return -TARGET_EFAULT; } - ret =3D get_errno(shm_rename(ufrom, uto, flags)); - unlock_user(ufrom, fromptr, 0); - unlock_user(uto, toptr, 0); + k =3D 0; + for (i =3D 0; i < ((CPU_SETSIZE / 8) / sizeof(abi_ulong)); i++) { + b =3D 0; + for (j =3D 0; j < TARGET_ABI_BITS; j++) { + b |=3D ((CPU_ISSET(k, mask) !=3D 0) << j); + k++; + } + __put_user(b, &target_mask[i]); + } + unlock_user(target_mask, target_mask_addr, (CPU_SETSIZE / 8)); + + return 0; +} + +/* cpuset_getaffinity(2) */ +/* cpuset_getaffinity(cpulevel_t, cpuwhich_t, id_t, size_t, cpuset_t *); */ +static inline abi_long do_freebsd_cpuset_getaffinity(cpulevel_t level, + cpuwhich_t which, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5, + abi_ulong arg6) +{ + cpuset_t mask; + abi_long ret; + id_t id; /* 64-bit */ + abi_ulong setsize, target_mask; + +#if TARGET_ABI_BITS =3D=3D 32 + id =3D (id_t)target_arg64(arg3, arg4); + setsize =3D arg5; + target_mask =3D arg6; +#else + id =3D (id_t)arg3; + setsize =3D arg4; + target_mask =3D arg5; +#endif + + ret =3D get_errno(cpuset_getaffinity(level, which, id, setsize, &mask)= ); + if (ret =3D=3D 0) { + ret =3D copy_to_user_cpuset_mask(target_mask, &mask); + } =20 return ret; } -#endif /* __FreeBSD_version >=3D 1300049 */ + +/* cpuset_setaffinity(2) */ +/* cpuset_setaffinity(cpulevel_t, cpuwhich_t, id_t, size_t, const cpuset_t= *);*/ +static inline abi_long do_freebsd_cpuset_setaffinity(cpulevel_t level, + cpuwhich_t which, abi_ulong arg3, abi_ulong arg4, abi_ulong arg5, + abi_ulong arg6) +{ + cpuset_t mask; + abi_long ret; + id_t id; /* 64-bit */ + abi_ulong setsize, target_mask; + +#if TARGET_ABI_BITS =3D=3D 32 + id =3D (id_t)target_arg64(arg3, arg4); + setsize =3D arg5; + target_mask =3D arg6; +#else + id =3D (id_t)arg3; + setsize =3D arg4; + target_mask =3D arg5; +#endif + + ret =3D copy_from_user_cpuset_mask(&mask, target_mask); + if (ret =3D=3D 0) { + ret =3D get_errno(cpuset_setaffinity(level, which, id, setsize, + &mask)); + } + + return ret; +} + +/* + * Pretend there are no modules loaded into the kernel. Don't allow loadin= g or + * unloading of modules. This works well for tests, and little else seems = to + * care. Will reevaluate if examples are found that do matter. + */ + =20 #endif /* OS_MISC_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782016002; cv=none; d=zohomail.com; s=zohoarc; b=MTANV8+/1EZs1uTTHhIyuhjYsM2NK7Aofd0U+SyVMDUZQrJz5w2le2DDC5ySgntoCNhsKf+F2Ctd1BbQq7wkTMflWUQdA0LQK9oeO3NIEXN4E/drj4O0ICMHmD3D0KMCRR8iNqXDZQU92F8fPvl7Q9A0S33QTQ0LVWVE3CuEmMM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782016002; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Tg3YHlLuXAcVGsKv4xJCZeoXsfp500/2TPyxlVqzIuw=; b=WjFQa14Ev+7naaGYpNdGHsb33ovrPrHGk6GrLfF2v95PXzmygXSq36qsbA81BOCn/A48lg0r01hMlhKqDTMi9zKhea510Nr7zmg93GzCdG51MFCuD6+U5wOBGem+MDGkQgk2LTPlFfNbzLufbXYIBl5YViusaJ2pKMfNeCc40pw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17820160020691013.571142900621; Sat, 20 Jun 2026 21:26:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9ho-0003TO-DD; Sun, 21 Jun 2026 00:22:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9he-0003D1-U8 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:38 -0400 Received: from mail-oo1-xc2b.google.com ([2607:f8b0:4864:20::c2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hc-0005Py-I0 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:38 -0400 Received: by mail-oo1-xc2b.google.com with SMTP id 006d021491bc7-69eb8b6bea8so1489246eaf.3 for ; Sat, 20 Jun 2026 21:22:36 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015755; x=1782620555; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Tg3YHlLuXAcVGsKv4xJCZeoXsfp500/2TPyxlVqzIuw=; b=pGeOeQxtAFwuKRpd24Vh8HbJU1ZmBy/3d9pab9cWnYM9MO/VOLH7ulkx2wbVkWB2uw 3MOsPyiNvIpXd8SGjAHXXzBT7royQ5djPgA3kCxQzAcHy301gs7Fxq5qoe66G3c5uu9i R6N4/AMG2YNdbbei2kx5dxcdpgW8fQluQWHPI8MYQWqI4W0pNCbG1I2Vk/HGiE6KNXYy yOZLnirc0eDWdll2+XSwXtO1/FraLpbzSYF/4a7cnfhrPDlbrgZLt52Wtw0X9k9OAlFF QjDGcyUwI7BhKCJvak4zm1B1cYojbKAgwfc33eJA4wmyptFXba1WQcr6XWfg/Bzk7LkW MaVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015755; x=1782620555; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Tg3YHlLuXAcVGsKv4xJCZeoXsfp500/2TPyxlVqzIuw=; b=CH3ikcGtjbZkAU++ZLUrVHCkWL0OksYe6H9k4bvssUEfSD22ObvXKUgaCJP4EZIT+w HVRfknEN/y4WNSiGCji1aHqk3WuPc+5L29rfHBs2yQUIRY98kN5fPx3OZYc2O+Bp0OI9 0mGAkbp7HYDsVjEhzj//Ys2chc7/GFartf4k5cy8JDwKT9fyRhk9EzDfsPzt4I7sOuC9 J6tUT/R4SlJGkdvD4Olz/oxy6YdGx+0e+kVKVBNbGqgJGshpoD9pl7xWMWfjW+M67Hfh FxrIBN145THMMSyBKDYlBWnbVOrfk6oQbeczQVKHuv3NDZUgWuGSquFx5pyEfrGzDdam Yv0g== X-Gm-Message-State: AOJu0YwQUUDHfxb1dFN5mo+CmMRRYA5t9xC5Q20Mifz5pHsYxzd4MfiY RmORVuUQoRSWD61hTJeMZwGwyG+qYMjuNr1XQFnULUbQfITqG2gS4i8d1W7nw+/mhhw= X-Gm-Gg: AfdE7cms/mBGtl0ulWWkKRIzVjovkM7KAHnyk8V7PiYfWEY8phYkHgrFw5KTd3uDJTZ atfLa+5l+9zRlAmlloYu2p8lpBBF/IqMyumPfE77elkBi9xVmLOyPC9X1il384edwtiWzQs38MW n10XisZj55vPVZCCDLLlwLk83NXqdRzzoLHnlj7Bt6ijDcgwnL+kQ+aXl+iFrhvqekI1Pr04hbf nw2rt1HxqTAyp5k6LuRclfUqW2Wf6ID/rQFJxCb8wq6GNjutRh4+GXB0kGUhq+al9G5W5SGZ2N/ 20zk3x3c3TA5SRVgJbU0vYJ8R9ijkZi7s9ebeEpFs11EHqr6UPYvUGj0O8Wd4AgL6BvIh7Gl0vH 8vTl0/fQYgD0o9yQx38FdFjDjKzzoUdsdkVWFrLWUaSerfNFadFwwZA2o8utJZB/8Quab66ObP0 w= X-Received: by 2002:a05:6820:8105:b0:69d:e3e7:332b with SMTP id 006d021491bc7-6a0d8936481mr7486196eaf.35.1782015755417; Sat, 20 Jun 2026 21:22:35 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:24 -0600 Subject: [PATCH v3 37/40] bsd-user: Add kmod, posix, and misc functions to os-misc.h MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-37-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Karim Taha , Sean Bruno , Alexander Kabaev X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=8178; i=imp@bsdimp.com; h=from:subject:message-id; bh=iBp/lsj1fOvExflvuYEfJAp650GGJg0tE0FYQ1wXsmQ=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aBe6iRG2B+sAs8W1fOb49B2peacafHdssIG 9y3G2Up9VGJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR AG5jD/9ewzUQCbgHl5nV/LyPIn/5A80WK6XMz8awZxflG2Y4cnusfJl0oFr/AeKYef4Ae9uMyAt juqJKJz4q4BgMXA1DRj/V+Dr+2B0aN9FITtsrYxQCuFgNvmUoFhkdq0vwmQ/IJtyupI4invOXmo TrIB1ml0sENl2iw1fV4ZTH84kBdWpkRD4LPNQyaiyf2J/ht6Cdjeg0Gqbp9uMglHeOuhfi4wGHb dbYWm0gwMq50cQeUMKHRE7EotAv1segarxK+WlvnAwMq2NsCPMKf9ZyyohqaEVI3om66yiCL1Ow N/ctPtcMRj0bBLCnIjF/MQqdAeW9AUhst4yMjqvnbT6Vs/oQpnqzfNxoSW2+UyWsSZIVeqW/I4v 7dqX9Kr18dnWYCd1i9GqaIGY+VYUg2cvrI4fCf448gTANdVS5z0mBFjR31//YxWWSi8jrs5R0PP j5S+sLxKl/I+8bK3Gec+9mWKNZiXQ1R9g0mc27tWuBIITaYRlgClEWNXr05LL/dmU1ABgbatTOZ GC8dcgliKA586vhV+3vaByl2H9n/x4EPd+jtpGUNjf1oA01XQlMuqeOIEctAmkA5nu3fUbv4pML 5a6E7mFsWLSBfy4qPQd5+6x50mEeoFmuJcqjI1K7UwRV+rpo+sgqg4XIQdc6UxBKl43APnMN0MK r3rGhxWLvDIto6w== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2b; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2b.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782016003675154100 Complete os-misc.h with kernel module functions (modfnext, modfind, kldload, kldunload, kldunloadf, kldfind, kldnext, kldstat, kldfirstmod, kldsym), POSIX functions (posix_fallocate, posix_openpt), getrandom, and kenv. Signed-off-by: Stacey Son Signed-off-by: Karim Taha Signed-off-by: Sean Bruno Signed-off-by: Alexander Kabaev Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-misc.h | 274 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 274 insertions(+) diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h index eea6371163..0f87b21cc8 100644 --- a/bsd-user/freebsd/os-misc.h +++ b/bsd-user/freebsd/os-misc.h @@ -266,5 +266,279 @@ static inline abi_long do_freebsd_cpuset_setaffinity(= cpulevel_t level, * care. Will reevaluate if examples are found that do matter. */ =20 +/* modfnext(2) */ +static inline abi_long do_freebsd_modfnext(abi_long modid) +{ + return -TARGET_ENOENT; +} + +/* modfind(2) */ +static inline abi_long do_freebsd_modfind(abi_ulong target_name) +{ + return -TARGET_ENOENT; +} + +/* kldload(2) */ +static inline abi_long do_freebsd_kldload(abi_ulong target_name) +{ + return -TARGET_EPERM; +} + +/* kldunload(2) */ +static inline abi_long do_freebsd_kldunload(abi_long fileid) +{ + return -TARGET_EPERM; +} + +/* kldunloadf(2) */ +static inline abi_long do_freebsd_kldunloadf(abi_long fileid, abi_long fla= gs) +{ + return -TARGET_EPERM; +} + +/* kldfind(2) */ +static inline abi_long do_freebsd_kldfind(abi_ulong target_name) +{ + return -TARGET_ENOENT; +} + +/* kldnext(2) */ +static inline abi_long do_freebsd_kldnext(abi_long fileid) +{ + return -TARGET_ENOENT; +} + + +/* kldstat(2) */ +static inline abi_long do_freebsd_kldstat(abi_long fileid, + abi_ulong target_stat) +{ + return -TARGET_ENOENT; +} + +/* kldfirstmod(2) */ +static inline abi_long do_freebsd_kldfirstmod(abi_long fileid) +{ + return -TARGET_ENOENT; +} + +/* kldsym(2) */ +static inline abi_long do_freebsd_kldsym(abi_long fileid, abi_long cmd, + abi_ulong target_data) +{ + return -TARGET_ENOENT; +} + +/* + * New posix calls + */ + +#if TARGET_ABI_BITS =3D=3D 32 +static inline uint64_t target_offset64(uint32_t word0, uint32_t word1) +{ +#ifdef TARGET_BIG_ENDIAN + return ((uint64_t)word0 << 32) | word1; +#else + return ((uint64_t)word1 << 32) | word0; +#endif +} +#else /* TARGET_ABI_BITS =3D=3D 32 */ +static inline uint64_t target_offset64(uint64_t word0, uint64_t word1) +{ + return word0; +} +#endif /* TARGET_ABI_BITS !=3D 32 */ + +/* posix_fallocate(2) */ +static inline abi_long do_freebsd_posix_fallocate(abi_long arg1, abi_long = arg2, + abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6) +{ + +#if TARGET_ABI_BITS =3D=3D 32 + return get_errno(posix_fallocate(arg1, target_offset64(arg3, arg4), + target_offset64(arg5, arg6))); +#else + return get_errno(posix_fallocate(arg1, arg2, arg3)); +#endif +} + +/* posix_openpt(2) */ +static inline abi_long do_freebsd_posix_openpt(abi_long flags) +{ + + return get_errno(posix_openpt(flags)); +} + +/* + * shm_open2 isn't exported, but the __sys_ alias is. We can use either fo= r the + * static version, but to dynamically link we have to use the sys version. + */ +int __sys_shm_open2(const char *path, int flags, mode_t mode, int shmflags, + const char *); + +/* shm_open2(2) */ +static inline abi_long do_freebsd_shm_open2(abi_ulong pathptr, abi_ulong f= lags, + abi_long mode, abi_ulong shmflags, abi_ulong nameptr) +{ + int ret; + void *uname, *upath; + + if (pathptr =3D=3D (uintptr_t)SHM_ANON) { + upath =3D SHM_ANON; + } else { + upath =3D lock_user_string(pathptr); + if (upath =3D=3D NULL) { + return -TARGET_EFAULT; + } + } + + uname =3D NULL; + if (nameptr !=3D 0) { + uname =3D lock_user_string(nameptr); + if (uname =3D=3D NULL) { + unlock_user(upath, pathptr, 0); + return -TARGET_EFAULT; + } + } + ret =3D get_errno(__sys_shm_open2(upath, + target_to_host_bitmask(flags, fcntl_flags_tbl), mode, + target_to_host_bitmask(shmflags, shmflag_flags_tbl), uname= )); + + if (upath !=3D SHM_ANON) { + unlock_user(upath, pathptr, 0); + } + if (uname !=3D NULL) { + unlock_user(uname, nameptr, 0); + } + return ret; +} + +/* shm_rename(2) */ +static inline abi_long do_freebsd_shm_rename(abi_ulong fromptr, abi_ulong = toptr, + abi_ulong flags) +{ + int ret; + void *ufrom, *uto; + + ufrom =3D lock_user_string(fromptr); + if (ufrom =3D=3D NULL) { + return -TARGET_EFAULT; + } + uto =3D lock_user_string(toptr); + if (uto =3D=3D NULL) { + unlock_user(ufrom, fromptr, 0); + return -TARGET_EFAULT; + } + ret =3D get_errno(shm_rename(ufrom, uto, flags)); + unlock_user(ufrom, fromptr, 0); + unlock_user(uto, toptr, 0); + + return ret; +} + +#if defined(CONFIG_GETRANDOM) +static inline abi_long do_freebsd_getrandom(abi_ulong buf, abi_ulong bufle= n, + abi_ulong flags) +{ + abi_long ret; + void *p; + + p =3D lock_user(VERIFY_WRITE, buf, buflen, 0); + if (p =3D=3D NULL) { + return -TARGET_EFAULT; + } + ret =3D get_errno(getrandom(p, buflen, flags)); + unlock_user(p, buf, ret); + + return ret; +} +#endif + +static inline abi_long do_freebsd_kenv(abi_long action, abi_ulong name, + abi_ulong value, abi_long len) +{ + abi_long ret; + void *gname =3D NULL; /* unlocked in cases where set */ + void *gvalue =3D NULL; /* unlocked in cases where set */ + + ret =3D -TARGET_EINVAL; + switch (action) { + case KENV_GET: + gname =3D lock_user_string(name); + if (gname =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + gvalue =3D lock_user(VERIFY_WRITE, value, len, 0); + if (gvalue =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + ret =3D get_errno(kenv(action, gname, gvalue, len)); + if (ret > 0) { + len =3D ret; + } else { + len =3D 0; + } + break; + case KENV_SET: + gname =3D lock_user_string(name); + if (gname =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + gvalue =3D lock_user(VERIFY_READ, value, len, 1); + if (gvalue =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + ret =3D get_errno(kenv(action, gname, gvalue, len)); + unlock_user(gvalue, value, 0); + gvalue =3D NULL; + break; + case KENV_UNSET: + gname =3D lock_user_string(name); + if (gname =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + /* value and name ignored, per kenv(2) */ + ret =3D get_errno(kenv(action, gname, NULL, 0)); + break; + /* All three treated the same */ + case KENV_DUMP: + case KENV_DUMP_LOADER: + case KENV_DUMP_STATIC: + /* value =3D=3D NULL -> just return length */ + if (value !=3D 0) { + gvalue =3D lock_user(VERIFY_WRITE, value, len, 0); + if (gvalue =3D=3D NULL) { + ret =3D -TARGET_EFAULT; + break; + } + } + /* name is ignored, per kenv(2) */ + ret =3D get_errno(kenv(action, NULL, gvalue, len)); + if (ret > 0) { + len =3D ret; + } else { + len =3D 0; + } + break; + default: + ret =3D -TARGET_EINVAL; + break; + } + + /* Unmap everything mapped */ + if (gvalue !=3D NULL) { + unlock_user(gvalue, value, len); + } + if (gname !=3D NULL) { + unlock_user(gname, name, 0); + } + + return ret; +} =20 #endif /* OS_MISC_H */ --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015848; cv=none; d=zohomail.com; s=zohoarc; b=N4mgUtDIiZ/09ZsLVBE8vOZjYqMuD+wmLn8fiyXIGnW+X3OdKsHkM9Lly2yoB7MQZHAQ30UeiDqMg+cYU7H1yDmYaXCuX4fd/fPyo1gfeDS9UEbx9lRarm+dBKu7hsj0y5IXEgfc7EN/hgwDCxcrAX2t1AuWxKGmV7hlgs7jPzc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015848; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LF1bQobYkJrBkuHIRmk4nhGfTKYNQmhfMjM71uVjJpo=; b=FvDmBnFL4sqK5yb+6lQrbcfCG8EnJKQ/1iwS+Kpns/4JnTpmbknrAQ/IYgLw/O5Srgn6Wk+jrMbs9S/aYjivsDT7Uenvdv+JVKkW1xJeyoDsgtjqH6JhJU2GVvzl1SLMs8xa2gqo3yS+geAIhqtu5kgNl4stAunZ5os0TOZ8ONc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015848696578.0633002056994; Sat, 20 Jun 2026 21:24:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hv-0003hk-5W; Sun, 21 Jun 2026 00:22:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hh-0003Es-4h for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:42 -0400 Received: from mail-oa1-x2d.google.com ([2001:4860:4864:20::2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9he-0005QS-BD for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:40 -0400 Received: by mail-oa1-x2d.google.com with SMTP id 586e51a60fabf-43cce8288c7so1882308fac.3 for ; Sat, 20 Jun 2026 21:22:37 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015757; x=1782620557; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=LF1bQobYkJrBkuHIRmk4nhGfTKYNQmhfMjM71uVjJpo=; b=pc5i3mvA4t5iAXqw6jhPLGPUnCsjYxtNN91KZxPLynhWD+F1NsiNSXHTiRGlI2faBo Ehtj4e8KioaoQ3o/3U5tAd1SroZfkPsCYC9pzdbA5ldUAKaSAg1hU1xJhaxsGlqj1TDp 8b+huCkbTaL+FQcFObvsRWkUq6CPvZYmYEe5bNGC/SEJ/0YyYJfDT8xUxzHDqM7jEXCY z4o1VbzIC7q6JVrmtxGvCSbILRFkhDWN5m+4gfEK31EXE4DOLMPvYOQTQ3JwsuXsVl/Y eG5matZqjyV2JOuYzh5NKQQqi8jyz4U8wqtJ4nYIXX02glFZkmPBmSStdsZKAXrY+WOa JjWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015757; x=1782620557; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LF1bQobYkJrBkuHIRmk4nhGfTKYNQmhfMjM71uVjJpo=; b=HHP2joGLPi8BE0snxAuj1Xazo6v+gSNMyDCv3htqZXoLK7mGcDiN3EFI/7pcLCrPEs uwMjRV/KI0KhwWM401rbKkDAyNAdSh1VMqg+hAwmGKAa1zn8zJf+ftbzwGYtpIgqEYil TFdKwUqdx2YA8kegcdJDEfStaDhK6VIrdkEvBpwiKG7XrcdaieAY4CIXbQDEl4CJWoMq YvqguNsYOlfU2j3bnj+wReyyXPhLaSN2nKoTHIDaujls9sFmqYjhDgn0e2KVMZh/bOTy bTGl+njYP0TlGSM6D6W97Glrg2NYPptG9oJvOM50YC7nZaHLdByBwkpffG0P/7sURyW9 8hbg== X-Gm-Message-State: AOJu0YwnsUYQZuQ2pUZ6LT5YCWR8wH+aA3507lCUOT4Rfz9tlcQgj7tX xAxhaHcbL8vyrWZCXR4H+JRNYGhgT8NQVma5+JwV6GGQLMYOVTqUAqHuxK6dDl29syJ7QbdXA+i W5vYoVsDshA== X-Gm-Gg: AfdE7cmPku2zTCj/pOay++Snq1BFWqsKO2GRdudIrWc7v3FG9fVp/ISpOyCjL2MN2+S Fet6HccXa4zip8W3Q80PuYXFDFnmUmCqxKCkbkN8QXOQUayy+gbIGBlTc5uGMO/+1TOmmu5PPDm voyD0oF4XxtmJUNKUyBhSb58sG4Twb5GnZqv2nMnicqQMmQARdCP5RmdZxiU2MGtrLXEN3N0YzB p9lxzUfSmg8MjfGEQm57cap9hR0jW+IdS2VRLADmxkokxp8/LeBpGtMeXaTZdt5cE72KAL/AeVw vBV5LIFGP0HygbP6LxOWhUreE00MT58+e7J/iqBw7w3GF/UcT9r1Ahcun/84qJkb+zUBfu8Snrj 9dOoAmXuYd+9BOX34b88AlFChfVvEE2hLstp2IY1lDmn+VEE7vzvN1GBYNcg83lJ2B3EG+RxXts k= X-Received: by 2002:a05:6820:200e:b0:6a0:c657:163e with SMTP id 006d021491bc7-6a0d89badc8mr7634560eaf.50.1782015757188; Sat, 20 Jun 2026 21:22:37 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:25 -0600 Subject: [PATCH v3 38/40] bsd-user: Add scheduler, cpuset, kmod, and misc syscall dispatch MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-38-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh , Stacey Son , Kyle Evans X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=21160; i=imp@bsdimp.com; h=from:subject:message-id; bh=2zQvtn7mcZ2v9dzpXT9ias3aQJ8VKEAI6mnCVE+8Eag=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aBcGu1wC5xnlzccRdQlTsiVKZif0x1J9hVW cUjsCh5BzOJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR ALinEADb4Ng7Xp+n5E/FFmEzlqy7vxeVdrFOBV/cWnAMwrN+0DCjE2KHaVIqmtrJbTZ7PdYNTWK IfcW713plI5bDI5b/O7UpN4jbVrKxIC8K4fUONwWVi9dy8fgYz2hmPMfcuk85tdYNqNoNh6DWB/ CrXczp8lR+Dv6ZbzM470K07/CTcoyatI3E99gOt97ZfLG0mTY1N9Gya4uiXvsL0FcNAmRwo1AWB z1RDtXPAlULD4QYsGMhUjrUBXozSgxzAsQMFxBgJBOeQVBZfEmqR+aAPOvc/SpHV+KwWVNSua9A C6GF8o2SNUeNgC7nF8VPypZDdYFudEwspkVHEqKR8oUU9vKF//FtErNlFhFUEnJfbRErU3E1cRp PkVR9/Ix3UCHUkoZAx4jg4KFQtxqZqn0oxIhPJanIdLPMp/mAyJTtjYW0wlDA0rCGjNO82rMaiD voN4TFE/IorMkFJCS9yJZNWjFotNN7wQsf4VAGXFW4nGUUb+ZAmibbegiP2KvScfmfqfrHj1glT qTi0SD+M0JKPzpBeVO99ntgamC5a4jA/sUVWunDFu4utCMquesqiOe72UYbOj7G890PM0KQaNfr 4XbRghICWT4Qr3W2+r9qww/d5in81X9N2PhURTtfqPZH2uTk5jvPJaSYqqtz9Z7ZYEjambIwa4A 3XV4XZePey9P+5w== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2001:4860:4864:20::2d; envelope-from=imp@bsdimp.com; helo=mail-oa1-x2d.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015851305154100 Wire up remaining system calls: sched_setparam, sched_getparam, sched_setscheduler, sched_getscheduler, sched_get_priority_max, sched_get_priority_min, sched_rr_get_interval, sched_yield, cpuset, cpuset_setid, cpuset_getid, cpuset_getaffinity, cpuset_setaffinity, modfnext, modfind, kldload, kldunload, kldunloadf, kldfind, kldnext, kldstat, kldfirstmod, kldsym, posix_fallocate, posix_openpt, getrandom, kenv, cap_rights_limit, cap_ioctls_limit, cap_fcntls_limit, cap_enter, syscall, and __syscall. We also reshuffle a few system calls here to match the blitz branch which adds some churn, but is the least bad way to deal with the issues. Signed-off-by: Stacey Son Signed-off-by: Kyle Evans Signed-off-by: Warner Losh Assisted-by: Claude Opus 4.6 (1M context) Acked-by: Richard Henderson --- bsd-user/freebsd/os-syscall.c | 512 ++++++++++++++++++++++++++------------= ---- 1 file changed, 323 insertions(+), 189 deletions(-) diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c index a14efd3fd4..7e400c89bc 100644 --- a/bsd-user/freebsd/os-syscall.c +++ b/bsd-user/freebsd/os-syscall.c @@ -532,6 +532,10 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_closefrom(arg1); break; =20 + case TARGET_FREEBSD_NR_close_range: /* close_range(2) */ + ret =3D do_freebsd_close_range(arg1, arg2, arg3); + break; + case TARGET_FREEBSD_NR_revoke: /* revoke(2) */ ret =3D do_bsd_revoke(arg1); break; @@ -696,6 +700,10 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_chflags(arg1, arg2); break; =20 + case TARGET_FREEBSD_NR_chflagsat: /* chflagsat(2) */ + ret =3D do_bsd_chflagsat(arg1, arg2, arg3, arg4); + break; + case TARGET_FREEBSD_NR_lchflags: /* lchflags(2) */ ret =3D do_bsd_lchflags(arg1, arg2); break; @@ -740,6 +748,10 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_poll(arg1, arg2, arg3); break; =20 + case TARGET_FREEBSD_NR_ppoll: /* ppoll(2) */ + ret =3D do_freebsd_ppoll(env, arg1, arg2, arg3, arg4); + break; + case TARGET_FREEBSD_NR_lseek: /* lseek(2) */ ret =3D do_bsd_lseek(env, arg1, arg2, arg3, arg4, arg5); break; @@ -766,14 +778,6 @@ static abi_long freebsd_syscall(CPUArchState *env, int= num, abi_long arg1, ret =3D do_bsd_swapoff(arg1, arg2); break; =20 - case TARGET_FREEBSD_NR_chflagsat: /* chflagsat(2) */ - ret =3D do_bsd_chflagsat(arg1, arg2, arg3, arg4); - break; - - case TARGET_FREEBSD_NR_close_range: /* close_range(2) */ - ret =3D do_freebsd_close_range(arg1, arg2, arg3); - break; - case TARGET_FREEBSD_NR___realpathat: /* __realpathat(2) (XXX no realpathat()) */ ret =3D do_freebsd_realpathat(arg1, arg2, arg3, arg4, arg5); @@ -787,125 +791,12 @@ static abi_long freebsd_syscall(CPUArchState *env, i= nt num, abi_long arg1, ret =3D do_freebsd___specialfd(arg1, arg2, arg3); break; =20 - /* - * ioctl(2) - */ - case TARGET_FREEBSD_NR_ioctl: /* ioctl(2) */ - ret =3D do_bsd_ioctl(arg1, arg2, arg3); - break; - - /* - * stat system calls - */ - case TARGET_FREEBSD_NR_freebsd11_stat: /* stat(2) */ - ret =3D do_freebsd11_stat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_lstat: /* lstat(2) */ - ret =3D do_freebsd11_lstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_fstat: /* fstat(2) */ - ret =3D do_freebsd11_fstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_fstat: /* fstat(2) */ - ret =3D do_freebsd_fstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_fstatat: /* fstatat(2) */ - ret =3D do_freebsd11_fstatat(arg1, arg2, arg3, arg4); - break; - - case TARGET_FREEBSD_NR_fstatat: /* fstatat(2) */ - ret =3D do_freebsd_fstatat(arg1, arg2, arg3, arg4); - break; - - case TARGET_FREEBSD_NR_freebsd11_nstat: /* undocumented */ - ret =3D do_freebsd11_nstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_nfstat: /* undocumented */ - ret =3D do_freebsd11_nfstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_nlstat: /* undocumented */ - ret =3D do_freebsd11_nlstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_getfh: /* getfh(2) */ - ret =3D do_freebsd_getfh(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_lgetfh: /* lgetfh(2) */ - ret =3D do_freebsd_lgetfh(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_fhopen: /* fhopen(2) */ - ret =3D do_freebsd_fhopen(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_fhstat: /* fhstat(2) */ - ret =3D do_freebsd11_fhstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_fhstat: /* fhstat(2) */ - ret =3D do_freebsd_fhstat(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_fhstatfs: /* fhstatfs(2) */ - ret =3D do_freebsd11_fhstatfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_fhstatfs: /* fhstatfs(2) */ - ret =3D do_freebsd_fhstatfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_statfs: /* statfs(2) */ - ret =3D do_freebsd11_statfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_statfs: /* statfs(2) */ - ret =3D do_freebsd_statfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_fstatfs: /* fstatfs(2) */ - ret =3D do_freebsd11_fstatfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_fstatfs: /* fstatfs(2) */ - ret =3D do_freebsd_fstatfs(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_freebsd11_getfsstat: /* getfsstat(2) */ - ret =3D do_freebsd11_getfsstat(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_getfsstat: /* getfsstat(2) */ - ret =3D do_freebsd_getfsstat(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_freebsd11_getdents: /* getdents(2) */ - ret =3D do_freebsd11_getdents(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_getdirentries: /* getdirentries(2) */ - ret =3D do_freebsd_getdirentries(arg1, arg2, arg3, arg4); - break; - - case TARGET_FREEBSD_NR_freebsd11_getdirentries: /* getdirentries(2) */ - ret =3D do_freebsd11_getdirentries(arg1, arg2, arg3, arg4); - break; - case TARGET_FREEBSD_NR_fcntl: /* fcntl(2) */ - ret =3D do_freebsd_fcntl(arg1, arg2, arg3); - break; - /* * Memory management system calls. */ case TARGET_FREEBSD_NR_mmap: /* mmap(2) */ ret =3D do_bsd_mmap(env, arg1, arg2, arg3, arg4, arg5, arg6, arg7, - arg8); + arg8); break; =20 case TARGET_FREEBSD_NR_munmap: /* munmap(2) */ @@ -952,17 +843,13 @@ static abi_long freebsd_syscall(CPUArchState *env, in= t num, abi_long arg1, ret =3D do_bsd_shm_open(arg1, arg2, arg3); break; =20 -#if defined(__FreeBSD_version) && __FreeBSD_version >=3D 1300048 case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */ ret =3D do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5); break; -#endif =20 -#if defined(__FreeBSD_version) && __FreeBSD_version >=3D 1300049 case TARGET_FREEBSD_NR_shm_rename: /* shm_rename(2) */ ret =3D do_freebsd_shm_rename(arg1, arg2, arg3); break; -#endif =20 case TARGET_FREEBSD_NR_shm_unlink: /* shm_unlink(2) */ ret =3D do_bsd_shm_unlink(arg1); @@ -984,68 +871,10 @@ static abi_long freebsd_syscall(CPUArchState *env, in= t num, abi_long arg1, ret =3D do_bsd_shmdt(arg1); break; =20 - /* - * System V Semaphores - */ - case TARGET_FREEBSD_NR_semget: /* semget(2) */ - ret =3D do_bsd_semget(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_semop: /* semop(2) */ - ret =3D do_bsd_semop(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR___semctl: { /* __semctl() undocumented */ - ret =3D do_bsd___semctl(arg1, arg2, arg3, arg4); - break; - } - - /* - * System V Messages - */ - case TARGET_FREEBSD_NR_msgctl: /* msgctl(2) */ - ret =3D do_bsd_msgctl(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_msgget: /* msgget(2) */ - ret =3D do_bsd_msgget(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_msgsnd: /* msgsnd(2) */ - ret =3D do_bsd_msgsnd(arg1, arg2, arg3, arg4); - break; - - case TARGET_FREEBSD_NR_msgrcv: /* msgrcv(2) */ - ret =3D do_bsd_msgrcv(arg1, arg2, arg3, arg4, arg5); - break; - case TARGET_FREEBSD_NR_freebsd11_vadvise: ret =3D do_bsd_vadvise(); break; =20 - /* - * Misc - */ - case TARGET_FREEBSD_NR_break: - ret =3D do_obreak(arg1); - break; - - case TARGET_FREEBSD_NR_quotactl: /* quotactl(2) */ - ret =3D do_bsd_quotactl(arg1, arg2, arg3); - break; - - case TARGET_FREEBSD_NR_reboot: /* reboot(2) */ - ret =3D do_bsd_reboot(arg1); - break; - - case TARGET_FREEBSD_NR_uuidgen: /* uuidgen(2) */ - ret =3D do_bsd_uuidgen(arg1, arg2); - break; - - case TARGET_FREEBSD_NR_getdtablesize: /* getdtablesize(2) */ - ret =3D do_bsd_getdtablesize(); - break; - /* * time related system calls. */ @@ -1133,10 +962,6 @@ static abi_long freebsd_syscall(CPUArchState *env, in= t num, abi_long arg1, ret =3D do_freebsd_pselect(env, arg1, arg2, arg3, arg4, arg5, arg6= ); break; =20 - case TARGET_FREEBSD_NR_ppoll: /* ppoll(2) */ - ret =3D do_freebsd_ppoll(env, arg1, arg2, arg3, arg4); - break; - case TARGET_FREEBSD_NR_kqueue: /* kqueue(2) */ ret =3D do_freebsd_kqueue(); break; @@ -1350,6 +1175,119 @@ static abi_long freebsd_syscall(CPUArchState *env, = int num, abi_long arg1, ret =3D do_freebsd__umtx_op(arg1, arg2, arg3, arg4, arg5); break; =20 + /* + * ioctl(2) + */ + case TARGET_FREEBSD_NR_ioctl: /* ioctl(2) */ + ret =3D do_bsd_ioctl(arg1, arg2, arg3); + break; + + /* + * stat system calls + */ + case TARGET_FREEBSD_NR_freebsd11_stat: /* stat(2) */ + ret =3D do_freebsd11_stat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_lstat: /* lstat(2) */ + ret =3D do_freebsd11_lstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_fstat: /* fstat(2) */ + ret =3D do_freebsd11_fstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_fstat: /* fstat(2) */ + ret =3D do_freebsd_fstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_fstatat: /* fstatat(2) */ + ret =3D do_freebsd11_fstatat(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_fstatat: /* fstatat(2) */ + ret =3D do_freebsd_fstatat(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_freebsd11_nstat: /* undocumented */ + ret =3D do_freebsd11_nstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_nfstat: /* undocumented */ + ret =3D do_freebsd11_nfstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_nlstat: /* undocumented */ + ret =3D do_freebsd11_nlstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_getfh: /* getfh(2) */ + ret =3D do_freebsd_getfh(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_lgetfh: /* lgetfh(2) */ + ret =3D do_freebsd_lgetfh(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_fhopen: /* fhopen(2) */ + ret =3D do_freebsd_fhopen(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_fhstat: /* fhstat(2) */ + ret =3D do_freebsd11_fhstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_fhstat: /* fhstat(2) */ + ret =3D do_freebsd_fhstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_fhstatfs: /* fhstatfs(2) */ + ret =3D do_freebsd11_fhstatfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_fhstatfs: /* fhstatfs(2) */ + ret =3D do_freebsd_fhstatfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_statfs: /* statfs(2) */ + ret =3D do_freebsd11_statfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_statfs: /* statfs(2) */ + ret =3D do_freebsd_statfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_fstatfs: /* fstatfs(2) */ + ret =3D do_freebsd11_fstatfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_fstatfs: /* fstatfs(2) */ + ret =3D do_freebsd_fstatfs(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_freebsd11_getfsstat: /* getfsstat(2) */ + ret =3D do_freebsd11_getfsstat(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getfsstat: /* getfsstat(2) */ + ret =3D do_freebsd_getfsstat(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_freebsd11_getdents: /* getdents(2) */ + ret =3D do_freebsd11_getdents(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_getdirentries: /* getdirentries(2) */ + ret =3D do_freebsd_getdirentries(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_freebsd11_getdirentries: /* getdirentries(2) */ + ret =3D do_freebsd11_getdirentries(arg1, arg2, arg3, arg4); + break; + case TARGET_FREEBSD_NR_fcntl: /* fcntl(2) */ + ret =3D do_freebsd_fcntl(arg1, arg2, arg3); + break; + /* * sys{ctl, arch, call} */ @@ -1365,8 +1303,14 @@ static abi_long freebsd_syscall(CPUArchState *env, i= nt num, abi_long arg1, ret =3D do_freebsd_sysarch(env, arg1, arg2); break; =20 + case TARGET_FREEBSD_NR_syscall: /* syscall(2) */ + case TARGET_FREEBSD_NR___syscall: /* __syscall(2) */ + ret =3D do_freebsd_syscall(env, arg1 & 0xffff, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, 0); + break; + /* - * extended attributes and ACL system calls + * extended attributes system calls */ case TARGET_FREEBSD_NR_extattrctl: /* extattrctl() */ ret =3D do_freebsd_extattrctl(arg1, arg2, arg3, arg4, arg5); @@ -1468,6 +1412,196 @@ static abi_long freebsd_syscall(CPUArchState *env, = int num, abi_long arg1, ret =3D do_freebsd__acl_set_link(arg1, arg2, arg3); break; =20 + /* + * System V Semaphores + */ + case TARGET_FREEBSD_NR_semget: /* semget(2) */ + ret =3D do_bsd_semget(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_semop: /* semop(2) */ + ret =3D do_bsd_semop(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR___semctl: { /* __semctl() undocumented */ + ret =3D do_bsd___semctl(arg1, arg2, arg3, arg4); + break; + } + + /* + * System V Messages + */ + case TARGET_FREEBSD_NR_msgctl: /* msgctl(2) */ + ret =3D do_bsd_msgctl(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_msgget: /* msgget(2) */ + ret =3D do_bsd_msgget(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_msgsnd: /* msgsnd(2) */ + ret =3D do_bsd_msgsnd(arg1, arg2, arg3, arg4); + break; + + case TARGET_FREEBSD_NR_msgrcv: /* msgrcv(2) */ + ret =3D do_bsd_msgrcv(arg1, arg2, arg3, arg4, arg5); + break; + + /* + * FreeBSD scheduler control + */ + case TARGET_FREEBSD_NR_sched_setparam: /* sched_setparam(2) */ + ret =3D do_freebsd_sched_setparam(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_sched_getparam: /* sched_getparam(2) */ + ret =3D do_freebsd_sched_getparam(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_sched_setscheduler: /* sched_setscheduler(2) */ + ret =3D do_freebsd_sched_setscheduler(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_sched_getscheduler: /* sched_getscheduler(2) */ + ret =3D do_freebsd_sched_getscheduler(arg1); + break; + + case TARGET_FREEBSD_NR_sched_get_priority_max: /* sched_get_priority_m= ax(2)*/ + ret =3D do_bsd_sched_get_priority_max(arg1); + break; + + case TARGET_FREEBSD_NR_sched_get_priority_min: /* sched_get_priority_m= in(2)*/ + ret =3D do_bsd_sched_get_priority_min(arg1); + break; + + case TARGET_FREEBSD_NR_sched_rr_get_interval: /* sched_rr_get_interval= (2) */ + ret =3D do_freebsd_sched_rr_get_interval(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_sched_yield: /* sched_yield(2)*/ + ret =3D do_bsd_sched_yield(); + break; + + + /* + * FreeBSD CPU affinity sets management + */ + case TARGET_FREEBSD_NR_cpuset: /* cpuset(2) */ + ret =3D do_freebsd_cpuset(arg1); + break; + + case TARGET_FREEBSD_NR_cpuset_setid: /* cpuset_setid(2) */ + ret =3D do_freebsd_cpuset_setid(env, arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_cpuset_getid: /* cpuset_getid(2) */ + ret =3D do_freebsd_cpuset_getid(arg1, arg2, arg3, arg4, arg5); + break; + + case TARGET_FREEBSD_NR_cpuset_getaffinity: /* cpuset_getaffinity(2) */ + ret =3D do_freebsd_cpuset_getaffinity(arg1, arg2, arg3, arg4, arg5= , arg6); + break; + + case TARGET_FREEBSD_NR_cpuset_setaffinity: /* cpuset_setaffinity(2) */ + ret =3D do_freebsd_cpuset_setaffinity(arg1, arg2, arg3, arg4, arg5= , arg6); + break; + + /* + * FreeBSD kernel module + */ + case TARGET_FREEBSD_NR_modfnext: /* modfnext(2) */ + ret =3D do_freebsd_modfnext(arg1); + break; + + case TARGET_FREEBSD_NR_modfind: /* modfind(2) */ + ret =3D do_freebsd_modfind(arg1); + break; + + case TARGET_FREEBSD_NR_kldload: /* kldload(2) */ + ret =3D do_freebsd_kldload(arg1); + break; + + case TARGET_FREEBSD_NR_kldunload: /* kldunload(2) */ + ret =3D do_freebsd_kldunload(arg1); + break; + + case TARGET_FREEBSD_NR_kldunloadf: /* kldunloadf(2) */ + ret =3D do_freebsd_kldunloadf(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_kldfind: /* kldfind(2) */ + ret =3D do_freebsd_kldfind(arg1); + break; + + case TARGET_FREEBSD_NR_kldnext: /* kldnext(2) */ + ret =3D do_freebsd_kldnext(arg1); + break; + + case TARGET_FREEBSD_NR_kldstat: /* kldstat(2) */ + ret =3D do_freebsd_kldstat(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_kldfirstmod: /* kldfirstmod(2) */ + ret =3D do_freebsd_kldfirstmod(arg1); + break; + + case TARGET_FREEBSD_NR_kldsym: /* kldsym(2) */ + ret =3D do_freebsd_kldsym(arg1, arg2, arg3); + break; + + /* + * FreeBSD additional posix support + */ + case TARGET_FREEBSD_NR_posix_fallocate: /* posix_fallocate(2) */ + ret =3D do_freebsd_posix_fallocate(arg1, arg2, arg3, arg4, arg5, a= rg6); + break; + + case TARGET_FREEBSD_NR_posix_openpt: /* posix_openpt(2) */ + ret =3D do_freebsd_posix_openpt(arg1); + break; + + /* + * Misc + */ + case TARGET_FREEBSD_NR_quotactl: /* quotactl(2) */ + ret =3D do_bsd_quotactl(arg1, arg2, arg3); + break; + + case TARGET_FREEBSD_NR_reboot: /* reboot(2) */ + ret =3D do_bsd_reboot(arg1); + break; + + case TARGET_FREEBSD_NR_uuidgen: /* uuidgen(2) */ + ret =3D do_bsd_uuidgen(arg1, arg2); + break; + + case TARGET_FREEBSD_NR_getdtablesize: /* getdtablesize(2) */ + ret =3D do_bsd_getdtablesize(); + break; + + case TARGET_FREEBSD_NR_break: + ret =3D do_obreak(arg1); + break; + +#if defined(CONFIG_GETRANDOM) + case TARGET_FREEBSD_NR_getrandom: + ret =3D do_freebsd_getrandom(arg1, arg2, arg3); + break; +#endif + case TARGET_FREEBSD_NR_kenv: + ret =3D do_freebsd_kenv(arg1, arg2, arg3, arg4); + break; + + /* XXX */ + case TARGET_FREEBSD_NR_cap_rights_limit: + case TARGET_FREEBSD_NR_cap_ioctls_limit: + case TARGET_FREEBSD_NR_cap_fcntls_limit: + ret =3D -TARGET_EINVAL; + break; + case TARGET_FREEBSD_NR_cap_enter: + ret =3D 0; + break; + default: qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num); ret =3D -TARGET_ENOSYS; --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015988; cv=none; d=zohomail.com; s=zohoarc; b=GTiWMLYn5PurGjRBRx1VgIGAGD3Uxi/EKhDNhW3vUbbz77218kNnIYilLyUozn6PhrwdBMIRaWzt4WHfJuVp6OqE7eaebs/M40lfmpPQ3S5/WpqB5b0KIt8xRPXYE24K6kIs6azWuWpG8YqnBmKlOWpODJUcd3LeAufvIu4k4L4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015988; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LR9lFk+mxAxbjJU5Z9czAKz/et2kSY91hVXwWMWBddM=; b=j8eP9HMBddcLq4yF0wV5AG0uHrgPQfYsL5df8YznOHyZNVAtv90svctkyVbS3JOBxOFqQ2JrcOjoib2tDePRixY9Hlq7afpoKwsmcVocgs3m1kprgNyHnROjxa35bQpy9FguQYwj+VQNywC2Qh2ZAF4CjhMKBPl9Rrnduqtzbog= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015988110454.8888397380607; Sat, 20 Jun 2026 21:26:28 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9hp-0003XR-RO; Sun, 21 Jun 2026 00:22:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hg-0003Ej-Sd for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:40 -0400 Received: from mail-oo1-xc2e.google.com ([2607:f8b0:4864:20::c2e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hf-0005Ql-HK for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:40 -0400 Received: by mail-oo1-xc2e.google.com with SMTP id 006d021491bc7-6a0eb19ff49so820148eaf.1 for ; Sat, 20 Jun 2026 21:22:39 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015758; x=1782620558; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=LR9lFk+mxAxbjJU5Z9czAKz/et2kSY91hVXwWMWBddM=; b=Y/24n0ed9khuThEjDbLeSMEmy6DCT/NUSKl53CPs4ex982oZYw8m+HAqlWWp9/ptp0 GbY+5/LU283sCI1FJH6Fq3Bwg7EzMmcQAY0ANrHeTxgtc5tO3V7nA5yzKaMk9tB78kGd lBE6VZ+dHqS6ohAEeA7ekCjf+g19CtbjQKVgV4ETcuDNqSR5iwYje4OU31wmS1EGBMhI dplV44BmoILXCRIjHTdCPR1vABqJyGiwxnEds5orgPEV+uqT7z18Z11IVrtodEwwqICt 0UYdW1QA1nQv1w86TbaEmlvzVs2ivfEKCbYhjT+GGa3nh6ZsDCtZYzl6U9X1WX2pwKRj c4aQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015758; x=1782620558; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=LR9lFk+mxAxbjJU5Z9czAKz/et2kSY91hVXwWMWBddM=; b=dv4YgRlun7edDKV+BdfnZUF/VcF2eXCPZAi4n6iqmVdgLFL1cqSEG290qyvpWdSRsx lK7m34vitAB1dYC8f1pgRabGwJajSX+x4xvH245OZI4IbRrxp9qMPk6AfjtXw3gBCrrY YNRwNcePWp4wovj0Sx+qJmcQDeaPRe4qSC6epxDJSgSfMXFEuLb8teonBWUoLytuWnKq 82PPe5bmOQ4xS+YHAEF5hubroc1tIJgDCKAtsL9lQ49u63JPgiYZnFtqe0tpUtfZroLx /VC5gqN/E41tDHY2lHd9G9a2qms2W4FiDRNJfFemJoQP3QqEqAlUnff56W+detijXjEz 52iw== X-Gm-Message-State: AOJu0Yzi/Nw3uf4bbDrboXFG4GoT/bIZLXRO7MTLnhi9FwOF/UXTDENz nFyFDIcaqOcKH0qhoVgjgzw4kn1ysn09tTF+CCQJUis5pQv3Mw4gIXu47+dyXxhW+rs= X-Gm-Gg: AfdE7cnTwlA74naz6E9+WIQJrtUpD9/yAjT3DJyut6kAeD4BCa92wVIWdnI8UKd4g3L j0rYxQvAH+MX4KJDByDvGN93xL/8KU4YyIihZavygSWS4MTH+/5xDIfpTSp+KFUnABjERzI7LMh ny76Cwxz9i9QB2azq8kqxGcUzTZvAml7+PV5cxH5iYYvXxl9f8xmzZwVW4QB+zaDz7pwBtfsHqc SdI7yAG7w0vSmblUttkTiAHi7j70OdfWwKOKJfi7TmFzddLOd8PckSuLvm/OmQXavfBaugTHGxg yh7TYvvZ2foWvkewUbUwe+YYtC5KI9+cLVVtG8KNJw3L9PPB0lj+Ypqw06E5ZWreMSN5rJxp0nW A5LPmlJv025bMmebkRbj5P4KvBpvOinuUcoDQ8ObIYEx4JPWQYHOlHHKYCCCPneeoSYCygNAFRB ikzCw8R4Ku1g== X-Received: by 2002:a05:6820:1a0a:b0:69e:428d:136d with SMTP id 006d021491bc7-6a0d8887828mr8463886eaf.19.1782015758555; Sat, 20 Jun 2026 21:22:38 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:26 -0600 Subject: [PATCH v3 39/40] bsd-user: Move qemu_guest_random_seed_main to same as linux-user MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-39-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=979; i=imp@bsdimp.com; h=from:subject:message-id; bh=vAHbZWc3zpEl4d8agZA4APlWismbA5dNWh1VfyToEe4=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aB6mrKGm2n1ZKDwLQ/Yhyww4yORxv4zsaXI /z/aAQiFiCJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR AIwKEAC3sJApN1xIwtKnm3ksE7Tnt/7oqOrBFiAjNtLw/QVo+zieRjXIgSYWsDQujJ67EGayXxz VDZ2vvT7T74pvAORCVrtPDEvs2tTnb3CYGhadzeb9WjGrVzLu1T3sV4LsPKw4PQ8z2OEZBvp9mw 8CXuguBjJSqZwIAC/nYj2AmFlsIqHKxU21bbfXLMnMiNmMCWqk24V1Sq0HijVXDzFQyFxTgRsOT HYupX1IKZRfq12T3mXkSQfU08KHQlCoUAzG6WCAfeoXsvwIVyNJQ631OJsKqmuntEi+jy7o8SvQ 5CXsfaZbC31vN9pdcWJa80/h7Tt+HD0ioBawk1YnNeOQS6Z2pGVSVbvdcFnYttizSdzMXGKuH4w cgCAs+S22gV2eUc1rzuzqMFOpNdpjq8l5U4Y7OKhK/pSRErK7XfnEK63DydLVUoVwQyuvE+S+k6 X97G+YzD4H99qHFIidfPq3uS9n+YzYxpDP7WeJMGYlvhm5fv3qcj6NR6f17JWStD3JrFXUQnuXx k09Hd5GcRaKEvsw/qxbI3aO/d+g8ZgSFzyD6EKOUtvqAbdO7htNXUxKqoAE4mJfK71yk1RLc/ae IBGqwtbwOkzsfMqdsO8cSouobhFq90M2gxhjJU2ma/r1xIU6VyZ5gkfnbHKeJEyfJwjA6CO/rtW eOwhgiqm/u4jDSA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c2e; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc2e.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015989274154100 Linux-user initializes this before doing the environment stuff. Go ahead and move it there for consistency, though it doesn't matter since we don't use it until later. Signed-off-by: Warner Losh Acked-by: Richard Henderson --- bsd-user/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index 9dff2cbcb7..6541ed2608 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -542,9 +542,6 @@ int main(int argc, char **argv) do_strace =3D 1; } =20 - target_environ =3D envlist_to_environ(envlist, NULL); - envlist_free(envlist); - { Error *err =3D NULL; if (seed_optarg !=3D NULL) { @@ -558,6 +555,9 @@ int main(int argc, char **argv) } } =20 + target_environ =3D envlist_to_environ(envlist, NULL); + envlist_free(envlist); + /* * Now that page sizes are configured we can do * proper page alignment for guest_base. --=20 2.52.0 From nobody Sun Jul 26 12:42:15 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1782015936; cv=none; d=zohomail.com; s=zohoarc; b=LGhsb6Z+Yelf5H6injc4FnF3DtfFiNyRqsn3pK0XhlOP4w9hOaq50tfPpwuSBhhqdNu3kSRJ8vEtt4rD0NtxQeAmEPXh4FFGTqBiFp0QzUFIHQaAvJ+1UyiaOrIQjtxde6vbNagdPQilsDUwgqjGY9CGId8Tp/q45KlHet2CO/A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1782015936; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=RvOtNE9D705DF6qe5L1DaLnOftJE4cjWn/xE0Uo76dU=; b=kZnB0MgXyo3MRceMdT0oa7lzgat2OFVzxMWCDi3N7tBkk74ioJXlA0vZ7DmDzEpVsDoW8jtnkMgRvqhsFkADkivLxwBipWnoN+vUKoiDNrv6p91t3WZLR5eZw/Vhr1e6PDgxVjxgIWlVY2i/aOttFx+WFjVIk9yseiWCGX3jBdc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1782015936483369.0335336806811; Sat, 20 Jun 2026 21:25:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wb9i2-0003vS-Hq; Sun, 21 Jun 2026 00:23:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wb9hi-0003Ez-4g for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:42 -0400 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wb9hg-0005R9-O6 for qemu-devel@nongnu.org; Sun, 21 Jun 2026 00:22:41 -0400 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-69ed219d3ecso2366389eaf.2 for ; Sat, 20 Jun 2026 21:22:40 -0700 (PDT) Received: from rebo.bsdimp.com ([50.253.99.174]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-6a0e9f698ccsm2828648eaf.4.2026.06.20.21.22.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Jun 2026 21:22:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20251104.gappssmtp.com; s=20251104; t=1782015759; x=1782620559; darn=nongnu.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=RvOtNE9D705DF6qe5L1DaLnOftJE4cjWn/xE0Uo76dU=; b=SN8FZWODsn3p5xH1ssxXahHOv/lCVSNcU2oB6bvpOPebNdOiWvjFCZK9IKWGV+5Lt4 uXS9qYyacKVlSf3GUNihb5mLljSdX4jDV6rFzoK/2Ql8wRP8gCcCGmbPT6OZAff6HyrV FtZkpfZS0iJbctN6UzMmtMzlbmVlfwdFGQLcIUm8dK6ez/kBzGIlxcgDvl7Re0dXfbaY 7WWPKcQwOuXRdGnHUYStEPDOky9pHH9+N3X4YSiyUYJSSLoszlXc6Ve9NlUw7+MOvZ0n DhKIb7NxYu3TKd82PBEeDIs9vZDC+FYWvT64RyWiqBFrs2VO3Aa1aRwPs8gJepIhU/Sp VQWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782015759; x=1782620559; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=RvOtNE9D705DF6qe5L1DaLnOftJE4cjWn/xE0Uo76dU=; b=XAVl4/YgI9YgYRV5N43ZHdTnc91OmGM4x36iW475KbYkVNJh5gyqF5d6TEJDMHOM4b Vn7ryZWHPzw5Cb/je/l5547Sqxzz8Wjbrc5rkZvKDShKXN5vgdgw9nPtxQl4VFEYWUrR pTm+xeAOyAlanlDIwUlEzSq9AW683zV/MTujcEwAclNy1MlEHX8ASFveU7+DiY6Tb/Xp jRWpoMcJ5zkXH1bNnF3bXJPMeohSy29W1rxly+VRGjge9JynWRF8DmtzqNts0rAGN0xO nenGeo2ktr+M6MOQObWS87rtgDBLgKY1F/iM4CGtaZvAcN4or86H8aDlk2oCJxh/v9YS yDUQ== X-Gm-Message-State: AOJu0YxypPSU6nHLY6y+60IOGXaQW1+etnwnn6wRY/j73bU4nWy+Hd9A qw4aHKHjRkn81h8Pjc4v8gghcqNIvbu8VZbBZCJxBNQB4NG5gkiOWD217X++KsqJhRjjoL7DdZj VpMFOVxp4Mg== X-Gm-Gg: AfdE7cl2V3dyXE8h6A4pqpnhJIfVna2YkF0oEX6hLHto8TezDkoEEvNeGWssf77qKgN WJAGgdcJh2IyjHMamDuIF79ok5gZnFcoHd3plePsBHJWSFwWBZxM9nZobwCF7xzf9Z8pvGkK5Sd JbNfCV7b4gsd/WPPLE92HfiVqv91S05vuO9NLKXmowQP6HJul1vXbxLX00kr3mjsOFBUaHXSkrj sm5kytBMNDq4J0V3SII+2B1FtzEfRv75566pMb2P/9rppAALJrhoFE0a1x02WfpKOufIA2yNOsB qc3WW5ys44NDrybWRNE16YJpXh+ZCWeBqdlxf3QI+/M4Ku2BJZ4Vq1KJbuDFw1gWSwesI/qx2kc u5UBmlGL+VxLpfe48Bl/xkbTjnbLOtHVHMCgUYT+a6akuG/s6GpoqlwSr88hNMDq6Y7tX3faws2 o= X-Received: by 2002:a05:6820:3415:20b0:6a0:e740:2497 with SMTP id 006d021491bc7-6a0e7405d12mr3334846eaf.7.1782015759614; Sat, 20 Jun 2026 21:22:39 -0700 (PDT) From: Warner Losh Date: Sat, 20 Jun 2026 22:20:27 -0600 Subject: [PATCH v3 40/40] bsd-user Update random_seed on thread creation MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260620-misc-2026q2-v3-40-f6ce23ad8dda@bsdimp.com> References: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> In-Reply-To: <20260620-misc-2026q2-v3-0-f6ce23ad8dda@bsdimp.com> To: qemu-devel@nongnu.org Cc: Kyle Evans , Pierrick Bouvier , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Warner Losh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1477; i=imp@bsdimp.com; h=from:subject:message-id; bh=oLnkr1J1KnuwjBFmklS6zLgiFsxxXkqkrfGUH2CGy14=; b=owEBbQKS/ZANAwAKAWwc0Sh9sBEAAcsmYgBqN2aBFj01DOcIn7HEQPUzqiL3vqKa719lSwBAm RmOAWkUsVWJAjMEAAEKAB0WIQQgNfiUsAqjz3zN4bdsHNEofbARAAUCajdmgQAKCRBsHNEofbAR AMfKEAC5HzxYHaLr9R03jmGFYzSDTaGetLYjGL3lNC6ZoXHkSl8U2p+1MN/70de/9s/gPFsXaWV S/wq/G+Iy1L16r3g41sd+m1WI1W3QK9up/ij09LLn1Jp022NJqB1OK2FaKsWhHcCwMWxiKmQTW8 Akbn/iyy/jhEnv5pVIpSbYbQxsf1dua/AB3BS4qBzXFKsDMLVkDDgN3jvtLmZj4Cpy4vgeIff0a NxEVUntT/Vojdr8UQb0wnZM1iXzhcDLj7RUqtf+JRn1QzR/aOXIGdTBwbQkGJ2Xmi7DI/EJRlks EzkbsS2ME7RQ6+NBRX+dHgEB/mVzvR7FVDnpPL3vzu3deznBiUrCqXf1NI41n19izDjZS1xN5da 26OwxIsTg+md2qBREFDTPJjyDyp7iw5PMrnLApsaeP3Sh54kB3NxoVDVXuzREJaVFjvVCApbaG7 t43Gbzics1m/eiQqOzbU3/jz7E9gAyRba8JbPxVQ4xNV8IM1fxszf4Z09v9/+sQ5sTjPdgFea3l kKloRXTm8SvSpTscv+Re+5UcC+MVnQrwxNNP3gAc+e69DZNZVrjeJLqzDUcMDebjeEiXMg6LSdF HIo34E/Xm9ZuI6Wf6VO9h2QLFKsZoisQVa/vLOViTslCZ8wPUxXbtKjps4kaLLL5EE1MXa16kit EgnxEIiS7oVUYCA== X-Developer-Key: i=imp@bsdimp.com; a=openpgp; fpr=2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: none client-ip=2607:f8b0:4864:20::c30; envelope-from=imp@bsdimp.com; helo=mail-oo1-xc30.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @bsdimp-com.20251104.gappssmtp.com) X-ZM-MESSAGEID: 1782015938398154100 Initialize / update cpu->random_seed in similar locations to the linux-user code. Set it just before we create the thread, and update it in the thread startup code. Signed-off-by: Warner Losh Acked-by: Richard Henderson Reported-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- bsd-user/freebsd/os-thread.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bsd-user/freebsd/os-thread.c b/bsd-user/freebsd/os-thread.c index 63c17e10d0..15872f03fd 100644 --- a/bsd-user/freebsd/os-thread.c +++ b/bsd-user/freebsd/os-thread.c @@ -14,6 +14,7 @@ #include "signal-common.h" #include "target_arch_cpu.h" #include "target_arch_thread.h" +#include "qemu/guest-random.h" #include "tcg/startup.h" #include "exec/tb-flush.h" =20 @@ -142,7 +143,7 @@ void *new_freebsd_thread_start(void *arg) target_thread_set_upcall(env, info->param.start_func, info->param.arg, info->param.stack_base, info->param.stack_size); target_cpu_set_tls(env, info->param.tls_base); - + qemu_guest_random_seed_thread_part2(cpu->random_seed); /* Enable signals */ sigprocmask(SIG_SETMASK, &info->sigmask, NULL); /* Signal to the parent that we're ready. */ @@ -1657,6 +1658,7 @@ abi_long do_freebsd_thr_new(CPUArchState *env, */ sigfillset(&sigmask); sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask); + cpu->random_seed =3D qemu_guest_random_seed_thread_part1(); =20 ret =3D pthread_create(&info.thread, &attr, new_freebsd_thread_start, = &info); =20 --=20 2.52.0