|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH][for-4.19 v6 2/8] x86: add deviation for asm-only functions
On Wed, 1 Nov 2023, Nicola Vetrini wrote:
> As stated in rules.rst, functions used only in asm modules
> are allowed to have no prior declaration visible when being
> defined, hence these functions are marked with an
> 'asmlinkage' macro, which is then deviated for MISRA C:2012
> Rule 8.4.
>
> Signed-off-by: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx>
> ---
> Changes in v3:
> - added SAF deviations for vmx counterparts to svm functions.
> Changes in v5:
> - drop SAF deviations in favour of the pseudo-attribute asmlinkage
> Changes in v6:
> - conditioned asmlinkage definition to make it overridable;
> - move the pseudo-attribute after the return type
> ---
> automation/eclair_analysis/ECLAIR/deviations.ecl | 9 +++++++++
> docs/misra/deviations.rst | 6 ++++++
> xen/arch/x86/hvm/svm/intr.c | 2 +-
> xen/arch/x86/hvm/svm/nestedsvm.c | 2 +-
> xen/arch/x86/hvm/svm/svm.c | 4 ++--
> xen/arch/x86/hvm/vmx/intr.c | 2 +-
> xen/arch/x86/hvm/vmx/vmx.c | 4 ++--
> xen/arch/x86/hvm/vmx/vvmx.c | 2 +-
> xen/arch/x86/traps.c | 2 +-
> xen/arch/x86/x86_64/traps.c | 2 +-
> xen/include/xen/compiler.h | 5 +++++
> 11 files changed, 30 insertions(+), 10 deletions(-)
>
> diff --git a/automation/eclair_analysis/ECLAIR/deviations.ecl
> b/automation/eclair_analysis/ECLAIR/deviations.ecl
> index fa56e5c00a27..06619ecf7e8d 100644
> --- a/automation/eclair_analysis/ECLAIR/deviations.ecl
> +++ b/automation/eclair_analysis/ECLAIR/deviations.ecl
> @@ -163,6 +163,15 @@ Therefore the absence of prior declarations is safe."
> -config=MC3R1.R8.4,reports+={safe, "first_area(any_loc(file(gcov)))"}
> -doc_end
>
> +-doc_begin="Recognize the occurrence of current_stack_pointer as a
> declaration."
> +-file_tag+={asm_defns, "^xen/arch/x86/include/asm/asm_defns\\.h$"}
> +-config=MC3R1.R8.4,declarations+={safe,
> "loc(file(asm_defns))&&^current_stack_pointer$"}
> +-doc_end
> +
> +-doc_begin="asmlinkage is a marker to indicate that the function is only
> used to interface with asm modules."
> +-config=MC3R1.R8.4,declarations+={safe,"loc(text(^(?s).*asmlinkage.*$,
> -1..0))"}
> +-doc_end
> +
> -doc_begin="The following variables are compiled in multiple translation
> units
> belonging to different executables and therefore are safe."
> -config=MC3R1.R8.6,declarations+={safe,
> "name(current_stack_pointer||bsearch||sort)"}
> diff --git a/docs/misra/deviations.rst b/docs/misra/deviations.rst
> index 8511a189253b..d468da2f5ce9 100644
> --- a/docs/misra/deviations.rst
> +++ b/docs/misra/deviations.rst
> @@ -133,6 +133,12 @@ Deviations related to MISRA C:2012 Rules:
> configuration. Therefore, the absence of prior declarations is safe.
> - Tagged as `safe` for ECLAIR.
>
> + * - R8.4
> + - Functions and variables used only by asm modules are either marked
> with
> + the `asmlinkage` macro or with a SAF-1-safe textual deviation
> + (see safe.json).
> + - Tagged as `safe` for ECLAIR.
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
If Julien prefers a different wording I could modify on commit as needed
> * - R8.6
> - The following variables are compiled in multiple translation units
> belonging to different executables and therefore are safe.
> diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c
> index 192e17ebbfbb..4805c5567213 100644
> --- a/xen/arch/x86/hvm/svm/intr.c
> +++ b/xen/arch/x86/hvm/svm/intr.c
> @@ -123,7 +123,7 @@ static void svm_enable_intr_window(struct vcpu *v, struct
> hvm_intack intack)
> vmcb, general1_intercepts | GENERAL1_INTERCEPT_VINTR);
> }
>
> -void svm_intr_assist(void)
> +void asmlinkage svm_intr_assist(void)
> {
> struct vcpu *v = current;
> struct vmcb_struct *vmcb = v->arch.hvm.svm.vmcb;
> diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c
> b/xen/arch/x86/hvm/svm/nestedsvm.c
> index a09b6abaaeaf..fc7658d67d4e 100644
> --- a/xen/arch/x86/hvm/svm/nestedsvm.c
> +++ b/xen/arch/x86/hvm/svm/nestedsvm.c
> @@ -1441,7 +1441,7 @@ nestedsvm_vcpu_vmexit(struct vcpu *v, struct
> cpu_user_regs *regs,
> }
>
> /* VCPU switch */
> -void nsvm_vcpu_switch(void)
> +void asmlinkage nsvm_vcpu_switch(void)
> {
> struct cpu_user_regs *regs = guest_cpu_user_regs();
> struct vcpu *v = current;
> diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
> index 24c417ca7199..cb8abe7a0066 100644
> --- a/xen/arch/x86/hvm/svm/svm.c
> +++ b/xen/arch/x86/hvm/svm/svm.c
> @@ -1056,7 +1056,7 @@ static void noreturn cf_check svm_do_resume(void)
> reset_stack_and_jump(svm_asm_do_resume);
> }
>
> -void svm_vmenter_helper(void)
> +void asmlinkage svm_vmenter_helper(void)
> {
> const struct cpu_user_regs *regs = guest_cpu_user_regs();
> struct vcpu *curr = current;
> @@ -2586,7 +2586,7 @@ const struct hvm_function_table * __init start_svm(void)
> return &svm_function_table;
> }
>
> -void svm_vmexit_handler(void)
> +void asmlinkage svm_vmexit_handler(void)
> {
> struct cpu_user_regs *regs = guest_cpu_user_regs();
> uint64_t exit_reason;
> diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c
> index fd719c4c01d2..8beeaab1517b 100644
> --- a/xen/arch/x86/hvm/vmx/intr.c
> +++ b/xen/arch/x86/hvm/vmx/intr.c
> @@ -224,7 +224,7 @@ void vmx_sync_exit_bitmap(struct vcpu *v)
> }
> }
>
> -void vmx_intr_assist(void)
> +void asmlinkage vmx_intr_assist(void)
> {
> struct hvm_intack intack;
> struct vcpu *v = current;
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index 1edc7f1e919f..f5739b3aa5a1 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -4035,7 +4035,7 @@ static void undo_nmis_unblocked_by_iret(void)
> guest_info | VMX_INTR_SHADOW_NMI);
> }
>
> -void vmx_vmexit_handler(struct cpu_user_regs *regs)
> +void asmlinkage vmx_vmexit_handler(struct cpu_user_regs *regs)
> {
> unsigned long exit_qualification, exit_reason, idtv_info, intr_info = 0;
> unsigned int vector = 0;
> @@ -4787,7 +4787,7 @@ static void lbr_fixup(void)
> }
>
> /* Returns false if the vmentry has to be restarted */
> -bool vmx_vmenter_helper(const struct cpu_user_regs *regs)
> +bool asmlinkage vmx_vmenter_helper(const struct cpu_user_regs *regs)
> {
> struct vcpu *curr = current;
> struct domain *currd = curr->domain;
> diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
> index 16b0ef82b6c8..a28803987af6 100644
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -1490,7 +1490,7 @@ static void nvmx_eptp_update(void)
> __vmwrite(EPT_POINTER, get_shadow_eptp(curr));
> }
>
> -void nvmx_switch_guest(void)
> +void asmlinkage nvmx_switch_guest(void)
> {
> struct vcpu *v = current;
> struct nestedvcpu *nvcpu = &vcpu_nestedhvm(v);
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index e1356f696aba..6393467b06fd 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -2265,7 +2265,7 @@ void asm_domain_crash_synchronous(unsigned long addr)
> }
>
> #ifdef CONFIG_DEBUG
> -void check_ist_exit(const struct cpu_user_regs *regs, bool ist_exit)
> +void asmlinkage check_ist_exit(const struct cpu_user_regs *regs, bool
> ist_exit)
> {
> const unsigned int ist_mask =
> (1U << X86_EXC_NMI) | (1U << X86_EXC_DB) |
> diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
> index e03e80813e36..668605e5bc67 100644
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -266,7 +266,7 @@ void show_page_walk(unsigned long addr)
> l1_table_offset(addr), l1e_get_intpte(l1e), pfn);
> }
>
> -void do_double_fault(struct cpu_user_regs *regs)
> +void asmlinkage do_double_fault(struct cpu_user_regs *regs)
> {
> unsigned int cpu;
> unsigned long crs[8];
> diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h
> index dd99e573083f..94e2d6080d93 100644
> --- a/xen/include/xen/compiler.h
> +++ b/xen/include/xen/compiler.h
> @@ -159,6 +159,11 @@
> # define ASM_FLAG_OUT(yes, no) no
> #endif
>
> +/* Mark a function or variable as being used only to interface with asm */
> +#ifndef asmlinkage
> +#define asmlinkage
> +#endif
> +
> /*
> * NB: we need to disable the gcc-compat warnings for clang in some places or
> * else it will complain with: "'break' is bound to loop, GCC binds it to
> --
> 2.34.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |