As the tasklet subsystem is now initialized, it is necessary to implement
sync_local_execstate(), since it is invoked when something calls
tasklet_softirq_action(), which is registered in tasklet_subsys_init().
After introducing sync_local_execstate(), the following linker issue occurs:
riscv64-linux-gnu-ld: prelink.o: in function `bitmap_and':
/build/xen/./include/xen/bitmap.h:147: undefined reference to
`sync_vcpu_execstate'
riscv64-linux-gnu-ld: ./.xen-syms.0: hidden symbol
`sync_vcpu_execstate' isn't defined
riscv64-linux-gnu-ld: final link failed: bad value
Therefore, an implementation of sync_vcpu_execstate() is provided, based on
the Arm code.
Signed-off-by: Oleksii Kurochko <[email protected]>
---
xen/arch/riscv/domain.c | 23 +++++++++++++++++++++++
xen/arch/riscv/setup.c | 3 +++
xen/arch/riscv/stubs.c | 10 ----------
3 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/xen/arch/riscv/domain.c b/xen/arch/riscv/domain.c
index 8a010ae5b47e..574a5a34a389 100644
--- a/xen/arch/riscv/domain.c
+++ b/xen/arch/riscv/domain.c
@@ -141,6 +141,29 @@ void vcpu_kick(struct vcpu *v)
}
}
+void sync_local_execstate(void)
+{
+ /* Nothing to do -- no lazy switching */
+}
+
+void sync_vcpu_execstate(struct vcpu *v)
+{
+ /*
+ * We don't support lazy switching.
+ *
+ * However the context may have been saved from a remote pCPU so we
+ * need a barrier to ensure it is observed before continuing.
+ *
+ * Per vcpu_context_saved(), the context can be observed when
+ * v->is_running is false (the caller should check it before calling
+ * this function).
+ *
+ * Note this is a full barrier to also prevent update of the context
+ * to happen before it was observed.
+ */
+ smp_mb();
+}
+
int vcpu_set_interrupt(struct vcpu *v, const unsigned int irq)
{
/*
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index 9b4835960d20..e8dbd55ce79e 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -12,6 +12,7 @@
#include <xen/serial.h>
#include <xen/shutdown.h>
#include <xen/smp.h>
+#include <xen/tasklet.h>
#include <xen/timer.h>
#include <xen/vmap.h>
#include <xen/xvmalloc.h>
@@ -133,6 +134,8 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
panic("Booting using ACPI isn't supported\n");
}
+ tasklet_subsys_init();
+
init_IRQ();
riscv_fill_hwcap();
diff --git a/xen/arch/riscv/stubs.c b/xen/arch/riscv/stubs.c
index d120274af2fe..2b3eb01bf03c 100644
--- a/xen/arch/riscv/stubs.c
+++ b/xen/arch/riscv/stubs.c
@@ -91,16 +91,6 @@ void continue_running(struct vcpu *same)
BUG_ON("unimplemented");
}
-void sync_local_execstate(void)
-{
- BUG_ON("unimplemented");
-}
-
-void sync_vcpu_execstate(struct vcpu *v)
-{
- BUG_ON("unimplemented");
-}
-
void startup_cpu_idle_loop(void)
{
BUG_ON("unimplemented");
--
2.52.0