[RFC PATCH 7/7] sci: add example system calls to exercse SCI

From: Mike Rapoport
Date: Thu Apr 25 2019 - 17:46:43 EST


Signed-off-by: Mike Rapoport <rppt@xxxxxxxxxxxxx>
---
arch/x86/entry/common.c | 6 +++-
arch/x86/entry/syscalls/syscall_64.tbl | 3 ++
kernel/Makefile | 2 +-
kernel/sci-examples.c | 52 ++++++++++++++++++++++++++++++++++
4 files changed, 61 insertions(+), 2 deletions(-)
create mode 100644 kernel/sci-examples.c

diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 8f2a6fd..be0e1a7 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -275,7 +275,11 @@ __visible inline void syscall_return_slowpath(struct pt_regs *regs)
#ifdef CONFIG_SYSCALL_ISOLATION
static inline bool sci_required(unsigned long nr)
{
- return false;
+ if (!static_cpu_has(X86_FEATURE_SCI))
+ return false;
+ if (nr < __NR_get_answer)
+ return false;
+ return true;
}

static inline unsigned long sci_syscall_enter(unsigned long nr)
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index f0b1709..a25e838 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -343,6 +343,9 @@
332 common statx __x64_sys_statx
333 common io_pgetevents __x64_sys_io_pgetevents
334 common rseq __x64_sys_rseq
+335 64 get_answer __x64_sys_get_answer
+336 64 sci_write_dmesg __x64_sys_sci_write_dmesg
+337 64 sci_write_dmesg_bad __x64_sys_sci_write_dmesg_bad

#
# x32-specific system call numbers start at 512 to avoid cache impact
diff --git a/kernel/Makefile b/kernel/Makefile
index 6aa7543..d6441d0 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -10,7 +10,7 @@ obj-y = fork.o exec_domain.o panic.o \
extable.o params.o \
kthread.o sys_ni.o nsproxy.o \
notifier.o ksysfs.o cred.o reboot.o \
- async.o range.o smpboot.o ucount.o
+ async.o range.o smpboot.o ucount.o sci-examples.o

obj-$(CONFIG_MODULES) += kmod.o
obj-$(CONFIG_MULTIUSER) += groups.o
diff --git a/kernel/sci-examples.c b/kernel/sci-examples.c
new file mode 100644
index 0000000..9bfaad0
--- /dev/null
+++ b/kernel/sci-examples.c
@@ -0,0 +1,52 @@
+#include <linux/kernel.h>
+#include <linux/pid.h>
+#include <linux/syscalls.h>
+#include <linux/hugetlb.h>
+#include <asm/special_insns.h>
+
+SYSCALL_DEFINE0(get_answer)
+{
+ return 42;
+}
+
+#define BUF_SIZE 1024
+
+typedef void (*foo)(void);
+
+SYSCALL_DEFINE2(sci_write_dmesg, const char __user *, ubuf, size_t, count)
+{
+ char buf[BUF_SIZE];
+
+ if (!ubuf || count >= BUF_SIZE)
+ return -EINVAL;
+
+ buf[count] = '\0';
+ if (copy_from_user(buf, ubuf, count))
+ return -EFAULT;
+
+ printk("%s\n", buf);
+
+ return count;
+}
+
+SYSCALL_DEFINE2(sci_write_dmesg_bad, const char __user *, ubuf, size_t, count)
+{
+ unsigned long addr = (unsigned long)(void *)hugetlb_reserve_pages;
+ char buf[BUF_SIZE];
+ foo func1;
+
+ addr += 0xc5;
+ func1 = (foo)(void *)addr;
+ func1();
+
+ if (!ubuf || count >= BUF_SIZE)
+ return -EINVAL;
+
+ buf[count] = '\0';
+ if (copy_from_user(buf, ubuf, count))
+ return -EFAULT;
+
+ printk("%s\n", buf);
+
+ return count;
+}
--
2.7.4