Introduce a virtual timer structure along with functions to initialize
and destroy the virtual timer.
Add a vtimer_expired() function and implement it as a stub, as the timer
and tasklet subsystems are not functional at this stage.
Call vcpu_vtimer_init() in arch_vcpu_create().
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
---
xen/arch/riscv/Makefile | 1 +
xen/arch/riscv/domain.c | 8 ++++--
xen/arch/riscv/include/asm/domain.h | 4 +++
xen/arch/riscv/include/asm/vtimer.h | 25 ++++++++++++++++++
xen/arch/riscv/vtimer.c | 39 +++++++++++++++++++++++++++++
5 files changed, 75 insertions(+), 2 deletions(-)
create mode 100644 xen/arch/riscv/include/asm/vtimer.h
create mode 100644 xen/arch/riscv/vtimer.c
diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile
index 8863d4b15605..5bd180130165 100644
--- a/xen/arch/riscv/Makefile
+++ b/xen/arch/riscv/Makefile
@@ -22,6 +22,7 @@ obj-y += traps.o
obj-y += vmid.o
obj-y += vm_event.o
obj-y += vsbi/
+obj-y += vtimer.o
$(TARGET): $(TARGET)-syms
$(OBJCOPY) -O binary -S $< $@
diff --git a/xen/arch/riscv/domain.c b/xen/arch/riscv/domain.c
index 44387d056546..dd3c237d163d 100644
--- a/xen/arch/riscv/domain.c
+++ b/xen/arch/riscv/domain.c
@@ -6,6 +6,7 @@
#include <asm/cpufeature.h>
#include <asm/csr.h>
#include <asm/riscv_encoding.h>
+#include <asm/vtimer.h>
static void vcpu_csr_init(struct vcpu *v)
{
@@ -97,11 +98,14 @@ int arch_vcpu_create(struct vcpu *v)
if ( is_idle_vcpu(v) )
return rc;
+ if ( (rc = vcpu_vtimer_init(v)) )
+ goto fail;
+
/*
- * As the vtimer and interrupt controller (IC) are not yet implemented,
+ * As interrupt controller (IC) is not yet implemented,
* return an error.
*
- * TODO: Drop this once the vtimer and IC are implemented.
+ * TODO: Drop this once IC is implemented.
*/
rc = -EOPNOTSUPP;
goto fail;
diff --git a/xen/arch/riscv/include/asm/domain.h b/xen/arch/riscv/include/asm/domain.h
index a0ffbbc09c6f..be7ddaff30e7 100644
--- a/xen/arch/riscv/include/asm/domain.h
+++ b/xen/arch/riscv/include/asm/domain.h
@@ -8,6 +8,7 @@
#include <public/hvm/params.h>
#include <asm/p2m.h>
+#include <asm/vtimer.h>
struct vcpu_vmid {
uint64_t generation;
@@ -52,6 +53,9 @@ struct arch_vcpu
struct cpu_info *cpu_info;
void *stack;
+ struct vtimer vtimer;
+ bool vtimer_initialized;
+
/* CSRs */
register_t hstatus;
register_t hedeleg;
diff --git a/xen/arch/riscv/include/asm/vtimer.h b/xen/arch/riscv/include/asm/vtimer.h
new file mode 100644
index 000000000000..a2ca704cf0cc
--- /dev/null
+++ b/xen/arch/riscv/include/asm/vtimer.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * (c) 2023-2024 Vates
+ */
+
+#ifndef ASM__RISCV__VTIMER_H
+#define ASM__RISCV__VTIMER_H
+
+#include <xen/timer.h>
+
+struct domain;
+struct vcpu;
+struct xen_arch_domainconfig;
+
+struct vtimer {
+ struct vcpu *v;
+ struct timer timer;
+};
+
+int vcpu_vtimer_init(struct vcpu *v);
+void vcpu_timer_destroy(struct vcpu *v);
+
+int domain_vtimer_init(struct domain *d, struct xen_arch_domainconfig *config);
+
+#endif /* ASM__RISCV__VTIMER_H */
diff --git a/xen/arch/riscv/vtimer.c b/xen/arch/riscv/vtimer.c
new file mode 100644
index 000000000000..5ba533690bc2
--- /dev/null
+++ b/xen/arch/riscv/vtimer.c
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <xen/sched.h>
+
+#include <public/xen.h>
+
+#include <asm/vtimer.h>
+
+int domain_vtimer_init(struct domain *d, struct xen_arch_domainconfig *config)
+{
+ /* Nothing to do at the moment */
+
+ return 0;
+}
+
+static void vtimer_expired(void *data)
+{
+ panic("%s: TBD\n", __func__);
+}
+
+int vcpu_vtimer_init(struct vcpu *v)
+{
+ struct vtimer *t = &v->arch.vtimer;
+
+ t->v = v;
+ init_timer(&t->timer, vtimer_expired, t, v->processor);
+
+ v->arch.vtimer_initialized = true;
+
+ return 0;
+}
+
+void vcpu_timer_destroy(struct vcpu *v)
+{
+ if ( !v->arch.vtimer_initialized )
+ return;
+
+ kill_timer(&v->arch.vtimer.timer);
+}
--
2.52.0