x86/domain: restrict context switch hooks for the idle domain

The arch_init_idle_domain() initializes struct arch_csw idle_csw as:

    static const struct arch_csw idle_csw = {
        .from = paravirt_ctxt_switch_from,
        .to   = paravirt_ctxt_switch_to,
        .tail = idle_loop,
    };

but only place where d->arch.ctxt_switch->{to,from}() are used is
__context_switch() where they are both guarded by !is_idle_domain(pd)
which makes the callbacks in idle_csw unreachable.

Introduce a new poison value to be used in unreachable function hooks, and
set the from/to fields of idle_csw to it.  Use a different value from the
currently defined ones for easy differentiation.

Signed-off-by: Grygorii Strashko <grygorii_strashko@epam.com>
Signed-off-by: Roger Pau Monné <roger@xenproject.org>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Grygorii Strashko authored and Roger Pau Monne committed 2026-10-07 15:21:40 +02:00
1 parent 8cf4ec7d9e
commit 0d3bb3c98b
2 files changed
+5 -2

No files matched your search

+2 -2
View File
@@ -813,8 +813,8 @@ static bool emulation_flags_ok(const struct domain *d, uint32_t emflags)
void __init arch_init_idle_domain(struct domain *d)
{
static const struct arch_csw idle_csw = {
.from = paravirt_ctxt_switch_from,
.to = paravirt_ctxt_switch_to,
.from = FUNCTION_POISON,
.to = FUNCTION_POISON,
.tail = idle_loop,
};
+3
View File
@@ -56,6 +56,9 @@
#define LIST_POISON1 ((void *)0x0100100100100100UL)
#define LIST_POISON2 ((void *)0x0200200200200200UL)
/* Poison unreachable function hooks with a non-canonical value. */
#define FUNCTION_POISON ((void *)0xDEAD0000DEAD0000UL)
#include <xen/const.h>
#define PML4_ENTRY_BITS 39
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.