From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D157E268C42 for ; Thu, 18 Sep 2025 05:16:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172586; cv=none; b=htTE92aCldS673W/MDniRtnWHGA/5nQbCjPnA/6/S9DfVCDc1EDn3VN3fbh2ZQcmMkIcI1O1bMLh2eVh8PHy8ok58TFx9JKTzYxoYKLWtREMkyz/8t6Q8bjYTLAG5tzYXzmyTmNUI4Q+ZHVNPasR9YAN+GXeXkKwWC/SmtaJ1Hw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172586; c=relaxed/simple; bh=Rh8EDyP0VnYAbVERnzfNVnPZO1tV+O/kVhDgVIx4GNc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b918lPGTPvGZP/QjTTKWwOFyMYQV6STkwZbZvBRNGgiuZ36o4pwFNKll9/bqox4ulFYLcfdv+0vyzpsk/YGz8EjXa0h3dZHN42kEqhfdGHB0ujakEUT53uXPeytHrqBpznE2ot460zqKahn61LHgmo0qmmCNEkQ3NBMkZw3xDtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GFLl53Gu; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GFLl53Gu" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-77d24db67e0so259593b3a.3 for ; Wed, 17 Sep 2025 22:16:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172584; x=1758777384; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=oiT0MrcHOyv1UJl38CIIzCgovK63Js+Y+q9YvsvWIlo=; b=GFLl53GuPlD4HCdzi4jYtHKBOJPUFem/AoEJqDMe4lIfzEsEQifIyF0rFj30ZBjaEf lfMLjkXT3qrJV/pxSDzOiUIxE79iTN/70keU1thcLJNlSondX7qR1FUa15UhQjGafqRl S+4lEkmbA+m2ZBdZitesDJrc1fH5vJpugiWYUgTxJLY21YcWQk4jiq1wH03MMdArASKH O3C3Buo2HGzZPDBpYTNHBK6AFJjYJVOBDYUPSzzCPUSCnN7Xmz32rDhhjGeIMI1v45Pn h7WCoOXrbm28h++Pzb5TD18bo41HQW6UyryYia7N/3bSd5HvrfGTe12VoCXKEaov6XXA cZrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172584; x=1758777384; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oiT0MrcHOyv1UJl38CIIzCgovK63Js+Y+q9YvsvWIlo=; b=H+B/xm9rlu/PgujVkmVDaD9nBw9QV/kiXVJ7CYsDvks10KC4Ak/s6qzp6SThTIs8Xu PVYtZ4LeBaqKGztVamkoADPwAeSZ5Be1vaaBhsUzE428lMJLnLMISONqLVh6HPjf48+U w2mp74/QGVmFf/5wBl8PsSa91y5Q6xoKY5ux2fdolT6KRk/r7QJGaXm477zU8R/7sMwr bM2gsaWiW5vdiws5w+vk15czfdPCDuXVRqK0nvshtiUvCF85cegrg7Wu0/bOr7mxd+tp OL5QdlxYAmMLbyboh5YhPIoDhRL9jS1mVqP8TJAIzjOizjG80cZnqWjPgKV4TDZzNzT2 pCRQ== X-Forwarded-Encrypted: i=1; AJvYcCXSYvgq7DjSSvNdS/BI+nvps15EY05avRkQJHAAx6rGZAofbUQXzdN5/KEsdcSJqfti2f48x1D8j0L7nWA=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl+5H2GmaGbCHA262LH1anGtwi4p4nNJOEUveDd+4kLz6uGM1a pTPU81qcjC2t4bIZCeI167VBymXksPm+pevwpStYMYia7tRba0T2W4tA X-Gm-Gg: ASbGnct19NRBODfNkUkNJDYcEPhdyeeE5fT4I2HTCQmC8kGtMepJkTUTEzOx1YeyX8c hDOL6SgIBrsqi4TkjDovirFqaV7VwLHw0rI9xPPtrYAHOLfrVnr1vjPjXu4R+16W602tVSGQdXC WWA04ZAl+aXdMb3L/xLMHP2Yct9XRdaNoy3AnRsWN1nnMVPizFO+EvMwPCBNOkLRF5RFsylBeYe xt95TYK6nx2kzmz9IMIj78TbvnkJcnulYfrx+OnlUTm2RDLqJELpIXD3JlY/jlNZXBpAto0SvXm 25OnLWdoNVBB7GIqg8VcN6xlzBhwfd/JREzjR/vTr9IdkUV2oUXkSS6r0nfZrwF4OZY/0+cVgYL AUx78GvjjvVtPUMmaWUDscYQufkYdXPdshWLmDiT6Uy9r4fi5ibvetZ0mVlGSC69gRwmS+5axRj 2TMTeu+c8PKbDC42uFW3Aetg== X-Google-Smtp-Source: AGHT+IEa23dRQySwPPnr5ub15MBlqUEyaqoSvqVGNsNzpQT7Ye8yNYnLRaw4EeZooTnvYHDwu7FgGw== X-Received: by 2002:a05:6a00:887:b0:772:8694:1d71 with SMTP id d2e1a72fcca58-77bf45c2008mr5267793b3a.0.1758172583863; Wed, 17 Sep 2025 22:16:23 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfe7607c8sm1093015b3a.58.2025.09.17.22.16.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:23 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id B2BEE1061EE2; Thu, 18 Sep 2025 14:16:20 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org, Eric Biederman , Kees Cook , Alexander Viro , Christian Brauner , Jan Kara , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v11 01/14] x86/um: nommu: elf loader for fdpic Date: Thu, 18 Sep 2025 14:15:54 +0900 Message-ID: <5a4932bbcdbf79facd544fec7e3d6a6969a40aa1.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" As UML supports CONFIG_MMU=3Dn case, it has to use an alternate ELF loader, FDPIC ELF loader. In this commit, we added necessary definitions in the arch, as UML has not been used so far. It also updates Kconfig file to use BINFMT_ELF_FDPIC under !MMU environment. Cc: Eric Biederman Cc: Kees Cook Cc: Alexander Viro Cc: Christian Brauner Cc: Jan Kara Cc: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org Acked-by: Kees Cook Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/um/include/asm/mmu.h | 5 +++++ arch/um/include/asm/ptrace-generic.h | 6 ++++++ arch/x86/um/asm/elf.h | 8 ++++++-- fs/Kconfig.binfmt | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/arch/um/include/asm/mmu.h b/arch/um/include/asm/mmu.h index 4d0e4239f3cc..e9661846b4a3 100644 --- a/arch/um/include/asm/mmu.h +++ b/arch/um/include/asm/mmu.h @@ -17,6 +17,11 @@ typedef struct mm_context { /* Address range in need of a TLB sync */ unsigned long sync_tlb_range_from; unsigned long sync_tlb_range_to; + +#ifdef CONFIG_BINFMT_ELF_FDPIC + unsigned long exec_fdpic_loadmap; + unsigned long interp_fdpic_loadmap; +#endif } mm_context_t; =20 #endif diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptr= ace-generic.h index 86d74f9d33cf..62e9916078ec 100644 --- a/arch/um/include/asm/ptrace-generic.h +++ b/arch/um/include/asm/ptrace-generic.h @@ -29,6 +29,12 @@ struct pt_regs { =20 #define PTRACE_OLDSETOPTIONS 21 =20 +#ifdef CONFIG_BINFMT_ELF_FDPIC +#define PTRACE_GETFDPIC 31 +#define PTRACE_GETFDPIC_EXEC 0 +#define PTRACE_GETFDPIC_INTERP 1 +#endif + struct task_struct; =20 extern long subarch_ptrace(struct task_struct *child, long request, diff --git a/arch/x86/um/asm/elf.h b/arch/x86/um/asm/elf.h index 62ed5d68a978..33f69f1eac10 100644 --- a/arch/x86/um/asm/elf.h +++ b/arch/x86/um/asm/elf.h @@ -9,6 +9,7 @@ #include =20 #define CORE_DUMP_USE_REGSET +#define ELF_FDPIC_CORE_EFLAGS 0 =20 #ifdef CONFIG_X86_32 =20 @@ -190,8 +191,11 @@ extern int arch_setup_additional_pages(struct linux_bi= nprm *bprm, =20 extern unsigned long um_vdso_addr; #define AT_SYSINFO_EHDR 33 -#define ARCH_DLINFO NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr) - +#define ARCH_DLINFO \ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr); \ + NEW_AUX_ENT(AT_MINSIGSTKSZ, 0); \ +} while (0) #endif =20 typedef unsigned long elf_greg_t; diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt index bd2f530e5740..419ba0282806 100644 --- a/fs/Kconfig.binfmt +++ b/fs/Kconfig.binfmt @@ -58,7 +58,7 @@ config ARCH_USE_GNU_PROPERTY config BINFMT_ELF_FDPIC bool "Kernel support for FDPIC ELF binaries" default y if !BINFMT_ELF - depends on ARM || ((M68K || RISCV || SUPERH || XTENSA) && !MMU) + depends on ARM || ((M68K || RISCV || SUPERH || UML || XTENSA) && !MMU) select ELFCORE help ELF FDPIC binaries are based on ELF, but allow the individual load --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 51A2025A2BF for ; Thu, 18 Sep 2025 05:16:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172588; cv=none; b=dfb18IHdzhQXcQ1VxVIQo5YlpkGPT1wyxjE17GeF34hdMp/Vi3s1sl4Q3l1y0dVwW09YGUceXB0n3NkHOKL7TOdfonQyOSzJrOmh3EzMIwm7Lx9i2g5S9bAG2wg459qlEeozBmEqSLqNXfnn3Mh0bTjrz9uIg33Lgm2POP2z6gg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172588; c=relaxed/simple; bh=VX63Cts70ezj4r0nc0GLQLD8D46JgopVfQkzG5n55e8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k/cOI9ubai/HHKSvAE9LWMQxMjrm2/QR442e8uijZ++3RYtq+mYv7sSO7ao760ZkNyPkk7z2d5aSawXOztCwkVKszlabASIh3mBCM3p/Gqv7g/QzSStVxSwQdJ5jEIo6FrAT4zE5FxUC+iJ6GQCmEIlo3gQS7KZZKFME9EYC224= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=TG38/xwy; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="TG38/xwy" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-77796ad4c13so397919b3a.0 for ; Wed, 17 Sep 2025 22:16:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172586; x=1758777386; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1F21TWOFO4Nmsr2w4QPMMTb+GqIkJhpnakmqkMS5Gtc=; b=TG38/xwyYxedwyvfwlFOXFxDpkylJk+E/320oFymMKgKU1MueulSme9o/f2dSWxWFf WkwMRAz1o9jj9d8Lul2juKUARd3s7iK6/0NHviRLKdlEyTUY4JXniu1eB7z3gBJ8u8pS SsfaETWDdOZav/m1/Y7fUaXXAzGcDS2m2d3sP7XAIwnaRcV2Lk2yBL84abeYlo4eSAVt mSYtzFoWoGjgYsANnCmFLx7HhjBGn3cxaV6G52losQSXSgvNCGIFouINenbZCfedrfWz cc+X5zf/nfT5SPSzVge0fd10KuyAT98gnLoh3Lu4Tf2Vft/bYaKsDpUzNBfdZUbaLgKG 0EFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172586; x=1758777386; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1F21TWOFO4Nmsr2w4QPMMTb+GqIkJhpnakmqkMS5Gtc=; b=UjG2qeHbSxg6B7JNUnqW+gNDadkPOt0VkLZemvsSHsE1KLUcVk6gfOLGFWVGMZbiLF seg2lY+3+ffb9zZM+DCoQOUc+0s3Z4BM8mZJgP1mNQCzSLfcHp0DOhj/Iy7iCMQmyELT GQZhNr01uVhBEg0DTU5rKN8yjluLgovYC7tp0zNWITbINsvRlWaT5nu+jONlm/+4eT8W YijwzAotQwHI+1vCzVF/Vh7t67d4xgp41rVKnCPkaZ/At4SFsyBYV8Zgd/cexjDpqXVk xwDGjxQXSsFmP6PpY4+NTRAX3uQYaXxGye4/B0vcA6pF9kdq8ZRi+bg45VJSSXJYO9uA FglA== X-Forwarded-Encrypted: i=1; AJvYcCVueZy6zTRFYXxWwuGZnp57xwwbOxeQgt+6neCjcio/zzeG1ws66AElLP+Cap4ZVNHPcTNM/8ID+yG0W2s=@vger.kernel.org X-Gm-Message-State: AOJu0YznnNrt40brYBkU2OToJN1EqdlerxfhTszFRhFRFHUclC30iJmc BQbdi/XP9rt++loA4/560ViVrKZOs8n1/Ns8TLPylyAmVSOLY3xk0eAQUrsi9A== X-Gm-Gg: ASbGncvNg6FEmPzBLAYlptRKO1iyy8um1yncjdG+stpoHkEchMx21Rgf7mPHxRLca8l 7RBvbzDwVxYsJrswYBt9+NnShKf6qWbgis6h8GFBVoDy4yBT8NiHlbbg3ITtLcmT9J8yzuPzERs 04A0BBS+8AChYCAMZre5/t5JRCE3IrN3REgjw+BHidQean8ZYd9NrObIPcdi5eVjqs1MXLXVaEr tBf9ZgZMEP9u4w171wykpj+D6Aj0fSZhxZNgK5K5llWO8yYkwXQeJy5RZvT/sbG4gt2Bwdi9Og0 iAF+MRGIfbe+AlivtxbZE09EHagUswxh2losAKydgVqLXO6A836FVPjK6k4B0BDKQrMNYizaP+/ QPLn1Lkh0fYPxfaTYPBgzM9AmQMbccyODdUk3x96qbmK8ymSbY+RT7cKS1EX3aU8KWI40F+XX0O x7QMAHse94dPERPpgw5hVE1w== X-Google-Smtp-Source: AGHT+IE9KBHsPSUbje/NyXg6zQg4Uv9zV8Hw+XsbFPAe9nlsq8Ejds5VN8WaQdSXcrL2brt8Vz97zQ== X-Received: by 2002:a05:6a20:3d05:b0:252:2bfe:b654 with SMTP id adf61e73a8af0-27aa85b493cmr6276905637.51.1758172585459; Wed, 17 Sep 2025 22:16:25 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32ea0859e20sm3576779a91.0.2025.09.17.22.16.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:24 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id A0C2C1061EE4; Thu, 18 Sep 2025 14:16:22 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 02/14] um: decouple MMU specific code from the common part Date: Thu, 18 Sep 2025 14:15:55 +0900 Message-ID: <7255e42a935a07e9a6e68ce3fbb24ab28de4cf6b.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This splits the memory, process related code with common and MMU specific parts in order to avoid ifdefs in .c file and duplication between MMU and !MMU. Signed-off-by: Hajime Tazaki --- arch/um/kernel/Makefile | 5 +- arch/um/kernel/mem-pgtable.c | 55 ++++++++++++++ arch/um/kernel/mem.c | 35 --------- arch/um/kernel/process.c | 25 +++++++ arch/um/kernel/skas/process.c | 25 ------- arch/um/os-Linux/Makefile | 3 +- arch/um/os-Linux/process.c | 128 ++++++++++++++++++++++++++++++++ arch/um/os-Linux/skas/process.c | 126 ------------------------------- 8 files changed, 213 insertions(+), 189 deletions(-) create mode 100644 arch/um/kernel/mem-pgtable.c diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index b8f4e9281599..11ede105f3a9 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile @@ -16,9 +16,10 @@ always-$(KBUILD_BUILTIN) :=3D vmlinux.lds =20 obj-y =3D config.o exec.o exitcode.o irq.o ksyms.o mem.o \ physmem.o process.o ptrace.o reboot.o sigio.o \ - signal.o sysrq.o time.o tlb.o trap.o \ - um_arch.o umid.o kmsg_dump.o capflags.o skas/ + signal.o sysrq.o time.o \ + um_arch.o umid.o kmsg_dump.o capflags.o obj-y +=3D load_file.o +obj-$(CONFIG_MMU) +=3D mem-pgtable.o tlb.o trap.o skas/ =20 obj-$(CONFIG_BLK_DEV_INITRD) +=3D initrd.o obj-$(CONFIG_GPROF) +=3D gprof_syms.o diff --git a/arch/um/kernel/mem-pgtable.c b/arch/um/kernel/mem-pgtable.c new file mode 100644 index 000000000000..549da1d3bff0 --- /dev/null +++ b/arch/um/kernel/mem-pgtable.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Allocate and free page tables. */ + +pgd_t *pgd_alloc(struct mm_struct *mm) +{ + pgd_t *pgd =3D (pgd_t *)__get_free_page(GFP_KERNEL); + + if (pgd) { + memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + memcpy(pgd + USER_PTRS_PER_PGD, + swapper_pg_dir + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return pgd; +} + +static const pgprot_t protection_map[16] =3D { + [VM_NONE] =3D PAGE_NONE, + [VM_READ] =3D PAGE_READONLY, + [VM_WRITE] =3D PAGE_COPY, + [VM_WRITE | VM_READ] =3D PAGE_COPY, + [VM_EXEC] =3D PAGE_READONLY, + [VM_EXEC | VM_READ] =3D PAGE_READONLY, + [VM_EXEC | VM_WRITE] =3D PAGE_COPY, + [VM_EXEC | VM_WRITE | VM_READ] =3D PAGE_COPY, + [VM_SHARED] =3D PAGE_NONE, + [VM_SHARED | VM_READ] =3D PAGE_READONLY, + [VM_SHARED | VM_WRITE] =3D PAGE_SHARED, + [VM_SHARED | VM_WRITE | VM_READ] =3D PAGE_SHARED, + [VM_SHARED | VM_EXEC] =3D PAGE_READONLY, + [VM_SHARED | VM_EXEC | VM_READ] =3D PAGE_READONLY, + [VM_SHARED | VM_EXEC | VM_WRITE] =3D PAGE_SHARED, + [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] =3D PAGE_SHARED +}; +DECLARE_VM_GET_PAGE_PROT diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 76bec7de81b5..106a2f85ab5c 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -207,45 +206,11 @@ void free_initmem(void) { } =20 -/* Allocate and free page tables. */ - -pgd_t *pgd_alloc(struct mm_struct *mm) -{ - pgd_t *pgd =3D __pgd_alloc(mm, 0); - - if (pgd) - memcpy(pgd + USER_PTRS_PER_PGD, - swapper_pg_dir + USER_PTRS_PER_PGD, - (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); - - return pgd; -} - void *uml_kmalloc(int size, int flags) { return kmalloc(size, flags); } =20 -static const pgprot_t protection_map[16] =3D { - [VM_NONE] =3D PAGE_NONE, - [VM_READ] =3D PAGE_READONLY, - [VM_WRITE] =3D PAGE_COPY, - [VM_WRITE | VM_READ] =3D PAGE_COPY, - [VM_EXEC] =3D PAGE_READONLY, - [VM_EXEC | VM_READ] =3D PAGE_READONLY, - [VM_EXEC | VM_WRITE] =3D PAGE_COPY, - [VM_EXEC | VM_WRITE | VM_READ] =3D PAGE_COPY, - [VM_SHARED] =3D PAGE_NONE, - [VM_SHARED | VM_READ] =3D PAGE_READONLY, - [VM_SHARED | VM_WRITE] =3D PAGE_SHARED, - [VM_SHARED | VM_WRITE | VM_READ] =3D PAGE_SHARED, - [VM_SHARED | VM_EXEC] =3D PAGE_READONLY, - [VM_SHARED | VM_EXEC | VM_READ] =3D PAGE_READONLY, - [VM_SHARED | VM_EXEC | VM_WRITE] =3D PAGE_SHARED, - [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] =3D PAGE_SHARED -}; -DECLARE_VM_GET_PAGE_PROT - void mark_rodata_ro(void) { unsigned long rodata_start =3D PFN_ALIGN(__start_rodata); diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 1be644de9e41..bfbfee0d401a 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -46,6 +47,8 @@ struct task_struct *cpu_tasks[NR_CPUS]; EXPORT_SYMBOL(cpu_tasks); =20 +static char cpu0_irqstack[THREAD_SIZE] __aligned(THREAD_SIZE); + void free_stack(unsigned long stack, int order) { free_pages(stack, order); @@ -299,3 +302,25 @@ unsigned long __get_wchan(struct task_struct *p) =20 return 0; } + + +static int __init start_kernel_proc(void *unused) +{ + block_signals_trace(); + + start_kernel(); + return 0; +} + +int __init start_uml(void) +{ + stack_protections((unsigned long) &cpu0_irqstack); + set_sigstack(cpu0_irqstack, THREAD_SIZE); + + init_new_thread_signals(); + + init_task.thread.request.thread.proc =3D start_kernel_proc; + init_task.thread.request.thread.arg =3D NULL; + return start_idle_thread(task_stack_page(&init_task), + &init_task.thread.switch_buf); +} diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c index 5881b17eb987..5247121d3419 100644 --- a/arch/um/kernel/skas/process.c +++ b/arch/um/kernel/skas/process.c @@ -16,31 +16,6 @@ #include #include =20 -extern void start_kernel(void); - -static int __init start_kernel_proc(void *unused) -{ - block_signals_trace(); - - start_kernel(); - return 0; -} - -static char cpu0_irqstack[THREAD_SIZE] __aligned(THREAD_SIZE); - -int __init start_uml(void) -{ - stack_protections((unsigned long) &cpu0_irqstack); - set_sigstack(cpu0_irqstack, THREAD_SIZE); - - init_new_thread_signals(); - - init_task.thread.request.thread.proc =3D start_kernel_proc; - init_task.thread.request.thread.arg =3D NULL; - return start_idle_thread(task_stack_page(&init_task), - &init_task.thread.switch_buf); -} - unsigned long current_stub_stack(void) { if (current->mm =3D=3D NULL) diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index fae836713487..c048fc838068 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile @@ -8,7 +8,8 @@ KCOV_INSTRUMENT :=3D n =20 obj-y =3D execvp.o file.o helper.o irq.o main.o mem.o process.o \ registers.o sigio.o signal.o start_up.o time.o tty.o \ - umid.o user_syms.o util.o skas/ + umid.o user_syms.o util.o +obj-$(CONFIG_MMU) +=3D skas/ =20 CFLAGS_signal.o +=3D -Wframe-larger-than=3D4096 =20 diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 00b49e90d05f..d000907ec796 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -6,6 +6,7 @@ =20 #include #include +#include #include #include #include @@ -15,10 +16,16 @@ #include #include #include +#include #include #include #include #include +#include +#include + +int using_seccomp; +static int unscheduled_userspace_iterations; =20 void os_alarm_process(int pid) { @@ -189,3 +196,124 @@ void os_set_pdeathsig(void) { prctl(PR_SET_PDEATHSIG, SIGKILL); } + +int is_skas_winch(int pid, int fd, void *data) +{ + return pid =3D=3D getpgrp(); +} + +void new_thread(void *stack, jmp_buf *buf, void (*handler)(void)) +{ + (*buf)[0].JB_IP =3D (unsigned long) handler; + (*buf)[0].JB_SP =3D (unsigned long) stack + UM_THREAD_SIZE - + sizeof(void *); +} + +#define INIT_JMP_NEW_THREAD 0 +#define INIT_JMP_CALLBACK 1 +#define INIT_JMP_HALT 2 +#define INIT_JMP_REBOOT 3 + +void switch_threads(jmp_buf *me, jmp_buf *you) +{ + unscheduled_userspace_iterations =3D 0; + + if (UML_SETJMP(me) =3D=3D 0) + UML_LONGJMP(you, 1); +} + +static jmp_buf initial_jmpbuf; + +/* XXX Make these percpu */ +static void (*cb_proc)(void *arg); +static void *cb_arg; +static jmp_buf *cb_back; + +int start_idle_thread(void *stack, jmp_buf *switch_buf) +{ + int n; + + set_handler(SIGWINCH); + + /* + * Can't use UML_SETJMP or UML_LONGJMP here because they save + * and restore signals, with the possible side-effect of + * trying to handle any signals which came when they were + * blocked, which can't be done on this stack. + * Signals must be blocked when jumping back here and restored + * after returning to the jumper. + */ + n =3D setjmp(initial_jmpbuf); + switch (n) { + case INIT_JMP_NEW_THREAD: + (*switch_buf)[0].JB_IP =3D (unsigned long) uml_finishsetup; + (*switch_buf)[0].JB_SP =3D (unsigned long) stack + + UM_THREAD_SIZE - sizeof(void *); + break; + case INIT_JMP_CALLBACK: + (*cb_proc)(cb_arg); + longjmp(*cb_back, 1); + break; + case INIT_JMP_HALT: + kmalloc_ok =3D 0; + return 0; + case INIT_JMP_REBOOT: + kmalloc_ok =3D 0; + return 1; + default: + printk(UM_KERN_ERR "Bad sigsetjmp return in %s - %d\n", + __func__, n); + fatal_sigsegv(); + } + longjmp(*switch_buf, 1); + + /* unreachable */ + printk(UM_KERN_ERR "impossible long jump!"); + fatal_sigsegv(); + return 0; +} + +void initial_thread_cb_skas(void (*proc)(void *), void *arg) +{ + jmp_buf here; + + cb_proc =3D proc; + cb_arg =3D arg; + cb_back =3D &here; + + block_signals_trace(); + if (UML_SETJMP(&here) =3D=3D 0) + UML_LONGJMP(&initial_jmpbuf, INIT_JMP_CALLBACK); + unblock_signals_trace(); + + cb_proc =3D NULL; + cb_arg =3D NULL; + cb_back =3D NULL; +} + +void halt_skas(void) +{ + block_signals_trace(); + UML_LONGJMP(&initial_jmpbuf, INIT_JMP_HALT); +} + +static bool noreboot; + +static int __init noreboot_cmd_param(char *str, int *add) +{ + *add =3D 0; + noreboot =3D true; + return 0; +} + +__uml_setup("noreboot", noreboot_cmd_param, +"noreboot\n" +" Rather than rebooting, exit always, akin to QEMU's -no-reboot option.= \n" +" This is useful if you're using CONFIG_PANIC_TIMEOUT in order to catch= \n" +" crashes in CI\n\n"); + +void reboot_skas(void) +{ + block_signals_trace(); + UML_LONGJMP(&initial_jmpbuf, noreboot ? INIT_JMP_HALT : INIT_JMP_REBOOT); +} diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/proces= s.c index 0bc10cd4cbed..92278107007e 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -29,16 +28,10 @@ #include #include #include -#include #include #include #include "../internal.h" =20 -int is_skas_winch(int pid, int fd, void *data) -{ - return pid =3D=3D getpgrp(); -} - static const char *ptrace_reg_name(int idx) { #define R(n) case HOST_##n: return #n @@ -433,8 +426,6 @@ static int __init init_stub_exe_fd(void) } __initcall(init_stub_exe_fd); =20 -int using_seccomp; - /** * start_userspace() - prepare a new userspace process * @mm_id: The corresponding struct mm_id @@ -547,7 +538,6 @@ int start_userspace(struct mm_id *mm_id) return err; } =20 -static int unscheduled_userspace_iterations; extern unsigned long tt_extra_sched_jiffies; =20 void userspace(struct uml_pt_regs *regs) @@ -786,119 +776,3 @@ void userspace(struct uml_pt_regs *regs) } } } - -void new_thread(void *stack, jmp_buf *buf, void (*handler)(void)) -{ - (*buf)[0].JB_IP =3D (unsigned long) handler; - (*buf)[0].JB_SP =3D (unsigned long) stack + UM_THREAD_SIZE - - sizeof(void *); -} - -#define INIT_JMP_NEW_THREAD 0 -#define INIT_JMP_CALLBACK 1 -#define INIT_JMP_HALT 2 -#define INIT_JMP_REBOOT 3 - -void switch_threads(jmp_buf *me, jmp_buf *you) -{ - unscheduled_userspace_iterations =3D 0; - - if (UML_SETJMP(me) =3D=3D 0) - UML_LONGJMP(you, 1); -} - -static jmp_buf initial_jmpbuf; - -/* XXX Make these percpu */ -static void (*cb_proc)(void *arg); -static void *cb_arg; -static jmp_buf *cb_back; - -int start_idle_thread(void *stack, jmp_buf *switch_buf) -{ - int n; - - set_handler(SIGWINCH); - - /* - * Can't use UML_SETJMP or UML_LONGJMP here because they save - * and restore signals, with the possible side-effect of - * trying to handle any signals which came when they were - * blocked, which can't be done on this stack. - * Signals must be blocked when jumping back here and restored - * after returning to the jumper. - */ - n =3D setjmp(initial_jmpbuf); - switch (n) { - case INIT_JMP_NEW_THREAD: - (*switch_buf)[0].JB_IP =3D (unsigned long) uml_finishsetup; - (*switch_buf)[0].JB_SP =3D (unsigned long) stack + - UM_THREAD_SIZE - sizeof(void *); - break; - case INIT_JMP_CALLBACK: - (*cb_proc)(cb_arg); - longjmp(*cb_back, 1); - break; - case INIT_JMP_HALT: - kmalloc_ok =3D 0; - return 0; - case INIT_JMP_REBOOT: - kmalloc_ok =3D 0; - return 1; - default: - printk(UM_KERN_ERR "Bad sigsetjmp return in %s - %d\n", - __func__, n); - fatal_sigsegv(); - } - longjmp(*switch_buf, 1); - - /* unreachable */ - printk(UM_KERN_ERR "impossible long jump!"); - fatal_sigsegv(); - return 0; -} - -void initial_thread_cb_skas(void (*proc)(void *), void *arg) -{ - jmp_buf here; - - cb_proc =3D proc; - cb_arg =3D arg; - cb_back =3D &here; - - block_signals_trace(); - if (UML_SETJMP(&here) =3D=3D 0) - UML_LONGJMP(&initial_jmpbuf, INIT_JMP_CALLBACK); - unblock_signals_trace(); - - cb_proc =3D NULL; - cb_arg =3D NULL; - cb_back =3D NULL; -} - -void halt_skas(void) -{ - block_signals_trace(); - UML_LONGJMP(&initial_jmpbuf, INIT_JMP_HALT); -} - -static bool noreboot; - -static int __init noreboot_cmd_param(char *str, int *add) -{ - *add =3D 0; - noreboot =3D true; - return 0; -} - -__uml_setup("noreboot", noreboot_cmd_param, -"noreboot\n" -" Rather than rebooting, exit always, akin to QEMU's -no-reboot option.= \n" -" This is useful if you're using CONFIG_PANIC_TIMEOUT in order to catch= \n" -" crashes in CI\n\n"); - -void reboot_skas(void) -{ - block_signals_trace(); - UML_LONGJMP(&initial_jmpbuf, noreboot ? INIT_JMP_HALT : INIT_JMP_REBOOT); -} --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6DE2D2749E6 for ; Thu, 18 Sep 2025 05:16:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172591; cv=none; b=qVHZupl14BolKmAYb3epQ10GTWzNidQFmcrUHDePnJB0QTD2756gYc+68cHbdS/McOdmWmBJCZo/VCWXJEpBooOvZdtgcIyR1pKVyKjQhppfmMxhz11HCMA79yqJVeCzIMqKFWMwoU1QdpNDVX5ObuttgmiUWby/Ord2tmVzMHM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172591; c=relaxed/simple; bh=byCqW4A9iLem+ANWjBVScnY9Hghuk40zDm3UjEWz6rc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B2qddR4HBdG09AHxtIb+xn5sOz6phBGbvmkO4i/SSC8LWR7oxzLrpFrqknXVo4NYoJWbe+83ErVs5fq1roHyXbIkBSQbEJD/qeOR0KX9FPXf+RrOr5naOyFQEQOCKSXZEUoi4pI0iZu1eB2mMyLAIojCNqwlwYHAiMDLNx0/s6Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jzUmC410; arc=none smtp.client-ip=209.85.210.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jzUmC410" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-7741991159bso808768b3a.0 for ; Wed, 17 Sep 2025 22:16:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172589; x=1758777389; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5v5kFFhzG2vuvgO+enxcsWpy0aeKbEC/zaWFYDqr9sQ=; b=jzUmC410EjJqpdT8xplBojuB/waBDGx6PZOMHcjkBKpoigjewwwb7JEorDvs7frdy/ 8Vs6/CSebnZiH2bObePgbgMeH0o9h4BY1QN9QTYBIs5+6JTSzllNOS7L1LDWKxGNCWqY TIZkqScjx3jBPoHeqeXFhA+7adreoTW9JU20y/YDQMlEqqLbBQmL2AjNzjfJ8qO+RPd9 grtaCEhN7Bf42ct/Sf+o1UWLz8n9xAOwDM/tRdQXPrLjwW0+LWHgdmLh87QAdqJJ4YmO zIYSqpydgVeQrYmRrykp8+gILNUTns/1/CnvRx7b7FOUVbH+wq+JNXc0ntpdK+3alKQD NZGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172589; x=1758777389; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5v5kFFhzG2vuvgO+enxcsWpy0aeKbEC/zaWFYDqr9sQ=; b=kEmJO27YDkwWqEMBAPyHBCBE4orjCyDJ7CTiUV7ZMA3QupjHbF+Z1bLMsccOULdsL2 9+dvGk0H7g2sudcWnCKjnKTU0C4dBxH19gMN5Ox5eCNtghkjQPyrp2dE4juQ1CuW7NRx aDOCKZj53zMXupLE4tfTFLIeoF/Ghs0+kuDjgP7flccFynrazp59Yx7VyFBYRbW2Lj1d Qsl9epW4K++AqakJrwGBGmfpfW5lVtiyXd8RUAJ4SubTq6h2QLTDmGQ/FvCtqBJv30QB Sm5O3288NEjPhUK638AAJJ0NkwpLkdCRkKxZF84n6+rGar+iu9aR4pD2ERH1TS5n80aw qNJQ== X-Forwarded-Encrypted: i=1; AJvYcCXfIx8azxxWenGGq0s8KoPQfk5pXy4AXjTcm3c8g3lFhF6dwI/D0mU/KIegGNiE7zJ95DPrpE/jQrQQPlM=@vger.kernel.org X-Gm-Message-State: AOJu0YwDcBFmRHtV8Qsliu8SISUGixX/lg3QYNeb/oT9dEVxIG3amkHT Gv8QMiI9NiB372uavxczFKmsvp1VHzUmyl5tmj895Wkf2jkaqt8JO551 X-Gm-Gg: ASbGncuvEoDldGuovRK9RdEpmu1wvxAaaJvGT/QuyGz8lIVnZ/rLh3mYnlZoy/qgv5F bEGU3UH9rDBFJnSSBBCNokTd5GaPPdQliySivDJQvQHFo7DUejdJS4z8eXqOlHmO5fHtEHPXj+x TMxB6G7m4xjkmEL/8i9VBi2wp8Lhi1QOeGR4uM7uupDNeRwJyoFLH+sfrZk12d4rKDkVRlJPw6c 1FXRWnBM+R420Fp28Fg/KfJRggjsB9h5etlB+MOszHWwxQKqYxKFtCLN8xyhu9WfCTwrTVCJusc FBqemnE+dMpAGkdtSF5zDPwCRA/rjH6Ng/gZkGLSnSpXHhhpglDrjiBes+BnTn4jW/7sSxArA+H CDWHpcUvzDjMWePe2Ys7tlQYBFOn95Mwsvm7goR4XPcYSCzEq5jyXtb0/SAIm/kJXqBhd3l67Pl IP7WzUeBgfIYk= X-Google-Smtp-Source: AGHT+IG8EEwYKDe4752fihuiPCe3VzAnJwEodvoJBXr6/jhOceuh0a1JLYy/bZX7937V8Cg9Tlqlzg== X-Received: by 2002:a05:6a20:938e:b0:25c:3979:ec83 with SMTP id adf61e73a8af0-27aa99c1a45mr6611727637.58.1758172588580; Wed, 17 Sep 2025 22:16:28 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfec3c32fsm1027923b3a.71.2025.09.17.22.16.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:27 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id EB5551061EE6; Thu, 18 Sep 2025 14:16:26 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 03/14] um: nommu: memory handling Date: Thu, 18 Sep 2025 14:15:56 +0900 Message-ID: <5b248fc7351c6228f2a2bb9a4d33fddf3f1744ed.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit adds memory operations on UML under !MMU environment. Some part of the original UML code relying on CONFIG_MMU are excluded from compilation when !CONFIG_MMU. Additionally, generic functions such as uaccess, futex, memcpy/strnlen/strncpy can be used as user- and kernel-space share the address space in !CONFIG_MMU mode. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/um/Makefile | 4 ++++ arch/um/include/asm/futex.h | 4 ++++ arch/um/include/asm/mmu.h | 3 +++ arch/um/include/asm/mmu_context.h | 2 ++ arch/um/include/asm/uaccess.h | 7 ++++--- arch/um/kernel/mem.c | 3 ++- arch/um/os-Linux/mem.c | 4 ++++ arch/um/os-Linux/process.c | 4 ++-- 8 files changed, 25 insertions(+), 6 deletions(-) diff --git a/arch/um/Makefile b/arch/um/Makefile index 7be0143b5ba3..5371c9a1b11e 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -46,6 +46,10 @@ ARCH_INCLUDE :=3D -I$(srctree)/$(SHARED_HEADERS) ARCH_INCLUDE +=3D -I$(srctree)/$(HOST_DIR)/um/shared KBUILD_CPPFLAGS +=3D -I$(srctree)/$(HOST_DIR)/um =20 +ifneq ($(CONFIG_MMU),y) +core-y +=3D $(ARCH_DIR)/nommu/ +endif + # -Dvmap=3Dkernel_vmap prevents anything from referencing the libpcap.o sy= mbol so # named - it's a common symbol in libpcap, so we get a binary which crashe= s. # diff --git a/arch/um/include/asm/futex.h b/arch/um/include/asm/futex.h index 780aa6bfc050..785fd6649aa2 100644 --- a/arch/um/include/asm/futex.h +++ b/arch/um/include/asm/futex.h @@ -7,8 +7,12 @@ #include =20 =20 +#ifdef CONFIG_MMU int arch_futex_atomic_op_inuser(int op, u32 oparg, int *oval, u32 __user *= uaddr); int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval); +#else +#include +#endif =20 #endif diff --git a/arch/um/include/asm/mmu.h b/arch/um/include/asm/mmu.h index e9661846b4a3..9f30c69e5278 100644 --- a/arch/um/include/asm/mmu.h +++ b/arch/um/include/asm/mmu.h @@ -18,10 +18,13 @@ typedef struct mm_context { unsigned long sync_tlb_range_from; unsigned long sync_tlb_range_to; =20 +#ifndef CONFIG_MMU + unsigned long end_brk; #ifdef CONFIG_BINFMT_ELF_FDPIC unsigned long exec_fdpic_loadmap; unsigned long interp_fdpic_loadmap; #endif +#endif /* !CONFIG_MMU */ } mm_context_t; =20 #endif diff --git a/arch/um/include/asm/mmu_context.h b/arch/um/include/asm/mmu_co= ntext.h index c727e56ba116..528b217da285 100644 --- a/arch/um/include/asm/mmu_context.h +++ b/arch/um/include/asm/mmu_context.h @@ -18,11 +18,13 @@ static inline void switch_mm(struct mm_struct *prev, st= ruct mm_struct *next, { } =20 +#ifdef CONFIG_MMU #define init_new_context init_new_context extern int init_new_context(struct task_struct *task, struct mm_struct *mm= ); =20 #define destroy_context destroy_context extern void destroy_context(struct mm_struct *mm); +#endif =20 #include =20 diff --git a/arch/um/include/asm/uaccess.h b/arch/um/include/asm/uaccess.h index 1c6e0ae41b0c..b9677758e759 100644 --- a/arch/um/include/asm/uaccess.h +++ b/arch/um/include/asm/uaccess.h @@ -23,6 +23,7 @@ #define __addr_range_nowrap(addr, size) \ ((unsigned long) (addr) <=3D ((unsigned long) (addr) + (size))) =20 +#ifdef CONFIG_MMU extern unsigned long raw_copy_from_user(void *to, const void __user *from,= unsigned long n); extern unsigned long raw_copy_to_user(void __user *to, const void *from, u= nsigned long n); extern unsigned long __clear_user(void __user *mem, unsigned long len); @@ -34,9 +35,6 @@ static inline int __access_ok(const void __user *ptr, uns= igned long size); =20 #define INLINE_COPY_FROM_USER #define INLINE_COPY_TO_USER - -#include - static inline int __access_ok(const void __user *ptr, unsigned long size) { unsigned long addr =3D (unsigned long)ptr; @@ -70,5 +68,8 @@ do { \ barrier(); \ current->thread.segv_continue =3D NULL; \ } while (0) +#endif + +#include =20 #endif diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 106a2f85ab5c..4be1cf240d71 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -64,7 +64,8 @@ void __init arch_mm_preinit(void) * to be turned on. */ brk_end =3D (unsigned long) UML_ROUND_UP(sbrk(0)); - map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0); + map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, + !IS_ENABLED(CONFIG_MMU)); memblock_free((void *)brk_end, uml_reserved - brk_end); uml_reserved =3D brk_end; min_low_pfn =3D PFN_UP(__pa(uml_reserved)); diff --git a/arch/um/os-Linux/mem.c b/arch/um/os-Linux/mem.c index 72f302f4d197..4f5d9a94f8e2 100644 --- a/arch/um/os-Linux/mem.c +++ b/arch/um/os-Linux/mem.c @@ -213,6 +213,10 @@ int __init create_mem_file(unsigned long long len) { int err, fd; =20 + /* NOMMU kernel uses -1 as a fd for further use (e.g., mmap) */ + if (!IS_ENABLED(CONFIG_MMU)) + return -1; + fd =3D create_tmp_file(len); =20 err =3D os_set_exec_close(fd); diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index d000907ec796..bc598e661ec6 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -98,8 +98,8 @@ int os_map_memory(void *virt, int fd, unsigned long long = off, unsigned long len, prot =3D (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | (x ? PROT_EXEC : 0); =20 - loc =3D mmap64((void *) virt, len, prot, MAP_SHARED | MAP_FIXED, - fd, off); + loc =3D mmap64((void *) virt, len, prot, MAP_SHARED | MAP_FIXED | + (!IS_ENABLED(CONFIG_MMU) ? MAP_ANONYMOUS : 0), fd, off); if (loc =3D=3D MAP_FAILED) return -errno; return 0; --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9041A27E1DC for ; Thu, 18 Sep 2025 05:16:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172594; cv=none; b=q/pdeIVxEtGnxO64t+deFTLz8AHXsiypqb2KihB/v8VRcagJO6a8yRog40Uz0FR+dp494A3r/oWzNh9nw7WbOBHWt5hGZFBVVZgAmhC5MbqMrftNaVDJzAmxRQpXCrjK6voXbqQu72UpRTbecXBiG0N2gkI/PsMkOd6ky6DOuzg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172594; c=relaxed/simple; bh=Z6qZSB5ccwxVgYVj98AksF/DlcdpqcgoKyj9hpY/Brg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MXIHL7lBmgCBhwG7sg1cz3NCOmqvQNcE8JcKoiLDCAn+PrGhNTe27uckg3d4KZzMc+bFOOgok6Lm3JMikh2fB3+7q8tkGT0KdJkXxMtFkWpfhRirF9XgPQdASSCUaDvEzGy5DqRrjB6d7lGMjjE52QEhjkGOYBoPUAvLwlvQlaU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BILWPuBS; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BILWPuBS" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2698e4795ebso2356755ad.0 for ; Wed, 17 Sep 2025 22:16:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172591; x=1758777391; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MNruZWOB1A9W2xPWfDeeJw/PtthshopimV+lzxEm4to=; b=BILWPuBS861KpUGocDcp19/hWLMUgF6tITpf8G7zG0E/DhewSqa706J9yyH0s+dIsT ADoFEvLtmD2SEXxPGwww7awup+5U1H8IoP8t35nf2duMpOrIv8/n+Y8JY7US9kW974AA 3PnLtCBZzqXFGPnM63q2DDtVn+GEvaldQgsZ+18w7RKb9CcaQR4oue8FJG7iuBiGv9or 14U/p6FTxbmBHP8lQNRjUqX4pYHcsBQj0RkOb8r6HvesUW93GFSdJ+2VwViPJJggzDUa 3208UGQtQ/VkUYxdHWxu2VbWbHGxWX2RQBlQHc8QeN89sHUP6eXvV+c2hmIbZqICUlrz S71A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172591; x=1758777391; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MNruZWOB1A9W2xPWfDeeJw/PtthshopimV+lzxEm4to=; b=GrodupRLvw2YzXHN3cE1XwVIMhkNf8CCFM5lryizzIMEewWVuWK+9gVRYbwf0F2jJ+ nFi9oxzpAlC+8VjCLfF/0EnW7Cm4xMbOuwEYIH1hUvIyEWCdV/JpYdvdC2LEdkpLOHP3 9ZAOtxo525keVMQHBz1QjDnVupseVN/qVFgJDJZMd04BGH7nkHIkReBGIXPP5fiZ2j5r xd+iwRQ42Pj8VugLnX5t5HCldUHVuWEezTkaxOHQlikanEe/gPUd5JPMkeyOtsIF9dr4 lH+bvX8i0Xk2E5O3X6No1KBheJEU2mfpx0xtcsB4xsS9uw2Wnvj1mipG02aDPD8mzlHT kdtg== X-Forwarded-Encrypted: i=1; AJvYcCUmE8JaVr2o7wIK5kCBYnIt4MRYqibPjp2BP7f0XQcELQ3zI8yMSxqPt7HiEIXYuWglUUnL/vL9pxXyAfE=@vger.kernel.org X-Gm-Message-State: AOJu0YwkKkPsNtxXKwVRLlRUn49UZ1miJAJgGd2U25Z5qYwtB252/CVF h/tROTWubEQ0GbujnoWZXhSfdScSpQaHXtYF+DkvTEr/aCcLT9y1siDz X-Gm-Gg: ASbGncsCueIzn+DUmCzDhV/rudFluPLcunm5VYqtlCznLKeiVv1lpa4yMduHUdraIRC HXmkVvcANGJtv1HjrjnrJcWZ8e36g3kFVqYJPwWLGUS8iYc6hIkerMPpsw1tcqTVKUw5V2NJUgA gD+UnvXBJB/9uqIFeRRMVH4FFs4mGlEBcllIaqb33+PU0Y4UkP0ERaBl9jFrCvVhlEmkoe89ilP /B/iM+HlYvNFWyDybnJTXn9DCRTuKUnYUz4A0XkTQan0p9QKz5U3GoS3DsFrgw3mmtOubwmRtH8 ws8bOmy7gzsu0RtufaDs3vjsIk/kR88bTWIfrbE3fJE3hFmdKvrqg8rhulTi7U/Co862jHwFENa gjgb85q2TmnQIaC4eTA9Vlw7i5jGr9mvRF5ZgiTJG1AH2Xc+tXzD4e+F34mQayY9a3NMv2Z88Gt sbpzKOOzdvM3plqBSVEYrrYg== X-Google-Smtp-Source: AGHT+IGDcPCTQRDQJloTH9BdqlAOj6e2/TUJJrtVUeXUVjBEic4MtyF8+jxmHyt7EO3Nq8kgKfGCdw== X-Received: by 2002:a17:902:d504:b0:258:9d26:1860 with SMTP id d9443c01a7336-26813902e19mr67208525ad.40.1758172590685; Wed, 17 Sep 2025 22:16:30 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269802deeb1sm12286825ad.78.2025.09.17.22.16.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:30 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 4EAD71061EE8; Thu, 18 Sep 2025 14:16:28 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 04/14] x86/um: nommu: syscall handling Date: Thu, 18 Sep 2025 14:15:57 +0900 Message-ID: <99a54b96cee85275692ca01fe4a0ef0d83996f0f.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit introduces an entry point of syscall interface for !MMU mode. It uses an entry function, __kernel_vsyscall, a kernel-wide global symbol accessible from any locations. Although it isn't in the scope of this commit, it can be also exposed via vdso image which is directly accessible from userspace. A standard library (i.e., libc) can utilize this entry point to implement syscall wrapper; we can also use this by hooking syscall for unmodified userspace applications/libraries, which will be implemented in the subsequent commit. This only supports 64-bit mode of x86 architecture. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/x86/um/Makefile | 4 ++ arch/x86/um/asm/syscall.h | 6 ++ arch/x86/um/nommu/Makefile | 8 +++ arch/x86/um/nommu/do_syscall_64.c | 32 +++++++++ arch/x86/um/nommu/entry_64.S | 112 ++++++++++++++++++++++++++++++ arch/x86/um/nommu/syscalls.h | 16 +++++ 6 files changed, 178 insertions(+) create mode 100644 arch/x86/um/nommu/Makefile create mode 100644 arch/x86/um/nommu/do_syscall_64.c create mode 100644 arch/x86/um/nommu/entry_64.S create mode 100644 arch/x86/um/nommu/syscalls.h diff --git a/arch/x86/um/Makefile b/arch/x86/um/Makefile index b42c31cd2390..227af2a987e2 100644 --- a/arch/x86/um/Makefile +++ b/arch/x86/um/Makefile @@ -32,6 +32,10 @@ obj-y +=3D syscalls_64.o vdso/ subarch-y =3D ../lib/csum-partial_64.o ../lib/memcpy_64.o \ ../lib/memmove_64.o ../lib/memset_64.o =20 +ifneq ($(CONFIG_MMU),y) +obj-y +=3D nommu/ +endif + endif =20 subarch-$(CONFIG_MODULES) +=3D ../kernel/module.o diff --git a/arch/x86/um/asm/syscall.h b/arch/x86/um/asm/syscall.h index d6208d0fad51..bb4f6f011667 100644 --- a/arch/x86/um/asm/syscall.h +++ b/arch/x86/um/asm/syscall.h @@ -20,4 +20,10 @@ static inline int syscall_get_arch(struct task_struct *t= ask) #endif } =20 +#ifndef CONFIG_MMU +extern void do_syscall_64(struct pt_regs *regs); +extern long __kernel_vsyscall(int64_t a0, int64_t a1, int64_t a2, int64_t = a3, + int64_t a4, int64_t a5, int64_t a6); +#endif + #endif /* __UM_ASM_SYSCALL_H */ diff --git a/arch/x86/um/nommu/Makefile b/arch/x86/um/nommu/Makefile new file mode 100644 index 000000000000..d72c63afffa5 --- /dev/null +++ b/arch/x86/um/nommu/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 +ifeq ($(CONFIG_X86_32),y) + BITS :=3D 32 +else + BITS :=3D 64 +endif + +obj-y =3D do_syscall_$(BITS).o entry_$(BITS).o diff --git a/arch/x86/um/nommu/do_syscall_64.c b/arch/x86/um/nommu/do_sysca= ll_64.c new file mode 100644 index 000000000000..292d7c578622 --- /dev/null +++ b/arch/x86/um/nommu/do_syscall_64.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include + +__visible void do_syscall_64(struct pt_regs *regs) +{ + int syscall; + + syscall =3D PT_SYSCALL_NR(regs->regs.gp); + UPT_SYSCALL_NR(®s->regs) =3D syscall; + + if (likely(syscall < NR_syscalls)) { + unsigned long ret; + + ret =3D (*sys_call_table[syscall])(UPT_SYSCALL_ARG1(®s->regs), + UPT_SYSCALL_ARG2(®s->regs), + UPT_SYSCALL_ARG3(®s->regs), + UPT_SYSCALL_ARG4(®s->regs), + UPT_SYSCALL_ARG5(®s->regs), + UPT_SYSCALL_ARG6(®s->regs)); + PT_REGS_SET_SYSCALL_RETURN(regs, ret); + } + + PT_REGS_SYSCALL_RET(regs) =3D regs->regs.gp[HOST_AX]; + + /* handle tasks and signals at the end */ + interrupt_end(); +} diff --git a/arch/x86/um/nommu/entry_64.S b/arch/x86/um/nommu/entry_64.S new file mode 100644 index 000000000000..485c578aae64 --- /dev/null +++ b/arch/x86/um/nommu/entry_64.S @@ -0,0 +1,112 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#include + +#include +#include +#include + +#include "../entry/calling.h" + +#ifdef CONFIG_SMP +#error need to stash these variables somewhere else +#endif + +#define UM_GLOBAL_VAR(x) .data; .align 8; .globl x; x:; .long 0 + +UM_GLOBAL_VAR(current_top_of_stack) +UM_GLOBAL_VAR(current_ptregs) + +.code64 +.section .entry.text, "ax" + +.align 8 +#undef ENTRY +#define ENTRY(x) .text; .globl x; .type x,%function; x: +#undef END +#define END(x) .size x, . - x + +/* + * %rcx has the return address (we set it before entering __kernel_vsyscal= l). + * + * Registers on entry: + * rax system call number + * rcx return address + * rdi arg0 + * rsi arg1 + * rdx arg2 + * r10 arg3 + * r8 arg4 + * r9 arg5 + * + * (note: we are allowed to mess with r11: r11 is callee-clobbered + * register in C ABI) + */ +ENTRY(__kernel_vsyscall) + + movq %rsp, %r11 + + /* Point rsp to the top of the ptregs array, so we can + just fill it with a bunch of push'es. */ + movq current_ptregs, %rsp + + /* 8 bytes * 20 registers (plus 8 for the push) */ + addq $168, %rsp + + /* Construct struct pt_regs on stack */ + pushq $0 /* pt_regs->ss (index 20) */ + pushq %r11 /* pt_regs->sp */ + pushfq /* pt_regs->flags */ + pushq $0 /* pt_regs->cs */ + pushq %rcx /* pt_regs->ip */ + pushq %rax /* pt_regs->orig_ax */ + + PUSH_AND_CLEAR_REGS rax=3D$-ENOSYS + + mov %rsp, %rdi + + /* + * Switch to current top of stack, so "current->" points + * to the right task. + */ + movq current_top_of_stack, %rsp + + call do_syscall_64 + + jmp userspace + +END(__kernel_vsyscall) + +/* + * common userspace returning routine + * + * all procedures like syscalls, signal handlers, umh processes, will gate + * this routine to properly configure registers/stacks. + * + * void userspace(struct uml_pt_regs *regs) + */ +ENTRY(userspace) + + /* clear direction flag to meet ABI */ + cld + /* align the stack for x86_64 ABI */ + and $-0x10, %rsp + /* Handle any immediate reschedules or signals */ + call interrupt_end + + movq current_ptregs, %rsp + + POP_REGS + + addq $8, %rsp /* skip orig_ax */ + popq %rcx /* pt_regs->ip */ + addq $8, %rsp /* skip cs */ + addq $8, %rsp /* skip flags */ + popq %rsp + + /* + * not return w/ ret but w/ jmp as the stack is already popped before + * entering __kernel_vsyscall + */ + jmp *%rcx + +END(userspace) diff --git a/arch/x86/um/nommu/syscalls.h b/arch/x86/um/nommu/syscalls.h new file mode 100644 index 000000000000..a2433756b1fc --- /dev/null +++ b/arch/x86/um/nommu/syscalls.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __UM_NOMMU_SYSCALLS_H +#define __UM_NOMMU_SYSCALLS_H + + +#define task_top_of_stack(task) \ +({ \ + unsigned long __ptr =3D (unsigned long)task->stack; \ + __ptr +=3D THREAD_SIZE; \ + __ptr; \ +}) + +extern long current_top_of_stack; +extern long current_ptregs; + +#endif --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DAC30288C39 for ; Thu, 18 Sep 2025 05:16:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172595; cv=none; b=LtkbimyVxS+G18KLY+fpjY6npsshpfQdWLdK9cOuMb49IlZpp4zdQel1tAkHBtiXfcsxLEvu5TTCNQdu5sd2VSIQeqZd3ancK0TB/W9Sie8nMX1h6yiJ3sHKHpqunDMxH08b7wyawCcATPlAWfjUiEIPM/XUNgazme2KitXmzB4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172595; c=relaxed/simple; bh=7/bypW60GL8eL/uqYkt5R7qvzBuLOGenTkwRBAP7t9k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VUJdDNuQfECPB4Y25zZGTY9JIrg2em7AAqZdYojJZxr+fZrNOFf5B1wXtuKVe8EEaz/Y4PxKatDnnanyKOIhgfirI9yEKihSrRyzna+UVPIeg+Hywe0i0Teg0BL5IL+zwep0nKQGArfMJBGy07Ib7JxvZntiuneJJSBgGBkga/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Xwh+HCy9; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Xwh+HCy9" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-32ee4817c43so430056a91.0 for ; Wed, 17 Sep 2025 22:16:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172593; x=1758777393; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=q19q5PL21Wai78SSc2mwVr4TVT2qO2bW74gFJJ8pT9o=; b=Xwh+HCy9RhW5Uyvt/EAa3N6IJH7OP3t8KW2n7wHGH0Tr7rh9oAkc3UaYEx1HYB1XVA fj6sNBi1dfhghlzAwxYs2gHWWJxYVHmYj56TvD6bbfjLz6scAKL0zFTcn7Npdx5jREi7 Yr2zH6EnLggdg4aP/rwFCCtFiXw2tP99YKAGOYAXKXzH/o0AI5wK1FwU36efLOKCEp+A 2zBFBBtCG4UIzteH/bfBeGpi5AivcHvW9CRyskYregXdR09ZDwVZNBOuLrcNkMqy/Yhk lWnv9NfvlGoYkLmtfWTQc3YkoXzHUjAdVl8ctIUohMJoQSLY+4BypGfnfBlsDIc3l1ng aRAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172593; x=1758777393; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=q19q5PL21Wai78SSc2mwVr4TVT2qO2bW74gFJJ8pT9o=; b=Q7GQavSAn+ywv3QcRY/3Ww0EYRcv375yn8xTYj/+VUcuMhLAnqQTOhiLf9zSBFIBOF T9qFkv4lw/IUjS/0o1T4ADyXVlDGUMy5OyHLKImDnx91USRNJm4Vd6h3fv/9eOsaHhdb +oWUuG2ll9+UXd5n0Hr70TqwWUhSf+s3Fu4aV+j4LZ81XlA/4wC0qDZ+rHSmJyFnuNos hgMwBGSrsE3TJh5kQEGvOFs1rS8gmu7ixuMpi5lXQfarO7GtUmV2vVpxbX7MHQzv9YCF JjMxgk5Wsz1XfrFrWgJri5L7bYf8ECa0xFOBQYUHGJ/uxFT4A3Zr6TEwON5zDQB1KQ0k M0dQ== X-Forwarded-Encrypted: i=1; AJvYcCX0KKbogh3L9ZLQi4AHPpKgTf8O2PBAi81EXi0iTi9rG+o4nJ8MJv1gl6tUtgdEgEX17yvKNGjPZPqCz9E=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/nA20o0Wss5YNMFgSTQa+4jNO8/ZGdSJNEndUG966MMKBePVJ 9Lj1NLNxL64FInOQqQ8Xa48sztSmIRqA+D8g7rvALVRA9N/k8uTq0FUP X-Gm-Gg: ASbGnctVE45FfE3YhP7ZSvaNcV1gtHdssVXaJNo43Uw7e3i++egogLnoa87/nDzZaC1 Qhq79ah1CRnzdjLG1ILdHjHcu34NETA8JjNNZqGpD4hE/5WMpLYdlRITd2OyuVKS6fbmPu9JRjo YE2D7NVj30GsCR5DwCi9ek6liDf4OGt57SbHIqF5n7CZ54+fH1vdDxDHA7PmFJr7c9adR+bduU3 tIb5waPl0Xs/dEJoo4bx2Dy691nE0N/YIwLYK1CpJXw74XnnUF5L8N+lpXkrveFUJjplC8jespl c9dUTcnuGWezZ/VPsCWbRCNd0Za86V8BhtIjzdURG0g1KumwESNs5hgMjGY4G2uA4Matl1FOBQP TV8rizH4sHxZuqbRBWYeFP+pntn/0C9/KRfY/rU8EM3wh+ywADZCFfPtPUFlDe4Q1uIZsEm67uI mWJ6mcMQbdVYs= X-Google-Smtp-Source: AGHT+IGPq6NoJecMSRuhP/l9ouJtlFCnSkKR9+iBv1QGL1Q1oGRUhlnsX+GsoH3jhGeW+/vjvX25Wg== X-Received: by 2002:a17:90b:3f0f:b0:32d:e309:8d76 with SMTP id 98e67ed59e1d1-3305c64978fmr2409491a91.10.1758172592958; Wed, 17 Sep 2025 22:16:32 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-33046a4d0basm2726998a91.27.2025.09.17.22.16.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:32 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 003E61061EEA; Thu, 18 Sep 2025 14:16:31 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org, Kenichi Yasukata Subject: [PATCH v11 05/14] um: nommu: seccomp syscalls hook Date: Thu, 18 Sep 2025 14:15:58 +0900 Message-ID: <952f2620bf435d90358bf5868a17ec27f213bf3f.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit adds syscall hook with seccomp. Using seccomp raises SIGSYS to UML process, which is captured in the (UML) kernel, then jumps to the syscall entry point, __kernel_vsyscall, to hook the original syscall instructions. The SIGSYS signal is raised upon the execution from uml_reserved and high_physmem, which locates userspace memory. It also renames existing static function, sigsys_handler(), in start_up.c to avoid name conflicts between them. Signed-off-by: Hajime Tazaki Signed-off-by: Kenichi Yasukata --- arch/um/include/shared/kern_util.h | 2 + arch/um/include/shared/os.h | 10 +++ arch/um/kernel/um_arch.c | 3 + arch/um/nommu/Makefile | 3 + arch/um/nommu/os-Linux/Makefile | 7 +++ arch/um/nommu/os-Linux/signal.c | 16 +++++ arch/um/os-Linux/Makefile | 5 ++ arch/um/os-Linux/seccomp.c | 87 +++++++++++++++++++++++++++ arch/um/os-Linux/signal.c | 8 +++ arch/um/os-Linux/start_up.c | 4 +- arch/x86/um/nommu/Makefile | 2 +- arch/x86/um/nommu/os-Linux/Makefile | 6 ++ arch/x86/um/nommu/os-Linux/mcontext.c | 15 +++++ arch/x86/um/shared/sysdep/mcontext.h | 4 ++ 14 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 arch/um/nommu/Makefile create mode 100644 arch/um/nommu/os-Linux/Makefile create mode 100644 arch/um/nommu/os-Linux/signal.c create mode 100644 arch/um/os-Linux/seccomp.c create mode 100644 arch/x86/um/nommu/os-Linux/Makefile create mode 100644 arch/x86/um/nommu/os-Linux/mcontext.c diff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/ke= rn_util.h index 00ca3e12fd9a..ec8ba1f13c58 100644 --- a/arch/um/include/shared/kern_util.h +++ b/arch/um/include/shared/kern_util.h @@ -66,6 +66,8 @@ extern void segv_handler(int sig, struct siginfo *unused_= si, struct uml_pt_regs extern void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *= regs, void *mc); extern void fatal_sigsegv(void) __attribute__ ((noreturn)); +extern void sigsys_handler(int sig, struct siginfo *si, struct uml_pt_regs= *regs, + void *mc); =20 void um_idle_sleep(void); =20 diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index b35cc8ce333b..1251f08e26d0 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -338,4 +338,14 @@ extern void um_trace_signals_off(void); /* time-travel */ extern void deliver_time_travel_irqs(void); =20 +/* seccomp.c */ +#ifdef CONFIG_MMU +static inline int os_setup_seccomp(void) +{ + return 0; +} +#else +extern int os_setup_seccomp(void); +#endif + #endif diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index cfbbbf8500c3..e90b8744144a 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -426,6 +426,9 @@ void __init setup_arch(char **cmdline_p) add_bootloader_randomness(rng_seed, sizeof(rng_seed)); memzero_explicit(rng_seed, sizeof(rng_seed)); } + + /* install seccomp filter */ + os_setup_seccomp(); } =20 void __init arch_cpu_finalize_init(void) diff --git a/arch/um/nommu/Makefile b/arch/um/nommu/Makefile new file mode 100644 index 000000000000..baab7c2f57c2 --- /dev/null +++ b/arch/um/nommu/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-y :=3D os-Linux/ diff --git a/arch/um/nommu/os-Linux/Makefile b/arch/um/nommu/os-Linux/Makef= ile new file mode 100644 index 000000000000..68833c576437 --- /dev/null +++ b/arch/um/nommu/os-Linux/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-y :=3D signal.o +USER_OBJS :=3D $(obj-y) + +include $(srctree)/arch/um/scripts/Makefile.rules +USER_CFLAGS+=3D-I$(srctree)/arch/um/os-Linux diff --git a/arch/um/nommu/os-Linux/signal.c b/arch/um/nommu/os-Linux/signa= l.c new file mode 100644 index 000000000000..19043b9652e2 --- /dev/null +++ b/arch/um/nommu/os-Linux/signal.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include + +void sigsys_handler(int sig, struct siginfo *si, + struct uml_pt_regs *regs, void *ptr) +{ + mcontext_t *mc =3D (mcontext_t *) ptr; + + /* hook syscall via SIGSYS */ + set_mc_sigsys_hook(mc); +} diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index c048fc838068..432476a4239a 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile @@ -21,4 +21,9 @@ USER_OBJS :=3D $(user-objs-y) elf_aux.o execvp.o file.o h= elper.o irq.o \ main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ tty.o umid.o util.o =20 +ifneq ($(CONFIG_MMU),y) +obj-y +=3D seccomp.o +USER_OBJS +=3D seccomp.o +endif + include $(srctree)/arch/um/scripts/Makefile.rules diff --git a/arch/um/os-Linux/seccomp.c b/arch/um/os-Linux/seccomp.c new file mode 100644 index 000000000000..d1cfa6e3d632 --- /dev/null +++ b/arch/um/os-Linux/seccomp.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include /* For SYS_xxx definitions */ +#include +#include +#include +#include +#include + +int __init os_setup_seccomp(void) +{ + int err; + unsigned long __userspace_start =3D uml_reserved, + __userspace_end =3D high_physmem; + + struct sock_filter filter[] =3D { + /* if (IP_high > __userspace_end) allow; */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer) + 4), + BPF_JUMP(BPF_JMP + BPF_JGT + BPF_K, __userspace_end >> 32, + /*true-skip=3D*/0, /*false-skip=3D*/1), + BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), + + /* if (IP_high =3D=3D __userspace_end && IP_low >=3D __userspace_end) al= low; */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer) + 4), + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, __userspace_end >> 32, + /*true-skip=3D*/0, /*false-skip=3D*/3), + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer)), + BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, __userspace_end, + /*true-skip=3D*/0, /*false-skip=3D*/1), + BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), + + /* if (IP_high < __userspace_start) allow; */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer) + 4), + BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, __userspace_start >> 32, + /*true-skip=3D*/1, /*false-skip=3D*/0), + BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), + + /* if (IP_high =3D=3D __userspace_start && IP_low < __userspace_start) a= llow; */ + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer) + 4), + BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, __userspace_start >> 32, + /*true-skip=3D*/0, /*false-skip=3D*/3), + BPF_STMT(BPF_LD + BPF_W + BPF_ABS, + offsetof(struct seccomp_data, instruction_pointer)), + BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, __userspace_start, + /*true-skip=3D*/1, /*false-skip=3D*/0), + BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), + + /* other address; trap */ + BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_TRAP), + }; + struct sock_fprog prog =3D { + .len =3D ARRAY_SIZE(filter), + .filter =3D filter, + }; + + err =3D prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); + if (err) + os_warn("PR_SET_NO_NEW_PRIVS (err=3D%d, ernro=3D%d)\n", + err, errno); + + err =3D syscall(SYS_seccomp, SECCOMP_SET_MODE_FILTER, + SECCOMP_FILTER_FLAG_TSYNC, &prog); + if (err) { + os_warn("SECCOMP_SET_MODE_FILTER (err=3D%d, ernro=3D%d)\n", + err, errno); + exit(1); + } + + set_handler(SIGSYS); + + os_info("seccomp: setup filter syscalls in the range: 0x%lx-0x%lx\n", + __userspace_start, __userspace_end); + + return 0; +} + diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 11f07f498270..53e276e81b37 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -20,6 +20,7 @@ #include #include #include +#include =20 void (*sig_info[NSIG])(int, struct siginfo *, struct uml_pt_regs *, void *= mc) =3D { [SIGTRAP] =3D relay_signal, @@ -30,6 +31,7 @@ void (*sig_info[NSIG])(int, struct siginfo *, struct uml_= pt_regs *, void *mc) =3D [SIGSEGV] =3D segv_handler, [SIGIO] =3D sigio_handler, [SIGCHLD] =3D sigchld_handler, + [SIGSYS] =3D sigsys_handler, }; =20 static void sig_handler_common(int sig, struct siginfo *si, mcontext_t *mc) @@ -176,6 +178,11 @@ static void sigusr1_handler(int sig, struct siginfo *u= nused_si, mcontext_t *mc) uml_pm_wake(); } =20 +__weak void sigsys_handler(int sig, struct siginfo *unused_si, + struct uml_pt_regs *regs, void *mc) +{ +} + void register_pm_wake_signal(void) { set_handler(SIGUSR1); @@ -187,6 +194,7 @@ static void (*handlers[_NSIG])(int sig, struct siginfo = *si, mcontext_t *mc) =3D { [SIGILL] =3D sig_handler, [SIGFPE] =3D sig_handler, [SIGTRAP] =3D sig_handler, + [SIGSYS] =3D sig_handler, =20 [SIGIO] =3D sig_handler, [SIGWINCH] =3D sig_handler, diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c index a827c2e01aa5..4e1f05360c49 100644 --- a/arch/um/os-Linux/start_up.c +++ b/arch/um/os-Linux/start_up.c @@ -238,7 +238,7 @@ extern unsigned long *exec_fp_regs; =20 __initdata static struct stub_data *seccomp_test_stub_data; =20 -static void __init sigsys_handler(int sig, siginfo_t *info, void *p) +static void __init _sigsys_handler(int sig, siginfo_t *info, void *p) { ucontext_t *uc =3D p; =20 @@ -273,7 +273,7 @@ static int __init seccomp_helper(void *data) sizeof(seccomp_test_stub_data->sigstack)); =20 sa.sa_flags =3D SA_ONSTACK | SA_NODEFER | SA_SIGINFO; - sa.sa_sigaction =3D (void *) sigsys_handler; + sa.sa_sigaction =3D (void *) _sigsys_handler; sa.sa_restorer =3D NULL; if (sigaction(SIGSYS, &sa, NULL) < 0) exit(2); diff --git a/arch/x86/um/nommu/Makefile b/arch/x86/um/nommu/Makefile index d72c63afffa5..ebe47d4836f4 100644 --- a/arch/x86/um/nommu/Makefile +++ b/arch/x86/um/nommu/Makefile @@ -5,4 +5,4 @@ else BITS :=3D 64 endif =20 -obj-y =3D do_syscall_$(BITS).o entry_$(BITS).o +obj-y =3D do_syscall_$(BITS).o entry_$(BITS).o os-Linux/ diff --git a/arch/x86/um/nommu/os-Linux/Makefile b/arch/x86/um/nommu/os-Lin= ux/Makefile new file mode 100644 index 000000000000..4571e403a6ff --- /dev/null +++ b/arch/x86/um/nommu/os-Linux/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-y =3D mcontext.o +USER_OBJS :=3D mcontext.o + +include $(srctree)/arch/um/scripts/Makefile.rules diff --git a/arch/x86/um/nommu/os-Linux/mcontext.c b/arch/x86/um/nommu/os-L= inux/mcontext.c new file mode 100644 index 000000000000..b62a6195096f --- /dev/null +++ b/arch/x86/um/nommu/os-Linux/mcontext.c @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#define __FRAME_OFFSETS +#include +#include +#include + +extern long __kernel_vsyscall(int64_t a0, int64_t a1, int64_t a2, int64_t = a3, + int64_t a4, int64_t a5, int64_t a6); + +void set_mc_sigsys_hook(mcontext_t *mc) +{ + mc->gregs[REG_RCX] =3D mc->gregs[REG_RIP]; + mc->gregs[REG_RIP] =3D (unsigned long) __kernel_vsyscall; +} diff --git a/arch/x86/um/shared/sysdep/mcontext.h b/arch/x86/um/shared/sysd= ep/mcontext.h index 6fe490cc5b98..9a0d6087f357 100644 --- a/arch/x86/um/shared/sysdep/mcontext.h +++ b/arch/x86/um/shared/sysdep/mcontext.h @@ -17,6 +17,10 @@ extern int get_stub_state(struct uml_pt_regs *regs, stru= ct stub_data *data, extern int set_stub_state(struct uml_pt_regs *regs, struct stub_data *data, int single_stepping); =20 +#ifndef CONFIG_MMU +extern void set_mc_sigsys_hook(mcontext_t *mc); +#endif + #ifdef __i386__ =20 #define GET_FAULTINFO_FROM_MC(fi, mc) \ --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F386D296BA2 for ; Thu, 18 Sep 2025 05:16:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172599; cv=none; b=YkNvEDQlDCLZNp+akHxVVLFkWdft2hQP9LzYIxmqhKWrUkpYOh/DEk/cYZ9+whFcxoOl9+PXVErSBY0aF7Tt4e6UApshMWvSYtNT06sE4nyCmQHwC8+uVxpfCyqk7ruHEVyrAdAcer94nVxIWGubfDdR8yFXy5FNe4hP05+6DEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172599; c=relaxed/simple; bh=Spi61onNNaOtQ/uC59E8UPShdVaOx9lbkbExtWbBzy8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NwZodmQcXYP1Kohs+zFheuQ9we3r4YXNCflYADzB4W2TdBrdUoUvdSR3yU2z1QUwEc65i+H7B4WREn1NoWGgq7nHXhfjsA+MHBt7R+XWKydpupfvjrCpVk9mJoi3NnF3+brZoZbrFTP8a95KYjZAWlTdZvvi3NvUuv+29oBhykw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Gj9lHcgU; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Gj9lHcgU" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-b4c3d8bd21eso347061a12.2 for ; Wed, 17 Sep 2025 22:16:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172597; x=1758777397; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JKlVdGR3DDGWOcc4/nfzMKG19h1bO7GYSLtWMup+EQg=; b=Gj9lHcgUVcoreXR+B6jm0TviPWsDO+Nxh7Q0FRbUBTqtA3d6Wslj7nE5Cl+j9AigJZ GmzJwoNmxVTatnToSBLYp0TwqqtUPp2yL1RDbJlpEVj2s8XlgDgCAzajmXLGahWUoGV1 J+inQHXHA2eSV5NL7IVBpdo7YnE3sufotBY140e/X/MsK+/JessEk5uUjMGLB9wZtNyx rzfWFnKeXUmjzut3A7f51VWcHOjxF90P3bbhZzB/PHOuBXqLPD6VxWIj2e/ytsD93KF1 tRfs38AeyxL3OW41sJjjc+139HM9GIupdH2+eA7E55IZ5WUyAdOBPSsK8yxst5/smC9c TvSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172597; x=1758777397; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JKlVdGR3DDGWOcc4/nfzMKG19h1bO7GYSLtWMup+EQg=; b=KhMpgayjsd7NSS7KSw7dtZQeA3cZN3UPvIrPQhFX6rnC42bEAM3TMwhfpEWg0wrCGs 6cohEm7TMx2dFAK8b1RNKKCtulGrqWHVFJDLwjFYuwd82qJi/lFqOLUKb0/ifa/Mzmop dpRKrBt/Xp2x2Kh5Z17SYDaLeHngnPCH6vC9tB8b6gbkZXa8Frz8yTVH2v7a90RO54gU taClv0NUk3TceKXk1x5gr6VlwX3xYl6II1B2Z+Ow68F56Aek7xW0rOKpJoYMKUf6zAWA m9OSEfnXx7bDQqiGqp4VTXiCOMZAcG+5fpKTvqHhjSw+yFqL6Y+FmHUFHGT2m36EsiP6 DdqA== X-Forwarded-Encrypted: i=1; AJvYcCW+S8rB2G7RhCOT+DfyorQX0BU8/0zulDa8gtgfBFcSadPezToT9dP5AES4ESAQCBJcvNgsiPIUdtw8Xbk=@vger.kernel.org X-Gm-Message-State: AOJu0YwPERuPB0RQTH0jlPsSxF6SL2yWSA4mPqSqspBygE+GC9tI2Twf 7r49aRwHN1t8Sd32sypj4g8kJokU67AMaBouZeDTi0k+DhefqUqWsVLE2KS8PQ== X-Gm-Gg: ASbGncvT8TpLcOnSRW8LkJv5fz2zZe2sZANa5oKMn3VggfDnNwkBKrxgvtEDmlAxa3e maZzokEAR+biBRbg3pewp/s11lWOfei08U/Yv8VjTA1UGLy6b59wc9Hrh5ODpfT7LqiWmiqzuLk Yac3O7rRJVBlAj40jI8iqE2q1C0Myb/xFfu1P6vlWfCy/weQlBiml8Qk01dcI4Md3rJH1P2lGhr jPhSG9WL/YZv6jsWX3+86fzWYyEle+6kFAtZv+J2pqbCMWtThCX6yDAh0/2KYWnI4uxumG3abMt J2BJ7mBCsNmusOrvkyS9gM9rH4yagiky1mQfzkAIiZ0M6aMRjfHO6eyFXzczczEgM2avd0ug4/X l1l9U16HFHs8w4rMyxMAb+atZkNQPEbd1SXBG7dJXNzY2KufPTtciHSk44/tU6zcdmNsCPxgJ9d bHh6P7FY9UIUM= X-Google-Smtp-Source: AGHT+IGCbT607NrmgHz5Q3KgCNRtitF2Ip3ekkLRwWL5RuIU+yeUgrW6R7+caKPoVbPB2OrdzbDjGQ== X-Received: by 2002:a17:902:d2c5:b0:269:9a71:dc71 with SMTP id d9443c01a7336-2699a71ded8mr3010715ad.16.1758172597074; Wed, 17 Sep 2025 22:16:37 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2698016d9d5sm12830035ad.53.2025.09.17.22.16.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:36 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 734B71061EEC; Thu, 18 Sep 2025 14:16:34 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 06/14] fixup seccomp Date: Thu, 18 Sep 2025 14:15:59 +0900 Message-ID: <6adb6305c2c84d715d37642ee9cd4f5a28719979.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" --- arch/um/nommu/os-Linux/Makefile | 2 +- arch/um/{ =3D> nommu}/os-Linux/seccomp.c | 0 arch/um/os-Linux/Makefile | 5 ----- 3 files changed, 1 insertion(+), 6 deletions(-) rename arch/um/{ =3D> nommu}/os-Linux/seccomp.c (100%) diff --git a/arch/um/nommu/os-Linux/Makefile b/arch/um/nommu/os-Linux/Makef= ile index 68833c576437..805e26ccf63b 100644 --- a/arch/um/nommu/os-Linux/Makefile +++ b/arch/um/nommu/os-Linux/Makefile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 =20 -obj-y :=3D signal.o +obj-y :=3D seccomp.o signal.o USER_OBJS :=3D $(obj-y) =20 include $(srctree)/arch/um/scripts/Makefile.rules diff --git a/arch/um/os-Linux/seccomp.c b/arch/um/nommu/os-Linux/seccomp.c similarity index 100% rename from arch/um/os-Linux/seccomp.c rename to arch/um/nommu/os-Linux/seccomp.c diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile index 432476a4239a..c048fc838068 100644 --- a/arch/um/os-Linux/Makefile +++ b/arch/um/os-Linux/Makefile @@ -21,9 +21,4 @@ USER_OBJS :=3D $(user-objs-y) elf_aux.o execvp.o file.o h= elper.o irq.o \ main.o mem.o process.o registers.o sigio.o signal.o start_up.o time.o \ tty.o umid.o util.o =20 -ifneq ($(CONFIG_MMU),y) -obj-y +=3D seccomp.o -USER_OBJS +=3D seccomp.o -endif - include $(srctree)/arch/um/scripts/Makefile.rules --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E79F298CC0 for ; Thu, 18 Sep 2025 05:16:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172601; cv=none; b=cYlFnmkoAruSf8ftDemunYBQSVMX4Mnu35+dKgOfld7c/iOuXxPRn5xk1Gkg3eQME5DDjNtGKUYMr8Kg4n4AY1BgxWFGyud7+TWHEo+TTM2ycQ3LiCzxYJyrKqZu1liVsEo8PAc0nwAzxdAgwdTpKLf7ocjam4+LI9g0fLJOaG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172601; c=relaxed/simple; bh=asugRdDdRMBxIe1EMSyil3lIrPO4TUilJEIW10zlNcg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dunOABWux3TsTPqeG7pb61Qlp0jig3z+MMERm436znrzue82mOQFB24Gl9D+WDMf446YysfHYJfAMdcUeUyc8i1uQH5MdKkcxoVJkEfFADrdsANeloJ3gN5a17AP7v+VmnQFnbq6bEJ7BJh5qHrSW5Sm/GoMupT0sBC0UM4rXYM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Wkn37IH8; arc=none smtp.client-ip=209.85.215.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Wkn37IH8" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-b5507d3ccd8so45176a12.0 for ; Wed, 17 Sep 2025 22:16:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172599; x=1758777399; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gGE/jcU6KuNdO8mMPcpFhWHkaPMHY5y6/wQ8dXBnUzI=; b=Wkn37IH84k9U7mTBYGzFLbUuNLnCNm3n0V3gpd5O8kr6fVfV56JXvnc7XQ49BNwW1T 8mLnsY5eewwPxx6WhSTSoQgIfKxQHFLTAjwxQ4/mWXIe9f92O5QTT2GCA5YnEb/njhXB feKSyDDlg6S+XQgAZUySzibk6LEN4DGePpWJ71Usm0EVukOrcUdcPJdxtJzOGlQNaO+Q 6L+nDe0nQKkJNZrSc7bD1GJQu11cf4nTWipnjcbmheErj2ICpN460XRUx//Z/I9hubmI Go/eEkCIwPod/Rlvmr3EEqTO8SKZcQGCzjxYiyi7uEqrBq+FgDqn/lXmCMjs2V8G+DjV 4vxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172599; x=1758777399; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gGE/jcU6KuNdO8mMPcpFhWHkaPMHY5y6/wQ8dXBnUzI=; b=M7xWU511BJNXr342jpN6jfnaxa/h0RqhFge+UMWvNfmWT3TT1wQFs94fVGp2BYEe2N t0Re7hMcA8tCQ81UTG4hm0LKj9aIqJxiV/LodWaGFIostzQ/cfg2dJ1gP66vv8LNjGOr I+a6tRb8YE/nDw+bprr2hO1XTErTaKvPVLZZ5ZfGCH7l+7QHJ28se5/bV8IF3LrJduJx Zx9Hph3BMWPn/V6r3ZlUdU2o0kX6w2knrwsdc0YZwhNAIInCGH6DftlmCTTBSOYKjuQU BDmX3vONF9sP2Ld1RlA0i/llo5zrQrUG4nNMjylXjO5U+QCvcGBew9lB/KZEOWqEIb36 MDTA== X-Forwarded-Encrypted: i=1; AJvYcCXhuEKD6XzHd6bMfUyzuFwk2FrYUdAmf2HE34DL2N7FMXXhXav9wdFDSPkQG+7oQAkhodO7t5lKU71A3Kk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1S9701lxm1wFdinu22YqherzqIEPdmVrNCBRZE+dB/mdcxFTq K7ru45wqqNy/Lg1tEW84pi4GWIpUmhivX8NxVC8AQfDq2v/isPXC4Txa X-Gm-Gg: ASbGncuCDj+0mRryw3Aji/rKBwaP1yzANSh4xrRVLGbr4dBLVuT6O4/iYlbUPXaPbMw UPNLywN/U3AkN+KrsEe6roL7becEyzEgiPLe4apduwP3uUMbzCnbAWWRpSoIB3dc4UpqegVAqU4 gyjnuO5XT8jzyQOJ7XemPs+PbMCYDEKTZFVDkkq4rmDU1UAccbSdQ5y0lo+angYBTQ6iPJwDEtL Gl5ZFn6D1Hu4Ok4DD1b6UFMY/7T1dIQzWnv6FP7gM7N9LpKYl+5zbrXrLQVulGJArhBexA++q/q 0AweFYT+X38N9tffqv3v20B7Zq6LzqD0zWdLZ31EOnCrKwQCrteN3eF/H5/Hb9MZ+peS0lTin8J DxXXHFBOd/6GHbzQVGoCNCVQ7v2+9mtJKtzwG9nncm+3rfqv+HIpUnIKxxOoQEqUNWV5/E1ZV2Z R/pcPLALUzlc0= X-Google-Smtp-Source: AGHT+IF1j90Ta1QtOnlayd+rOIMVjDlDgB9HTQ6NhnrPndZrudKEMwQBaDxvvy2pq+iS/ce/Fx31JA== X-Received: by 2002:a17:902:f792:b0:264:4e4a:904a with SMTP id d9443c01a7336-26813cfeb3fmr56547865ad.53.1758172599048; Wed, 17 Sep 2025 22:16:39 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269803026e9sm12683435ad.107.2025.09.17.22.16.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:38 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 006621061EEE; Thu, 18 Sep 2025 14:16:37 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 07/14] x86/um: nommu: process/thread handling Date: Thu, 18 Sep 2025 14:16:00 +0900 Message-ID: <5528885e35e11984cf2543665b4d92582f4b3ac1.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Since ptrace facility isn't used under !MMU of UML, there is different code path to invoke processes/threads; there are no external process used, and need to properly configure some of registers (fs segment register for TLS, etc) on every context switch, etc. Signals aren't delivered in non-ptrace syscall entry/leave so, we also need to handle pending signal by ourselves. ptrace related syscalls are not tested yet so, marked arch_has_single_step() unsupported in !MMU environment. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/um/include/asm/ptrace-generic.h | 2 +- arch/x86/um/Makefile | 3 +- arch/x86/um/nommu/Makefile | 2 +- arch/x86/um/nommu/entry_64.S | 2 ++ arch/x86/um/nommu/syscalls.h | 2 ++ arch/x86/um/nommu/syscalls_64.c | 50 ++++++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 arch/x86/um/nommu/syscalls_64.c diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptr= ace-generic.h index 62e9916078ec..5aa38fe6b2fb 100644 --- a/arch/um/include/asm/ptrace-generic.h +++ b/arch/um/include/asm/ptrace-generic.h @@ -14,7 +14,7 @@ struct pt_regs { struct uml_pt_regs regs; }; =20 -#define arch_has_single_step() (1) +#define arch_has_single_step() (IS_ENABLED(CONFIG_MMU)) =20 #define EMPTY_REGS { .regs =3D EMPTY_UML_PT_REGS } =20 diff --git a/arch/x86/um/Makefile b/arch/x86/um/Makefile index 227af2a987e2..53c9ebb3c41c 100644 --- a/arch/x86/um/Makefile +++ b/arch/x86/um/Makefile @@ -27,7 +27,8 @@ subarch-y +=3D ../kernel/sys_ia32.o =20 else =20 -obj-y +=3D syscalls_64.o vdso/ +obj-y +=3D vdso/ +obj-$(CONFIG_MMU) +=3D syscalls_64.o =20 subarch-y =3D ../lib/csum-partial_64.o ../lib/memcpy_64.o \ ../lib/memmove_64.o ../lib/memset_64.o diff --git a/arch/x86/um/nommu/Makefile b/arch/x86/um/nommu/Makefile index ebe47d4836f4..4018d9e0aba0 100644 --- a/arch/x86/um/nommu/Makefile +++ b/arch/x86/um/nommu/Makefile @@ -5,4 +5,4 @@ else BITS :=3D 64 endif =20 -obj-y =3D do_syscall_$(BITS).o entry_$(BITS).o os-Linux/ +obj-y =3D do_syscall_$(BITS).o entry_$(BITS).o syscalls_$(BITS).o os-Linux/ diff --git a/arch/x86/um/nommu/entry_64.S b/arch/x86/um/nommu/entry_64.S index 485c578aae64..a58922fc81e5 100644 --- a/arch/x86/um/nommu/entry_64.S +++ b/arch/x86/um/nommu/entry_64.S @@ -86,6 +86,8 @@ END(__kernel_vsyscall) */ ENTRY(userspace) =20 + /* set stack and pt_regs to the current task */ + call arch_set_stack_to_current /* clear direction flag to meet ABI */ cld /* align the stack for x86_64 ABI */ diff --git a/arch/x86/um/nommu/syscalls.h b/arch/x86/um/nommu/syscalls.h index a2433756b1fc..ce16bf8abd59 100644 --- a/arch/x86/um/nommu/syscalls.h +++ b/arch/x86/um/nommu/syscalls.h @@ -13,4 +13,6 @@ extern long current_top_of_stack; extern long current_ptregs; =20 +void arch_set_stack_to_current(void); + #endif diff --git a/arch/x86/um/nommu/syscalls_64.c b/arch/x86/um/nommu/syscalls_6= 4.c new file mode 100644 index 000000000000..d56027ebc651 --- /dev/null +++ b/arch/x86/um/nommu/syscalls_64.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2003 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) + * Copyright 2003 PathScale, Inc. + * + * Licensed under the GPL + */ + +#include +#include +#include +#include +#include /* XXX This should get the constants from libc */ +#include +#include +#include "syscalls.h" + +void arch_set_stack_to_current(void) +{ + current_top_of_stack =3D task_top_of_stack(current); + current_ptregs =3D (long)task_pt_regs(current); +} + +void arch_switch_to(struct task_struct *to) +{ + /* + * In !CONFIG_MMU, it doesn't ptrace thus, + * The FS_BASE registers are saved here. + */ + current_top_of_stack =3D task_top_of_stack(to); + current_ptregs =3D (long)task_pt_regs(to); + + if ((to->thread.regs.regs.gp[FS_BASE / sizeof(unsigned long)] =3D=3D 0) || + (to->mm =3D=3D NULL)) + return; + + /* this changes the FS on every context switch */ + arch_prctl(to, ARCH_SET_FS, + (void __user *) to->thread.regs.regs.gp[FS_BASE / sizeof(unsigned lon= g)]); +} + +SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, + unsigned long, prot, unsigned long, flags, + unsigned long, fd, unsigned long, off) +{ + if (off & ~PAGE_MASK) + return -EINVAL; + + return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); +} --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 017EA29B8DC for ; Thu, 18 Sep 2025 05:16:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172605; cv=none; b=LOLW5+ejRLScsr/LwYjvzYLInkqWsSO25Za95VIOrS3djVNRN6gIDUqEF3Pt8+4lb/zSLob+cePdwZD0AunWcC7pcq3ZkAtOyiKop3i7mnVvjpGjSPA0/KDx3q/bibFoiQW5E0wzDpeoTcyqhowreN/dt0i7eZuLia1IwkwTnqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172605; c=relaxed/simple; bh=+Waag5s2KV4AtkQ8FWm0y4/xw2uolW4OhcFUtzX2NSU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gzMRk1yTwztZISM8tGdIlCLm1l0zSvMZRWBYdWceXzJbBd2XGGOHJ2ugGR4JLpR5FmpWzt6K2zYIRrw6MIZGvq72ykGDsim3m12OTA0OI6MAsS5tuRmP+AWCrTQVukGnLm6QAvnSHP4GkmC0ozjKdOstBdDutTU2m2iNAW0rcWo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=myBWHlpM; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="myBWHlpM" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-32dc6616f7dso355424a91.1 for ; Wed, 17 Sep 2025 22:16:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172603; x=1758777403; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=V2ZhXR0YE7Nfxy83gEc2kisuCO87If9KaW5qC95ko0I=; b=myBWHlpMMa0G0F1NSxpcNSAzBPE9WkNSOpsoEwneUN2qbuseyF3SelOblShvIX8Cys aoX0Y8akm/9QPdrdEZs30QZubWXU+AUgeOe16zGJ3TScprATffaOaEICEYEYiWmOCQeY JuP6f658ghfsNbzI9mYxBjnTZ/Wtj6/UJulAcUh8YkEAvUpwH26qX4dQrwWxOZqe7GZQ 41yAmDWiemEmq0NujnE0mPhEDgoq6uFui7doVL8rB8TScY/zEcSTHVz/ZKrk7Ip7SvvI MnwFPViyDSAh24e3d1KFL8tOjiYizT2dSiLzm2mef/0sJ9TZ2KEHhgbA+bWAWaXGdICq zXDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172603; x=1758777403; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=V2ZhXR0YE7Nfxy83gEc2kisuCO87If9KaW5qC95ko0I=; b=oBkSiS66V1Ag4mNuPFBWeJ4iPvu1JCzj3aAHN2lDx2gadDLaFKao5oFKUTxgBF3Rxz cgI55o+ojxQ1xFyPhaVgtYJBYnp9Aj1Se+buK57utQWg9nJEjpkabkEPvPh9NGiFSY7T N0wkSW1PmNVHFRz4MWGCVqc8TxfJTWLSSHwOVz7ZRLrEIg2kjWH+a2hgN/baMGYNEguS ayfD8FlomEuowGSg8KBIPZQxZWNY0d4lAG9LupBoY3v0o1ne2O14ffs7mRR6zbd/aJcv rMl5HBsAUjl30+Op3lUL+Yy7qHizzXYXyhZDM05ajwyaxFQh0BNFFMtbJs4E8LW7YbsC IXGQ== X-Forwarded-Encrypted: i=1; AJvYcCVE6ARXKlbLR3c31GFBUiS+LQ3Wfb7DIHaKb3/z5ah+tlIUT8nOWz8raUxXBND5TzuRoi73doE+DXuN+K4=@vger.kernel.org X-Gm-Message-State: AOJu0YyHs7sWA8pbW6maZiTbaDQwyrMosKt0nG1FfL//cJ3OnObVimx7 gREff6+87OyrHC8ch1mfuZBT6AygpBWpxvHks/ms9OCb0V/FyIOrmzjb X-Gm-Gg: ASbGnctUle8oX4ITnIWhsw1Nxjm26ynzSBY/aJm67RLnN9bKE/9vq0pfW1yTPs0lxK+ lIXw4J0Jdj92L3RE9t6VB3XRibi6ElJXKeEirDvvnjX7HxKk/NzQzkCVF3aqypNKoH1LXZHCCiP y+XY1FdnKdyyLZ+4u782j3tIaW5kxWjBtWkpa1rmgYPnF5iYY+O39XF1s8xz1Aihiczh0E1zR11 yWVjeHc3pghoZdeuMfhev7ry9a9RAT22o8HFTlr3MAgZpoggMlYYG04PqqN7xebhF+kQwDMx6sj TU/+uzS9FWLp4Pc+BlB3ZDjmbrmvQZYB01RZ0pKfFAq7oDM8Y4hOfp1Yw4ZKofliGN2G6gfIXTN x0EiBTzVJZ21zXUbFtqjYnDV6uWYQyodCn723Rcj9IZP/10jLx5GOzHh/9HmmxYpeYsa3SFMW9x zCrqE9MkaAquU= X-Google-Smtp-Source: AGHT+IG8kVGxyfKRfwX/JNXisY3HoiZuY6aX/okVnX+nb2qOOqX+U51XZ6lCxRUZ1cTr4GcOddepSA== X-Received: by 2002:a17:90b:3b4b:b0:32e:37af:b012 with SMTP id 98e67ed59e1d1-32ee3d89bccmr6251146a91.0.1758172602923; Wed, 17 Sep 2025 22:16:42 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-330607e9475sm1178905a91.19.2025.09.17.22.16.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:42 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 4FF1B1061EF0; Thu, 18 Sep 2025 14:16:40 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 08/14] um: nommu: configure fs register on host syscall invocation Date: Thu, 18 Sep 2025 14:16:01 +0900 Message-ID: <8f953c5284f2bf5339540e18844531a146a8051f.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" As userspace on UML/!MMU also need to configure %fs register when it is running to correctly access thread structure, host syscalls implemented in os-Linux drivers may be puzzled when they are called. Thus it has to configure %fs register via arch_prctl(SET_FS) on every host syscalls. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/um/include/shared/os.h | 6 +++ arch/um/os-Linux/process.c | 6 +++ arch/um/os-Linux/start_up.c | 21 +++++++++ arch/x86/um/nommu/do_syscall_64.c | 37 ++++++++++++++++ arch/x86/um/nommu/syscalls_64.c | 71 +++++++++++++++++++++++++++++++ 5 files changed, 141 insertions(+) diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 1251f08e26d0..7c6a8bc0447c 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h @@ -189,6 +189,7 @@ extern void check_host_supports_tls(int *supports_tls, = int *tls_min); extern void get_host_cpu_features( void (*flags_helper_func)(char *line), void (*cache_helper_func)(char *line)); +extern int host_has_fsgsbase; =20 /* mem.c */ extern int create_mem_file(unsigned long long len); @@ -213,6 +214,11 @@ extern int os_protect_memory(void *addr, unsigned long= len, extern int os_unmap_memory(void *addr, int len); extern int os_drop_memory(void *addr, int length); extern int can_drop_memory(void); +extern int os_arch_prctl(int pid, int option, unsigned long *arg); +#ifndef CONFIG_MMU +extern long long host_fs; +#endif + =20 void os_set_pdeathsig(void); =20 diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index bc598e661ec6..0a1d078dce19 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -16,6 +16,7 @@ #include #include #include +#include /* For SYS_xxx definitions */ #include #include #include @@ -177,6 +178,11 @@ int __init can_drop_memory(void) return ok; } =20 +int os_arch_prctl(int pid, int option, unsigned long *arg2) +{ + return syscall(SYS_arch_prctl, option, arg2); +} + void init_new_thread_signals(void) { set_handler(SIGSEGV); diff --git a/arch/um/os-Linux/start_up.c b/arch/um/os-Linux/start_up.c index 4e1f05360c49..55dd92bd2a0b 100644 --- a/arch/um/os-Linux/start_up.c +++ b/arch/um/os-Linux/start_up.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include #include @@ -36,6 +38,8 @@ #include #include "internal.h" =20 +int host_has_fsgsbase; + static void ptrace_child(void) { int ret; @@ -459,6 +463,20 @@ __uml_setup("seccomp=3D", uml_seccomp_config, " This is insecure and should only be used with a trusted userspace\n\n" ); =20 +static void __init check_fsgsbase(void) +{ + unsigned long auxv =3D getauxval(AT_HWCAP2); + + os_info("Checking FSGSBASE instructions..."); + if (auxv & HWCAP2_FSGSBASE) { + host_has_fsgsbase =3D 1; + os_info("OK\n"); + } else { + host_has_fsgsbase =3D 0; + os_info("disabled\n"); + } +} + void __init os_early_checks(void) { int pid; @@ -484,6 +502,9 @@ void __init os_early_checks(void) using_seccomp =3D 0; check_ptrace(); =20 + /* probe fsgsbase instruction */ + check_fsgsbase(); + pid =3D start_ptraced_child(); if (init_pid_registers(pid)) fatal("Failed to initialize default registers"); diff --git a/arch/x86/um/nommu/do_syscall_64.c b/arch/x86/um/nommu/do_sysca= ll_64.c index 292d7c578622..9bc630995df9 100644 --- a/arch/x86/um/nommu/do_syscall_64.c +++ b/arch/x86/um/nommu/do_syscall_64.c @@ -2,10 +2,38 @@ =20 #include #include +#include +#include #include #include #include =20 +static int os_x86_arch_prctl(int pid, int option, unsigned long *arg2) +{ + if (!host_has_fsgsbase) + return os_arch_prctl(pid, option, arg2); + + switch (option) { + case ARCH_SET_FS: + wrfsbase(*arg2); + break; + case ARCH_SET_GS: + wrgsbase(*arg2); + break; + case ARCH_GET_FS: + *arg2 =3D rdfsbase(); + break; + case ARCH_GET_GS: + *arg2 =3D rdgsbase(); + break; + default: + pr_warn("%s: unsupported option: 0x%x", __func__, option); + break; + } + + return 0; +} + __visible void do_syscall_64(struct pt_regs *regs) { int syscall; @@ -13,6 +41,9 @@ __visible void do_syscall_64(struct pt_regs *regs) syscall =3D PT_SYSCALL_NR(regs->regs.gp); UPT_SYSCALL_NR(®s->regs) =3D syscall; =20 + /* set fs register to the original host one */ + os_x86_arch_prctl(0, ARCH_SET_FS, (void *)host_fs); + if (likely(syscall < NR_syscalls)) { unsigned long ret; =20 @@ -29,4 +60,10 @@ __visible void do_syscall_64(struct pt_regs *regs) =20 /* handle tasks and signals at the end */ interrupt_end(); + + /* restore back fs register to userspace configured one */ + os_x86_arch_prctl(0, ARCH_SET_FS, + (void *)(current->thread.regs.regs.gp[FS_BASE + / sizeof(unsigned long)])); + } diff --git a/arch/x86/um/nommu/syscalls_64.c b/arch/x86/um/nommu/syscalls_6= 4.c index d56027ebc651..19d23686fc5b 100644 --- a/arch/x86/um/nommu/syscalls_64.c +++ b/arch/x86/um/nommu/syscalls_64.c @@ -13,8 +13,70 @@ #include /* XXX This should get the constants from libc */ #include #include +#include +#include #include "syscalls.h" =20 +/* + * The guest libc can change FS, which confuses the host libc. + * In fact, changing FS directly is not supported (check + * man arch_prctl). So, whenever we make a host syscall, + * we should be changing FS to the original FS (not the + * one set by the guest libc). This original FS is stored + * in host_fs. + */ +long long host_fs =3D -1; + +long arch_prctl(struct task_struct *task, int option, + unsigned long __user *arg2) +{ + long ret =3D -EINVAL; + unsigned long *ptr =3D arg2, tmp; + + switch (option) { + case ARCH_SET_FS: + if (host_fs =3D=3D -1) + os_arch_prctl(0, ARCH_GET_FS, (void *)&host_fs); + ret =3D 0; + break; + case ARCH_SET_GS: + ret =3D 0; + break; + case ARCH_GET_FS: + case ARCH_GET_GS: + ptr =3D &tmp; + break; + } + + ret =3D os_arch_prctl(0, option, ptr); + if (ret) + return ret; + + switch (option) { + case ARCH_SET_FS: + current->thread.regs.regs.gp[FS_BASE / sizeof(unsigned long)] =3D + (unsigned long) arg2; + break; + case ARCH_SET_GS: + current->thread.regs.regs.gp[GS_BASE / sizeof(unsigned long)] =3D + (unsigned long) arg2; + break; + case ARCH_GET_FS: + ret =3D put_user(current->thread.regs.regs.gp[FS_BASE / sizeof(unsigned = long)], arg2); + break; + case ARCH_GET_GS: + ret =3D put_user(current->thread.regs.regs.gp[GS_BASE / sizeof(unsigned = long)], arg2); + break; + } + + return ret; +} + +SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2) +{ + return arch_prctl(current, option, (unsigned long __user *) arg2); +} + void arch_set_stack_to_current(void) { current_top_of_stack =3D task_top_of_stack(current); @@ -48,3 +110,12 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned lon= g, len, =20 return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); } + +static int __init um_nommu_setup_hostfs(void) +{ + /* initialize the host_fs value at boottime */ + os_arch_prctl(0, ARCH_GET_FS, (void *)&host_fs); + + return 0; +} +arch_initcall(um_nommu_setup_hostfs); --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A5CB128467B for ; Thu, 18 Sep 2025 05:16:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172607; cv=none; b=H0/t4+/huAwlfPZiCs9A9/Rt3DnOASW/XK1mxJaTh6XgV9KOK5oZguD16fLr/gGyXCsnwRhuwGC+lwTHymaBLrkDLI/ikWmtO70sLh+xFg9D3U13NqU29r7N9LeZdnGT81yPhQ2c5uAw3nkyCWwULHrtkLbUCeJ+t/ImpxYXoBg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172607; c=relaxed/simple; bh=YUEZeH1TUt8vhd5nOMxaCkzJVaWiSM7ZZlNxkfxZqDc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Bu5zuX1LSnCgqXoMW7lAZBrzezyltnvNck/FKeSUIr7qW+yDAgUONreUwVwbabZn97jcJEOrVrVZ/MEP7VXEDdUX+Iu3pzw14tdX6GMSaMuMhsK17U/0p+ifrAWCvjgtq41SxmF7JzTlXIXTjBK7SAiDaVPlSNBzL1+G46cKgbA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=U17fY/CR; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="U17fY/CR" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-25669596921so5715405ad.1 for ; Wed, 17 Sep 2025 22:16:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172605; x=1758777405; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0G7VVQnGQtrb3sGnx5GNm2Y3zP47y1QHGJfHFp/BsUc=; b=U17fY/CR7P3v8UpIWB6TpsHwOd2QkrO9apokwotyFL90cAKItoh0d5ehJ0IBTe7Tyd Ocwrs21wOSjYKS9PrFp4CL0/78ckc/G1mMSfyNITJevs1ZGXD8BGvg/9keK7mIeHDe8O B5l2WmTS/VK2AURnqFpSUbyZ2aOUhuaZKAMx+mVjc/fAhmYmyr2mKbDj5bbBiyrTMdTP QQXkjQwkuRUZZYTErISnc61ckY/dzScY7OphbjjCyxWGxKdfuLfkzDaJNlNYxp5mPe4/ JN/xreaI+32dlD/gRDbpY4gayEgvSKYR8zaQ/b3/TWCfG/lKKKPeqPxvxoBSOhAKbvQk 53wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172605; x=1758777405; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0G7VVQnGQtrb3sGnx5GNm2Y3zP47y1QHGJfHFp/BsUc=; b=SXMASRtxObT1cWPY/VO3B7ZMkCOyMVnxEg2NH0vNPvogSf9Grr9KHK3sXddQk0rwJ+ O/lEDcTqeoTKmeKeocSdty0qdqGWm0MfLHRBmKIj0XdTUcDyw6tbPrfgiTKD7Kr/QACv v4+il9v8cD8tRTBtOXedrqIlaUqpu9HDXdq4tzh0t0illX+S5ttWdLekyiEdfzWdbpnl YgAVeub2C1S4pREt62qAwnUb15wpGRBxVMRlqK760UFgN87iesGI1OzLEQHyrsQ/Y09X XEf02rnj44Gfg456r+hDzTyQeIVt2PLZBBnX5IKSo75faMhdLDuAFzaFgWb23vR6ZnSP bAfg== X-Forwarded-Encrypted: i=1; AJvYcCVIPWcePUr79WFEN22UEx6HcSKk9a8xn6T9xzH+TEsIQgz9nl4HhYZ1lmqZkBilU0WXVUYbuIh/uvg8TPs=@vger.kernel.org X-Gm-Message-State: AOJu0Ywar8pSd8TTu/NKrr109sdPtmg6DIf4W78MccH4xHMkRGslB3nR 5d0rlT+QcuSpQbsPQKGbd2WtdKOFZxZP/4eEMCVtb0k5i/jtNmMeWSBrb+XugQ== X-Gm-Gg: ASbGncsRzuEDgAIUsfV5GRu2+uRqjPpSmxaplUrmBZDImIPcg6pdr5TMvZRkaQ05O9q CVcXmEUly3VypkMCkWSTpa7nFo2BIv0JFTn6jEW5z2buMwX7gSRByULuqo8Ra1gzxKgbu78JZjl r2rdOC5W+ONs7AeZDhiorDFaZJ1x6F+gB/JEs/H4i9I2Va8TIYECitO2Aue3FkB0Fp6z377R86D hf6L2bMbjKtjnes9mvDOb/oXCwZHL7Ro3USnOniYROaJhUHKBuFB7pr6KwEb8B2nEbiF8IcBv0m pcREHNK39dy5Mf5pA972ZAQ3I7zEVuo4zgFrgpa1mMHAV0/43ortpRh6e+33Cq/af44MVTfLB+o sjWG9YAAyQiNmpfDhR4cvpk920eZN/rNOu9Q84X/b/nsTSbDMr77ybxrsfBrlSR8UKkgQCcjnIb ualLEKpuOUDuc= X-Google-Smtp-Source: AGHT+IENUWJEnq6oE7Ax3BDTY7kWNNijSyVEXEQa7OevR8qtv4uLVgHLKbgA4U1otQAK7eBXyC8eSg== X-Received: by 2002:a17:903:298b:b0:263:7b6e:8da0 with SMTP id d9443c01a7336-2681216b6d7mr52232155ad.15.1758172604780; Wed, 17 Sep 2025 22:16:44 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-26980329745sm12581375ad.121.2025.09.17.22.16.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:44 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id DC5101061EF2; Thu, 18 Sep 2025 14:16:43 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 09/14] x86/um/vdso: nommu: vdso memory update Date: Thu, 18 Sep 2025 14:16:02 +0900 Message-ID: <973b16819b91b5640029311ee8385059e3b41e71.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On !MMU mode, the address of vdso is accessible from userspace. This commit implements the entry point by pointing a block of page address. This commit also add memory permission configuration of vdso page to be executable. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/x86/um/vdso/vma.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/arch/x86/um/vdso/vma.c b/arch/x86/um/vdso/vma.c index dc8dfb2abd80..1c8c39f87681 100644 --- a/arch/x86/um/vdso/vma.c +++ b/arch/x86/um/vdso/vma.c @@ -9,6 +9,7 @@ #include #include #include +#include =20 static unsigned int __read_mostly vdso_enabled =3D 1; unsigned long um_vdso_addr; @@ -21,14 +22,24 @@ static int __init init_vdso(void) { BUG_ON(vdso_end - vdso_start > PAGE_SIZE); =20 - um_vdso_addr =3D task_size - PAGE_SIZE; - um_vdso =3D alloc_page(GFP_KERNEL); if (!um_vdso) goto oom; =20 copy_page(page_address(um_vdso), vdso_start); =20 +#ifdef CONFIG_MMU + um_vdso_addr =3D task_size - PAGE_SIZE; +#else + /* this is fine with NOMMU as everything is accessible */ + um_vdso_addr =3D (unsigned long)page_address(um_vdso); + os_protect_memory((void *)um_vdso_addr, vdso_end - vdso_start, 1, 0, 1); +#endif + + pr_info("vdso_start=3D%lx um_vdso_addr=3D%lx pg_um_vdso=3D%lx", + (unsigned long)vdso_start, um_vdso_addr, + (unsigned long)page_address(um_vdso)); + return 0; =20 oom: @@ -39,6 +50,7 @@ static int __init init_vdso(void) } subsys_initcall(init_vdso); =20 +#ifdef CONFIG_MMU int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) { struct vm_area_struct *vma; @@ -63,3 +75,4 @@ int arch_setup_additional_pages(struct linux_binprm *bprm= , int uses_interp) =20 return IS_ERR(vma) ? PTR_ERR(vma) : 0; } +#endif --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 33B0329D281 for ; Thu, 18 Sep 2025 05:16:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172610; cv=none; b=Lkn6pRzvjjFTFvZHSzC4Gm/q6AiDPCo0W5uyLQQ/TnVNbCiVfGM9fP+bMtF0E4M+olgt9fb5kaa2xZ+eRTwlj09h+6pTDzNfsjVntPB1bw6rI/DKf3h8xMlos8IQbGpjx5JKVta9p1owvMUbhuEalq85Wfh0q4W50vjIVeCVBbM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172610; c=relaxed/simple; bh=zCkpBY3Mz9F8XK5ho3tgyxEPJV3QOKN8qRPFl1UtObQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X+waAb1cIp1vagQ4ixGHV/xWrTBqBgRsjMvKkv0/c/kCb4Zp4qgjcUCfYGgOPKVrLrZ2sircHnGuBXCZikAnYgN0zN0hgS78YcuPDVig4gKbPkKOfv4hUfbZuuJSmH6jHN3jJM5jAL2m5L5+LjufkYrao3p/m5qkgVoGzxB7s+A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WgqiqbJC; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WgqiqbJC" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2570bf605b1so6869515ad.2 for ; Wed, 17 Sep 2025 22:16:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172607; x=1758777407; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uT1O8FBsm0dVNsun14WInwimP6kWv851HnymaaK7agg=; b=WgqiqbJC0SA62I5Rz0XZgVsIyQ/K6KdBHmSCAOM9GHO4Er9jDn687Oud9l/OtNwpT7 YmU6AGEV512DeDifZbAjnjSefdz2ESpw3tE1ykctq4RAsiLfcpp96m+nIlpZ8S4VIGC2 AV0jqMEIq6HvKz5+03PgcXR8sw+jtVUbpcGEVZCM4jsxX5TR0He2NLckkz05N7XZf7Tf dKnYHtGdZTIZdw04jmd8vDqAz/nS/2cloc8VlWMVe3gFnvthUbhSTdWJfS7AqVuZ1VvH yEdQ0XCxctOVGCtRpLtdkwlwLhk9KzoGNtDPXdygEihk7v62Ehl3m2UltvP1Tfkpw6HD BE7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172607; x=1758777407; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uT1O8FBsm0dVNsun14WInwimP6kWv851HnymaaK7agg=; b=IAYCxYwZvLcZibuDlqrKXp5Zhczx3irv3u3AN6jIsKrwgf7xL0b9erHeqrEXYYNbrh Y4H2RPPKKPNohPk4MoNkaSIz+EmqoxmHnQ8WXlbWzBF3Bi8915o/6xHXksJcfoS6d6lA A6vyiQAnc38Nxwmc6Bc0VYcUyt9Rn3SWL8o8f0iUTH4Hj3vQd9ecWoeUZbw0xw5sQ313 PWjcR4WQYqdryzYNPPYFv1poC4tnkss3RhJGeAJITsQzJ/E0sY/qk6UYvv9HZwwbKder wqIh42Bax7I6DxuiwbuRQ+5AtkrdmfJN2DV681wlltX/POmDBr/VH3goad6s0fEYY7B0 yUfg== X-Forwarded-Encrypted: i=1; AJvYcCU4fM6k1OWbFGf+bPsgnPmAn87O0lLdRaM/Wpv75kMI6edbMhHv/O49W2yZ/YVGXlBMniZok1EQPmAijA4=@vger.kernel.org X-Gm-Message-State: AOJu0YzVTfmz+Ec4u58Nd9ObrC9SjnEmO33cYwMnJCxTaRSpObNR64oq yRAJFq8GWHu7YdtPyyPCp1QfEySk0joK/QMcioX4s5XrVQDRf24fUPPZ X-Gm-Gg: ASbGncvII39XGrO+fLxNJ+/b4TvbV3bwEbGmoXLpfnnVp18ZWCWpuoTX9M0tt/GFvp9 cYqQPruhbhNSL+yaaT5CQRnMW+bueJddfFY5n/WyWmPTaPlK8Lfv38IRK3qyL3CNkthawdLNN23 R4S59NU5eRML6mM4Q7AWgTuQLIvn8qOeIGrVYFxxMo0nuIWgsn//8+0DNr8J1F+F7211j8EkTN+ 7gvg8wZIHhHsfrJP1VBIk5DD9XeSHPSpmpu7tUox55opQm6MNumWgGVkmnKhtbQms3oq4wxt6J9 pcsP2eLVdqN5hGpyybS+Yt6//QhguXe8gU6YqLq2Ir47xXl6NllufkGsOc8qpzlRwlXTCbuvry7 6h5V+2CqmAM9hogmzq64SoSR8oGk/2RCj9aPS8uXF2C4mNy6r4N+PUFyKQY9C/KYsQBrBKpy4Zr yac+/rnwbnI54= X-Google-Smtp-Source: AGHT+IGPjeWatpTtLaGVXEChqNNUpovLoAeNkNeMj9KxkDXsx5I4+56t+qwLzW6GwqvrTUSB8i0ejA== X-Received: by 2002:a17:903:2ad0:b0:263:e664:7a6b with SMTP id d9443c01a7336-2681218baeamr54735905ad.25.1758172607170; Wed, 17 Sep 2025 22:16:47 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfe66916csm1074320b3a.51.2025.09.17.22.16.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:46 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 48CE01061EF5; Thu, 18 Sep 2025 14:16:45 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 10/14] x86/um: nommu: signal handling Date: Thu, 18 Sep 2025 14:16:03 +0900 Message-ID: <0b79247275299dd9fc1e20d037d855e7e7f01595.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit updates the behavior of signal handling under !MMU environment. It adds the alignment code for signal frame as the frame is used in userspace as-is. floating point register is carefully handling upon entry/leave of syscall routine so that signal handlers can read/write the contents of the register. It also adds the follow up routine for SIGSEGV as a signal delivery runs in the same stack frame while we have to avoid endless SIGSEGV. Signed-off-by: Hajime Tazaki --- arch/um/include/shared/kern_util.h | 4 + arch/um/nommu/Makefile | 2 +- arch/um/nommu/os-Linux/signal.c | 8 + arch/um/nommu/trap.c | 201 ++++++++++++++++++++++++++ arch/um/os-Linux/signal.c | 3 +- arch/x86/um/nommu/do_syscall_64.c | 6 + arch/x86/um/nommu/os-Linux/mcontext.c | 11 ++ arch/x86/um/shared/sysdep/mcontext.h | 1 + arch/x86/um/shared/sysdep/ptrace.h | 2 +- 9 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 arch/um/nommu/trap.c diff --git a/arch/um/include/shared/kern_util.h b/arch/um/include/shared/ke= rn_util.h index ec8ba1f13c58..7f55402b6385 100644 --- a/arch/um/include/shared/kern_util.h +++ b/arch/um/include/shared/kern_util.h @@ -73,4 +73,8 @@ void um_idle_sleep(void); =20 void kasan_map_memory(void *start, size_t len); =20 +#ifndef CONFIG_MMU +extern void nommu_relay_signal(void *ptr); +#endif + #endif diff --git a/arch/um/nommu/Makefile b/arch/um/nommu/Makefile index baab7c2f57c2..096221590cfd 100644 --- a/arch/um/nommu/Makefile +++ b/arch/um/nommu/Makefile @@ -1,3 +1,3 @@ # SPDX-License-Identifier: GPL-2.0 =20 -obj-y :=3D os-Linux/ +obj-y :=3D trap.o os-Linux/ diff --git a/arch/um/nommu/os-Linux/signal.c b/arch/um/nommu/os-Linux/signa= l.c index 19043b9652e2..6febb178dcda 100644 --- a/arch/um/nommu/os-Linux/signal.c +++ b/arch/um/nommu/os-Linux/signal.c @@ -5,6 +5,7 @@ #include #include #include +#include =20 void sigsys_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs, void *ptr) @@ -14,3 +15,10 @@ void sigsys_handler(int sig, struct siginfo *si, /* hook syscall via SIGSYS */ set_mc_sigsys_hook(mc); } + +void nommu_relay_signal(void *ptr) +{ + mcontext_t *mc =3D (mcontext_t *) ptr; + + set_mc_relay_signal(mc); +} diff --git a/arch/um/nommu/trap.c b/arch/um/nommu/trap.c new file mode 100644 index 000000000000..430297517455 --- /dev/null +++ b/arch/um/nommu/trap.c @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Note this is constrained to return 0, -EFAULT, -EACCES, -ENOMEM by + * segv(). + */ +int handle_page_fault(unsigned long address, unsigned long ip, + int is_write, int is_user, int *code_out) +{ + /* !MMU has no pagefault */ + return -EFAULT; +} + +static void show_segv_info(struct uml_pt_regs *regs) +{ + struct task_struct *tsk =3D current; + struct faultinfo *fi =3D UPT_FAULTINFO(regs); + + if (!unhandled_signal(tsk, SIGSEGV)) + return; + + pr_warn_ratelimited("%s%s[%d]: segfault at %lx ip %p sp %p error %x", + task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, + tsk->comm, task_pid_nr(tsk), FAULT_ADDRESS(*fi), + (void *)UPT_IP(regs), (void *)UPT_SP(regs), + fi->error_code); +} + +static void bad_segv(struct faultinfo fi, unsigned long ip) +{ + current->thread.arch.faultinfo =3D fi; + force_sig_fault(SIGSEGV, SEGV_ACCERR, (void __user *) FAULT_ADDRESS(fi)); +} + +void fatal_sigsegv(void) +{ + force_fatal_sig(SIGSEGV); + do_signal(¤t->thread.regs); + /* + * This is to tell gcc that we're not returning - do_signal + * can, in general, return, but in this case, it's not, since + * we just got a fatal SIGSEGV queued. + */ + os_dump_core(); +} + +/** + * segv_handler() - the SIGSEGV handler + * @sig: the signal number + * @unused_si: the signal info struct; unused in this handler + * @regs: the ptrace register information + * + * The handler first extracts the faultinfo from the UML ptrace regs struc= t. + * If the userfault did not happen in an UML userspace process, bad_segv i= s called. + * Otherwise the signal did happen in a cloned userspace process, handle i= t. + */ +void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *= regs, + void *mc) +{ + struct faultinfo *fi =3D UPT_FAULTINFO(regs); + + /* !MMU specific part; detection of userspace */ + /* mark is_user=3D1 when the IP is from userspace code. */ + if (UPT_IP(regs) > uml_reserved && UPT_IP(regs) < high_physmem) + regs->is_user =3D 1; + + if (UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)) { + show_segv_info(regs); + bad_segv(*fi, UPT_IP(regs)); + return; + } + segv(*fi, UPT_IP(regs), UPT_IS_USER(regs), regs, mc); + + /* !MMU specific part; detection of userspace */ + relay_signal(sig, unused_si, regs, mc); +} + +/* + * We give a *copy* of the faultinfo in the regs to segv. + * This must be done, since nesting SEGVs could overwrite + * the info in the regs. A pointer to the info then would + * give us bad data! + */ +unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, + struct uml_pt_regs *regs, void *mc) +{ + int si_code; + int err; + int is_write =3D FAULT_WRITE(fi); + unsigned long address =3D FAULT_ADDRESS(fi); + + if (!is_user && regs) + current->thread.segv_regs =3D container_of(regs, struct pt_regs, regs); + + if (current->mm =3D=3D NULL) { + show_regs(container_of(regs, struct pt_regs, regs)); + panic("Segfault with no mm"); + } else if (!is_user && address > PAGE_SIZE && address < TASK_SIZE) { + show_regs(container_of(regs, struct pt_regs, regs)); + panic("Kernel tried to access user memory at addr 0x%lx, ip 0x%lx", + address, ip); + } + + if (SEGV_IS_FIXABLE(&fi)) + err =3D handle_page_fault(address, ip, is_write, is_user, + &si_code); + else { + err =3D -EFAULT; + /* + * A thread accessed NULL, we get a fault, but CR2 is invalid. + * This code is used in __do_copy_from_user() of TT mode. + * XXX tt mode is gone, so maybe this isn't needed any more + */ + address =3D 0; + } + + if (!err) + goto out; + else if (!is_user && arch_fixup(ip, regs)) + goto out; + + if (!is_user) { + show_regs(container_of(regs, struct pt_regs, regs)); + panic("Kernel mode fault at addr 0x%lx, ip 0x%lx", + address, ip); + } + + show_segv_info(regs); + + if (err =3D=3D -EACCES) { + current->thread.arch.faultinfo =3D fi; + force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address); + } else { + WARN_ON_ONCE(err !=3D -EFAULT); + current->thread.arch.faultinfo =3D fi; + force_sig_fault(SIGSEGV, si_code, (void __user *) address); + } + +out: + if (regs) + current->thread.segv_regs =3D NULL; + + return 0; +} + +void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs, + void *mc) +{ + int code, err; + + /* !MMU specific part; detection of userspace */ + /* mark is_user=3D1 when the IP is from userspace code. */ + if (UPT_IP(regs) > uml_reserved && UPT_IP(regs) < high_physmem) + regs->is_user =3D 1; + + if (!UPT_IS_USER(regs)) { + if (sig =3D=3D SIGBUS) + pr_err("Bus error - the host /dev/shm or /tmp mount likely just ran out= of space\n"); + panic("Kernel mode signal %d", sig); + } + /* if is_user=3D=3D1, set return to userspace sig handler to relay signal= */ + nommu_relay_signal(mc); + + arch_examine_signal(sig, regs); + + /* Is the signal layout for the signal known? + * Signal data must be scrubbed to prevent information leaks. + */ + code =3D si->si_code; + err =3D si->si_errno; + if ((err =3D=3D 0) && (siginfo_layout(sig, code) =3D=3D SIL_FAULT)) { + struct faultinfo *fi =3D UPT_FAULTINFO(regs); + + current->thread.arch.faultinfo =3D *fi; + force_sig_fault(sig, code, (void __user *)FAULT_ADDRESS(*fi)); + } else { + pr_err("Attempted to relay unknown signal %d (si_code =3D %d) with errno= %d\n", + sig, code, err); + force_sig(sig); + } +} + +void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs, + void *mc) +{ + do_IRQ(WINCH_IRQ, regs); +} diff --git a/arch/um/os-Linux/signal.c b/arch/um/os-Linux/signal.c index 53e276e81b37..67dcd88b45b1 100644 --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -40,9 +40,10 @@ static void sig_handler_common(int sig, struct siginfo *= si, mcontext_t *mc) int save_errno =3D errno; =20 r.is_user =3D 0; + if (mc) + get_regs_from_mc(&r, mc); if (sig =3D=3D SIGSEGV) { /* For segfaults, we want the data from the sigcontext. */ - get_regs_from_mc(&r, mc); GET_FAULTINFO_FROM_MC(r.faultinfo, mc); } =20 diff --git a/arch/x86/um/nommu/do_syscall_64.c b/arch/x86/um/nommu/do_sysca= ll_64.c index 9bc630995df9..cf5a347ee9b1 100644 --- a/arch/x86/um/nommu/do_syscall_64.c +++ b/arch/x86/um/nommu/do_syscall_64.c @@ -44,6 +44,9 @@ __visible void do_syscall_64(struct pt_regs *regs) /* set fs register to the original host one */ os_x86_arch_prctl(0, ARCH_SET_FS, (void *)host_fs); =20 + /* save fp registers */ + asm volatile("fxsaveq %0" : "=3Dm"(*(struct _xstate *)regs->regs.fp)); + if (likely(syscall < NR_syscalls)) { unsigned long ret; =20 @@ -61,6 +64,9 @@ __visible void do_syscall_64(struct pt_regs *regs) /* handle tasks and signals at the end */ interrupt_end(); =20 + /* restore fp registers */ + asm volatile("fxrstorq %0" : : "m"((current->thread.regs.regs.fp))); + /* restore back fs register to userspace configured one */ os_x86_arch_prctl(0, ARCH_SET_FS, (void *)(current->thread.regs.regs.gp[FS_BASE diff --git a/arch/x86/um/nommu/os-Linux/mcontext.c b/arch/x86/um/nommu/os-L= inux/mcontext.c index b62a6195096f..afa20f1e235a 100644 --- a/arch/x86/um/nommu/os-Linux/mcontext.c +++ b/arch/x86/um/nommu/os-Linux/mcontext.c @@ -4,10 +4,21 @@ #include #include #include +#include +#include "../syscalls.h" =20 extern long __kernel_vsyscall(int64_t a0, int64_t a1, int64_t a2, int64_t = a3, int64_t a4, int64_t a5, int64_t a6); =20 +void set_mc_relay_signal(mcontext_t *mc) +{ + /* configure stack and userspace returning routine as + * instruction pointer + */ + mc->gregs[REG_RSP] =3D (unsigned long) current_top_of_stack; + mc->gregs[REG_RIP] =3D (unsigned long) userspace; +} + void set_mc_sigsys_hook(mcontext_t *mc) { mc->gregs[REG_RCX] =3D mc->gregs[REG_RIP]; diff --git a/arch/x86/um/shared/sysdep/mcontext.h b/arch/x86/um/shared/sysd= ep/mcontext.h index 9a0d6087f357..82a5f38b350f 100644 --- a/arch/x86/um/shared/sysdep/mcontext.h +++ b/arch/x86/um/shared/sysdep/mcontext.h @@ -19,6 +19,7 @@ extern int set_stub_state(struct uml_pt_regs *regs, struc= t stub_data *data, =20 #ifndef CONFIG_MMU extern void set_mc_sigsys_hook(mcontext_t *mc); +extern void set_mc_relay_signal(mcontext_t *mc); #endif =20 #ifdef __i386__ diff --git a/arch/x86/um/shared/sysdep/ptrace.h b/arch/x86/um/shared/sysdep= /ptrace.h index 572ea2d79131..6ed6bb1ca50e 100644 --- a/arch/x86/um/shared/sysdep/ptrace.h +++ b/arch/x86/um/shared/sysdep/ptrace.h @@ -53,7 +53,7 @@ struct uml_pt_regs { int is_user; =20 /* Dynamically sized FP registers (holds an XSTATE) */ - unsigned long fp[]; + unsigned long fp[] __attribute__((aligned(16))); }; =20 #define EMPTY_UML_PT_REGS { } --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4AD172848BB for ; Thu, 18 Sep 2025 05:16:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172611; cv=none; b=IHSYsZn+N/B4prTbwGNAnXZ9eiccSZ03WMywxoTcGvw24jUWn8hiyjVfPbBSU8uCsKZgjPaKF3mAnk6qC287uKaOZ10IkOVzgg+cyhDTgpUG7okdo8NHrj1rEjo94ImIPPAgKURe/mFBKB4QiKH7kXjnxaiNh7prCrW23csSZMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172611; c=relaxed/simple; bh=A+kgl3pP41bBhorqPw1acgSIN74xjFREHN1mNj1smKY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hFhmtjm7FeIUQSh839A9idjiXLJkIUSMMK3aQUGPAbfKuXh/UN4fjFwavegefdvrv+aRqhtVIBgrey9XFXPQoicVJcNeK9Or2ZhYAg4k+7CkEucwyv4ZsT6hXgQdI8Dw5WdljXVGMppx+Weut8rAybYe+Us9ujq+mmrfip7G7Qw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HNYBjxTw; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HNYBjxTw" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-32b863ed6b6so430341a91.2 for ; Wed, 17 Sep 2025 22:16:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172610; x=1758777410; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sL9evNGVpzgjwGis6FRx6Ny95Jmdu1Zd+5bgNtHIJLs=; b=HNYBjxTwkT7g2pejceFpxCzKWIOR7X2n6SfZ0oz8n8T67NKKLRXD6G3fgK6Frcewq7 gsdVdYhVC3czM1lTPazTKhp8uQtKhE+I0burEBTLmtksIWItQ+Y/T4nAqokPia2U3YzG 7mvOafYgwOhXK2QvRYo7GZdM3bHUR/7+s1be7NGZWA00YoBzWSH/xcP5QBe+sTNuse/c sMZ+ud6F2Js+Atp+oLfADxbKQO55b/SABgi3+QZxSF9T4wpg0URNQ6Yq9RHA4eBjVyzQ D6Y8pAlwea0ZQT8KvrjjkXfE/dMKgjXSxk+fD3LeUVQHPivTKyKaxo0YCwWSOxfW7pat ruXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172610; x=1758777410; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sL9evNGVpzgjwGis6FRx6Ny95Jmdu1Zd+5bgNtHIJLs=; b=O3sxLFcvw9tASvOOITPFPZFIQu3rGgtl88ArHpre4aTlkHReoMV1qrAUxdtsXUDz3/ 0MCkYVBflRQcXBP9GC+IifYos7LVfRe/cxHLjJEUQNjDuLbqONCsJRaiWYUIUw51t4E8 R3I1pK72YQgh64KZvlFLh3UI3b2nfO3hwBJIb4i08SqM6vPWQXiC8v68Px7EW/ugXTbH Aeq0RJVV0P7cmr/TBhx10XIliuhZkB2How7hs/pcG+gogVpSMmhHULeUq/xl+ijDjZCm AKnE+zArNxBsOqRO9b49SBSwApKSLgKd2YGroVDI/fxpZQ8oOniMya6mui6wt8fcVgwA sFlQ== X-Forwarded-Encrypted: i=1; AJvYcCVGR0nnxB2J0NLz7QvZ59V2Hkq9YJrcJchdHTcCZVOK8rJ2c8yq+nwz0Ft0VDBrn709yNsHdI+5iokEQqs=@vger.kernel.org X-Gm-Message-State: AOJu0YwLSDx48w7PT1Sc0A+CGRHoHFj1iwq7PryUh1539ajvbKdp0kNm m+cQWpYtwlOFG/1lidE8hTxMpDLRKLHR9TCLxa+pTlrRpSGEdW/TtR1L X-Gm-Gg: ASbGnctaRtrjv1Ri/v1lL7rK2v1BFFvIBrcRU5wK/KV8fV+2XSBw78ty++O007a5C5b Yyu1lRr4F5IBsxTHz29KhsAEQLF6zCOmR+7vAwlTbiQErgj7PCLAh4CaGN4KthvjY1A7HTv3Q7x smj6itQ3gVfXP77OfmrqasR9ph6iAc+gZ/2KKoBZjAzNBWQ8+FVQFC2ITVHZ9HkXD91zS6HXRm9 0vInDsKALwtsaiAC+ZAhiAUyHTpCCPZ9uG1xxdEcRZzlcmG8+ZYs5WGoCO2gBvZ+3dvi61XpgGW IRHBv6KSNWx+CLli1FTjj0EmiOS67gAxdrh4DQN4N5GMDScu9wWwqXm23SupM55lC2zJ/CLTiS9 SDzUi4RIIFD+etXfKf6rhxRt1GqnsBBMhrSbPX8Uvdb1sXnci2Y9/rJPHfCqkeviL4ThD4zDq4Y mjKiBnVH6Mq5E= X-Google-Smtp-Source: AGHT+IFwiCIUby5Al7WTn2I/DIUnBMJmg3jISswUhPnLRV817OVMwAQnC20DwIBS9SCeb7OC9m1+7w== X-Received: by 2002:a17:90b:4c12:b0:32b:7d2f:2ee7 with SMTP id 98e67ed59e1d1-32ee3ebecf9mr5669955a91.13.1758172609515; Wed, 17 Sep 2025 22:16:49 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3306064edb8sm1208854a91.7.2025.09.17.22.16.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:48 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 82C191061EF7; Thu, 18 Sep 2025 14:16:47 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 11/14] um: nommu: a work around for MMU dependency to PCI driver Date: Thu, 18 Sep 2025 14:16:04 +0900 Message-ID: <3cdc0df9917b2acdd718dc2587ae1bddb9258b06.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The commit 8fe743b5eba0 ("PCI: Add CONFIG_MMU dependency") restricts the PCI base driver to depend on MMU. While nommu UML _can_ implement PCI drivers over PCI devices (e.g., virtio-pci), the current nommu UML doesn't implement it. But without PCI drivers kunit complains as config for kunit (arch_uml.config) defines the dependency to PCI drivers. This commit fixes the issue of this compile failures when building PCI drivers with nommu UML. In particular, the fix is to undefine the constant PCI_IOBASE to be able to bypass pci_unmap_iospace() call. When we will support PCI drivers for nommu UML, we will refactor this code. Signed-off-by: Hajime Tazaki --- arch/um/include/asm/dma.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/um/include/asm/dma.h b/arch/um/include/asm/dma.h index fdc53642c718..643d74555671 100644 --- a/arch/um/include/asm/dma.h +++ b/arch/um/include/asm/dma.h @@ -4,6 +4,19 @@ =20 #include =20 +/** + * now the PCI core driver depends on CONFIG_MMU in linus tree, nommu + * UML cannot build with PCI but without PCI kunit doesn't build due + * to the dependency to the CONFIG_VIRTIO_UML. + * + * This is a workaround to silence build failures on kunit, which is + * valid until nommu UML supports PCI drivers (e.g., virtio-pci) in a + * future. + */ +#ifndef CONFIG_MMU +#undef PCI_IOBASE +#endif + extern unsigned long uml_physmem; =20 #define MAX_DMA_ADDRESS (uml_physmem) --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE7642BF3D7 for ; Thu, 18 Sep 2025 05:16:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172615; cv=none; b=EBlesjFf1pERI78i4KStFZW5J/FC5cLURMnyGVldq6tc2RJBAeCR9YlEEDJOU0mDWS/vazsYef+R6ByoQHAekejittemhIx4GvpbCNvzE3iPN0K9F+22WJi3K13gCnJsbyRN5fOb9XFLFWVAOESJQ92FfI9vX7srZzlzAm8OulA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172615; c=relaxed/simple; bh=kvY4llqgRsxBvMcZ/CXo6FHDMPIg9Hmu3RD2Lrj2HZo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gdkxLPm5zxJRDi8NprEJ8VEM1qS0NF1RjxGSlVaq5BHPWOAZnlFgIh/mIz89ZWOewHjq3a69t5N3ySJneTybdZ1umMdQ6MdLUJyNFnf0GYPE6kjZ+Hh1yvxEitJT1iZyxuof0XhfXsBYYa9HGy4m66BOuvqucOIABb0L9GvrGfU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gLVw5tiD; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gLVw5tiD" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2680cf68265so4432145ad.2 for ; Wed, 17 Sep 2025 22:16:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172613; x=1758777413; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SfaLR+xtvYbSj0Yj5pLhRxT8PrYzixVb/sw/K5Eb4uM=; b=gLVw5tiDMmHT8ZLqPuBL1+FHXudrVGdojSG0wiaa/PzVvyqgWhniaWXw/wRa7Rw1lS rBB1wxmkDeDBScSOrhiHQJllgUolHJD6ecXCHO5MB4k/84GfRjN8CDci+V1bUPlmintx QwGcik7cqE92RslU0v7Qfdw89TCFbJObOAeId9/F0JxTfKpoO97w7iEFiZhKyoGWcv4H /r+gkkLtuWQJhJx1FTANMlMiX35B3KfFNPV58qHoQg7aWemZZCWuVxaSwb546S/Mb8wJ dZ/wxKNpcaCsdTf+dwGFe30qTh16JrQ9aTMEKbqan7p+LuqGNFUc9vXCXpGXJ+ICqEAW ynfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172613; x=1758777413; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SfaLR+xtvYbSj0Yj5pLhRxT8PrYzixVb/sw/K5Eb4uM=; b=rC8CkpOhtw+1BFLgE0N3DRPQngTNYQCdY/NBgxhUSPVYnZTyvu6mRA1zfyhpEuSFFw dK8pz4/rM01W6DDO05nK+4fsFY6zpyP9m3GVYF09wPXlDR479sRt54w7asq52Mc4T2Rw 9jukyLJ1pqAcDjqAEyDKOOnytLNpfeLqWqlssLrQwewCFMxu+hfRCNyD5YpzlaGs3F7O ME4xvmh0Zr1FTHe2W6wBfvU3IV3eIrJmQ6lBAS5CnKxrc8LYcCD3bP26rzXtWmDVTCxo EN1hBl5AVTHdyd++xjqBGWse/5hgWmJi15bxtD9V2W2/Wc8lh8J53r1Q0xlJzxDWsn01 TT0A== X-Forwarded-Encrypted: i=1; AJvYcCU1qbIN0Lyjo/lthU5IeWYF/QBe2jeXR8mc736bxCxbsXsYSflFFwaCoD29ewJyDEa6yWjvw33aBuFjC9k=@vger.kernel.org X-Gm-Message-State: AOJu0YyLVLK8UtpQXMqDhCvXtMWAmhJKYE0XoMzQR/BYAiflGaBxdIJs iAViSAvxC8IsL+6pBzXNjUoWrhEK6hi57u4OGeTa1zpq1c2JFFQhVKqtWLyGbw== X-Gm-Gg: ASbGnctZOLApH+Ess0SfG7v4fD9LggWjCEqZB88QtXSB5mwtOYiFiKZ3cMafR0cJCDu 1AthM9Gw71c/2u+xlwlqv4cX2hWj3+5x8j0fZC1/225uSQvYJSFTrfRG/AhUZChQQnGnw0WJxME B/wxlcRBub8v0fnPv7W0M7zqgnak+z3wyKrymLSsBu8R6udj1zadsscHwlkqWXQLORqRT8nymqh PIK/7qv0uvpDuofSCEXKNOmiqI29dQc6NvYz4W11Og8dCnypwWkWK+/sH/oxmvyTFTxqK/bnz3x OeQsNOJgqdFncXwBRAhl9nRiwKN2tr158UA0BZzJmUw4sZ+rltR/xaJxHqwJmD4CM8ajrx4PD3a RIqHEhUmcdyEaKaMW2AYcUnZbSsWw+pZBxF1ZwcXrjH3nMS+8fQ1kdKFVKQTF8x7rGDNbC5meGp Thj6PFFOLSWng= X-Google-Smtp-Source: AGHT+IEifDbjgR7s6TwejGaq1ZSUhh2KXIkEFHyaKhNV1A4v7AfhWkkpamL+EAMom7TUh85CJvEh6g== X-Received: by 2002:a17:903:2345:b0:269:6401:7fdb with SMTP id d9443c01a7336-26964018c43mr56230345ad.17.1758172612995; Wed, 17 Sep 2025 22:16:52 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3306064edb8sm1208993a91.7.2025.09.17.22.16.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:52 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 531001061EF9; Thu, 18 Sep 2025 14:16:50 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 12/14] um: change machine name for uname output Date: Thu, 18 Sep 2025 14:16:05 +0900 Message-ID: <8e75e4e2116d25a2bd6065ed6b53e57b0eb0a86f.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit tries to display MMU/!MMU mode from the output of uname(2) so that users can distinguish which mode of UML is running right now. Signed-off-by: Hajime Tazaki --- arch/um/Makefile | 6 ++++++ arch/um/os-Linux/util.c | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/um/Makefile b/arch/um/Makefile index 5371c9a1b11e..9bc8fc149514 100644 --- a/arch/um/Makefile +++ b/arch/um/Makefile @@ -153,6 +153,12 @@ export CFLAGS_vmlinux :=3D $(LINK-y) $(LINK_WRAPS) $(L= D_FLAGS_CMDLINE) $(CC_FLAGS_ CLEAN_FILES +=3D linux x.i gmon.out MRPROPER_FILES +=3D $(HOST_DIR)/include/generated =20 +ifeq ($(CONFIG_MMU),y) +UTS_MACHINE :=3D "um" +else +UTS_MACHINE :=3D "um\(nommu\)" +endif + archclean: @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ -o -name '*.gcov' \) -type f -print | xargs rm -f diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c index 4193e04d7e4a..20421e9f0f77 100644 --- a/arch/um/os-Linux/util.c +++ b/arch/um/os-Linux/util.c @@ -65,7 +65,8 @@ void setup_machinename(char *machine_out) } # endif #endif - strcpy(machine_out, host.machine); + strcat(machine_out, "/"); + strcat(machine_out, host.machine); } =20 void setup_hostinfo(char *buf, int len) --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6B5302C08C4 for ; Thu, 18 Sep 2025 05:16:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172617; cv=none; b=TGyVvxB4Aj0+Nypt7PWKSzNFoih0xEZXN9t1+TQHGqD3y7DTmos7+sWzhHegP3av45HS4JdzxcZ5nDdbD+Awl0lmUysyxlfTJ4JngcLC7tJxiVe6AmbDsH5zp2MfymLwBVTsN9olUnAwJwQ9I5SpiTliob307dYoV9so/8r5d0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172617; c=relaxed/simple; bh=YthZjy/Hv5hqKNtjIRhLrTfxuO/N5yUqpo/LnhhO6o0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NJx3aOuKeyQ8F3AW0qYuZ6m+/GWfVFzD9Y68O4jv9OAtJtLUHqymEF37v0OV4GU0mwgCd7iPsIJa4K1PrkpTRTSdH1UpFr7oBi1RYfh+yoqDYYG356EaoecvgSIBlZ1aYuIQU0yxWoyJR0Va9pXKHFx/p5m1piaMeymQCFAaXc0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BpZWyN3L; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BpZWyN3L" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-77da29413acso11243b3a.1 for ; Wed, 17 Sep 2025 22:16:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172615; x=1758777415; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7W9A+e/F06Vc82vlngwh7iXI86jVV5QL2Xi32VbEg8Q=; b=BpZWyN3L3yY3x1NiUqyvfpYjDp5ycOEUaWMuNRzM/fbQoFtjkTsvRtLRmS9Y5VuptN H4L9W2sb4SzIrtqpQyYk9aIFke0czyxpf1/dn9TwFaZT0TNSziPaF8ln5qNOLgPPuReY I9ZBaf0T+vq41Nap/IG61SfRxkuB5QpPbLIZdZ/KYvuBo4jVhcHebMTknQLn7VE+amZA cDYXFRmHR1ydrcHHfuiE6XPo9fUzUi4KHN+vdvM2J0hMBTjpRbd4Z1CWj+07dpJLabwv SsQI7JyvMAoBXiGiuMsA8R5LERquvPsnQ4tQfwfUT69mnFTFgeXuu1pPQ+E9xZjguV6k UUBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172615; x=1758777415; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7W9A+e/F06Vc82vlngwh7iXI86jVV5QL2Xi32VbEg8Q=; b=r0wlu5EFR+3YfnB1zMAuS0/2w5e6/JVMXnFcVuNQUbIlWhnDDjN3FGKzKS1EQ3Sniz bQxF2hvCVw2qenpozVT3kjcpd/6IozUvgFdxhvJeqwVWiBmHHINFKoUhyKSMsShtnKZQ 4/SlUqmzcCztJeRsizLk18U15RwJ/O6dtuD0qPZb9isV0cd3pFrhiM29PDoK7j8qbDko 0FXtdw6GjBWDfwzEHHqQAMa6NPHWZV45/jt9vGyZwAjWUcGFhlbYO2r9qnWthzmfQAMV 7CBfzx8WQvewG7sAwoW4VVpXSIPGKEJRetVycDF0KHuIZX23BLfNDB4YfVcdvGgX3rzU n16A== X-Forwarded-Encrypted: i=1; AJvYcCXlev/7SB5cKPRfIA55pReQ+lypfa8sJX+LiHuQLqLj1QmG9OaNyWR/l1jLnjy6+j6MAJHzTtB5GQSJ+aM=@vger.kernel.org X-Gm-Message-State: AOJu0YxBDhpQ2djTFCBUs9NXJxMH2x1YouneiHkZJY1cM8VIw+cyAsst NAqmw0qFym0ZSGhCf69qQ18swl+8ex2ZY5ZSJVs+b+ERNyUhzURBcBu1 X-Gm-Gg: ASbGncuyjaj04cYMZklC+XspN4n/DlGyzMjNKrIHWZzDQK58X4/xpKZypny+w780Jh9 RtYZ1Quh/NymrtL0ATExTXKfkJpyZJwXfC2XmSfwvB+/IP63iJPJtbHsuG0H9YqbzUI9EwLYuO/ Z/FIymg6M9KW69PRoznIdiPiA8FjGHBhy+65IRkbvva/RFJOZ1WH7fuDtZbE29lbI7Z4Bwwo+dT jNsiM06EEHEy7l6HXB0M7w/iASMuZaUDPMT8AWi2ukR5tFboiloI+5Xv/BQ0HEwBjqA/V0XBzXx wbSKBBww//n6ynqVuag54bUeJXpuYwJQpzBPTBE03T+mEyUxvxzoUuKxK/Of6n8dUSpROYNbPaI ROHclCdf22e2ujTw9OGEOzvJ7seYM6/O0235lU44AAEloEQEwvgXl5jWLn9+reApMq7JJTyYKVn 8eClboJJQO9aE= X-Google-Smtp-Source: AGHT+IEE5bhAXGPg0At7G00mXMtBGsn7rVxTHuZFoiN+K+q3D4zlIFK5OGVWVsR6FWUseoB/IlYZgw== X-Received: by 2002:a05:6a00:189d:b0:776:9d99:e3f1 with SMTP id d2e1a72fcca58-77bf9856e7cmr5252403b3a.26.1758172614565; Wed, 17 Sep 2025 22:16:54 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfc2490dcsm1109998b3a.36.2025.09.17.22.16.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:53 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 378A01061EFB; Thu, 18 Sep 2025 14:16:52 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 13/14] um: nommu: add documentation of nommu UML Date: Thu, 18 Sep 2025 14:16:06 +0900 Message-ID: <16a6c1233ec249e1bd32ad1aca36b0e1e396e1b0.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This commit adds an initial documentation for !MMU mode of UML. Signed-off-by: Hajime Tazaki --- Documentation/virt/uml/nommu-uml.rst | 180 +++++++++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 181 insertions(+) create mode 100644 Documentation/virt/uml/nommu-uml.rst diff --git a/Documentation/virt/uml/nommu-uml.rst b/Documentation/virt/uml/= nommu-uml.rst new file mode 100644 index 000000000000..f049bbc697d1 --- /dev/null +++ b/Documentation/virt/uml/nommu-uml.rst @@ -0,0 +1,180 @@ +.. SPDX-License-Identifier: GPL-2.0 + +UML has been built with CONFIG_MMU since day 0. The patchset +introduces the nommu mode on UML in a different angle from what Linux +Kernel Library tried. + +.. contents:: :local: + +What is it for ? +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +- Alleviate syscall hook overhead implemented with ptrace(2) +- To exercises nommu code over UML (and over KUnit) +- Less dependency to host facilities + + +How it works ? +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +To illustrate how this feature works, the below shows how syscalls are +called under nommu/UML environment. + +- boot kernel, install seccomp filter if ``syscall`` instructions are + called from userspace memory based on the address of instruction + pointer +- (userspace starts) +- calls ``vfork``/``execve`` syscalls +- ``SIGSYS`` signal raised, handler calls syscall entry point ``__kernel_v= syscall`` +- call handler function in ``sys_call_table[]`` and follow how UML syscall + works. +- return to userspace + + +What are the differences from MMU-full UML ? +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The current nommu implementation adds 3 different functions which +MMU-full UML doesn't have: + +- kernel address space can directly be accessible from userspace + - so, ``uaccess()`` always returns 1 + - generic implementation of memcpy/strcpy/futex is also used +- alternate syscall entrypoint without ptrace +- alternate syscall hook + - hook syscall by seccomp filter + +With those modifications, it allows us to use unmodified userspace +binaries with nommu UML. + + +History +=3D=3D=3D=3D=3D=3D=3D + +This feature was originally introduced by Ricardo Koller at Open +Source Summit NA 2020, then integrated with the syscall translation +functionality with the clean up to the original code. + +Building and run +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +:: + + make ARCH=3Dum x86_64_nommu_defconfig + make ARCH=3Dum + +will build UML with ``CONFIG_MMU=3Dn`` applied. + +Kunit tests can run with the following command:: + + ./tools/testing/kunit/kunit.py run --kconfig_add CONFIG_MMU=3Dn + +To run a typical Linux distribution, we need nommu-aware userspace. +We can use a stock version of Alpine Linux with nommu-built version of +busybox and musl-libc. + + +Preparing root filesystem +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +nommu UML requires to use a specific standard library which is aware +of nommu kernel. We have tested custom-build musl-libc and busybox, +both of which have built-in support for nommu kernels. + +There are no available Linux distributions for nommu under x86_64 +architecture, so we need to prepare our own image for the root +filesystem. We use Alpine Linux as a base distribution and replace +busybox and musl-libc on top of that. The following are the step to +prepare the filesystem for the quick start:: + + container_id=3D$(docker create ghcr.io/thehajime/alpine:3.20.3-um-nom= mu) + docker start $container_id + docker wait $container_id + docker export $container_id > alpine.tar + docker rm $container_id + + mnt=3D$(mktemp -d) + dd if=3D/dev/zero of=3Dalpine.ext4 bs=3D1 count=3D0 seek=3D1G + sudo chmod og+wr "alpine.ext4" + yes 2>/dev/null | mkfs.ext4 "alpine.ext4" || true + sudo mount "alpine.ext4" $mnt + sudo tar -xf alpine.tar -C $mnt + sudo umount $mnt + +This will create a file image, ``alpine.ext4``, which contains busybox +and musl with nommu build on the Alpine Linux root filesystem. The +file can be specified to the argument ``ubd0=3D`` to the UML command line:: + + ./vmlinux ubd0=3D./alpine.ext4 rw mem=3D1024m loglevel=3D8 init=3D/sbin/= init + +We plan to upstream apk packages for busybox and musl so that we can +follow the proper procedure to set up the root filesystem. + + +Quick start with docker +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +There is a docker image that you can quickly start with a simple step:: + + docker run -it -v /dev/shm:/dev/shm --rm ghcr.io/thehajime/alpine:3.20.3= -um-nommu + +This will launch a UML instance with an pre-configured root filesystem. + +Benchmark +=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The below shows an example of performance measurement conducted with +lmbench and (self-crafted) getpid benchmark (with v6.17-rc5 uml/next +tree). + +.. csv-table:: lmbench (usec) + :header: ,native,um,um-mmu(s),um-nommu(s) + + select-10 ,0.5319,36.1214,24.2795,2.9174 + select-100 ,1.6019,34.6049,28.8865,3.8080 + select-1000 ,12.2588,43.6838,48.7438,12.7872 + syscall ,0.1644,35.0321,53.2119,2.5981 + read ,0.3055,31.5509,45.8538,2.7068 + write ,0.2512,31.3609,29.2636,2.6948 + stat ,1.8894,43.8477,49.6121,3.1908 + open/close ,3.2973,77.5123,68.9431,6.2575 + fork+sh ,1110.3000,7359.5000,4618.6667,439.4615 + fork+execve ,510.8182,2834.0000,2461.1667,139.7848 + +.. csv-table:: do_getpid bench (nsec) + :header: ,native,um,um-mmu(s),um-nommu(s) + + getpid , 161 , 34477 , 26242 , 2599 + +(um-nommu(s) is with seccomp syscall hook, um-mmu(s) is SECCOMP mode, +respectively) + +Limitations +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +generic nommu limitations +------------------------- +Since this port is a kernel of nommu architecture so, the +implementation inherits the characteristics of other nommu kernels +(riscv, arm, etc), described below. + +- vfork(2) should be used instead of fork(2) +- ELF loader only loads PIE (position independent executable) binaries +- processes share the address space among others +- mmap(2) offers a subset of functionalities (e.g., unsupported + MMAP_FIXED) + +Thus, we have limited options to userspace programs. We have tested +Alpine Linux with musl-libc, which has a support nommu kernel. + +supported architecture +---------------------- +The current implementation of nommu UML only works on x86_64 SUBARCH. +We have not tested with 32-bit environment. + + +Further readings about NOMMU UML +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D + +- NOMMU UML (original code by Ricardo Koller) + - https://static.sched.com/hosted_files/ossna2020/ec/kollerr_linux_um_nom= mu.pdf diff --git a/MAINTAINERS b/MAINTAINERS index cd7ff55b5d32..2bc267220b07 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26300,6 +26300,7 @@ USER-MODE LINUX (UML) M: Richard Weinberger M: Anton Ivanov M: Johannes Berg +M: Hajime Tazaki L: linux-um@lists.infradead.org S: Maintained W: http://user-mode-linux.sourceforge.net --=20 2.43.0 From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 733C62BF3D7 for ; Thu, 18 Sep 2025 05:16:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172619; cv=none; b=DulfBv9i1tSB04KUC/Oh25bC7XTVJLK06REepBNQRKD7KtMp0hs4vTsHRwiBjOYtMsuRcPTRijTeSnsY6EKUQ4ORIyiWwc2YBW7uE4LkrHKtBJckV+iGDhE44EVzmKEw5/rZ0gJkL4eKMU0Kga3dKeK07eXx+jg0XRxqzd87X94= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758172619; c=relaxed/simple; bh=H4z+K4nZbNEAC2aE3ZetyeCuDlJ6EyjEggbl9qc6cyE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ev3Pw8Q8v+mBQIAQgoFB79IJ2mAKMJmtp7dNb5jr6EzjGBC0SKwd/GJ9xfG2woBU4fJX3pYp1m+zuzCSA01aAO7Av3J0IlhPVoUkyxtV2nTjGVuG/x0qz78eqB5nvuM4/D84kQa55UMNeiNCbajKIKk5DPGEjAa51rcn7vKKDF0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VNs9QuMx; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VNs9QuMx" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-77256e75eacso521175b3a.0 for ; Wed, 17 Sep 2025 22:16:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758172618; x=1758777418; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=weQA9Kmk5Cj0pX9CPL2mzbHMoGKA1UTMBAigZCiGmmg=; b=VNs9QuMxO7x4klPLKHvQHvCSWba6Dorc+h0e2j0mGPTtPZpmWh0w/xjrB5YxE1xkk+ c5XugWC54GMx0EhGNdLW0y+mPyFlBVrH2W20O66hTF7zrpVz1tOJfkzNhN5LQxOefBGO fKBxySQsFeRjlcOEPmIzEXddQOIatQ30zml1AuG4aFz3QHsGznb/tUPDMjKTfv1D2NLe 5cAMHQcuS4cf0HW0iWoQ9VxabPY2vTCF9rj82cayGqTZi20pm267yP9l97GCXfGkcZ41 zDdsyzJbnQTCvtPPo2sg5on2j7Jgj1nGrMMrEESdA+gYq4F/dcdP+bhesI8jTNPwl20C 4Vww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758172618; x=1758777418; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=weQA9Kmk5Cj0pX9CPL2mzbHMoGKA1UTMBAigZCiGmmg=; b=LqLyz2DGJ2E5YjGYgDmZKhUyj5BLBYAYwEdR56mA7qxOMi+z9AVBmeFWDFVEUciUMF PHS1FxA737+ZUOW+1TPmIYkGMzgoyVi0XFxvBNC50LOfTYD0YByuP13C9ng+qOYfgO0A jZiuuSXtJmYZPVlIrp6aDQWRCRWdUlny9tjostSKSHgtW6Az5ja2A6x2SKX4L+fEqe16 MiqORPpENio59LS4KPkWCBlYd8atpyh0ilpZe79m++gtp8UsWJq36AINP5HRhBGyT591 F6dvKiFlmNQzbumZYyn2qfsvQHIvw92PiE9M+XOyqSSZb/Y5Aa6MJZCIfXiXgf+xst2Z yT1Q== X-Forwarded-Encrypted: i=1; AJvYcCWd+OpPt6i4utSkYkC/bEAutZhzz/0ptQxRlPOu19qsXmvbOKm8Gdz2X3aQgqK5AGrNUqTH/NWCCEihdsg=@vger.kernel.org X-Gm-Message-State: AOJu0YwANz3owbsISd+VvfZ/GF6oVdIGqDniT4A2lmD3BvCB7IYM1p4k oZulCtQYHNvAAgF/B15v5C9Ryebv/2/fMARoaRVL3yQvYueSFNWX4/c4 X-Gm-Gg: ASbGnctPdt8GTuPmSdz0qtW+2ZjTvIZ0a3AfXydVljN2woC0RlqjwWZyHQ7FGxPP9DC yVPvovzglBeJavcCFCuZO5uMfMq+6k3wsub7jDKSLS2I5hNRKBIROucdIi29PmDaIK4FKTObvNC wAmFabN0kDtzAxmAnlnikeujygRLSjl93nLFUsBO4Z+oTUV3AhKfOmHTQpNc6stQSo/8vZ4ri2Y y/4ytwtqcFWZyGF/55NuwkGK7HLnrk0cddW1lRufTY+OwBGqmsEyHI/K1FZha+BF5qavELpkg0L OJEYMbJQa4XvRIIIFnVvJpoObrNvoekU2Hz62VrJAwHbtKKFSV4sIXxw4XrL73d26nzTpfTAZWP YiV+23aK4YTsQXEPog+CBo2zz5OucaSLRH8N+L9eW7rdzk1oE1CB8s47b4coiXSRSMSZfFNEup8 npmmiB22oi6w4= X-Google-Smtp-Source: AGHT+IGZQwtJMyRnh3Z8k0XoyJf1CY4mOdwaCuE/LPYRa5FoHXNH/TLQrn91zATBe14rAtpangIWQA== X-Received: by 2002:a05:6a20:9150:b0:252:76ab:8beb with SMTP id adf61e73a8af0-27aa99bd366mr6383648637.41.1758172617633; Wed, 17 Sep 2025 22:16:57 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b54ff35afa1sm1149269a12.7.2025.09.17.22.16.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Sep 2025 22:16:56 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 2AC351061EFD; Thu, 18 Sep 2025 14:16:55 +0900 (JST) From: Hajime Tazaki To: linux-um@lists.infradead.org Cc: thehajime@gmail.com, ricarkol@google.com, Liam.Howlett@oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH v11 14/14] um: nommu: plug nommu code into build system Date: Thu, 18 Sep 2025 14:16:07 +0900 Message-ID: <8a9d6dde30441e5605b864d99977e6cf5842205c.1758171893.git.thehajime@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add nommu kernel for um build. defconfig is also provided. Signed-off-by: Hajime Tazaki Signed-off-by: Ricardo Koller --- arch/um/Kconfig | 14 ++++++- arch/um/configs/x86_64_nommu_defconfig | 54 ++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 arch/um/configs/x86_64_nommu_defconfig diff --git a/arch/um/Kconfig b/arch/um/Kconfig index 8161cc5ae6f7..b3d2716836ac 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig @@ -32,16 +32,19 @@ config UML select ARCH_SUPPORTS_LTO_CLANG_THIN select TRACE_IRQFLAGS_SUPPORT select TTY # Needed for line.c - select HAVE_ARCH_VMAP_STACK + select HAVE_ARCH_VMAP_STACK if MMU select HAVE_RUST select ARCH_HAS_UBSAN select HAVE_ARCH_TRACEHOOK select HAVE_SYSCALL_TRACEPOINTS select THREAD_INFO_IN_TASK select SPARSE_IRQ + select UACCESS_MEMCPY if !MMU + select GENERIC_STRNLEN_USER if !MMU + select GENERIC_STRNCPY_FROM_USER if !MMU =20 config MMU - bool + bool "MMU-based Paged Memory Management Support" if 64BIT default y =20 config UML_DMA_EMULATION @@ -185,8 +188,15 @@ config MAGIC_SYSRQ The keys are documented in . = Don't say Y unless you really know what this hack does. =20 +config ARCH_FORCE_MAX_ORDER + int "Order of maximal physically contiguous allocations" if EXPERT + default "10" if MMU + default "16" if !MMU + config KERNEL_STACK_ORDER int "Kernel stack size order" + default 3 if !MMU + range 3 10 if !MMU default 2 if 64BIT range 2 10 if 64BIT default 1 if !64BIT diff --git a/arch/um/configs/x86_64_nommu_defconfig b/arch/um/configs/x86_6= 4_nommu_defconfig new file mode 100644 index 000000000000..02cb87091c9f --- /dev/null +++ b/arch/um/configs/x86_64_nommu_defconfig @@ -0,0 +1,54 @@ +CONFIG_SYSVIPC=3Dy +CONFIG_POSIX_MQUEUE=3Dy +CONFIG_NO_HZ=3Dy +CONFIG_HIGH_RES_TIMERS=3Dy +CONFIG_BSD_PROCESS_ACCT=3Dy +CONFIG_IKCONFIG=3Dy +CONFIG_IKCONFIG_PROC=3Dy +CONFIG_LOG_BUF_SHIFT=3D14 +CONFIG_CGROUPS=3Dy +CONFIG_BLK_CGROUP=3Dy +CONFIG_CGROUP_SCHED=3Dy +CONFIG_CGROUP_DEVICE=3Dy +CONFIG_CGROUP_CPUACCT=3Dy +# CONFIG_PID_NS is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=3Dy +# CONFIG_MMU is not set +CONFIG_HOSTFS=3Dy +CONFIG_MAGIC_SYSRQ=3Dy +CONFIG_SSL=3Dy +CONFIG_NULL_CHAN=3Dy +CONFIG_PORT_CHAN=3Dy +CONFIG_PTY_CHAN=3Dy +CONFIG_TTY_CHAN=3Dy +CONFIG_CON_CHAN=3D"pts" +CONFIG_SSL_CHAN=3D"pts" +CONFIG_MODULES=3Dy +CONFIG_MODULE_UNLOAD=3Dy +CONFIG_IOSCHED_BFQ=3Dm +CONFIG_BINFMT_MISC=3Dm +CONFIG_NET=3Dy +CONFIG_PACKET=3Dy +CONFIG_UNIX=3Dy +CONFIG_INET=3Dy +CONFIG_DEVTMPFS=3Dy +CONFIG_DEVTMPFS_MOUNT=3Dy +CONFIG_BLK_DEV_UBD=3Dy +CONFIG_BLK_DEV_LOOP=3Dm +CONFIG_BLK_DEV_NBD=3Dm +CONFIG_DUMMY=3Dm +CONFIG_TUN=3Dm +CONFIG_PPP=3Dm +CONFIG_SLIP=3Dm +CONFIG_LEGACY_PTY_COUNT=3D32 +CONFIG_UML_RANDOM=3Dy +CONFIG_EXT4_FS=3Dy +CONFIG_QUOTA=3Dy +CONFIG_AUTOFS_FS=3Dm +CONFIG_ISO9660_FS=3Dm +CONFIG_JOLIET=3Dy +CONFIG_NLS=3Dy +CONFIG_DEBUG_KERNEL=3Dy +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=3Dy +CONFIG_FRAME_WARN=3D1024 +CONFIG_IPV6=3Dy --=20 2.43.0