From: Benjamin Berg <benjamin@sipsolutions.net>
To: linux-um@lists.infradead.org
Cc: Benjamin Berg <benjamin@sipsolutions.net>
Subject: [PATCH v4 02/12] um: Create signal stack memory assignment in stub_data
Date: Wed, 3 Jul 2024 15:45:26 +0200 [thread overview]
Message-ID: <20240703134536.1161108-3-benjamin@sipsolutions.net> (raw)
In-Reply-To: <20240703134536.1161108-1-benjamin@sipsolutions.net>
When we switch to use seccomp, we need both the signal stack and other
data (i.e. syscall information) to co-exist in the stub data. To
facilitate this, start by defining separate memory areas for the stack
and syscall data.
This moves the signal stack onto a new page as the memory area is not
sufficient to hold both signal stack and syscall information.
Only change the signal stack setup for now, as the syscall code will be
reworked later.
Signed-off-by: Benjamin Berg <benjamin@sipsolutions.net>
---
arch/um/include/shared/as-layout.h | 2 +-
arch/um/include/shared/skas/stub-data.h | 9 +++++++++
arch/um/kernel/skas/clone.c | 6 ++++--
arch/um/kernel/skas/mmu.c | 4 ++++
arch/um/os-Linux/skas/process.c | 11 ++++++-----
5 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/arch/um/include/shared/as-layout.h b/arch/um/include/shared/as-layout.h
index c22f46a757dc..06292fca5a4d 100644
--- a/arch/um/include/shared/as-layout.h
+++ b/arch/um/include/shared/as-layout.h
@@ -23,7 +23,7 @@
#define STUB_START stub_start
#define STUB_CODE STUB_START
#define STUB_DATA (STUB_CODE + UM_KERN_PAGE_SIZE)
-#define STUB_DATA_PAGES 1 /* must be a power of two */
+#define STUB_DATA_PAGES 2 /* must be a power of two */
#define STUB_END (STUB_DATA + STUB_DATA_PAGES * UM_KERN_PAGE_SIZE)
#ifndef __ASSEMBLY__
diff --git a/arch/um/include/shared/skas/stub-data.h b/arch/um/include/shared/skas/stub-data.h
index 5e3ade3fb38b..779d2a3bac5d 100644
--- a/arch/um/include/shared/skas/stub-data.h
+++ b/arch/um/include/shared/skas/stub-data.h
@@ -8,10 +8,19 @@
#ifndef __STUB_DATA_H
#define __STUB_DATA_H
+#include <linux/compiler_types.h>
+#include <as-layout.h>
+
struct stub_data {
unsigned long offset;
int fd;
long parent_err, child_err;
+
+ /* 128 leaves enough room for additional fields in the struct */
+ unsigned char syscall_data[UM_KERN_PAGE_SIZE - 128] __aligned(16);
+
+ /* Stack for our signal handlers and for calling into . */
+ unsigned char sigstack[UM_KERN_PAGE_SIZE] __aligned(UM_KERN_PAGE_SIZE);
};
#endif
diff --git a/arch/um/kernel/skas/clone.c b/arch/um/kernel/skas/clone.c
index 62435187dda4..906f7454887c 100644
--- a/arch/um/kernel/skas/clone.c
+++ b/arch/um/kernel/skas/clone.c
@@ -27,9 +27,11 @@ stub_clone_handler(void)
struct stub_data *data = get_stub_data();
long err;
+ /* syscall data as a temporary stack area (bottom half). */
err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
- (unsigned long)data +
- STUB_DATA_PAGES * UM_KERN_PAGE_SIZE / 2);
+ (unsigned long) data->syscall_data +
+ sizeof(data->syscall_data) / 2 -
+ sizeof(void *));
if (err) {
data->parent_err = err;
goto done;
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c
index aeed1c2aaf3c..681839cdd795 100644
--- a/arch/um/kernel/skas/mmu.c
+++ b/arch/um/kernel/skas/mmu.c
@@ -14,6 +14,10 @@
#include <as-layout.h>
#include <os.h>
#include <skas.h>
+#include <stub-data.h>
+
+/* Ensure the stub_data struct covers the allocated area */
+static_assert(sizeof(struct stub_data) == STUB_DATA_PAGES * UM_KERN_PAGE_SIZE);
int init_new_context(struct task_struct *task, struct mm_struct *mm)
{
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 45885deb6cae..56403a1b006a 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -474,11 +474,12 @@ static int __init init_thread_regs(void)
thread_regs[REGS_IP_INDEX] = STUB_CODE +
(unsigned long) stub_clone_handler -
(unsigned long) __syscall_stub_start;
- thread_regs[REGS_SP_INDEX] = STUB_DATA + STUB_DATA_PAGES * UM_KERN_PAGE_SIZE -
- sizeof(void *);
-#ifdef __SIGNAL_FRAMESIZE
- thread_regs[REGS_SP_INDEX] -= __SIGNAL_FRAMESIZE;
-#endif
+
+ /* syscall data as a temporary stack area (top half). */
+ thread_regs[REGS_SP_INDEX] = STUB_DATA +
+ offsetof(struct stub_data, syscall_data) +
+ sizeof(((struct stub_data *) 0)->syscall_data) -
+ sizeof(void *);
return 0;
}
--
2.45.2
next prev parent reply other threads:[~2024-07-03 15:00 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-03 13:45 [PATCH v4 00/12] Rework stub syscall and page table handling Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 01/12] um: Remove stub-data.h include from common-offsets.h Benjamin Berg
2024-07-03 13:45 ` Benjamin Berg [this message]
2024-07-03 13:45 ` [PATCH v4 03/12] um: Add generic stub_syscall6 function Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 04/12] um: Rework syscall handling Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 05/12] um: compress memory related stub syscalls while adding them Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 06/12] um: remove LDT support Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 07/12] um: remove copy_context_skas0 Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 08/12] um: Delay flushing syscalls until the thread is restarted Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 09/12] um: Do not flush MM in flush_thread Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 10/12] um: remove force_flush_all from fork_handler Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 11/12] um: simplify and consolidate TLB updates Benjamin Berg
2024-07-03 13:45 ` [PATCH v4 12/12] um: refactor TLB update handling Benjamin Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240703134536.1161108-3-benjamin@sipsolutions.net \
--to=benjamin@sipsolutions.net \
--cc=linux-um@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox