From nobody Thu Oct 2 10:39:02 2025 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 14C812EBDD7 for ; Thu, 18 Sep 2025 07:39:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181161; cv=none; b=BHavZd4s+UdI7IqB0PcmObzUNI2u8+Fwqcuy365plpcuTORm3dm3w34heh0Nf7udjrrUf/iKyLnj5XmzTxFr/Bj/9N4FFhBhRmEHWIjGC96QuaK2P++NXDJy8atBmHOwdegIyyXVbcL57COq0M2uC+4NgMYJeHZCq2UeSmjQrW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181161; c=relaxed/simple; bh=Rh8EDyP0VnYAbVERnzfNVnPZO1tV+O/kVhDgVIx4GNc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bjhIZKeiUcML0hkRgnfJJtlZb0kfXNVGIgsq8OPgxtb0KIAEBP2Gn9ZeCrisfpKfDtEvVhVScRQhcSI/eBuN8NlPSQ+lErPyxFxD9Doc9EdPKML25wsxNZpCEiiXV361EKWX8RdSYDkPaauY6l91uNWTBKTEAlEM9oYgD3WctmY= 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=Sciqb97b; arc=none smtp.client-ip=209.85.214.179 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="Sciqb97b" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2570bf6058aso8623725ad.0 for ; Thu, 18 Sep 2025 00:39:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181159; x=1758785959; 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=Sciqb97bttyGOWmpz8VwjxB0BSFchh4Q5b1BAAG/GKsi4bEkJy8/Fo5JQVFZ4pNGVs zbCjzI5xveg/xAJ4DksB0flD+g1przwl2U5zJ03i3T9atiV8pQIcJQJzp7HIG41MLFxC DohqxgXk/nCdcwzwG2p96P/VNVlbkKkteyXq+V6XE1hXbtAZXprYRHFwpxEvjFcryHfs L50tb14E07y3Mi+stRFqu9+W5EcT37E5oTVCbBbRyu98fEalZs8QDptpj5V0bWq2qMjU oI5nEfBa10GmFS0q8ng0T611N51+Pr/SwFQcabVMvQ80WTeinoBFMm+UZDPcu30PbtGY PMuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181159; x=1758785959; 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=uVNhaPs65fM+OFEtQyy7Fo83h35VLaJBcs+0wLe3m4HOBkq51fdRR3zMx7jmH3eny6 pKVxdMdmORd562MOx1j+LKZygiOjQLyA4rO7MBDNAlFwBds7ciR6zYQSU5geNBp7lf0h rsU90ok4Ra1p+1+bX+oaf02vZQ+2w0Zz+vpL4OiPf0QPO7RvcQ8HcTmHsygiTsTt+5Tf oU4QHthd8oXM+4e2DBeULfxusRjhy5flQv2VQ9wrSWKjTc14qx3VHi4GPNbKOnca3cOz QQgeWVE3exhOLlwJcmQ7CQ0p4OKzyARsuvrGgRZISfggbjbRCngaO5/pISLZT93IxvQl D2kQ== X-Forwarded-Encrypted: i=1; AJvYcCVlQH4Ellka/pxPpII+522dTZ9cFV3VOaylm9kshnY27zXD8d7dDGAr6zblEbSpYVjDb6sHhUT5JXVWHq4=@vger.kernel.org X-Gm-Message-State: AOJu0YzWj1EHhleEHAm0fp7EhdEzZjO4siq8ob5NpcQZGeMVRBRQ6Cyt J8eDFvP5Cyis9Lh3Q2V5L7F/jVXLTTaGD9HOASvQn2YSRG0Xvq91xHXD X-Gm-Gg: ASbGncvdLky+0IzuulmON9qo7zOaiwt0/k2VcKKryMJX8irtwp/x1G/bGY3K77st7eN B0MQeW/fycrGN9R0aaEM3fcStTP5VW0VyW8wMP/RCeDCufeBPMYGfkhGIsGBoPSJeKstcQ4QrE4 /v8pmcawyAleTmA9KkBIi78l6NjGOnAcY/J4UBqIZrODdZEO1HRNHCStLK0TB/8orbv7HS+fW57 SfvQI1zlCga+HpQAmhTcHltnalbtsR69/WTbirJHuC7jUgRwXUwYIFuj9IUqxyz89btM96MwCSo rlPqSoLPuMJaE3Q6Q10NmyiyoydG8UGSyL7NVe+10aGCJADYG2s6P8LKWfb8YCcI0p/JmPLA+G7 YIOEN1mU15N0XF/rnEZT8ankVml6CIXxnA3BrKwhoVZ9baEHfJErxKgqhZ7L/2WwemBNxLOaw+I srhrYnVeZDQO8= X-Google-Smtp-Source: AGHT+IEhAan4I4Yy608aj+94bqPtnH0sZCzGPXalqh2iDtPG1/N54CnlninxatIc4ohWkAdwd6ge3w== X-Received: by 2002:a17:902:d504:b0:24c:af64:ae11 with SMTP id d9443c01a7336-26813903478mr67341765ad.44.1758181158787; Thu, 18 Sep 2025 00:39:18 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32ed275fb3csm4555900a91.20.2025.09.18.00.39.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:18 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 4BB8A10620FC; Thu, 18 Sep 2025 16:39:16 +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 RESEND v11 01/13] x86/um: nommu: elf loader for fdpic Date: Thu, 18 Sep 2025 16:38:56 +0900 Message-ID: <5a4932bbcdbf79facd544fec7e3d6a6969a40aa1.1758181109.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-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 736C22EC0A7 for ; Thu, 18 Sep 2025 07:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181163; cv=none; b=F6HCf/sFNKP1gsErOLwzNUp5e2y+tPVKt1L+lUwjUfQvo7LCa65Q7w2MLFQn04viEFdr6iFZtVvFcqCMq9/SOc+2w35L4k+f4A1fSYg1nKX4KtMQpHfXCgCMIfoIwcU22XRFjNuvIUoiq3tNTOlyutcO4PkBAlxz883JMhvLxqE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181163; c=relaxed/simple; bh=VX63Cts70ezj4r0nc0GLQLD8D46JgopVfQkzG5n55e8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D63lJ9oo/x08KjJlOpgwL87LqASmk1mOsCcacsHkyvF6rrtRWoRn/tCqS/KCILNfK0Tneus6E+A5MMBIwZtXDl181TsDQJnEKrh6jrn3HmqKQoW36rnotLRYzpDAtAX6g6RRZ54AnOSk+nbmwMtLAZJccUv/26u9XvUt7AaHNvo= 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=Wzt+MiTT; arc=none smtp.client-ip=209.85.210.177 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="Wzt+MiTT" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-77b91ed5546so600931b3a.2 for ; Thu, 18 Sep 2025 00:39:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181161; x=1758785961; 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=Wzt+MiTTh5Li5M6MFi9xzRhEWuDgFwO6EauD5iMqwi54cip3z2oGp5e38jJWa1a/PE 4WQNcn5TNcVGn77WyWQQxcyaqOqGiRcAr7wul2a6bkpG8JSP0W2xV3sQrnPiEdkw+LXV sm1oJd93LQ5M7UzUqRN86OFcjQPV7tF6vyyC1kcdq7BLLYL72PlNeH9lyAkfecJkKWcn RuvMqbL+LMLJtUj79ZFtZ6j8WXO1a01yAFQo9sDfPKn1QMa4BfnYbQnj/zr3qPxaP0et Sevi3L9M2qJ+ipnN7ThbhCM/amGOav0nVpP8akq58VcbAxgkwWXv3zp6OWGQi80phElV usVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181161; x=1758785961; 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=FCI7inbIeZiHTj3Hu1epA84do3LDbAZjsfjFx0aZWkJw/v9h2aSkF8vnD3ERey3o05 p8Loww8au1dLgQMAAxvYsLD7biHAT1TNppUQD/KgFEQDFP1lLHGYqcP5eojIg5NeQnGL 5CFOtXR6VlpBhZRlZgDRCbor/Bm9dhy7JJFfZk+nIsjWZi5AMKIrY/96Yj7rB1hFvn0a S1iXAV0Y0CYN4e6+GXV2aTy32tXaf/a1KqlDpFFKwVmbT3DEoUAFkrO3ZONpuyXP4ZHI rnHeWOkVmcafjwDkQxxnqtrIvuy2exc3qvvTVF7XTKNSzhyO9BmWM5i1OZ0RQZmF70m6 mO1g== X-Forwarded-Encrypted: i=1; AJvYcCWztXJfeXlI6nDMe3I3NK4E6tzS2vpEBOkirqd5380OYYVyum0VM5eeGyXisyvXzZkGsNn0qWSIZzvpVRY=@vger.kernel.org X-Gm-Message-State: AOJu0YwQUSEHeWnRmKvHhfuV0qMikaXjZQ/nldQBAKpTj71zg5UWPrrd sozmboCVpSqdNgQKRU1ffss8DE53V+PeMv/a1o6Z4hsbuCeAqa3ZYr/Y X-Gm-Gg: ASbGncsFENJpQVQMxIPWcMn+lqXGQBf1aXmNnZCaliagGnvVZlbzSVJJR6AubB1kBdr ajv1NTEQkJDZhTh1eLB0E3e/dgvisUFJGnJzpbBz7q8Ooa2oYZOcmhnZdQr+rZg+HbZBjhub5Uc ZCSW9vr688SXvzuphCL673poGx523AINOY2srZmOGVZdJjjsA2xYUjfrchsMNcYBMvifnaLyhGU 4bpQDjJuAbX7XRpsPDVqAPeQku2C/Gl7qH15k56TXb7DrCq0YbeA40a7GajQ9czDm+WFkmVVquX n+muuU/YaBabPQbd+ASzZ0F5Sc1S8nQDHvPTRWIz0zO6EffZEZRmTdjPzywSId0GsT8a5PWWkSc gZb6wS47SfZ8sb3O7sFxM8mlpMY1hz7z406ddII8n1u1zcLBWXYXXyLSqyvAeXLhWeE2KqryOSr I8No96tqNDd5Q= X-Google-Smtp-Source: AGHT+IEvjp9C9M/NMB/+2L2sXW82oTdx2OeB0YpFB9vBllTau62oZ+2fuzVrRmwtZnZLKgWEUytIQA== X-Received: by 2002:a17:903:1ce:b0:248:e3fb:4dc8 with SMTP id d9443c01a7336-268138fdca5mr55932125ad.39.1758181160516; Thu, 18 Sep 2025 00:39:20 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-26980053d25sm17307685ad.12.2025.09.18.00.39.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:19 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 9441210620FE; Thu, 18 Sep 2025 16:39:17 +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 RESEND v11 02/13] um: decouple MMU specific code from the common part Date: Thu, 18 Sep 2025 16:38:57 +0900 Message-ID: <7255e42a935a07e9a6e68ce3fbb24ab28de4cf6b.1758181109.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-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.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 B16772ECD23 for ; Thu, 18 Sep 2025 07:39:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181164; cv=none; b=Tz5EsKZNNG0htphfphFmKZlviD9AznPXG0Yk8+QTc7Ln9DjTqEi0MwtTKV6ELIqOzaveVZYt5C03zI/VJ0E1MtQhCtFqNIY8fwYJWlp1/DYr5e/ledyJ+bL2FsbqVw3j0dYiprbDxM1Okmbhcjaipw6DxL/TQnckPXWyzcY2XdU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181164; c=relaxed/simple; bh=byCqW4A9iLem+ANWjBVScnY9Hghuk40zDm3UjEWz6rc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dYKlMM9Gqk4UjGYgL1a/QQGV3K6pFTl6vpbY7pOVk4qB8IqYIst3LxcfSexKgsahWJYHFz1R+Z2xMkkv9JKvFV0xrc25OmY8k/WFMl/I4TAukbeobiVCZG0nY9ZZsHfZzUohfw7+Er+4m3WMFk0ZLre6qzXxMdjaRNtDgWwO2Kg= 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=JFtKMmbX; arc=none smtp.client-ip=209.85.214.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="JFtKMmbX" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-244580523a0so6911585ad.1 for ; Thu, 18 Sep 2025 00:39:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181162; x=1758785962; 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=JFtKMmbXu5gIYoJl2d3yPr3rsWcdGc9Cs4p2N1zDDoHPniVQMaQ1RXqv58DMTiJUlu SgXGx+O1wkchFNGkOBCHIdMe6AQMD2rfmeLkA0ohzFMjfWApEu4cDUJByA2pLdob32xg h3RX3aj3DQBJKDdgtoiKIbMOuXyeRCWxIymNsPohOurJ8gf9ux40/HEH+wiLQEG943+s 4foxZtPwyw0I45uW5VbMigMHMQonPpToZ/UDfhuN9IJGPqk+M+z8cBzQ39RUIUivk8mA SSIWAq0G3M1tbs8zv6KGX8O0pu7ZJOl2s3fMAUlStIY1RByfrH74J+IBDvfGtwKl1XtM kuGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181162; x=1758785962; 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=diSEbYUX4kkNq2eHciPrH5udDccE6mWnNFaxV2h71dS+D1YHA88rCnoGDFRJ+LQX9W EEaQbGwQhlWAxRwrjSTEmj5tbMYqcaPT32js2fA2RAQrzrEewKUWF+Jb+mfBqsPjA1dI ZKyKCbswKFxBH4nnvfsRbJyXLzGucZb7ZzNotn0LuNTF6TLD+WtpGI1yOXN6kZ5BTXcK V4bawI1h6hvhG1YpzT0iHfZfMou+QQt8k1LbxLm7lOsK9xcw8vtZrZ8FpgKmGaysXfsl 12Stz9YWzX+JrHPqZgd7WABG/l3yfFDD8RXDvh1qmgHpsayCs1542hlfh6GRWgKHk0Ic uZOw== X-Forwarded-Encrypted: i=1; AJvYcCWnJwNVrQBBXGofLx/SEgsIwqvEQL9NiWPGIx2CrYb6PSdjhv4Y8Hvnk3v2rhUquXowwnMVLYyJKCwgpRo=@vger.kernel.org X-Gm-Message-State: AOJu0YxiitvNXJiN7B+EfjoBRBBpipliXt/uz1w2p+Jk5fknQfTGOU82 jKv5W5QzNgaV9iagjoJ9U4uUEjoo7Bd/xfidY3bINmUSeh6HY+d6gOUW X-Gm-Gg: ASbGncuHzNwkiIQwgRrbpl+gv0/KAHfNvNEU0COrzt9FRTA8dqSLIefivbqM2U4BRcK pAKOShy1ekIMHH97+VLxVyK1l2yhuYJ9otnbvtfDpAAqkRvjpwr8WKqKXeqteE+W3du4Xu9z3Wl OMgNifCT+C2zqsaLqOg9HsHxNQPIT6Tc3OXeMSo2/WxJANzWLoG3ZN+qYoDbZXYvch8SNGUUWEm Uo57uXZyhGuhDnOmkeyVWFD7HzMYbKxYipm5sqbE9oveWmzRAIGAJcLR0379W8qddy5U10t28p0 Lp/+EPIAyx5lOylpLJ78vEnQndTJhbp7C2ACnRK4I6wfhZheDYOgcndDi9WwkEojmIG3AuksYec TFiDtdgzNyq1lJjnm/Ejhwh5KqOdmbmZjwVvXHNibF1iMRxAwr6XJ7CLes0Va/YtxufZnH3NL4p FcOXLow/kV8p0= X-Google-Smtp-Source: AGHT+IG6ytpLYdQrX/2pjjExkFEIINfv8kAcyaa95KwBKwyJzJzySBkChQImoYTUSwTSO6F65yBwsA== X-Received: by 2002:a17:902:cccc:b0:24c:6125:390a with SMTP id d9443c01a7336-268118b95cdmr53455325ad.10.1758181161806; Thu, 18 Sep 2025 00:39:21 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-26980053201sm17187505ad.17.2025.09.18.00.39.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:20 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 09DA81062100; Thu, 18 Sep 2025 16:39:19 +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 RESEND v11 03/13] um: nommu: memory handling Date: Thu, 18 Sep 2025 16:38:58 +0900 Message-ID: <5b248fc7351c6228f2a2bb9a4d33fddf3f1744ed.1758181109.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-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.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 11CD92E7F0B for ; Thu, 18 Sep 2025 07:39:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181166; cv=none; b=LDr4b0qhU1+cp4Tubu/O/gPcKQTwj7bJtSkSCx0j6Clo0uT+GwohSS0upK05ug6ug/v0IXBQ/4vF4vBKoAxA3MQdDE1bhglSg4EEmxCD4PzUBbfjL6udAwzMRRQbX7AfeZ0UGwcEaXbKctygZFgoOTcsXGNuidQN9gkAKrJif2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181166; c=relaxed/simple; bh=Z6qZSB5ccwxVgYVj98AksF/DlcdpqcgoKyj9hpY/Brg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lxEBtpKgP5eNbA5xsW2JgAfHtmxl9AT+jZK/TzXGzU2YlKm/g9yoxu1PVNG8ZYV0LTVh/UAle42fdYWDaESD2QWtLkV5Gh652ZN4Dqj+n1qPLu0ldBF82iTXjEOw25rfbOoz4d4xwV87JpDIgnzqG52P4qUF6ZFknbSZRC6E5hE= 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=k3Ry3y1h; arc=none smtp.client-ip=209.85.215.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="k3Ry3y1h" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-b54fc45db56so579335a12.3 for ; Thu, 18 Sep 2025 00:39:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181163; x=1758785963; 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=k3Ry3y1h4W+aM5hylaiF71sI4Eb+EqKe3+jTwAZWQsZ62fYg49Wzt4sIQccgD9ofjS q0Cr7WDsFiWFoUIjM7vSu+VCG8j23lmu4S8gztAgCptA9tYdWzLGtXAxrBE/wx47ezIj 9O+kmEPKBwTpmEkdVJo6cxH2v0kdE5GCMc4EP6VZMigBNuc7u9zOI/rPp+cuUB4erwzt /8FhknvK7yAzRRwO9jThb/CMJ1/muZFwfpKhYBGVj1kYbm7YasTrHC2Uctd6dDMVXR9O zQXT1trnzij1O+PbHnD/vBYMmeU8s+PRUFIdef/8xOUsAMw/jMRFtDTOnx4HW9YFCKnV EuqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181163; x=1758785963; 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=p9NurfKegAsGqzGIkW3k+gUoBUfT3RyOcy/ImA8C5fHpA3vHlZUwe9PYXGHtp1w28s tdgjkidL58tfr9ZX86aiXuG/5jlxcuNwssMlMF6ExuYG+c6Spk1HIVZVKf4+Rj6FlbnN nb8YMfHAtqSL3vAvIJ4u85GW8T0ns2ZLadDUmfmAEvx+EVBPk9c5iWuD9/f5p84ejor+ 36LNCGAtmCt/0eELZGUOvTfEDp0yknEXWu+kKXQcTYKojIxrWpCUUWBgzLBCC9rGsi7W LBGpxRChC4NaRCCkEYdzVjW9q3UfKGqnQuhY85Z4G2CHw4HlTI0DYZ+CuUKGm0Ki7rrF FkqQ== X-Forwarded-Encrypted: i=1; AJvYcCUcNhm6oYBbEHQZVkzNqE524/Huf50LqGmeqKYsyS8py9FKMHDx+cRfH+lq1T7kRSqxGkp2SKPirOXCmFA=@vger.kernel.org X-Gm-Message-State: AOJu0YygqtqQx26v8xdYNdse9JktYZWc7u4cH6Y4shEugGoQ5Xl5Hix4 lFoaAx5Tf9HR/UMGoCUNt0fruG7ED7su96XBrd419fdY+7X/3UaD8L1X X-Gm-Gg: ASbGncspFJj8QwE/MwqcViAJr3vZVaM3rezjIPhyIqfGJaoyml7mEfsmXzz/ZoX6swb 5qCqx0Xkz9eYQfB3CPQMrtvo7Cm1aP5B0TVYdu4z5YSjaGOKae9fT1cl6guoACUXEO2UB6yJUU2 amUFIw3T5vrtJUCGW9GpUXUYEGfXE2VYqiPu/P/JmF+GAPQ6M12onVYMK20hAisxpx90EF1tNZe 7B97g1ONtL2c8CTiLYByBTDGO45Czeq9i3UarKjsv16jHA4ViTE+EtUq42/51KcVO+aIm9hF3wQ JkX4oOv4b1jsFe48pdDVE9cpnjxbys6hPMk3VnG3ff5uj4GQNnd8gwlYKSCEKDABojhkcuSQ1qn eAiQP4+2df1SHJXNivoY93rKq00svyhfzbrB/6ZOcBjZmjy06UcWqtmUoLsQQiAPLPKL2APPR+l ExF6XiAKD1TvGp592IZbjqmg== X-Google-Smtp-Source: AGHT+IHb67OmugF2cEMXD12M/xW4W+V68Zi7+KrzUwtAstQdAuQx8i/xU/qunW2Twhas2liFfVE02A== X-Received: by 2002:a17:902:ce8e:b0:246:24d:2394 with SMTP id d9443c01a7336-268119b2bdbmr55687205ad.8.1758181163196; Thu, 18 Sep 2025 00:39:23 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269802de7a9sm16783015ad.80.2025.09.18.00.39.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:22 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 5B7C51062102; Thu, 18 Sep 2025 16:39: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 Subject: [PATCH RESEND v11 04/13] x86/um: nommu: syscall handling Date: Thu, 18 Sep 2025 16:38:59 +0900 Message-ID: <99a54b96cee85275692ca01fe4a0ef0d83996f0f.1758181109.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-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 6D05A2ED85D for ; Thu, 18 Sep 2025 07:39:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181167; cv=none; b=eGPmS/pz/GUwMzTQy3wVp4v5nijqwIVx6841A47yGMnOJkTIzwKmInLeMS9eOx9YxhNSnglCS89YXl+KtHjKyNbk4OFjPWNVbuThFupbiw47q1WpD+dle5GQFqISIXWch49H1Dw8gFtixK4TwqM/+ByUO7/4PXrU+kAnXRTaqGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181167; c=relaxed/simple; bh=jpXAWLdaDr3CkWxqovNu2ZV2XQCQXuklwtFcY/epf20=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DtNaZe9p5fIjgpdR8I6EltlOto+5LA8Ak0pYSI7fwxwGerYkTiyRK30lpGsTlhygB02+IgK/FtbOP31o4yXLgxFsfU6MKU7TbKSnnkNsZxxlhJbpbLspYfmcQ9h8uQC2IGZBBbgtyguPJ0iyfnDU9orD6kz1zXRkFrqZAmNdJLE= 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=mqD7I2U4; arc=none smtp.client-ip=209.85.216.54 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="mqD7I2U4" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-327f87275d4so669004a91.1 for ; Thu, 18 Sep 2025 00:39:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181165; x=1758785965; 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=/LxuGmHlOoWlRMhiUJoe5t/Cd23uhaKelOnBHZQt6CI=; b=mqD7I2U42kiN73MiKND+1jUXomGDj1G2E+c+Hf5TuZERCXmrWm1wdQ4PaieSs7ZKdS lijnf+BRpyjugDNc5lbFjJemXQ+AQLqfp5NZY4EwoZ/dI8vK4R05cLiZjd+3dvk0yBbY TpVJYNEUhZwhREc9kTir4Bfz+ef/ixhmuJxLmvnlb5TMn4oouZ9riVp6se/KQ6sRpQZf RnMMm5aZp1R8iMuqEnSwl/9rtX39UhTTv9geV8CFpD3OGJYTMCvjGPabYcq66kZ5Obnf wFp+IqIH9X8Dfyk6cQol/1Mi9y5etlQ140ta4nxztwe9nh3/JBxsP/F/OB0sxh2cvgLu 7hfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181165; x=1758785965; 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=/LxuGmHlOoWlRMhiUJoe5t/Cd23uhaKelOnBHZQt6CI=; b=UC7iwauXp/LDl1KIMje7u1n843U8EfoSROCJyl9CQLNjrQtcQ5a9CSnsK0OZ5EZjJr Y5MSMoJtxuaT+g9u2koN5kfYhNq5/6rSuYHa4ByQZqVmAtdaNWTLr9sDj8iloi37Hnpr MuPwNOHkpHmuosASCJ/S7EPXHic8pJvBTQYLQcl5gErXBgftwszgcYVkSTr9RL8dvsEA XSUyX0zcQV7/N8rn1DaZkk4+EjR3s88ByeFlMZR+yKVIsHvqvn+UHsfK5doVbG0pIqVT d9yGQUayl9kfK53dKO/f7Q+HJ/DNF4KxJxncOpBTZlb4TUbPuYTscmP08bPzk/3nw7jO 3d0w== X-Forwarded-Encrypted: i=1; AJvYcCUoeRELOv8QpB04p1Zu1fn8B4o/bT9cW+RqwPVtbpiIXMtgAihg0a6Q2eQ/EZYM1eMoasqS09KAMITCqOk=@vger.kernel.org X-Gm-Message-State: AOJu0Yznh7wASeN8gVSkQBCK3vQpiMv3arHXNIqqT+agXkK1mOAn44qo ghOnACVu4D6wuz2nGprPKef0VLrZKvvoChXtthGW3eoqzJb69ZEMwwaZ X-Gm-Gg: ASbGnctzqUq4WyC7l3sxK4sDTxF2FiZaHfruvXwmQQQyERr7U4F5x9ZfR8NC1O9iAV7 E1XOoGE9gp6zYN7EY7kGkwKMhtF1UzXEhY/T6Zzm7NgO9c9hC6AeFCcRGd4cxT+pzktxmrix6Dh DUwQFOim7egS1HqQCR5h2E9DDYkUsZrMhfrKGdqRtcPRJHpR4zUv+VtpKHyPNxYEZjRqvLRp/tT nJLuhfZFe99TH9QjuCA6IrrswC40iE6YD1k5jtkJFFZeFNiKgxYNBFObbnqfYFxvFnpY7Yjw33F ZtnHnubJdsVgIachnyO2Uu+CDVnLQrFetULqmNXsNoLOev5i/vnFdNBb3foPVtoUVTi5PCg9XZE 5jUzsnRCVabfNmFdK1nffAW8zO4F+pqa1KnEpkw+vn2Jgps76FUeJtvsuKj5hDXzWdV67AUADwK HwZlkqJqxX0WI= X-Google-Smtp-Source: AGHT+IHjf+ft+15WeG7PNqgPVYcTsQiuOkBlrNQyjsBFDIHNYIS3zJGYte1TLc2nd5wBWXx4jfciFg== X-Received: by 2002:a17:90a:d60c:b0:327:7334:403d with SMTP id 98e67ed59e1d1-32ee3f87ec1mr6370968a91.26.1758181164436; Thu, 18 Sep 2025 00:39:24 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32ed2685fc8sm4648398a91.4.2025.09.18.00.39.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:23 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id B241E1062104; Thu, 18 Sep 2025 16:39: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, Kenichi Yasukata Subject: [PATCH RESEND v11 05/13] um: nommu: seccomp syscalls hook Date: Thu, 18 Sep 2025 16:39:00 +0900 Message-ID: <45ad2629815a908391762195e77d0fa7ccbe853f.1758181109.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/seccomp.c | 87 +++++++++++++++++++++++++++ arch/um/nommu/os-Linux/signal.c | 16 +++++ 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 ++ 13 files changed, 164 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/seccomp.c create mode 100644 arch/um/nommu/os-Linux/signal.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..805e26ccf63b --- /dev/null +++ b/arch/um/nommu/os-Linux/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +obj-y :=3D seccomp.o 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/seccomp.c b/arch/um/nommu/os-Linux/secc= omp.c new file mode 100644 index 000000000000..d1cfa6e3d632 --- /dev/null +++ b/arch/um/nommu/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/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/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-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 0A9062ECD39 for ; Thu, 18 Sep 2025 07:39:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181167; cv=none; b=J3DzeP/wZCdCLYMBDc0H2BER+IWpS7ZnD4Ff4vLKf1DdHmmq7qGJCKoDw+6bST6tKiePDo93KBvCV3k0rwzmvZSXiJlWinE6tTjWCiyb3yuQl4RzkCPU/IB8y5gyMWZRCRAgOanI7tAOhHj8OBpf7vxmh0JlsIHESPuUZo/OVuM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181167; c=relaxed/simple; bh=asugRdDdRMBxIe1EMSyil3lIrPO4TUilJEIW10zlNcg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SNQCDIFC7xPI/rt4Kxmvicdp3BiJDAQHt/IXeeNOQFXAcQpUR3gVFM+aj65mMGyAPW6cGbZSEdMpOba1gC8LWrX33++k1817eu38pfqjyfY/8wNP7lRly0BoslDFklnVR5uIffPFjikGIvepsY4iFkpvOZWYJIiKjB56JgUBn/E= 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=kaeq8+8K; arc=none smtp.client-ip=209.85.210.177 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="kaeq8+8K" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7726c7ff7e5so625715b3a.3 for ; Thu, 18 Sep 2025 00:39:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181165; x=1758785965; 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=kaeq8+8KWIgLk2XdzX/0FF/3ss95boX1A8S0cHcEa2VjxbEgqFpOn0xSBtZaia0BdG DEso4Liv/HfqAgWpV1YWwyYM8hH/Rtg1UjOv8ZzUapmYx6ukf+/rbPNvyXjp68H84Yis ZUXwqSG0vL+iMXrhykodkDtSazE8FvYcepX1QZZC5YSCn1mE9iNRLqZyulwhx7/QkgV7 l5m2X98YXFeRiswbWwGzwuvvn/1DKvyM17gndMVSQ6mlinhNcwCnflheBYrBWzgfqbI7 zVXdn2e/O4aqSQJN6fUW/dwD5wdquYbN+fsmcv6L5Fda5iPO/65RdE4PDMXEGqICeUQ+ ho4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181165; x=1758785965; 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=au8r2MuGJ7JiuPWeYsiY7lhr3IWTsUFjEqrURZtiubAq0sAN69sjafUL6VaeYuu5Mr k/W6GImVp+cf2zwtot7+TAlTOWHH3KdQsb9CXtvVRP0qu/gYG75A2BrqInNu+Zmh+f7S BSAcYJyNAcXvxEFdFz7skcA3CWNph0sModLUEd4vs/9ovBeugxj0h1c1aOi1MOai7qRC u88Rh2yEyH5vQ/qb711SOr3pntnn76NIqpG2qPnkuRJ0gAK1BrGi0EH9OYTCoZ/oFf8J 4FWFmKu8QWrfKX/N9z8wOHStaExy4USlE+j3bmhkITAWouCvLVkiGIz69+8wU3Aax5Ds JIbA== X-Forwarded-Encrypted: i=1; AJvYcCV4PcQGmo3QdYG1Qb4ZMR++NG6QMbI1T13jplujQN9sUImfOhbb4T3bks6s0gxXvbgAH18UqINi3j8R/tk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywd0Qr6jxLNoz4nWacAE3ysDVdR7SzjrWsvjfCdWmSF+FL2Ln1Y UHYQUjCtCP+TIee53/APdMT1498U63lRtjTHFIdEvAlniUce1qjbP4pM X-Gm-Gg: ASbGncv4Xh20KF6enpS6dNhBCNWOx+v1Ic6iZxpslH/apGdlfTrmP3d8lD6L/vJAFEv GVHpJCRhibQuZ3EJPSjRBK2jJ7i5QphEptj2H2brhqU9pKA8XbJm797M2Ta27jEShZNY46eW0Ww IqyyqeUPUqxJbn65M70dKSPvJy+aBmVBAtzQRsVj7qzwSGqLElWUmBzJ1pKVr784Ut1Zhz5j7UN cqStG3nILStVVs1//PQ+jfJXyRUXHNGPeJ0zwtFFlnpzW55J/jEE8XQK6dZWu8X5tdC46mArqwR iLaFzuhGwT0sMHNK2YvDh7v55Ldj47sP26goBaZraBUBOjpFo2qcg6+iDfYNQgQrfxNHCnP1Dnt guMwS6gOcVd1EwIM0Sc+BSOUm+pFjZzns9wSwcOAI97oRnRpQOo2XAeVGWifusWS4BebByJzQiT cBaEAm9rY44LE= X-Google-Smtp-Source: AGHT+IEW5cCMKXIm+nzKIkKeGH7H3LKniIm9mBlWZr7k0aEOZl0QvIVtSPe8fhK1TP/J+mcsUGlRpA== X-Received: by 2002:a05:6a20:a108:b0:277:f962:3163 with SMTP id adf61e73a8af0-27a94827d99mr7748359637.19.1758181165167; Thu, 18 Sep 2025 00:39:25 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32ed273e51dsm4547321a91.14.2025.09.18.00.39.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:24 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 06A791062106; Thu, 18 Sep 2025 16:39:23 +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 RESEND v11 06/13] x86/um: nommu: process/thread handling Date: Thu, 18 Sep 2025 16:39:01 +0900 Message-ID: <5c56554cf8c0215ea378b4c5935664ebc7a27d50.1758181109.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-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.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 7EE522EFDAD for ; Thu, 18 Sep 2025 07:39:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181170; cv=none; b=WT0dJzDdWABll/prbGFHYIyt424GbVbzJDSjRUVpJpSUwKu4gEQzVwWWilGDtVlngEI5bZBdozGkLLf3K/JIF7RroKMjKIwSfI1OgmqhJredS2kYez2hA93WDiwHRcl7ExfmZ/8/6DMgeOcwKTf9/Df/zx8L/7LRc8Z1TpkxfkY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181170; c=relaxed/simple; bh=+Waag5s2KV4AtkQ8FWm0y4/xw2uolW4OhcFUtzX2NSU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d/n0qI6YUGLqyJsC4WRkDwY/VMSazGk9L3e0bqwlZidbTzB4NWVKVxOdT2+BJdAOs4ZsMejuuNZJNYS5SAJFFHrLxQNWNdYwizoBtm7RId7fShrVM3CPwYBqzGYRvwVOvrjXdtFEqdLwOfeWg5prATbcivNkBXZcj0sLsvptdo0= 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=YgRAr/nZ; arc=none smtp.client-ip=209.85.215.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="YgRAr/nZ" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-b54c707374fso385004a12.1 for ; Thu, 18 Sep 2025 00:39:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181167; x=1758785967; 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=YgRAr/nZpCjqMKGVp2LbGeOZ/liDKaB3FS/HHXuMGfVTgtQyyHRBOyOg7pAoMaM9uy SlQrHQUvx4CJ5IhLzfLFzP0gw04GKR2Cc77fItoZI4/qHaBYGBmmRfXU6t8zs1SKivty 8WqeS85UUZsJ2s/bsUQNevWurUBGt9Wzmph9s8vMD6XzBcZ1s6hH/IgiHIs84HkB86bD s7P4UarJMfpZi2xs/oUzC4AbA3MT9M/ugxTh3/9XgE6QYWSTSw2+7YHz72hqFf/9MoOC ZcX9dofCMJIOXskeOAo9jgU7nOQcjU8Ny6MFJvdA/mBj7ILjgb4lXVb11HX/fQapoHrI naXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181167; x=1758785967; 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=HBqXDjDVsnHVw0cXmxnt78+Q0nw15TwPmpNrLWlTKPQIFEljBRoaQfffJDevZmghO7 nKvKmitJFVLpbuJYsJRkYe3Eac4+nlEV2dOaunlRpVfvMlYR1Mgk4aLHlBsm1TqxT0jL thunoRjSiC0fWwA+vgHOKURoTh/MBXrpuYje5OtsP7BunCVvARxBd14stp3nIiZbY4Ex tNb7HcynCgmnq6ZQFZ1CvJjH+2crTdzqNuNSTwS3+3yxLeJo6QgzGaQCJQ1VF0NdsAfZ FQUIZw0PEb7hOlw70d2M67UoJjY2fjs2EUANpM/8RvDqJeplRofo7oUbOem+VEEzJbDj 41Uw== X-Forwarded-Encrypted: i=1; AJvYcCVLY2KPg4oF32D4jCajq61onT5oWo6HK1aMQzmLUkq2nRifwvPtw7HCUxXrnS/mVxvGxHaYoE5Bt/1OOtQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywja9pi7o4GbxreDgPESneAqf4k2KkL8nm7DTeWU/JQ/6A9Qe9d 4jmxm3gJQPKvDbnMi9LfIa/O01UCIgf8/EQ3dvL3sEn3pjD6S9lqfFX9 X-Gm-Gg: ASbGncsbvt3WOiHNqKsvQQWWd0RCMN72zvJsPW7L68ItWwBT3KwE/HgokGcKj5pJ7HE FKGPIICg3Rv/qYcdxPT38gTsYylacOIGyXWG45C1Vp2z61PrHC/PNSMVMl5VHIQdClExQE2L7NK BJzkWxBJPrWZC2n+u4zT/0+9WypZdsQjSc2PghoNQ6gVpfI8D4q3zo00jFUH3cocE+4n/fbDEa1 XpXIQdcmeUzYiSySQSS6IJeapk06WWrnGn8Bhh0mnjIhoLktEatoc2QFS0mRo7xyy5/yJVmygel ptAuLm7VxlyThsH+qLeBJ43fxtU7TuCb9VLCTh3ry2THpQhvrvTCs6ls7vAgXiQtV5O1eEea2m0 wbu2w4U9kqjbTqKM99FHFfAK+kBcSeYzsHSS+U7fcSPWuUJOg7fKQMZ9BPUqlg3ZiSCYacBlR9u CPddHrPXBoEY4= X-Google-Smtp-Source: AGHT+IHjSWiyqEzb5MNMMYKGgtg1QZjldXLgQ13c89UclmrpwhpwSkHln8AQ8xL2QwO/QKq/4gg/ng== X-Received: by 2002:a17:903:1a2d:b0:267:b6f9:2ce with SMTP id d9443c01a7336-268138fe357mr58795445ad.41.1758181166670; Thu, 18 Sep 2025 00:39:26 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269802e079esm16857425ad.91.2025.09.18.00.39.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:25 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 325C51062108; Thu, 18 Sep 2025 16:39:24 +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 RESEND v11 07/13] um: nommu: configure fs register on host syscall invocation Date: Thu, 18 Sep 2025 16:39:02 +0900 Message-ID: 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-f175.google.com (mail-pl1-f175.google.com [209.85.214.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 E2E522F0C4F for ; Thu, 18 Sep 2025 07:39:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181171; cv=none; b=H91+OuEVhljeBBhKMqDf+mSMmYFKjjr0bEkirDDm/0uI2zAJ0m0uE8OepWV58TYFiCtjEMrwnUw27bNp4Qwos1z8SHdY/sO38o/KIkdVPF+EGHIlTW+RwoI4KTcvbVjvaeGkGQyY1Zrk+QXbhFsROS/Z52qMKaflSfPKO7VZXQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181171; c=relaxed/simple; bh=YUEZeH1TUt8vhd5nOMxaCkzJVaWiSM7ZZlNxkfxZqDc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tOGzm3Jn+DRMit2Tu3VPLtEbvzKOEHsPMS4Gb4V4xHOYsCe20tn+9JAgSO6qJglnQV1gKdJxckhAEUsFMetLQih53AAGFg1wrQwoaw0WGPge/v11j21/bYtvoor3h8bMbSawPMkmRT0frTPEDFnXOZ19bZhTPoMHkiis38xynyA= 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=IRu/CjVI; arc=none smtp.client-ip=209.85.214.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="IRu/CjVI" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2445824dc27so6457505ad.3 for ; Thu, 18 Sep 2025 00:39:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181168; x=1758785968; 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=IRu/CjVIJ3IG83jyLuk+P5pcgkUgkM0sCqFpjsizHB3GeqfxrcQ0Wz5VF5VEkcaY1N 0dg9pgOUzhtYw1lKBKJ3U9ZgeiByTXZgbLwhObiFlO48Yi1PmcCxJeWdxwOXQVl+IeB8 7vmoFdAGt9BJruHLi9OusOhGt9cLM+o8tUer3+pZ40iD5hdKOQ2PBKEr/oR+f30rkmTi /FzbwWf+IpSqM1/sJ4VBX9kZt9259JiK9UA+fdc8lXLeC4QwtE0lnWu+QitFJ1wtKqup WbCXunH5hKKb1i4rz817o/zAqixiR278EmgfQlBNGxhyUvJMRUzbLI+orB/yW5hmUqCf ZPtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181168; x=1758785968; 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=Ag9iIX2PBz9dmt+qZ9mozy0tc9PjmsCKf0VMB95Z9THLrCtBRGNzoLYaB6vd5LLISA TuZEM+Ojcb12GzXiBSlRiYEkRCzm5gz91gKmFcefXYiMEpxe7i8KH4OT/ZTQZb/iBNr6 ugD069tTnc/UTGJauABt5/vQVVFODh36QUpIQsSdb3UMiU2e/4klkVfToMMAxvhmRvUw WaWgJOke2Mv0B8lKHh52+vi3+ImVctl9nea3Gx+AgPzgFUtFKSX8mWtsI0ysDIFJ3hzv vQMFl6hcTIyWmchM0kXkoOp0H3h8YsuI2ZrIdnvCDPRdk1Ag+U90hPcaY/fmPtA9kRDg 4Adw== X-Forwarded-Encrypted: i=1; AJvYcCV8LQryu/5Yoat6ME4l1SZMEZxn2VUmDaxIiPLbPgCJ9er3EuI4pl91VZFgJoT7p/lDlExvjppVeSEWT20=@vger.kernel.org X-Gm-Message-State: AOJu0Yxrte0Yd7cGqNXTpCn6cCuGJHQ03aDhAs8zFSWPCPAYE17q153h qNdAq51UVptGROMNm9jh6ZDdPQrAp+h8+EeDHOQ8pT+1yAAw8bMXqqrfOUMx9w== X-Gm-Gg: ASbGnct9R3OxZVSNg+oCU5PkGWMsrKNJxFhVJNYC1jc8nbyA1FzN/36JFEYZxSa5hQ3 25vMaCAP1NhoV99t7pwnkNty7p6PPpzTOTsVgAqQ6DI1RWSjckNEGAMkr7Ih6Dej1ozlUxXM7yP fM21IhA8JjMaQGVBeQsubNS9aL82q8A5Qc6SWttivgNXGvzjfwmA/S85USWiBxOWhiZHePz/JFz 2b+cShAEETe/UAj+WMaKD1ztPljHIbL9hsdo+AKNy5imjueHTG1SAJ8MvIAspIGYTUIfL0rgk33 M0QOwN6CXwuztRMBa6xCsTSqiBSyqWOFNT+Nl160qAiYPAM2tBb9G1xltRYwLpK+o+KpPn/eUCA U/0Ucip2Clam9x91Iqz6jIblLx3K6rgSI2GQ02klGdQ57nFMg4ecnAa6dpXCOQ6o2p+SD662JrN t8nnHyxA1ylUkuf8CIdWMeIw== X-Google-Smtp-Source: AGHT+IHNzuZzI3jPq8s+w/v0EJThDoVKmlAiVRMnAVUhLpF0S4fB/x53BdW1cn1NajqHcqRK1lVQ1g== X-Received: by 2002:a17:902:e807:b0:248:811e:f86c with SMTP id d9443c01a7336-268138fdf0bmr60148035ad.34.1758181167976; Thu, 18 Sep 2025 00:39:27 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269802dfcfasm16349805ad.73.2025.09.18.00.39.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:26 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 78363106210A; Thu, 18 Sep 2025 16:39:25 +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 RESEND v11 08/13] x86/um/vdso: nommu: vdso memory update Date: Thu, 18 Sep 2025 16:39:03 +0900 Message-ID: <0f3c31aab253b7a76f96ba758150442d72b52ee4.1758181109.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-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 248392EF662 for ; Thu, 18 Sep 2025 07:39:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181172; cv=none; b=DemMmfeiygNl8pVA9kckoL0Ue63CpiIA2aRImSZsylfDM+iZ9DVUq5XB19Z7IgzT4D9qBhFWNPNTQxt+RNacjC0gi3gEg2UUNwplEjSZZ/VKG8s3Fu2rWZwthGzxcveVSSj5If7SpBucJ2wUER1WwsRdsRw9e9EwiX1RBYyQ2oQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181172; c=relaxed/simple; bh=zCkpBY3Mz9F8XK5ho3tgyxEPJV3QOKN8qRPFl1UtObQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kBgbYuG+gJOqj+fdS1Xm4MJpZ+VwxoCDIvXxTlH57qNFpO2J3zS+sv4Jj8zShBl30EzAYvE2cOBbHc+zpcSsXg6C6WoNVqfJGx/Hi4m/nWxUHBq2qS2pSD0BuE+/KJ2vdURT7ZjrM9J7np61pB5GLvzZJ97cYbATMY06e+cgVAU= 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=g6WqWrix; arc=none smtp.client-ip=209.85.214.177 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="g6WqWrix" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2445805aa2eso6894195ad.1 for ; Thu, 18 Sep 2025 00:39:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181169; x=1758785969; 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=g6WqWrix4bJYrL3bU6OYSfJ138PAMBTCgAdz1JSxtUEHhVRvdoIbNLjocEAj7aaYDZ 0l8F27WgVF0/WuVhq8m1YRDJNlY8rRAGF46nHV5WylfL9l4ytLneGWd1xxNBfIZ+Ij6L GetG4fOIXUZO7KNYRADlSq19RJdPZ/B26LFz00Ri3iLKCkHFus/q1a/bIY1DluqGRlLW ubb3621DTPpUtuEC0WXrcOkbJHdMdywVE2sYC4G2wfQPGO7PF5/mg30ahqYNA8kN7oWq sVmy9H0mX/qLt0S228we+2JnOMYXv5Hxi3H3nZoRIL7MgKeCSKNtvtEfoH8rIpLlXo6Z DouA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181169; x=1758785969; 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=KI3ooZtgOr5kS3slsp0Eva+QpBqMRu4mksa29+nF/NtoI0HwXY9s+KMMxpC04peIFk ixZOjUKIH3e+XAnrnWbAv4wcRQw5QpLg7BI6Yczem+75pYGMahQD1RfM1A4BLcc8AWUO FpRotvUeXQLLY6n8THjSx6INAwH56F8HVt+EPbGGwRbkHFO1t/yDyqDS3tnsvW4HhaMS PPBr0shtsj/w9lydCX3CeFCWPSOhrbxeIURSEQ12//YI8v7kf61bjdXGbz74tnGL+fcS 3vu71qm/ljl4w12n/1FmqZCZk0h/9F/Nqp8HfgVbU42CdwjMOCJkrd70c3vWoDuZZRHE vuhA== X-Forwarded-Encrypted: i=1; AJvYcCVfOdYBhDyRIWQq4Iw75gmURy89syKNTPhDglr9wgFiDtQbsWF1VsfsGFU8oSSkqHiiXgZSMBcjmFWi3MQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwswHdVJizDvzoB5GuraYCyCthUULjhsiG6QaOFSZS4tg6kRRwq vAW2REE2qgtoIKZWlxDkPdV63lU60bDxj2v2R7JqmpHPxbUiA88nwMBH X-Gm-Gg: ASbGncsXafQVho8qxMmFCEd0lubqN4FhdYwK1fKPPFY4nN8PbDHbhpRoyOySYLNpbnr tGRI5FfuqC8mTLdb1O63Pyprkqlhs+PHa3F8AKqV+R977zzdIgQYXTkEUVs4pes22iGJu3nRDgH n249NRk10J3s8iWijiT2JQ74SkxN7U1PdUM6/3H5hqGavZR6QZyx5L48jIFQo+p/toXpT8RmD7t Uc2+Knxx9QrEragiF9kVHzYXR4g67R83kRHswFDEuWtvdLwqn/AjeOIOddpVU+ZIjNgOihe6eLk 1+EqTa1y2JkIczQzhJQwm8H1DOs9dyRTJDQiQ9cs1MGbfCSoezfEIXlQWT/fdBljsM6sepi4jPn YTOh+X+uGsyYl6wPgs4pblNItEm/4NOKA/Mp3YF5ADilB+QAZvirxc+dLlAAVI54bnMH4H+Q4zQ IVtGugeRZfZbzPTyoEMhGCqQ== X-Google-Smtp-Source: AGHT+IEzz19fLyvx5HXPomhm+aBzEqHgd+YrmDT6JsS0ItBwXqmkokMyqG+cTaXZ2KvB8Z1Q21IkcQ== X-Received: by 2002:a17:903:11cf:b0:24c:7f03:61cb with SMTP id d9443c01a7336-2681256cb8amr68793185ad.26.1758181169140; Thu, 18 Sep 2025 00:39:29 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269800531c6sm17132025ad.14.2025.09.18.00.39.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:28 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id B2807106210C; Thu, 18 Sep 2025 16:39:27 +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 RESEND v11 09/13] x86/um: nommu: signal handling Date: Thu, 18 Sep 2025 16:39:04 +0900 Message-ID: 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-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.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 3AD9D2F1FFA for ; Thu, 18 Sep 2025 07:39:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181172; cv=none; b=Bm4Mdfn168s6NmYQQAeMj7b+bgRt1KQWrrL218fTTe5EOYcrLzVX241qCh9TDBqOWmeI6F/WXoCew2d2Ca4GOvNfG2o7S5PXBJkJDqqqMCK9q8pRxdw9vqSQd3uj4pmCfgRzMiPdE5s+lcmU5ZfUe8m8kGHrukoFr7jdqY6/SSo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181172; c=relaxed/simple; bh=A+kgl3pP41bBhorqPw1acgSIN74xjFREHN1mNj1smKY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aUhFds3UtGo11E6FJJ5xyLWRlbWIHLclXtFKzgifh7ihhGT27FcdGEc1kwPlZJ3RZp4zrW61rvpHNPf1mSEsRTmNApQ6zNBjt2ilxgNfisfADtdPI3QTlR+hXvo8vVL8E5UhxpNS2PxiU+i4f00gDYRJ7qhJtsYrHJ7PIm5mKwo= 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=Gm8nOtMV; arc=none smtp.client-ip=209.85.210.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="Gm8nOtMV" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-77d94c6562fso218251b3a.2 for ; Thu, 18 Sep 2025 00:39:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181170; x=1758785970; 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=Gm8nOtMVt09KdFLvoae9nC37MIhqcWKh0yytZ++f5qmodsy3CHQAA9/bmBkY8scNzH 0t9hjqF9pobKERAIqCqu24aAwVfTCKnPpw9OibOU0KzQcnL+6vr5i01pbyr/cx4mej2R rX47Qn/gEh4AoPRXsbTzD0YcAkztmnyyxjwz9jUtsjQdv+FEl6DsaVaROXWuYT474Pem xagWmbxaSef++bKiRFYcVC+tDIFNB6j+bO68Fdlz2Sfs7nVQVPriaeQj9P6GE8eO47mE HLA3hoeTmKmwjWsnOctnCCxTWEoDZmiaBDgL335pJwpAuFTwWrjE7d7ZahOOifht9E0b XuzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181170; x=1758785970; 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=TkZYXWlkJBWJg5b2fbTy34pUxvSVze69ow11p12vuXEPjIXp96/e1zi9DkY/Ywcina 1N0Djf5VVZCThdQMCwAdl8q6UIHV4bhaWyqTReypvrE3tHuq+iUcRKJgCDvkh7Ivf1h8 iDK1I8pzHeoNMsgfnxLEHBT6UuwCk3tBXXpB22qL52n/l7ZzLGogBn4CWMohRLeePDWb yU1ly6kAM8W7laLAd9jaqnb1kYRQxmezcW+qiQ5JPyjFUuctNUrn8ouE1QXRLlqgKyRP 0p32RmLJ5D5ShldHP87zgO+N1zdKu+f/tenQyJCU2Bqpd9W3NhvZJPwBU0rzLhtp5U88 UDhw== X-Forwarded-Encrypted: i=1; AJvYcCU6/+rUM/csT1aG4b5/wyYa5igz5M/ZliyEFz4DADibF4qoppaPyJT9kYmcOAAzR8DOrmHqwySHCH5CQqM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1w2jjpwhOro3YOvQBKRH5Y7B9d6dZfG8hHYexyHub7gjF9Fwa XBRJChTlXTS2k6BpfwPE5r8Y2cL94+GaShtOCHuIejUeIEv43IZnvWS/ X-Gm-Gg: ASbGncvL2wXvC9PLSn3g0AF+TTyeUOVVEoPWS1KycB7sHY8S+cGZlW+ENdHtZLfvK00 Wd+oHGrhirBCvCXb298/hHQhFCPH3tcW1seQdBsSsWHlZoS9LOkBEnWv/csJ8R103XByLT1Ft6m tMcq/pa7ZyDNvEL9Uuj/nQIsx7WQ9fLrNrVfj4OUPlELoG25Gzj3tUCfVuHcnDIKHQUaz68Be3s 2fdCXFge7WDLZKmvb7fDmUhY5iIcgBLJMSpO84MIHERP5GwBzORY8kf4r1pFkn9wl9oAZ/jxQHC dfsn9TCdmcMMsp1egUt6TBbKYJZHRozSBgOHLhrCWXlfFDHZ6Y7eoj++4L+oSunVsvMis8xzd3r ZG9AHjckk3M/JB+X0UQPXOJg4r5if7oI3KLHRVaOPJXmx/hrXLLAddtweNsdmj41eYPUneHf3tP vtyyx33CV8uZg= X-Google-Smtp-Source: AGHT+IE17eaOXHncHS5hiCqILLrCGf7cFJ1Ycoy+fQzqYB1HpBN8eNLK/gt5jkFvDElEVaTnnLbYOA== X-Received: by 2002:a05:6a00:84c:b0:771:fd01:9784 with SMTP id d2e1a72fcca58-77bf96606dcmr5439800b3a.29.1758181170538; Thu, 18 Sep 2025 00:39:30 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfbb79c2esm1503006b3a.2.2025.09.18.00.39.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:29 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 0372D106210E; Thu, 18 Sep 2025 16:39: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 RESEND v11 10/13] um: nommu: a work around for MMU dependency to PCI driver Date: Thu, 18 Sep 2025 16:39:05 +0900 Message-ID: <4a9dde10c586883d20a8201ca7d76e6d7d52eaf4.1758181109.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-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 859A32F3630 for ; Thu, 18 Sep 2025 07:39:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181175; cv=none; b=dTFcmhf4kRbiweTVkWT/kaplIQZY3JyIUV4pPkfWVMLt0YOdjgh8zkTwyYMOoN0Gt9UOHfYY3w0uOFxvzQj8LDAuIrUGjSIkMdwwhRF+qXBVIwL4LSo4I3wydldoGnbDNj0Gk8OiZIJu8BORSq/F/1MxaWkI4nIacs8bhIgzKFE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181175; c=relaxed/simple; bh=kvY4llqgRsxBvMcZ/CXo6FHDMPIg9Hmu3RD2Lrj2HZo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uZICNGoCMGgKBrmES/Hom+8sww8YlT4bghfufk8WcNIf2RJDwXXiKgmtn6uEgrRCdocJyRUjNhWOf31UGUR6y2dH8mCCk0MUz5pJbM7ShOvzWEtuhN31ZQgfM6Fp57Djh0SEFQZYlrhHYTZrqBIKZdBgJ4uvT+1kp+khHaKR1B8= 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=da0ZIS0w; arc=none smtp.client-ip=209.85.210.172 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="da0ZIS0w" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-77b0a93e067so639012b3a.2 for ; Thu, 18 Sep 2025 00:39:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181173; x=1758785973; 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=da0ZIS0w/hOpITEzJnNdt4IKqua8UbTSYVznh5BWj6Fg+2qFCMHD2ilbSMFXktHtg0 Be0PSHDIwNcckLOXCGD+cwG4EujK282WJEnEAIODx8U7VSMIFGPIGkRgPUhqDDIRc2GH yRIYrAY8RX8TGQE9EtUGwZT4EZGpTWjG9YOuXizbR8EJ6Tk5PqgW0j2PRQNFicwuGyIW oBvH1o4vpum7wWR9MTSje8Q065U0BX5DrH/SMmJqyB96wYPyCIZoH5PELUacTnxGNRgD pHWPa7wXoeJkmQYNluYvOhceR6iUIWbpIVX5f+V3YZ0eD4A6YQfo3CBQH9XDMwnkWePU 4Ylg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181173; x=1758785973; 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=bfZ+l0qytIHah2+u4JU/XqZmk8kiGxt72qXgLKBRePsa9daqp5N9vTTOcfwRx6Cb4D s+SXMrHzy62B+ImfPGekJN2dToFLM4qYLkSyIAxLOu+TFi2/iltH0uY4Et3j9CpPK5JJ aDtC9J9PSUs/Hh9v5vpc33nOWTinILnYkAMW607ljooQy6+lcKZKjqtN/JMl3TLNE0/b EQN0XzgQ36LkQB8qiPrYh2EQ5orEVIAUk4NIqOdF57ON3t8t2D38ea7mBD1tG/dvfebh 3dzVJ+jbWvFNbQrakTy3z/+BzsYkQPKJxokSE2on1b7ff+F1FcdDBXxu13bDAPRJbczi WZEw== X-Forwarded-Encrypted: i=1; AJvYcCXOnZYakMNhdCNfzQznOGMp6Ecr9l/0bVyM9tMrL6SJjgZMDVIZ7ZTTPObLcI5Qx7vXN/wfvx0J2sX/qG0=@vger.kernel.org X-Gm-Message-State: AOJu0YyeHhbAlfyY0Q28+E1wnEMk2Zg0L8ufMtGyGCHz+8s3Qd17mNRD aG3hZww4R/P0AMYV10iHqizuiMszvGxdYoLNqJUlUTpkxTnI9KFPnP4j X-Gm-Gg: ASbGncttjEnVObYZQMW+F+47ycCJdrSyO9uWUQBh7ofN78KThRMPbyJgH+WAuTid5ht CBAHxW0avYMF44+IiLVM06Ckl/+svS+HxBhPxmPl8BmmARirceDxPb87f6SNkbj+QvVMIRpygE4 eXbnxpPQd5d7RibHEjoqBDMWsW8mCHhVqS2uT8PyNkcLNHrNf6K9QWZ+EYsf1DUtF24x3m3Zpmv qBjZALRyZ2KU+mUID1EWStENIc18w4uhLJt03ypL8GhSgbEbRKDGOcjKUpuNDFw6Sn/TBGx25L2 h+y8XO5CuMDFeit988G6cHdoTebebOMm1VEjh05fhcde8ix+Hx8GZZsSrAg45oD7J+fLU+bvG29 DaFwK7OHi8O+iY5Sn81xkBWVKYwvcHq3T0mEWm67uwDm2gzP+6CY0//C+7jkWynQ015m9WiIuT5 oh4fesPyqwWHc= X-Google-Smtp-Source: AGHT+IGoXWN5DJ8xIXCgwHsBi/4NPgC0UAZOi82Bbm/JRF9tQ/p87F/MCcBLJSl0bwTlX6e3XqHsuw== X-Received: by 2002:a05:6a00:188b:b0:771:fbc3:f151 with SMTP id d2e1a72fcca58-77bf8e72b17mr6667074b3a.15.1758181172767; Thu, 18 Sep 2025 00:39:32 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77cfbb79c23sm1476897b3a.1.2025.09.18.00.39.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:32 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 328491062110; Thu, 18 Sep 2025 16:39:30 +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 RESEND v11 11/13] um: change machine name for uname output Date: Thu, 18 Sep 2025 16:39:06 +0900 Message-ID: <4e20b02e2b44b1db9a6f80e59e6b0c00ab08d5f8.1758181109.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-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 E108F2F3C21 for ; Thu, 18 Sep 2025 07:39:34 +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=1758181176; cv=none; b=EZWoIuaSr4yDQMbc/Fba9Ndtmyld8K1j8JZQiS3+xWI+oDe2AhXmE0n7y7k1hmlQvylcepzeYVFyPHfRWNnuvukuuW/6goaRpuxLhSL3+I0N/uaBISmoXC5LGD4pQOC1t+O7Z+wB9rpl+K5Zvjl8ZE5dZaWYh6OyhyPZj+Y02mQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181176; c=relaxed/simple; bh=YthZjy/Hv5hqKNtjIRhLrTfxuO/N5yUqpo/LnhhO6o0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l49zpb+YYsmgZe/6+jzHNSqwz59/l77onKYW95VQ1whgwkP+VBR1/KyQBJi1TW+yOc6QRoDWyNkglogEJrjElsHMzuVhTjGncbSMhtyvPST/hGeE7oCatZH+rh9+tDTaNdXU78kI8qoHBzSLhRZ//UPI2HyL92A0kQDoiLQmFSs= 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=M7j2d32Q; 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="M7j2d32Q" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-32e1c40ecb0so489143a91.3 for ; Thu, 18 Sep 2025 00:39:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181174; x=1758785974; 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=M7j2d32Qc9ieYPVDRlT72LnprXONgQf7fnUD6zt8lZZfCPlA+9nju4d3Z34Ik4lcd2 5GyKt98K7WQ8Nh8iyoHKXCYswcLuMT5hu5EMO/ShGxpYreDSki58pKfqIwppSGtkrD8d hrAkqijjEhHa2COYkuScggn8oUIe/6l63GUjZndxe6MlnAsyTkW6hQ7SqPW+St37dBlK VHL98Q/OiZ+sMN7yUoi7Y+ZLW/4D6zKDvVxfNO4/KBwZ8CmzAxJlzmPbJef9mSsqROgF zoXbtOYzR5DTs8qT8XympCBxDZloUefiRLORfjQNzkY5NmDp/e6rBCX/WYT2z1iVsOtS EyRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181174; x=1758785974; 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=Qtb6gUvePW08eWRBoxmDFjuBqJj6D0wE6x0Htp6nJRG+OaTqJ74/51DPv1qAryWotL QwcqBWs5+HK684jdfkn6TkNYgACihkM+Fyq4ZS7/9dsQ1rEoV0l57LVzDbVDfdiuLJKT Y7xo9XYHDtVsW8sgQ+vP6huiszILfH5N1R9YjZ7u1zXgYdm8enF+w8dMkEheUTP74Sh1 YbItm3D+YgwuqZCiIyzu68z72zwiQWak18XE7qKNePfnGsop0aniKYKv6LMJNkOFtbuF Dw8agQyjbTfpliXC8PzriQeewX1ZmUE1p8r4Zua1gVYT1QuY1TsZODq5supVfOZaOZUE ecxw== X-Forwarded-Encrypted: i=1; AJvYcCU4xZzs0jzXsstcb1adMbpRmhWeX2yZ11qDm5MiwTNWHeIwpuRxJgv/AEvud3iZFZpl9MA/riVxGTn4HAo=@vger.kernel.org X-Gm-Message-State: AOJu0YxnHYdzDt9RHNPzbFJYRih5MkAYLbwH6+zmldM+dGGToku+glM3 phkQfzd2s8/DW7We2y3F/KyqjyLaqtaZbEOqku6SFf4z7UYKIVlFYiFi X-Gm-Gg: ASbGnct/oNS0ywBV8IVp0I7MUzYLcz9bZ5AliEfNBx6ns70maagSwmtlvWfsFb68jv1 Vznpc5Eo1gcUf6yvbPyf5mPhWGXmWhGvCoeuhs/Yr09c1hTMElpXPHa+MJiYGwMGnJiZns38sUu Eq4qGZmG9JZg/G85WeNXL/mv2dV8nGnZKr4tdJjwN+b2Zj/mYQy21NFjnSYzN6/PoaqP3ejQYel BqpzLPZ8P6McV8sRx6pqpgupJMOylxBJBLXVqnm68CFAL9LtYVoG56M1JP1qGpcUDhKJM65VCu6 IlBzEXbdUhf1BrF4lcC10AmBm89Ef8FNDOVwrIMrRhbK656h0DPhR92Qz3/MUwCUiQ36jdS7lS+ MlvgihIq8pt+VhUZbbY1krcjWzak3ZMG6g+aKVA3fZh5SvVcQyb6Lzi5416h1i540FgtONPzxBu eaWqVMozeCI4k= X-Google-Smtp-Source: AGHT+IHxkUslwpxevE9bI62FFSn+jT5ev+hfJBOVMTNtFsfSx8g7hj3BL9W278Q7NiAXFoCSS/Poyg== X-Received: by 2002:a17:90b:1dc7:b0:32b:aee1:18d5 with SMTP id 98e67ed59e1d1-32ee3f76419mr6422504a91.29.1758181174135; Thu, 18 Sep 2025 00:39:34 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-32ed273ec20sm4537412a91.16.2025.09.18.00.39.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:33 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id AB4491062112; Thu, 18 Sep 2025 16:39:32 +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 RESEND v11 12/13] um: nommu: add documentation of nommu UML Date: Thu, 18 Sep 2025 16:39:07 +0900 Message-ID: <375e45e659d289d5343d7852303e1c04d6077a4c.1758181109.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-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.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 51D262EC54E for ; Thu, 18 Sep 2025 07:39:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181177; cv=none; b=aM2bt3A2zKDffWWzOkcaA1G7a2KCDvnyP1QYI2VxxxEGPyHYwgxZ8Qx8mq5Sx3kXd/McXT4aggDK5xRmAvK7YPKSCdCUkxgCiWJMCH9U8Rtd91j253MtT8fK1DjzlkEN4p8Ecco4qacrpN8/bR2zp6a4h+THSfV5yDPeu9vlp3w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758181177; c=relaxed/simple; bh=H4z+K4nZbNEAC2aE3ZetyeCuDlJ6EyjEggbl9qc6cyE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cAV+d5IdxdWOQUXIo+UvET8QqjEOkxcksTDmmQDNvNV8SGgvYvKBmDnWJAr1cWWITMkiqi0oXgTqJs5J6XnCfty7FdDvCn3LggRv14vygCZ2mPCChTlE35ef7oZm3ptSERxHEbesy10MtDapG3DxkRpJzCC8gf72mNX0wsmSo7s= 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=EiJ9/ACX; arc=none smtp.client-ip=209.85.215.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="EiJ9/ACX" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-b55003f99fdso448771a12.3 for ; Thu, 18 Sep 2025 00:39:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758181175; x=1758785975; 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=EiJ9/ACXgXGN2TizLxDXvrcFltR0Sesj3aUtfBSCdAxpjcjzOi8zWFFY1vAlr8hMFm xT+xIUp+mULfVIUVHIRWNSu8W7zl/XlK4pST6bEFLgALtxl+vU6dq9LJFHreO5YIzp5H 0oLlO3OfRtITfuosE3iGFMX9uSQE5wZt3dQ44/KeDDPFPLo7MaCtsZe6Gx9DdMRlttYU zppAvYCG8Z9Yf+hQP0E9oWYMBG2flDKbYQxPwIsXvbk4Cj8KAWyR0SzvmyMZekHghB1G T8zIquOt0Nk+HufY6B1y6ZaQoHWq+Hgc4sAnj8Fbeg/TiXvT1JHWUDwGzTElVvnHoUOb Ra0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758181175; x=1758785975; 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=nXCEX93izthUXSLL+PiG/WBNl4erII/wRwodQacOqrgatsx75KoIPLBvo5jB2C+Ty2 OqLtNEroQGXFdIF/UK//Ekr9bNqQqEWIt98cgxnVShCvf1aaj4xylWP2PY8SEiRkT9+P kBl1f+TSw4iEXsrIQcHduYpOAtPpKvORaIfAvbQFd2HDLVP+qgMWfaWl8f32zXUR4tve iVXMsZ1EvZtv/lVzk0TUeNia1p80bwxMJQqq7Dbkm+SdutSj7rXc2INNic8Jz1Z0BdT4 wtm5lBY2rWfZA9/7VmJdn51ESN8xbCPhHHLREbc5iQzT/mujFVjxr+h6dEkZXa1oGXoH dlhQ== X-Forwarded-Encrypted: i=1; AJvYcCVcxskEx29z73AiPzFBHYE5wAyyE/2yKI4GM+6OrZ+6GbOXjwA96++AyjCAhnhLGN4amHhDLlef7Vl9zfc=@vger.kernel.org X-Gm-Message-State: AOJu0YwvKGGtqZQ9N6EPVlxfrxYNSPXu6CqjDpKPrmSv+RvYgyHkQv55 IAy99H7Q4qHqmkv4CbHH4kQwH1t6wvyVJtIKAV2IlzX41zC4fxmiOLIQ X-Gm-Gg: ASbGncvpY8NjauZevV74RuKi70CGN4LI1c0NqSR2Jti5fR56g37K9Qgp2j3coV888ki u521zQ6Z7SkV6nffDhcKC6Dbd2Gls/E8Zv+p2YQKI7ei09OLORDpzz0AGz4/nAO6nh9hFZUPlva +G6jk+dRoPslJBS8Uourmm1lHcssHcXtLSDgW+cuWJYeH+rKSFCB/9tziCxDW4LzmYHrnArK5R/ BKfzsTj9PZ9ETR1EwAUj/7Hu3wkR/QMu9Ky6ST7GS5oyLitQsqL90TvnzQQM+pcSC6u5KhtOR6w Lq5YFHMXSUS4ULXEXDBi6zxv6EUJbljreI0ERoXPhg2/JG4S+UhULagPdSmh0vo6RKQsFmL7jjE G5h85/+9fwrecFU9BrcxM376SEjA5lxyBuoOhjnNLxm5H4bA6zOQL0jsOzhha45bxOoM5Vftlhi Tmv3GXZpnnKkw= X-Google-Smtp-Source: AGHT+IE+HOwpQOTe1IjwWUlVdtuE/bhc6md4K+/CWF49tmVYYKG4ELGdQ5lhm0IUR79AdsHRiU6vaA== X-Received: by 2002:a17:903:18e:b0:24e:e5c9:ecfd with SMTP id d9443c01a7336-2681390328cmr73932485ad.42.1758181175568; Thu, 18 Sep 2025 00:39:35 -0700 (PDT) Received: from ikb-h07-29-noble.in.iijlab.net ([202.214.97.5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-269802e00b3sm16679445ad.90.2025.09.18.00.39.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 Sep 2025 00:39:34 -0700 (PDT) Received: by ikb-h07-29-noble.in.iijlab.net (Postfix, from userid 1010) id 3475E1062114; Thu, 18 Sep 2025 16:39:33 +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 RESEND v11 13/13] um: nommu: plug nommu code into build system Date: Thu, 18 Sep 2025 16:39:08 +0900 Message-ID: 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