From: Oleksii Kurochko <oleksii.kurochko@gmail.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Romain Caritey" <Romain.Caritey@microchip.com>,
"Baptiste Le Duc" <baptiste.le-duc@vates.tech>,
"Zheng Zhang" <zhangzheng@iscas.ac.cn>,
"Alistair Francis" <alistair.francis@wdc.com>,
"Connor Davis" <connojdavis@gmail.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Michal Orzel" <michal.orzel@amd.com>,
"Julien Grall" <julien@xen.org>,
"Roger Pau Monné" <roger@xenproject.org>,
"Stefano Stabellini" <sstabellini@kernel.org>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH v2 12/39] xen/riscv: implement vCPU context switching
Date: Fri, 11 Sep 2026 12:43:40 +0200 [thread overview]
Message-ID: <09bf2c58-de60-46a5-ab74-909814ae9bad@gmail.com> (raw)
In-Reply-To: <2eb325d0-8f53-4790-889d-d68a03da0784@suse.com>
On 9/10/26 3:29 PM, Jan Beulich wrote:
> On 27.08.2026 17:20, Oleksii Kurochko wrote:
>> +static void ctxt_switch_from(struct vcpu *p)
>> +{
>> + /*
>> + * When the idle VCPU is running, Xen will always stay in hypervisor
>> + * mode.
>> + * Therefore we don't need to save the context of an idle VCPU.
>> + */
>> + if ( is_idle_vcpu(p) )
>> + return;
>> +
>> + p2m_ctxt_switch_from(p);
>> +
>> + vtimer_ctxt_switch_from(p);
>> +
>> + save_csr_regs(p);
>> +}
>> +
>> +static void ctxt_switch_to(struct vcpu *n)
>> +{
>> + /*
>> + * When the idle VCPU is running, Xen will always stay in hypervisor
>> + * mode.
>> + * Therefore we don't need to restore the context of an idle VCPU.
>> + */
>> + if ( is_idle_vcpu(n) )
>> + return;
>> +
>> + /*
>> + * If this vCPU last ran on a different pCPU, invalidate its VMID so
>> + * vmid_handle_vmenter() assigns a fresh one from the current pCPU's pool.
>> + * Without this, two pCPUs could independently assign the same
>> + * (generation, vmid) pair, generation counters start at the same value
>> + * on all pCPUs and increment independently, causing TLB contamination.
>> + */
>> + if ( n->arch.last_cpu != smp_processor_id() )
>> + vmid_flush_vcpu(n);
>
> I wonder why you need this, when we don't have anything similar in x86/HVM
> (and at the first glance Arm doesn't have anything similar either).
x86 does have the equivalent: vmx_do_resume() calls
hvm_asid_flush_vcpu() in the active_cpu != smp_processor_id() branch,
and svm_do_resume() does the same when launch_core != smp_processor_id()
("Migrating to another ASID domain. Request a new ASID."). The RISC-V
VMID allocator follows the x86 ASID scheme: VMIDs are a per-pCPU
resource with a per-pCPU generation, so a (generation, vmid) pair
obtained on one pCPU means nothing on another. Arm doesn't need this
because it allocates a single VMID per domain from a global bitmap.
Also, note that I've update a little bit how VMIDs are flushed here [1]
but this check still present IIURC.
[1]
https://lore.kernel.org/xen-devel/cover.1787838835.git.oleksii.kurochko@gmail.com/T/#m2c06e58c03a09022af112388be3585bf3ae6e4dc
>
>> + vtimer_ctxt_switch_to(n);
>> +
>> + restore_csr_regs(n);
>> +
>> + p2m_ctxt_switch_to(n);
>> +}
>
> In the absenmce of a comment towards the need for this specific order I'd
> expect these three calls to be ordered the opposite of their counterparts
> in ctxt_switch_from().
I will put restore_csr_regs(n) (and rename it to
csr_regs_ctxt_switch_to(n)) before vtimer_ctxt_switch_to(). There is no
any specific requirement to be ordered in the way it is now.
>
>> +static void schedule_tail(struct vcpu *prev)
>> +{
>> + unsigned int cpu = smp_processor_id();
>> +
>> + ASSERT(prev != current);
>> +
>> + ctxt_switch_from(prev);
>> +
>> + /*
>> + * Mark this CPU in next domain's dirty cpumasks before calling
>> + * ctxt_switch_to(). This avoids a race on things like p2m flushing,
>> + * which is synchronised on that function.
>> + */
>> + if ( prev->domain != current->domain )
>> + {
>> + cpumask_set_cpu(cpu, current->domain->dirty_cpumask);
>> +
>> + /*
>> + * Once this hart drops out of prev's dirty_cpumask it stops being a
>> + * target of p2m_tlb_flush(), while its TLB may still hold G-stage
>> + * translations of prev's domain: neither the vCPU which just ran nor
>> + * any other vCPU of that domain which ran here earlier has had its
>> + * VMID invalidated. Move the hart to a new VMID generation so that
>> + * none of them can be reached again.
>> + *
>> + * Switching away from the idle vCPU needs no bump: the idle domain
>> + * has no p2m of its own, and whatever G-stage entries this hart may
>> + * still hold (or speculatively create while HGATP keeps pointing at
>> + * the last guest's p2m) are tagged with a VMID which was already made
>> + * stale when that guest was switched out. Skipping the bump here also
>> + * avoids burning a generation on every pass through idle.
>> + */
>> + if ( !is_idle_vcpu(prev) )
>> + vmid_flush_hart();
>> +
>> + cpumask_clear_cpu(cpu, prev->domain->dirty_cpumask);
>> + }
>> + write_atomic(¤t->dirty_cpu, cpu);
>> +
>> + ctxt_switch_to(current);
>> +
>> + write_atomic(&prev->dirty_cpu, VCPU_CPU_CLEAN);
>> +
>> + current->arch.last_cpu = cpu;
>> +
>> + /*
>> + * sched_context_switched() internally uses a spinlock,
>> + * which requires interrupts to be enabled.
>> + */
>> + local_irq_enable();
>> +
>> + sched_context_switched(prev, current);
>> +}
>> +
>> +void context_switch(struct vcpu *prev, struct vcpu *next)
>> +{
>> + ASSERT(local_irq_is_enabled());
>> + ASSERT(prev != next);
>> + ASSERT(!vcpu_cpu_dirty(next));
>> +
>> + local_irq_disable();
>> +
>> + set_current(next);
>> +
>> + prev = __context_switch(prev, next);
>> +
>> + schedule_tail(prev);
>> +}
>
> __context_switch() switches stacks, which can easily collide with code the
> compiler has emitted. For example, the call to schedule_tail() may not be
> a tail call, and context_switch()'s return address may have been spilled
> to the stack (or into one of the s<N> registers). There's a reason Arm and
> x86 have reset_stack_and_jump().
RISC-V will have reset_stack_and_jump() that too but just introduced
later and will be used for different use case (in continue_new_vcpu()
introduced later in this patch series). But as the Arm RISC-V doesn't
use reset_stack_and_jump() in context_switch().
This follows the Arm model: every vCPU has its own Xen stack, and from
the incoming vCPU's point of view __context_switch() is ABI-conforming.
It restores exactly the sp/ra/s0-s11 that vCPU had when it itself called
__context_switch() from context_switch(). So after the return we are in
next's own context_switch() frame, and anything the compiler spilled
there (ra included) belongs to next. The only exception is a vCPU which
has never run: its ra points at continue_new_vcpu() on an empty stack,
and that's where reset_stack_and_jump() is needed, as on Arm. I'll make
continue_new_vcpu() noreturn accordingly. x86 differs because its stacks
are per-pCPU (IIUC), hence its context_switch() can't return.
Here is some diagram for better understanding:
vCPU A (stack A) vCPU B (stack B, switched out earlier)
schedule() schedule()
`- context_switch(A, B) `- context_switch(B, X)
[A's frame: ra, s-regs] [B's frame: ra, s-regs]
`- __context_switch() --------> "returns" here
(save A, load B) schedule_tail(prev = A)
ld ra <- B's frame (B's own ra)
ret -> B's sched_context_switch()
-> ... -> back into B
>
>> --- a/xen/arch/riscv/entry.S
>> +++ b/xen/arch/riscv/entry.S
>> @@ -99,3 +99,47 @@ restore_registers:
>>
>> sret
>> END(handle_trap)
>> +
>> +/*
>> + * struct vcpu *__context_switch(struct vcpu *prev, struct vcpu *next)
>> + *
>> + * This is called on prev's stack, and returns on next's.
>
> With ra being switched it may also return to other than the caller. If
> that's really intended, I think it also needs calling out here.
Yes, it's intended. Normally it returns into next's own context_switch()
(where next itself last called __context_switch()), and for a vCPU
which has never run it returns to continue_new_vcpu(). I'll update the
comment to:
* This is called on prev's stack, and returns on next's. As ra is
* switched too, it doesn't return to its caller: it returns to where
* next last called it from, i.e. into next's own context_switch(), or,
* for a vCPU which has never run, to continue_new_vcpu() with an empty
* stack.
>
>> + * a0 - prev
>> + * a1 - next
>> + *
>> + * Returns prev in a0
>> + */
>> +FUNC(__context_switch)
>> + REG_S s0, VCPU_XEN_SAVED_CONTEXT_S0(a0)
>> + REG_S s1, VCPU_XEN_SAVED_CONTEXT_S1(a0)
>> + REG_S s2, VCPU_XEN_SAVED_CONTEXT_S2(a0)
>> + REG_S s3, VCPU_XEN_SAVED_CONTEXT_S3(a0)
>> + REG_S s4, VCPU_XEN_SAVED_CONTEXT_S4(a0)
>> + REG_S s5, VCPU_XEN_SAVED_CONTEXT_S5(a0)
>> + REG_S s6, VCPU_XEN_SAVED_CONTEXT_S6(a0)
>> + REG_S s7, VCPU_XEN_SAVED_CONTEXT_S7(a0)
>> + REG_S s8, VCPU_XEN_SAVED_CONTEXT_S8(a0)
>> + REG_S s9, VCPU_XEN_SAVED_CONTEXT_S9(a0)
>> + REG_S s10, VCPU_XEN_SAVED_CONTEXT_S10(a0)
>> + REG_S s11, VCPU_XEN_SAVED_CONTEXT_S11(a0)
>> + REG_S sp, VCPU_XEN_SAVED_CONTEXT_SP(a0)
>> + REG_S ra, VCPU_XEN_SAVED_CONTEXT_RA(a0)
>> +
>> + REG_L s0, VCPU_XEN_SAVED_CONTEXT_S0(a1)
>> + REG_L s1, VCPU_XEN_SAVED_CONTEXT_S1(a1)
>> + REG_L s2, VCPU_XEN_SAVED_CONTEXT_S2(a1)
>> + REG_L s3, VCPU_XEN_SAVED_CONTEXT_S3(a1)
>> + REG_L s4, VCPU_XEN_SAVED_CONTEXT_S4(a1)
>> + REG_L s5, VCPU_XEN_SAVED_CONTEXT_S5(a1)
>> + REG_L s6, VCPU_XEN_SAVED_CONTEXT_S6(a1)
>> + REG_L s7, VCPU_XEN_SAVED_CONTEXT_S7(a1)
>> + REG_L s8, VCPU_XEN_SAVED_CONTEXT_S8(a1)
>> + REG_L s9, VCPU_XEN_SAVED_CONTEXT_S9(a1)
>> + REG_L s10, VCPU_XEN_SAVED_CONTEXT_S10(a1)
>> + REG_L s11, VCPU_XEN_SAVED_CONTEXT_S11(a1)
>> + REG_L sp, VCPU_XEN_SAVED_CONTEXT_SP(a1)
>> + REG_L ra, VCPU_XEN_SAVED_CONTEXT_RA(a1)
>> +
>> + ret
>> +END(__context_switch)
>
> What about gp and tp?
tp points to this hart's pcpu_info (set up once per hart by
setup_tp()), i.e. it's per-pCPU rather than per-vCPU state.
__context_switch() starts and ends on the same hart, so tp has to be
left alone.
gp isn't used by Xen at all: there's no __global_pointer$ in the
linker script, so no gp-relative relaxation happens, and the compiler
never allocates gp.
Neither of them is callee-saved per the psABI, so there's nothing to
preserve across the call. The guest's gp/tp are part of the guest
state and are going to be saved/restored via cpu_user_regs by the
trap entry/exit path.
>
>> --- a/xen/arch/riscv/include/asm/system.h
>> +++ b/xen/arch/riscv/include/asm/system.h
>> @@ -76,6 +76,10 @@ static inline bool local_irq_is_enabled(void)
>>
>> #define arch_fetch_and_add(x, v) __sync_fetch_and_add(x, v)
>>
>> +struct vcpu;
>
> I don't think this is needed, as ...
>
>> +struct vcpu *__context_switch(struct vcpu *prev, struct vcpu *next);
>
> ... parsing of the return type will make the struct known (before
> parameters are parsed).
Make sense to me. I will drop forward declaration.
>
> Also - can't next be pointer-to-const?
It could be. I will add const.
Thanks!
~ Oleksii
next prev parent reply other threads:[~2026-09-11 10:44 UTC|newest]
Thread overview: 163+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-27 15:20 [PATCH v2 00/39] [RISC-V] virtual interrupt controller (vAPLIC/vIMSIC) support Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 01/39] xen/riscv: drop pregs from struct cpu_user_regs Oleksii Kurochko
2026-08-31 12:48 ` Baptiste Le Duc
2026-09-01 6:58 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 02/39] xen/riscv: drop bug.h's duplicate instruction length helpers Oleksii Kurochko
2026-08-31 12:48 ` Baptiste Le Duc
2026-09-01 7:01 ` Jan Beulich
2026-09-02 10:48 ` Oleksii Kurochko
2026-09-02 13:02 ` Jan Beulich
2026-09-02 13:45 ` Oleksii Kurochko
2026-09-02 14:27 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 03/39] xen/riscv: set the guest's XLEN explicitly in hstatus.VSXL Oleksii Kurochko
2026-08-31 12:48 ` Baptiste Le Duc
2026-09-01 7:03 ` Jan Beulich
2026-09-01 8:40 ` Oleksii Kurochko
2026-09-01 15:16 ` Jan Beulich
2026-09-01 15:20 ` Jan Beulich
2026-09-02 11:42 ` Oleksii Kurochko
2026-09-02 13:07 ` Jan Beulich
2026-09-02 13:29 ` Oleksii Kurochko
2026-09-02 14:31 ` Jan Beulich
2026-09-02 15:17 ` Oleksii Kurochko
2026-09-02 15:56 ` Oleksii Kurochko
2026-09-02 17:45 ` Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 04/39] xen/riscv: introduce csr_read64() Oleksii Kurochko
2026-08-27 15:36 ` Andrew Cooper
2026-08-31 12:42 ` Oleksii Kurochko
2026-09-01 7:07 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 05/39] xen/riscv: request a G-stage flush on vmenter when VMIDs are disabled Oleksii Kurochko
2026-08-31 12:48 ` Baptiste Le Duc
2026-09-01 8:43 ` Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 06/39] xen/riscv: use UINT64_MAX to disable the VS-timer Oleksii Kurochko
2026-08-31 12:48 ` Baptiste Le Duc
2026-09-01 7:12 ` Jan Beulich
2026-09-01 8:47 ` Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 07/39] xen/riscv: add missing APLIC register offsets, masks to asm/aplic.h Oleksii Kurochko
2026-09-01 15:36 ` Baptiste Le Duc
2026-09-01 15:53 ` Jan Beulich
2026-09-02 13:22 ` Jan Beulich
2026-09-02 13:52 ` Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 08/39] xen/riscv: introduce device-agnostic MMIO emulation dispatch Oleksii Kurochko
2026-09-01 15:36 ` Baptiste Le Duc
2026-09-03 10:28 ` Oleksii Kurochko
2026-09-09 13:24 ` Jan Beulich
2026-09-09 14:04 ` Oleksii Kurochko
2026-09-09 14:32 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 09/39] xen/riscv: implement virtual APLIC MMIO emulation Oleksii Kurochko
2026-09-02 11:51 ` Baptiste Le Duc
2026-09-04 11:58 ` Oleksii Kurochko
2026-09-04 12:03 ` Jan Beulich
2026-09-02 12:31 ` Baptiste Le Duc
2026-09-04 14:02 ` Oleksii Kurochko
2026-09-09 14:26 ` Jan Beulich
2026-09-10 10:37 ` Oleksii Kurochko
2026-09-10 11:14 ` Jan Beulich
2026-09-10 14:24 ` Oleksii Kurochko
2026-09-12 8:50 ` SeungJu Cheon
2026-08-27 15:20 ` [PATCH v2 10/39] xen/riscv: build the target hart index via aplic_hart_field() Oleksii Kurochko
2026-09-04 8:26 ` Baptiste Le Duc
2026-09-04 14:28 ` Oleksii Kurochko
2026-09-09 14:51 ` Jan Beulich
2026-09-09 14:52 ` Jan Beulich
2026-09-10 10:59 ` Oleksii Kurochko
2026-09-10 11:23 ` Jan Beulich
2026-09-10 12:44 ` Oleksii Kurochko
2026-09-10 12:57 ` Jan Beulich
2026-09-11 9:47 ` Oleksii Kurochko
2026-09-10 11:23 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 11/39] xen/riscv: add helper to check APLIC MSI mode Oleksii Kurochko
2026-09-04 8:26 ` Baptiste Le Duc
2026-09-09 14:53 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 12/39] xen/riscv: implement vCPU context switching Oleksii Kurochko
2026-09-02 14:42 ` Oleksii Kurochko
2026-09-04 8:26 ` Baptiste Le Duc
2026-09-04 8:33 ` Jan Beulich
2026-09-04 9:54 ` Baptiste Le Duc
2026-09-04 14:55 ` Oleksii Kurochko
2026-09-07 8:17 ` Jan Beulich
2026-09-08 9:06 ` Oleksii Kurochko
2026-09-05 7:25 ` Oleksii Kurochko
2026-09-10 13:29 ` Jan Beulich
2026-09-11 10:43 ` Oleksii Kurochko [this message]
2026-08-27 15:20 ` [PATCH v2 13/39] xen/riscv: save and restore AIA state on vCPU context switch Oleksii Kurochko
2026-09-04 9:52 ` Baptiste Le Duc
2026-09-04 16:40 ` Oleksii Kurochko
2026-08-27 15:20 ` [PATCH v2 14/39] xen/riscv: introduce vintc_ctxt_switch_{from,to}() Oleksii Kurochko
2026-09-04 11:25 ` Baptiste Le Duc
2026-09-04 16:54 ` Oleksii Kurochko
2026-09-10 14:54 ` Jan Beulich
2026-08-27 15:20 ` [PATCH v2 15/39] xen/riscv: add IMSIC vCPU context switch handlers Oleksii Kurochko
2026-09-04 11:33 ` Baptiste Le Duc
2026-09-04 16:56 ` Oleksii Kurochko
2026-09-10 14:57 ` Jan Beulich
2026-09-11 11:19 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 16/39] xen/riscv: extend exception tables with type and data fields Oleksii Kurochko
2026-09-07 15:57 ` Baptiste Le Duc
2026-09-08 6:06 ` Jan Beulich
2026-09-08 8:18 ` Baptiste Le Duc
2026-09-08 9:19 ` Oleksii Kurochko
2026-09-08 16:26 ` Baptiste Le Duc
2026-09-08 13:44 ` Jan Beulich
2026-09-09 11:20 ` Oleksii Kurochko
2026-09-09 12:22 ` Jan Beulich
2026-09-09 12:42 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 17/39] xen/riscv: decouple INSN_PSEUDO_VS_* from the hypervisor's XLEN Oleksii Kurochko
2026-09-07 15:57 ` Baptiste Le Duc
2026-09-08 9:34 ` Oleksii Kurochko
2026-09-08 16:04 ` Baptiste Le Duc
2026-09-09 12:57 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 18/39] xen/riscv: add guest page fault handling stub Oleksii Kurochko
2026-09-07 15:57 ` Baptiste Le Duc
2026-09-08 9:49 ` Oleksii Kurochko
2026-09-08 14:10 ` Jan Beulich
2026-09-09 15:09 ` Oleksii Kurochko
2026-09-10 6:38 ` Jan Beulich
2026-09-11 11:47 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 19/39] xen/riscv: implement trap redirection to a guest Oleksii Kurochko
2026-09-07 15:57 ` Baptiste Le Duc
2026-09-08 10:01 ` Oleksii Kurochko
2026-09-08 14:58 ` Oleksii Kurochko
2026-09-08 15:05 ` Jan Beulich
2026-09-08 15:47 ` Baptiste Le Duc
2026-09-08 15:58 ` Jan Beulich
2026-09-08 14:16 ` Jan Beulich
2026-09-08 14:16 ` Jan Beulich
2026-09-08 15:25 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 20/39] xen/riscv: detect Shtvala Oleksii Kurochko
2026-09-07 15:57 ` Baptiste Le Duc
2026-09-08 10:15 ` Oleksii Kurochko
2026-09-08 15:49 ` Baptiste Le Duc
2026-08-27 15:21 ` [PATCH v2 21/39] xen/riscv: resolve the faulting guest physical address Oleksii Kurochko
2026-09-09 12:04 ` Baptiste Le Duc
2026-09-11 12:56 ` Oleksii Kurochko
2026-09-10 15:06 ` Jan Beulich
2026-08-27 15:21 ` [PATCH v2 22/39] xen/riscv: add guest memory read helper Oleksii Kurochko
2026-09-09 12:04 ` Baptiste Le Duc
2026-09-10 15:19 ` Jan Beulich
2026-09-11 13:06 ` Oleksii Kurochko
2026-09-11 13:41 ` Oleksii Kurochko
2026-09-11 13:47 ` Jan Beulich
2026-09-11 13:50 ` Oleksii Kurochko
2026-09-10 15:28 ` Jan Beulich
2026-09-11 13:57 ` Oleksii Kurochko
2026-09-11 14:00 ` Jan Beulich
2026-09-11 14:29 ` Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 23/39] xen/riscv: look up the exception table for any trap taken in Xen context Oleksii Kurochko
2026-09-10 15:31 ` Jan Beulich
2026-08-27 15:21 ` [PATCH v2 24/39] xen/riscv: add helpers for decoding a trapped load or store Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 25/39] xen/riscv: add guest load emulation for trapped MMIO accesses Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 26/39] xen/riscv: add guest store " Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 27/39] xen/riscv: introduce arch_move_irqs() Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 28/39] xen/riscv: handle the case when no vCPU migration is needed Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 29/39] xen/riscv: introduce aplic_reconfigure_target() Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 30/39] xen/riscv: prepare new IMSIC VS-file Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 31/39] xen/riscv: implement APLIC-hart sync barrier for vCPU migration Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 32/39] xen/riscv: remap interrupts to new IMSIC VS-file Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 33/39] xen/riscv: dump old interrupt file to memory Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 34/39] xen/riscv: restore register state in the new IMSIC VS-file Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 35/39] xen/riscv: add basic VGEIN management for AIA guests Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 36/39] xen/riscv: wake up a descheduled vCPU on a guest external interrupt Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 37/39] xen/riscv: map IMSIC interrupt file for vCPUs Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 38/39] xen/riscv: implement continue_new_vcpu() Oleksii Kurochko
2026-08-27 15:21 ` [PATCH v2 39/39] xen/riscv: introduce IMSIC h/w interrupt file attaching to vcpu Oleksii Kurochko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=09bf2c58-de60-46a5-ab74-909814ae9bad@gmail.com \
--to=oleksii.kurochko@gmail.com \
--cc=Romain.Caritey@microchip.com \
--cc=alistair.francis@wdc.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=baptiste.le-duc@vates.tech \
--cc=connojdavis@gmail.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger@xenproject.org \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
--cc=zhangzheng@iscas.ac.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.