From: Nicholas Miehlbradt <nicholas@linux.ibm.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Nicholas Miehlbradt <nicholas@linux.ibm.com>
Subject: [PATCH] powerpc/64: Implement arch_within_stack_frames
Date: Wed, 14 Dec 2022 04:42:52 +0000 [thread overview]
Message-ID: <20221214044252.1910657-1-nicholas@linux.ibm.com> (raw)
Walks the stack when copy_{to,from}_user address is in the stack to
ensure that the object being copied is entirely within a single stack
frame.
Substatially similar to the x86 implementation except using the back
chain to traverse the stack and identify stack frame boundaries.
Signed-off-by: Nicholas Miehlbradt <nicholas@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/thread_info.h | 38 ++++++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 2ca5418457ed..4c59d139ea83 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -198,6 +198,7 @@ config PPC
select HAVE_ARCH_KASAN_VMALLOC if HAVE_ARCH_KASAN
select HAVE_ARCH_KFENCE if ARCH_SUPPORTS_DEBUG_PAGEALLOC
select HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET
+ select HAVE_ARCH_WITHIN_STACK_FRAMES if PPC64
select HAVE_ARCH_KGDB
select HAVE_ARCH_MMAP_RND_BITS
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index af58f1ed3952..efdf39e07884 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -186,6 +186,44 @@ static inline bool test_thread_local_flags(unsigned int flags)
#define is_elf2_task() (0)
#endif
+#ifdef CONFIG_PPC64
+
+#ifdef CONFIG_PPC64_ELF_ABI_V1
+#define PARAMETER_SAVE_OFFSET 48
+#else
+#define PARAMETER_SAVE_OFFSET 32
+#endif
+
+/*
+ * Walks up the stack frames to make sure that the specified object is
+ * entirely contained by a single stack frame.
+ *
+ * Returns:
+ * GOOD_FRAME if within a frame
+ * BAD_STACK if placed across a frame boundary (or outside stack)
+ */
+static inline int arch_within_stack_frames(const void * const stack,
+ const void * const stackend,
+ const void *obj, unsigned long len)
+{
+ const void *frame;
+ const void *oldframe;
+
+ oldframe = (const void *)current_stack_pointer;
+ frame = *(const void * const *)oldframe;
+
+ while (stack <= frame && frame < stackend) {
+ if (obj + len <= frame)
+ return obj >= oldframe + PARAMETER_SAVE_OFFSET ?
+ GOOD_FRAME : BAD_STACK;
+ oldframe = frame;
+ frame = *(const void * const *)oldframe;
+ }
+
+ return BAD_STACK;
+}
+#endif /* CONFIG_PPC64 */
+
#endif /* !__ASSEMBLY__ */
#endif /* __KERNEL__ */
--
2.34.1
next reply other threads:[~2022-12-14 4:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-14 4:42 Nicholas Miehlbradt [this message]
2022-12-14 8:39 ` [PATCH] powerpc/64: Implement arch_within_stack_frames Christophe Leroy
2022-12-14 11:39 ` Nicholas Piggin
2022-12-14 11:48 ` Christophe Leroy
2022-12-14 11:54 ` Christophe Leroy
2022-12-15 0:17 ` Segher Boessenkool
2022-12-15 0:52 ` Nicholas Piggin
2022-12-15 16:29 ` Segher Boessenkool
2022-12-15 17:16 ` Segher Boessenkool
2022-12-19 6:32 ` Nicholas Miehlbradt
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=20221214044252.1910657-1-nicholas@linux.ibm.com \
--to=nicholas@linux.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.