linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Catalin Marinas <catalin.marinas@arm.com>
To: Mark Brown <broonie@kernel.org>
Cc: Will Deacon <will@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
	Andrew Morton <akpm@linux-foundation.org>,
	Marc Zyngier <maz@kernel.org>,
	Oliver Upton <oliver.upton@linux.dev>,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Arnd Bergmann <arnd@arndb.de>, Oleg Nesterov <oleg@redhat.com>,
	Eric Biederman <ebiederm@xmission.com>,
	Shuah Khan <shuah@kernel.org>,
	"Rick P. Edgecombe" <rick.p.edgecombe@intel.com>,
	Deepak Gupta <debug@rivosinc.com>,
	Ard Biesheuvel <ardb@kernel.org>,
	Szabolcs Nagy <Szabolcs.Nagy@arm.com>,
	Kees Cook <kees@kernel.org>, "H.J. Lu" <hjl.tools@gmail.com>,
	Paul Walmsley <paul.walmsley@sifive.com>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	Albert Ou <aou@eecs.berkeley.edu>,
	Florian Weimer <fweimer@redhat.com>,
	Christian Brauner <brauner@kernel.org>,
	Thiago Jung Bauermann <thiago.bauermann@linaro.org>,
	Ross Burton <ross.burton@arm.com>,
	linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org,
	kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-mm@kvack.org,
	linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-riscv@lists.infradead.org
Subject: Re: [PATCH v10 20/40] arm64/gcs: Ensure that new threads have a GCS
Date: Mon, 19 Aug 2024 13:04:18 +0100	[thread overview]
Message-ID: <ZsM0wkRRguMchecK@arm.com> (raw)
In-Reply-To: <20240801-arm64-gcs-v10-20-699e2bd2190b@kernel.org>

On Thu, Aug 01, 2024 at 01:06:47PM +0100, Mark Brown wrote:
> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> index 5f00cb0da9c3..d6d3a96cf2e4 100644
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -285,9 +285,32 @@ static void flush_gcs(void)
>  	write_sysreg_s(0, SYS_GCSPR_EL0);
>  }
>  
> +static int copy_thread_gcs(struct task_struct *p,
> +			   const struct kernel_clone_args *args)
> +{
> +	unsigned long gcs;
> +
> +	gcs = gcs_alloc_thread_stack(p, args);
> +	if (IS_ERR_VALUE(gcs))
> +		return PTR_ERR((void *)gcs);

Is 0 an ok value here? I can see further down that
gcs_alloc_thread_stack() may return 0.

> +
> +	p->thread.gcs_el0_mode = current->thread.gcs_el0_mode;
> +	p->thread.gcs_el0_locked = current->thread.gcs_el0_locked;
> +
> +	/* Ensure the current state of the GCS is seen by CoW */
> +	gcsb_dsync();

I don't get this barrier. What does it have to do with CoW, which memory
effects is it trying to order?

> diff --git a/arch/arm64/mm/gcs.c b/arch/arm64/mm/gcs.c
> index b0a67efc522b..b71f6b408513 100644
> --- a/arch/arm64/mm/gcs.c
> +++ b/arch/arm64/mm/gcs.c
> @@ -8,6 +8,138 @@
>  #include <asm/cpufeature.h>
>  #include <asm/page.h>
>  
> +static unsigned long alloc_gcs(unsigned long addr, unsigned long size)
> +{
> +	int flags = MAP_ANONYMOUS | MAP_PRIVATE;
> +	struct mm_struct *mm = current->mm;
> +	unsigned long mapped_addr, unused;
> +
> +	if (addr)
> +		flags |= MAP_FIXED_NOREPLACE;
> +
> +	mmap_write_lock(mm);
> +	mapped_addr = do_mmap(NULL, addr, size, PROT_READ, flags,
> +			      VM_SHADOW_STACK | VM_WRITE, 0, &unused, NULL);
> +	mmap_write_unlock(mm);
> +
> +	return mapped_addr;
> +}
> +
> +static unsigned long gcs_size(unsigned long size)
> +{
> +	if (size)
> +		return PAGE_ALIGN(size);
> +
> +	/* Allocate RLIMIT_STACK/2 with limits of PAGE_SIZE..2G */
> +	size = PAGE_ALIGN(min_t(unsigned long long,
> +				rlimit(RLIMIT_STACK) / 2, SZ_2G));
> +	return max(PAGE_SIZE, size);
> +}

So we still have RLIMIT_STACK/2. I thought we got rid of that and just
went with RLIMIT_STACK (or I misremember).

> +
> +static bool gcs_consume_token(struct mm_struct *mm, unsigned long user_addr)
> +{
> +	u64 expected = GCS_CAP(user_addr);
> +	u64 val;
> +	int ret;
> +
> +	/* This should really be an atomic cmpxchg.  It is not. */
> +	ret = access_remote_vm(mm, user_addr, &val, sizeof(val),
> +			       FOLL_FORCE);
> +	if (ret != sizeof(val))
> +		return false;
> +
> +	if (val != expected)
> +		return false;
> +
> +	val = 0;
> +	ret = access_remote_vm(mm, user_addr, &val, sizeof(val),
> +			       FOLL_FORCE | FOLL_WRITE);
> +	if (ret != sizeof(val))
> +		return false;
> +
> +	return true;
> +}

As per the clone3() thread, I think we should try to use
get_user_page_vma_remote() and do a cmpxchg() directly.

How does the user write the initial token? Do we need any barriers
before/after consuming the token?

-- 
Catalin

  reply	other threads:[~2024-08-19 12:04 UTC|newest]

Thread overview: 121+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-01 12:06 [PATCH v10 00/40] arm64/gcs: Provide support for GCS in userspace Mark Brown
2024-08-01 12:06 ` [PATCH v10 01/40] arm64/mm: Restructure arch_validate_flags() for extensibility Mark Brown
2024-08-15 10:39   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 02/40] prctl: arch-agnostic prctl for shadow stack Mark Brown
2024-08-15 10:42   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 03/40] mman: Add map_shadow_stack() flags Mark Brown
2024-08-15 15:45   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 04/40] arm64: Document boot requirements for Guarded Control Stacks Mark Brown
2024-08-15 17:00   ` Catalin Marinas
2024-08-15 18:14     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 05/40] arm64/gcs: Document the ABI " Mark Brown
2024-08-16 11:09   ` Catalin Marinas
2024-08-16 12:02     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 06/40] arm64/sysreg: Add definitions for architected GCS caps Mark Brown
2024-08-16 11:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 07/40] arm64/gcs: Add manual encodings of GCS instructions Mark Brown
2024-08-16 11:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 08/40] arm64/gcs: Provide put_user_gcs() Mark Brown
2024-08-16 11:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 09/40] arm64/gcs: Provide basic EL2 setup to allow GCS usage at EL0 and EL1 Mark Brown
2024-08-16 11:13   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 10/40] arm64/cpufeature: Runtime detection of Guarded Control Stack (GCS) Mark Brown
2024-08-16 11:15   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 11/40] arm64/mm: Allocate PIE slots for EL0 guarded control stack Mark Brown
2024-08-16 14:16   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 12/40] mm: Define VM_SHADOW_STACK for arm64 when we support GCS Mark Brown
2024-08-15 15:20   ` Edgecombe, Rick P
2024-08-15 15:26     ` Mark Brown
2024-08-15 16:39       ` Mark Brown
2024-08-15 17:53         ` Edgecombe, Rick P
2024-08-15 18:19           ` Mark Brown
2024-08-16 13:59             ` Edgecombe, Rick P
2024-08-19  9:07   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 13/40] arm64/mm: Map pages for guarded control stack Mark Brown
2024-08-19  9:10   ` Catalin Marinas
2024-08-19 16:33     ` Mark Brown
2024-08-20 14:59       ` Catalin Marinas
2024-08-20 15:28         ` Mark Brown
2024-08-20 17:30           ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 14/40] KVM: arm64: Manage GCS access and registers for guests Mark Brown
2024-08-16 14:15   ` Marc Zyngier
2024-08-16 14:40     ` Mark Brown
2024-08-16 14:52       ` Marc Zyngier
2024-08-01 12:06 ` [PATCH v10 15/40] arm64/idreg: Add overrride for GCS Mark Brown
2024-08-19  9:10   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 16/40] arm64/hwcap: Add hwcap " Mark Brown
2024-08-19  9:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 17/40] arm64/traps: Handle GCS exceptions Mark Brown
2024-08-19  9:12   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 18/40] arm64/mm: Handle GCS data aborts Mark Brown
2024-08-19  9:17   ` Catalin Marinas
2024-08-19 15:14     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 19/40] arm64/gcs: Context switch GCS state for EL0 Mark Brown
2024-08-19 11:46   ` Catalin Marinas
2024-08-19 15:44     ` Mark Brown
2024-08-20 17:07       ` Catalin Marinas
2024-08-20 17:56       ` Mark Brown
2024-08-21  8:50         ` Catalin Marinas
2024-08-21 12:48           ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 20/40] arm64/gcs: Ensure that new threads have a GCS Mark Brown
2024-08-19 12:04   ` Catalin Marinas [this message]
2024-08-19 15:57     ` Mark Brown
2024-08-20 17:28       ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 21/40] arm64/gcs: Implement shadow stack prctl() interface Mark Brown
2024-08-21 12:54   ` Catalin Marinas
2024-08-21 13:41     ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 22/40] arm64/mm: Implement map_shadow_stack() Mark Brown
2024-08-21 15:36   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 23/40] arm64/signal: Set up and restore the GCS context for signal handlers Mark Brown
2024-08-14 14:51   ` Dave Martin
2024-08-14 16:00     ` Mark Brown
2024-08-15 13:37       ` Dave Martin
2024-08-15 14:45         ` Mark Brown
2024-08-15 15:11           ` Dave Martin
2024-08-15 15:29             ` Mark Brown
2024-08-15 16:31               ` Dave Martin
2024-08-21 17:28   ` Catalin Marinas
2024-08-21 18:03     ` Mark Brown
2024-08-21 18:18       ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 24/40] arm64/signal: Expose GCS state in signal frames Mark Brown
2024-08-14 15:09   ` Dave Martin
2024-08-14 16:21     ` Mark Brown
2024-08-15 14:01       ` Dave Martin
2024-08-15 15:05         ` Mark Brown
2024-08-15 15:33           ` Dave Martin
2024-08-15 15:46             ` Mark Brown
2024-08-15 16:40               ` Dave Martin
2024-08-21 17:40   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 25/40] arm64/ptrace: Expose GCS via ptrace and core files Mark Brown
2024-08-21 17:57   ` Catalin Marinas
2024-08-21 18:27     ` Mark Brown
2024-08-21 18:41       ` Mark Brown
2024-08-01 12:06 ` [PATCH v10 26/40] arm64: Add Kconfig for Guarded Control Stack (GCS) Mark Brown
2024-08-21 17:58   ` Catalin Marinas
2024-08-01 12:06 ` [PATCH v10 27/40] kselftest/arm64: Verify the GCS hwcap Mark Brown
2024-08-07 22:22   ` Thiago Jung Bauermann
2024-08-01 12:06 ` [PATCH v10 28/40] kselftest: Provide shadow stack enable helpers for arm64 Mark Brown
2024-08-01 12:06 ` [PATCH v10 29/40] selftests/clone3: Enable arm64 shadow stack testing Mark Brown
2024-08-07 22:26   ` Thiago Jung Bauermann
2024-08-01 12:06 ` [PATCH v10 30/40] kselftest/arm64: Add GCS as a detected feature in the signal tests Mark Brown
2024-08-01 12:06 ` [PATCH v10 31/40] kselftest/arm64: Add framework support for GCS to signal handling tests Mark Brown
2024-08-01 12:06 ` [PATCH v10 32/40] kselftest/arm64: Allow signals tests to specify an expected si_code Mark Brown
2024-08-01 12:07 ` [PATCH v10 33/40] kselftest/arm64: Always run signals tests with GCS enabled Mark Brown
2024-08-01 12:07 ` [PATCH v10 34/40] kselftest/arm64: Add very basic GCS test program Mark Brown
2024-08-07 22:31   ` Thiago Jung Bauermann
2024-08-01 12:07 ` [PATCH v10 35/40] kselftest/arm64: Add a GCS test program built with the system libc Mark Brown
2024-08-07 22:32   ` Thiago Jung Bauermann
2024-08-01 12:07 ` [PATCH v10 36/40] kselftest/arm64: Add test coverage for GCS mode locking Mark Brown
2024-08-07 22:34   ` Thiago Jung Bauermann
2024-08-01 12:07 ` [PATCH v10 37/40] kselftest/arm64: Add GCS signal tests Mark Brown
2024-08-07 22:36   ` Thiago Jung Bauermann
2024-08-01 12:07 ` [PATCH v10 38/40] kselftest/arm64: Add a GCS stress test Mark Brown
2024-08-07 22:39   ` Thiago Jung Bauermann
2024-08-07 23:10     ` Mark Brown
2024-08-08  6:23       ` Thiago Jung Bauermann
2024-08-08  8:18         ` Mark Brown
2024-08-01 12:07 ` [PATCH v10 39/40] kselftest/arm64: Enable GCS for the FP stress tests Mark Brown
2024-08-08  6:25   ` Thiago Jung Bauermann
2024-08-01 12:07 ` [PATCH v10 40/40] KVM: selftests: arm64: Add GCS registers to get-reg-list Mark Brown
2024-08-02 16:03 ` [PATCH v10 00/40] arm64/gcs: Provide support for GCS in userspace Anders Roxell
2024-08-16 14:06 ` Marc Zyngier

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=ZsM0wkRRguMchecK@arm.com \
    --to=catalin.marinas@arm.com \
    --cc=Szabolcs.Nagy@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=ardb@kernel.org \
    --cc=arnd@arndb.de \
    --cc=brauner@kernel.org \
    --cc=broonie@kernel.org \
    --cc=corbet@lwn.net \
    --cc=debug@rivosinc.com \
    --cc=ebiederm@xmission.com \
    --cc=fweimer@redhat.com \
    --cc=hjl.tools@gmail.com \
    --cc=james.morse@arm.com \
    --cc=kees@kernel.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=maz@kernel.org \
    --cc=oleg@redhat.com \
    --cc=oliver.upton@linux.dev \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=ross.burton@arm.com \
    --cc=shuah@kernel.org \
    --cc=suzuki.poulose@arm.com \
    --cc=thiago.bauermann@linaro.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

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

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