git: ef71fbf692af - stable/13 - Add cpu_sync_core()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 26 Oct 2023 19:07:47 UTC
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=ef71fbf692af963b1a4fa072e88d0d1256f1f897
commit ef71fbf692af963b1a4fa072e88d0d1256f1f897
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-10-07 21:57:55 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2023-10-26 04:07:29 +0000
Add cpu_sync_core()
(cherry picked from commit 74ccb8ecf6c115a79f008bc32d4981f1126b63a8)
---
sys/amd64/amd64/support.S | 21 +++++++++++++++++++++
sys/arm/arm/vm_machdep.c | 5 +++++
sys/arm64/arm64/vm_machdep.c | 11 +++++++++++
sys/i386/i386/support.s | 8 ++++++++
sys/powerpc/powerpc/vm_machdep.c | 10 ++++++++++
sys/riscv/riscv/vm_machdep.c | 7 +++++++
sys/sys/proc.h | 1 +
7 files changed, 63 insertions(+)
diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S
index f070973913a0..936065a78879 100644
--- a/sys/amd64/amd64/support.S
+++ b/sys/amd64/amd64/support.S
@@ -1970,3 +1970,24 @@ ENTRY(mds_handler_silvermont)
popq %rax
retq
END(mds_handler_silvermont)
+
+/*
+ * Do the same as Linux and execute IRET explicitly, despite IPI
+ * return does it as well.
+ */
+ENTRY(cpu_sync_core)
+/*
+ * Can utilize SERIALIZE when instruction is moved from
+ * 'future extensions' to SDM.
+ */
+ movq (%rsp), %rdx
+ movl %ss, %eax
+ pushq %rax
+ pushq %rsp
+ addq $16, (%rsp)
+ pushfq
+ movl %cs, %eax
+ pushq %rax
+ pushq %rdx
+ iretq
+END(cpu_sync_core)
diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c
index 2dcd0158fd93..03816df5760f 100644
--- a/sys/arm/arm/vm_machdep.c
+++ b/sys/arm/arm/vm_machdep.c
@@ -305,3 +305,8 @@ cpu_procctl(struct thread *td __unused, int idtype __unused, id_t id __unused,
return (EINVAL);
}
+
+void
+cpu_sync_core(void)
+{
+}
diff --git a/sys/arm64/arm64/vm_machdep.c b/sys/arm64/arm64/vm_machdep.c
index f1ff0742418a..ea8e88b7201d 100644
--- a/sys/arm64/arm64/vm_machdep.c
+++ b/sys/arm64/arm64/vm_machdep.c
@@ -302,3 +302,14 @@ cpu_procctl(struct thread *td __unused, int idtype __unused, id_t id __unused,
return (EINVAL);
}
+
+void
+cpu_sync_core(void)
+{
+ /*
+ * Do nothing. According to ARM ARMv8 D1.11 Exception return
+ * If FEAT_ExS is not implemented, or if FEAT_ExS is
+ * implemented and the SCTLR_ELx.EOS field is set, exception
+ * return from ELx is a context synchronization event.
+ */
+}
diff --git a/sys/i386/i386/support.s b/sys/i386/i386/support.s
index e017e67d0fa7..2995469405df 100644
--- a/sys/i386/i386/support.s
+++ b/sys/i386/i386/support.s
@@ -634,3 +634,11 @@ ENTRY(mds_handler_silvermont)
movl %eax, %cr0
3: ret
END(mds_handler_silvermont)
+
+ENTRY(cpu_sync_core)
+ popl %eax
+ pushfl
+ pushl %cs
+ pushl %eax
+ iretl
+END(cpu_sync_core)
diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c
index 47a4dd0d4c4a..c99748149f39 100644
--- a/sys/powerpc/powerpc/vm_machdep.c
+++ b/sys/powerpc/powerpc/vm_machdep.c
@@ -234,3 +234,13 @@ cpu_procctl(struct thread *td __unused, int idtype __unused, id_t id __unused,
return (EINVAL);
}
+
+void
+cpu_sync_core(void)
+{
+ /*
+ * Linux performs "rfi" there. Our rendezvous IPI handler on
+ * the target cpu does "rfi" before and lwsync/sync after the
+ * action, which is stronger than required.
+ */
+}
diff --git a/sys/riscv/riscv/vm_machdep.c b/sys/riscv/riscv/vm_machdep.c
index 3b2553996bb8..58acf5df9e14 100644
--- a/sys/riscv/riscv/vm_machdep.c
+++ b/sys/riscv/riscv/vm_machdep.c
@@ -49,6 +49,7 @@
#include <machine/riscvreg.h>
#include <machine/cpu.h>
+#include <machine/cpufunc.h>
#include <machine/pcb.h>
#include <machine/frame.h>
#include <machine/sbi.h>
@@ -267,3 +268,9 @@ cpu_procctl(struct thread *td __unused, int idtype __unused, id_t id __unused,
return (EINVAL);
}
+
+void
+cpu_sync_core(void)
+{
+ fence_i();
+}
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 0e8156e308b6..369bc607e9c7 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1162,6 +1162,7 @@ void cpu_idle(int);
int cpu_idle_wakeup(int);
extern void (*cpu_idle_hook)(sbintime_t); /* Hook to machdep CPU idler. */
void cpu_switch(struct thread *, struct thread *, struct mtx *);
+void cpu_sync_core(void);
void cpu_throw(struct thread *, struct thread *) __dead2;
bool curproc_sigkilled(void);
void userret(struct thread *, struct trapframe *);