This patch series introduces the components necessary to implement a virtual
timer (vtimer).
Since the SSTC extension is not supported by Xen, an emulated (SBI-based)
timer is required. To address this, a virtual timer built on Xen’s timer
infrastructure is introduced, with save/restore support and SBI-based
programming.
To provide full guest software–based timer support, the following components
are also introduced:
- arch_vcpu_{create,destroy}() to initialize the virtual timer and other
vCPU-related state not directly tied to timer functionality. As part of this
work, struct arch_vcpu is introduced to describe the internal state of a
virtual CPU, along with vcpu_csr_init() to initialize the relevant CSR state.
- Support functions required by the virtual timer, including:
- vcpu_kick(), and a stub implementation of smp_send_event_check_mask()
(since SMP is not yet supported in Xen), which is used by vcpu_kick().
- Support for guest timer programming via interception of the SBI legacy
SET_TIMER call from guest.
- Implement reprogram_timer() using introduced sbi_set_timer().
- Initial lockless tracking of pending vCPU interrupts using atomic bitmaps.
Not full support, only vcpu_set_interrupt() and vcpu_unset_interrupt() are
introduced. All others functions will be introduced separately. [1]
- Handling of hypervisor timer interrupts and dispatch into Xen’s generic timer
softirq.
Oleksii Kurochko (15):
xen/riscv: introduce struct arch_vcpu
xen/riscv: implement arch_vcpu_{create,destroy}()
xen/riscv: implement vcpu_csr_init()
xen/riscv: introduce vtimer
xen/riscv: implement stub for smp_send_event_check_mask()
xen/riscv: introduce vcpu_kick() implementation
xen/riscv: introduce tracking of pending vCPU interrupts, part 1
xen/riscv: introduce vtimer_set_timer() and vtimer_expired()
xen/riscv: add vtimer_{save,restore}()
xen/riscv: implement SBI legacy SET_TIMER support for guests
xen/riscv: introduce ns_to_ticks()
xen/riscv: introduce sbi_set_timer()
xen/riscv: implement reprogram_timer() using SBI
xen/riscv: handle hypervisor timer interrupts
xen/riscv: init tasklet subsystem
xen/arch/riscv/Makefile | 2 +
xen/arch/riscv/cpufeature.c | 1 +
xen/arch/riscv/domain.c | 207 ++++++++++++++++++++
xen/arch/riscv/include/asm/config.h | 3 +-
xen/arch/riscv/include/asm/cpufeature.h | 1 +
xen/arch/riscv/include/asm/current.h | 6 +
xen/arch/riscv/include/asm/domain.h | 84 +++++++-
xen/arch/riscv/include/asm/riscv_encoding.h | 3 +
xen/arch/riscv/include/asm/sbi.h | 17 ++
xen/arch/riscv/include/asm/time.h | 5 +
xen/arch/riscv/include/asm/vtimer.h | 30 +++
xen/arch/riscv/sbi.c | 26 +++
xen/arch/riscv/setup.c | 3 +
xen/arch/riscv/smp.c | 8 +
xen/arch/riscv/stubs.c | 35 ----
xen/arch/riscv/time.c | 31 +++
xen/arch/riscv/traps.c | 14 ++
xen/arch/riscv/vsbi/legacy-extension.c | 6 +
xen/arch/riscv/vtimer.c | 82 ++++++++
19 files changed, 526 insertions(+), 38 deletions(-)
create mode 100644 xen/arch/riscv/domain.c
create mode 100644 xen/arch/riscv/include/asm/vtimer.h
create mode 100644 xen/arch/riscv/vtimer.c
--
2.52.0