From 40ad6282e2b41700734ea4f480ca7f68c9f5c499 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 22 Sep 2026 09:13:19 +0200 Subject: [PATCH] Arm/guestcopy: deviate copy_guest() uses just like their x86 counterparts Like x86/HVM's __hvm_copy(), Arm's copy_guest() is used for both to-guest and from-guest copying. Naturally in the latter case the hypervisor buffer needs writing to, hence the function parameter cannot be pointer-to-const. No functional change intended. Signed-off-by: Jan Beulich Reviewed-by: Michal Orzel Reviewed-by: Nicola Vetrini --- automation/eclair_analysis/ECLAIR/deviations.ecl | 6 ++++++ xen/arch/arm/guestcopy.c | 8 +++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/automation/eclair_analysis/ECLAIR/deviations.ecl b/automation/eclair_analysis/ECLAIR/deviations.ecl index 670d3693d6..33d508a2fb 100644 --- a/automation/eclair_analysis/ECLAIR/deviations.ecl +++ b/automation/eclair_analysis/ECLAIR/deviations.ecl @@ -433,6 +433,12 @@ Fixing this violation would require to increase code complexity and lower readab -config=MC3A2.R11.8,reports+={safe,"any_area(any_loc(any_exp(macro(^container_of$))))"} -doc_end +-doc_begin="Function copy_guest() in xen/arch/arm/guestcopy.c is a double-use +function, where the parameter needs to not be const because it can be set for +write or not" +-config=MC3A2.R11.8,reports+={safe,"any_area(any_loc(text(^.*copy_guest.*COPY_to_guest doesn't modify.*$)))"} +-doc_end + -doc_begin="Function __hvm_copy in xen/arch/x86/hvm/hvm.c is a double-use function, where the parameter needs to not be const because it can be set for write or not" diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c index 86f1c9d0e3..2235d23ba5 100644 --- a/xen/arch/arm/guestcopy.c +++ b/xen/arch/arm/guestcopy.c @@ -109,14 +109,16 @@ static unsigned long copy_guest(void *buf, uint64_t addr, unsigned long len, unsigned long raw_copy_to_guest(void *to, const void *from, unsigned int len) { - return copy_guest((void *)from, (vaddr_t)to, len, - GVA_INFO(current), COPY_to_guest | COPY_linear); + return copy_guest((void *)from, /* COPY_to_guest doesn't modify */ + (vaddr_t)to, len, GVA_INFO(current), + COPY_to_guest | COPY_linear); } unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, unsigned int len) { - return copy_guest((void *)from, (vaddr_t)to, len, GVA_INFO(current), + return copy_guest((void *)from, /* COPY_to_guest doesn't modify */ + (vaddr_t)to, len, GVA_INFO(current), COPY_to_guest | COPY_flush_dcache | COPY_linear); }