From: Nicola Vetrini <nicola.vetrini@bugseng.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: xen-devel@lists.xenproject.org,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Teddy Astie" <teddy.astie@vates.tech>,
"Roger Pau Monné" <roger@xenproject.org>
Subject: Re: [PATCH 04/12] x86: add noreturn in a few more places
Date: Sat, 29 Aug 2026 15:21:57 +0200 [thread overview]
Message-ID: <fceca3b7cf0ccc067f89212a30aa3a6e@bugseng.com> (raw)
In-Reply-To: <d0f991de-db67-4f49-aef0-25c590b3889e@suse.com>
On 2026-08-28 09:01, Jan Beulich wrote:
> start_secondary(), do_double_fault(), play_dead(), and tboot_s3_error()
> never return, so would better be annotated anyway. The
> do_double_fault()
> change needs accompanying by adjustments to entry_from_{pv,xen}(), as
> Eclair then deems the "return" there as unreachable.
>
> context_switch() and continue_running() are odd: We can't
> (unconditionally) add noreturn to their declarations, as Arm's variants
> do
> return. Put the attribute on x86'es definitions instead (the use of
> unreachable() in reset_stack_and_call_ind() allows the compiler to
> figure
> that out itself, but Eclair wants the annotation in addition).
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Nicola Vetrini <nicola.vetrini@bugseng.com>
> ---
> entry_from_pv() wants the annotation only when PV=n, yet once added gcc
> then warns about "return" being used in a "noreturn" function. Is there
> any other approach to address this besides adding #ifdef inside the
> function (i.e. replacing the !IS_ENABLED(CONFIG_PV) check that's
> there)?
>
Besides GCC's warning, this would violate MISRA C's Rule 17.9 ("A
function declared with a _Noreturn function specifier shall not return
to its caller")
which is not (yet) adopted by Xen, as it comes with MISRA C:2012
Amendment 3, whereas as you know Xen is based on MISRA C:2012 Amendment
2 rules.
Besides this, perhaps an alternative could be something like this
(untested):
#define __noreturn_0
#define __noreturn_1 __attribute__((noreturn))
#define __noreturn_select(x) __noreturn_select_(x)
#define __noreturn_select_(x) __noreturn_ ## x
#define noreturn(cond) __noreturn_select(cond)
assuming use sites such as noreturn(IS_ENABLED(CONFIG_FOO))
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -2163,7 +2163,7 @@ static void __context_switch(void)
> per_cpu(curr_vcpu, cpu) = n;
> }
>
> -void context_switch(struct vcpu *prev, struct vcpu *next)
> +void noreturn context_switch(struct vcpu *prev, struct vcpu *next)
> {
> unsigned int cpu = smp_processor_id();
> struct cpu_info *info = get_cpu_info();
> @@ -2240,7 +2240,7 @@ void context_switch(struct vcpu *prev, s
> reset_stack_and_call_ind(nextd->arch.ctxt_switch->tail);
> }
>
> -void continue_running(struct vcpu *same)
> +void noreturn continue_running(struct vcpu *same)
> {
> reset_stack_and_call_ind(same->domain->arch.ctxt_switch->tail);
> }
> --- a/xen/arch/x86/include/asm/cpuidle.h
> +++ b/xen/arch/x86/include/asm/cpuidle.h
> @@ -26,7 +26,7 @@ static inline int mwait_idle_init(struct
> int cpuidle_init_cpu(unsigned int cpu);
> void cf_check default_dead_idle(void);
> void cf_check acpi_dead_idle(void);
> -void play_dead(void);
> +void noreturn play_dead(void);
> void trace_exit_reason(u32 *irq_traced);
> void update_idle_stats(struct acpi_processor_power *power,
> struct acpi_processor_cx *cx,
> --- a/xen/arch/x86/include/asm/tboot.h
> +++ b/xen/arch/x86/include/asm/tboot.h
> @@ -126,7 +126,7 @@ int tboot_in_measured_env(void);
> int tboot_protect_mem_regions(void);
> int cf_check tboot_parse_dmar_table(acpi_table_handler dmar_handler);
> int tboot_s3_resume(void);
> -void tboot_s3_error(int error);
> +void noreturn tboot_s3_error(int error);
> int tboot_wake_ap(int apicid, unsigned long sipi_vec);
> #else
> static inline void tboot_probe(void) {}
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -326,7 +326,7 @@ static void set_cpu_sibling_map(unsigned
> }
> }
>
> -void asmlinkage start_secondary(void)
> +void asmlinkage noreturn start_secondary(void)
> {
> struct cpu_info *info = get_cpu_info();
> unsigned int cpu = smp_processor_id();
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -1080,7 +1080,7 @@ const char *vector_name(unsigned int vec
> return (vec < ARRAY_SIZE(names) && names[vec][0]) ? names[vec] :
> "???";
> }
>
> -void asmlinkage do_double_fault(struct cpu_user_regs *regs)
> +void asmlinkage noreturn do_double_fault(struct cpu_user_regs *regs)
> {
> unsigned int cpu;
> struct extra_state state;
> @@ -2304,7 +2304,7 @@ void asmlinkage entry_from_pv(struct cpu
> case X86_ET_HW_EXC:
> switch ( vec )
> {
> - case X86_EXC_DF: return do_double_fault(regs);
> + case X86_EXC_DF: do_double_fault(regs); /* noreturn */
> case X86_EXC_MC: return do_machine_check(regs);
> }
> break;
> @@ -2615,7 +2615,7 @@ void asmlinkage entry_from_xen(struct cp
> case X86_ET_HW_EXC:
> switch ( regs->fred_ss.vector )
> {
> - case X86_EXC_DF: return do_double_fault(regs);
> + case X86_EXC_DF: do_double_fault(regs); /* noreturn */
> case X86_EXC_MC: return do_machine_check(regs);
> }
> break;
--
Nicola Vetrini, B.Sc.
Software Engineer
BUGSENG (https://bugseng.com)
LinkedIn: https://www.linkedin.com/in/nicola-vetrini-a42471253
next prev parent reply other threads:[~2026-08-29 13:22 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-28 6:58 [PATCH 00/12] address most remaining Misra rule 2.1 violations Jan Beulich
2026-08-28 6:59 ` [PATCH 01/12] x86/IO-APIC: address Misra 2.1 rule violations Jan Beulich
2026-08-28 8:31 ` Nicola Vetrini
2026-09-10 7:38 ` Roger Pau Monné
2026-08-28 7:00 ` [PATCH 02/12] x86/mm: pagetable_dying() is HVM+SHADOW_PAGING only Jan Beulich
2026-09-10 7:36 ` Roger Pau Monné
2026-08-28 7:00 ` [PATCH 03/12] x86/shadow: eliminate unused forms of sh_map_and_validate_gl<N>e() Jan Beulich
2026-09-10 7:45 ` Roger Pau Monné
2026-08-28 7:01 ` [PATCH 04/12] x86: add noreturn in a few more places Jan Beulich
2026-08-29 13:21 ` Nicola Vetrini [this message]
2026-09-01 8:10 ` Jan Beulich
2026-08-31 19:13 ` Andrew Cooper
2026-09-01 6:26 ` Jan Beulich
2026-09-09 19:07 ` Nicola Vetrini
2026-09-10 6:43 ` Jan Beulich
2026-09-11 20:48 ` Nicola Vetrini
2026-09-01 6:31 ` Jan Beulich
2026-08-28 7:02 ` [PATCH 05/12] x86/crash: address Misra 2.1 rule violation Jan Beulich
2026-09-10 7:49 ` Roger Pau Monné
2026-09-10 8:38 ` Jan Beulich
2026-09-10 9:30 ` Roger Pau Monné
2026-09-10 9:52 ` Jan Beulich
2026-09-10 12:29 ` Roger Pau Monné
2026-09-11 18:53 ` Nicola Vetrini
2026-08-28 7:02 ` [PATCH 06/12] kexec: machine_reboot_kexec() doesn't return Jan Beulich
2026-08-28 9:55 ` Nicola Vetrini
2026-08-28 7:03 ` [PATCH 07/12] altp2m: address Misra 2.1 rule violation Jan Beulich
2026-08-31 1:14 ` Stefano Stabellini
2026-08-28 7:04 ` [PATCH 08/12] Arm/GIC: add noreturn in a few more places Jan Beulich
2026-08-31 1:21 ` Stefano Stabellini
2026-08-28 7:04 ` [PATCH 09/12] Eclair: deviate BUILD_ERROR() wrt rule 2.1 and introduce variants Jan Beulich
2026-08-29 14:04 ` Nicola Vetrini
2026-09-01 6:36 ` Jan Beulich
2026-08-31 1:30 ` Stefano Stabellini
2026-08-28 7:05 ` [PATCH 10/12] PCI/physdev: address Misra 2.1 rule violation Jan Beulich
2026-08-31 1:30 ` Stefano Stabellini
2026-08-28 7:05 ` [PATCH 11/12] x86/HVM: address Misra 2.1 rule violations Jan Beulich
2026-09-10 7:54 ` Roger Pau Monné
2026-08-28 7:06 ` [PATCH 12/12] x86/nSVM: address Misra 2.1 rule violation Jan Beulich
2026-09-10 7:44 ` Roger Pau Monné
2026-09-10 8:42 ` Jan Beulich
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=fceca3b7cf0ccc067f89212a30aa3a6e@bugseng.com \
--to=nicola.vetrini@bugseng.com \
--cc=andrew.cooper3@citrix.com \
--cc=jbeulich@suse.com \
--cc=roger@xenproject.org \
--cc=teddy.astie@vates.tech \
--cc=xen-devel@lists.xenproject.org \
/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.