From nobody Wed Aug 23 14:53:56 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RW8P105Lpz4qjKs; Wed, 23 Aug 2023 14:53:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RW8P02ZmHz3cN1; Wed, 23 Aug 2023 14:53:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692802436; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5UA4ed8zwL2BaAbykRS1H3lDyp0UurmxQMvytIOZHtc=; b=DgZAdhFrX7UFvZCZLuvWlrjMN83ZAB0uaHdejiL/DfFvfawNuT6vnGJZb22l6xLOZ/sgH8 DAy76tUNEtP4rjWL1Wc/dt+c9mtfN2c5Ftv/pCOsS40A3pjdMkkOsUisGfvr0116UiV366 4+E7o/aOgVmM9ib+35ZGUqRdkimxLd2gmhVglRFHenXGgFN/EZcA0KLjDaY11Dj+UJSRmF zAtoMLD3culvDDBQR2LzyhxRkqkrpAjqK7jAuj1eopdXsQSNG42r1sVhXKuv16D7SFMNre JnImiPFDCoCGLamaCxJn5sUYJSqYmm/DMBPdb9KZc96iX5x4Hv6vQzkRR2G1Uw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692802436; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=5UA4ed8zwL2BaAbykRS1H3lDyp0UurmxQMvytIOZHtc=; b=v6utQ/zG2ULFQTG4ghfV2Z/OeqEfigKIFX1Hn93iEztlZxYetvJQZTSgppBy6DmAnAkbfz wpblx8DiXYBaY6RsYXV61wchEZUlHFDQxjbO8qLzj+7zpIazfoL4JosaqFFP07vaulpCzb fEmfXpGXUJwvjJ/8t46CmKc4W/rIHrsf8G9a2h+octLcOB/OSp61/+ECqA1r+Gp9zkXGuY 6vkrf+gCGEoHIYpFK64cffoV3gGjKOVEwxTUKSj6+nSpWAXqgW2JVXKSk9g6mgQgGVwqzn 6QZndZpG/ijPqDxRWXnFlL8OTnO4IQUGwRkmioH1LgNFX3h6QhxxzQ3vtZHXXw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1692802436; a=rsa-sha256; cv=none; b=KR+B3YQp11cgRnt3GLubZuhUi8FOzC48MVRDyov+vszN2PHQ+1SUv8JCxXySVUcA/6ayoT Oj2ME8e+gkxAsGdxELytB+T1aBz+i8F4Jir15izTwFtm2n+ATjdR3+YlgJhEgLzjVCSma6 gJlSOcDw2NOsU0Xb8GkkpyQjiPpFLsLZMNnpQQECUkr8S+7PjKNY0w0EIhR6GmwsQaEyvS xk+gKIpnIdGtrQwfId0oKwTFnKq0We5sCz/7qgptAbKz111+YZw4cqkPY/sHH9O1xIK6jl xwFPQ4Eylt5xe1WIWXlzRsAznXLAzyrXmJcc3ejcVzSRmrBXxGKvvlBTIjafZA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RW8P01NmTzpRM; Wed, 23 Aug 2023 14:53:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37NEru3L056236; Wed, 23 Aug 2023 14:53:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37NErugD056233; Wed, 23 Aug 2023 14:53:56 GMT (envelope-from git) Date: Wed, 23 Aug 2023 14:53:56 GMT Message-Id: <202308231453.37NErugD056233@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 676386b5563f - main - Support dynamically sized register sets List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 676386b5563f60739d5ea2244cd0d770b390a1d7 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=676386b5563f60739d5ea2244cd0d770b390a1d7 commit 676386b5563f60739d5ea2244cd0d770b390a1d7 Author: Andrew Turner AuthorDate: 2023-08-23 14:32:56 +0000 Commit: Andrew Turner CommitDate: 2023-08-23 14:32:56 +0000 Support dynamically sized register sets We don't always know the size of the register set at compile time, e.g. on arm64 the size of the SVE registers need to be queried on boot. To support register sets that needs to be calculated at run time query the correct size when it is zero. Reviewed by: markj, kib (earlier version) Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D41302 --- sys/kern/sys_process.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 86b9ec532c11..647487f86b02 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -190,8 +190,21 @@ proc_read_regset(struct thread *td, int note, struct iovec *iov) if (regset == NULL) return (EINVAL); + if (regset->get == NULL) + return (EINVAL); + + size = regset->size; + /* + * The regset is dynamically sized, e.g. the size could change + * depending on the hardware, or may have a per-thread size. + */ + if (size == 0) { + if (!regset->get(regset, td, NULL, &size)) + return (EINVAL); + } + if (iov->iov_base == NULL) { - iov->iov_len = regset->size; + iov->iov_len = size; if (iov->iov_len == 0) return (EINVAL); @@ -199,14 +212,10 @@ proc_read_regset(struct thread *td, int note, struct iovec *iov) } /* The length is wrong, return an error */ - if (iov->iov_len != regset->size) - return (EINVAL); - - if (regset->get == NULL) + if (iov->iov_len != size) return (EINVAL); error = 0; - size = regset->size; p = td->td_proc; /* Drop the proc lock while allocating the temp buffer */ @@ -218,7 +227,7 @@ proc_read_regset(struct thread *td, int note, struct iovec *iov) if (!regset->get(regset, td, buf, &size)) { error = EINVAL; } else { - KASSERT(size == regset->size, + KASSERT(size == regset->size || regset->size == 0, ("%s: Getter function changed the size", __func__)); iov->iov_len = size; @@ -245,14 +254,23 @@ proc_write_regset(struct thread *td, int note, struct iovec *iov) if (regset == NULL) return (EINVAL); + size = regset->size; + /* + * The regset is dynamically sized, e.g. the size could change + * depending on the hardware, or may have a per-thread size. + */ + if (size == 0) { + if (!regset->get(regset, td, NULL, &size)) + return (EINVAL); + } + /* The length is wrong, return an error */ - if (iov->iov_len != regset->size) + if (iov->iov_len != size) return (EINVAL); if (regset->set == NULL) return (EINVAL); - size = regset->size; p = td->td_proc; /* Drop the proc lock while allocating the temp buffer */