summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <[email protected]>2023-07-18 08:33:41 +0000
committerYour Name <[email protected]>2023-07-18 08:33:41 +0000
commitc6c83e45719d3774bf723536f323e317eb9a384b (patch)
treee80c5a2f5029cc5dc6da4f4a59ecb86d16eb273e
parentd1528589b422729a8f9b10fce153425bc8ed5949 (diff)
add system call uintr_event(int fd)temp2
-rw-r--r--arch/x86/entry/syscalls/syscall_32.tbl1
-rw-r--r--arch/x86/entry/syscalls/syscall_64.tbl1
-rw-r--r--arch/x86/include/asm/uintr.h4
-rw-r--r--arch/x86/kernel/uintr_fd.c9
-rw-r--r--include/linux/syscalls.h1
-rw-r--r--include/uapi/asm-generic/unistd.h4
-rw-r--r--kernel/sys_ni.c1
-rwxr-xr-xscripts/checksyscalls.sh1
8 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
index d0e97f1f1173..a1575cd06bac 100644
--- a/arch/x86/entry/syscalls/syscall_32.tbl
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
@@ -459,3 +459,4 @@
452 i386 uintr_register_sender sys_uintr_register_sender
453 i386 uintr_unregister_sender sys_uintr_unregister_sender
454 i386 uintr_wait sys_uintr_wait
+455 i386 uintr_event sys_uintr_event
diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
index 444af44e5947..e3e0b47c40a2 100644
--- a/arch/x86/entry/syscalls/syscall_64.tbl
+++ b/arch/x86/entry/syscalls/syscall_64.tbl
@@ -376,6 +376,7 @@
452 common uintr_register_sender sys_uintr_register_sender
453 common uintr_unregister_sender sys_uintr_unregister_sender
454 common uintr_wait sys_uintr_wait
+455 common uintr_event sys_uintr_event
#
# Due to a historical design error, certain syscalls are numbered differently
diff --git a/arch/x86/include/asm/uintr.h b/arch/x86/include/asm/uintr.h
index a8bb151e4c8f..3e072bec04f2 100644
--- a/arch/x86/include/asm/uintr.h
+++ b/arch/x86/include/asm/uintr.h
@@ -64,12 +64,16 @@ void switch_uintr_return(void);
int uintr_receiver_wait(ktime_t *expires);
void uintr_wake_up_process(void);
+int do_uintr_event_init(int flag);
+void uintr_event_write(void);
+
#else /* !CONFIG_X86_USER_INTERRUPTS */
static inline void uintr_free(struct task_struct *task) {}
static inline void switch_uintr_prepare(struct task_struct *prev) {}
static inline void switch_uintr_return(void) {}
static inline void uintr_wake_up_process(void) {}
+void uintr_event_write(void) {}
#endif /* CONFIG_X86_USER_INTERRUPTS */
diff --git a/arch/x86/kernel/uintr_fd.c b/arch/x86/kernel/uintr_fd.c
index 8ddc6a7575bf..3287f8028d00 100644
--- a/arch/x86/kernel/uintr_fd.c
+++ b/arch/x86/kernel/uintr_fd.c
@@ -321,3 +321,12 @@ SYSCALL_DEFINE2(uintr_wait, u64, usec, unsigned int, flags)
expires = usec * NSEC_PER_USEC;
return uintr_receiver_wait(&expires);
}
+
+SYSCALL_DEFINE1(uintr_event, unsigned int, flags)
+{
+ if (!uintr_arch_enabled())
+ return -EOPNOTSUPP;
+
+ int fd = flags;
+ return do_uintr_event_init(fd);
+} \ No newline at end of file
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index ddb37e59acaa..792263090fcf 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -1067,6 +1067,7 @@ asmlinkage long sys_uintr_create_fd(u64 vector, unsigned int flags);
asmlinkage long sys_uintr_register_sender(int uintr_fd, unsigned int flags);
asmlinkage long sys_uintr_unregister_sender(int uintr_fd, unsigned int flags);
asmlinkage long sys_uintr_wait(u64 usec, unsigned int flags);
+asmlinkage long sys_uintr_event(unsigned int flags);
/* pciconfig: alpha, arm, arm64, ia64, sparc */
asmlinkage long sys_pciconfig_read(unsigned long bus, unsigned long dfn,
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
index b9a8b344270a..477f5f427530 100644
--- a/include/uapi/asm-generic/unistd.h
+++ b/include/uapi/asm-generic/unistd.h
@@ -892,9 +892,11 @@ __SYSCALL(__NR_uintr_register_sender, sys_uintr_register_sender)
__SYSCALL(__NR_uintr_unregister_sender, sys_uintr_unregister_sender)
#define __NR_uintr_wait 454
__SYSCALL(__NR_uintr_wait, sys_uintr_wait)
+#define __NR_uintr_event 455
+__SYSCALL(__NR_uintr_event, sys_uintr_event)
#undef __NR_syscalls
-#define __NR_syscalls 455
+#define __NR_syscalls 456
/*
* 32 bit systems traditionally used different
diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
index 5d8b92ac197b..36477d52eb73 100644
--- a/kernel/sys_ni.c
+++ b/kernel/sys_ni.c
@@ -364,6 +364,7 @@ COND_SYSCALL(uintr_create_fd);
COND_SYSCALL(uintr_register_sender);
COND_SYSCALL(uintr_unregister_sender);
COND_SYSCALL(uintr_wait);
+COND_SYSCALL(uintr_event);
/*
* Architecture specific weak syscall entries.
diff --git a/scripts/checksyscalls.sh b/scripts/checksyscalls.sh
index 0969580d829c..857106a48d2d 100755
--- a/scripts/checksyscalls.sh
+++ b/scripts/checksyscalls.sh
@@ -210,6 +210,7 @@ cat << EOF
#define __IGNORE_uintr_register_sender
#define __IGNORE_uintr_unregister_sender
#define __IGNORE_uintr_wait
+#define __IGNORE_uintr_event
/* ... including the "new" 32-bit uid syscalls */
#define __IGNORE_lchown32