[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[XEN][PATCH v3] coverage: extend coverage on .init and lib code


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Grygorii Strashko <grygorii_strashko@xxxxxxxx>
  • Date: Thu, 18 Dec 2025 15:15:31 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=t8hmnY0aC2xdlj9g5eJ9RbkTonQqKXrtQjX0wXyKp6Q=; b=CkvkCF5c59UmN8kMWzOqL6cCf1rMJXAJRiv94zBSk8pDO6M+mfBXMusUDSZayt16udDqdq1opQeT/tSRQ2+1SOaVLwphnxJMoosx1zZls1yrpQNCLfpl6XQZ4q4QrJXjVI3SbX3/CNd3lQaCJEaNHeXM5R/h1YIU2qfuMqE57Pucc1GCwrR9H1ZYnIrAlr/TbmocJXxbS6CQyWisrogO0EPnS76Xk4WDrhcNIbIOHCFmj6W2k1oEhb2vBHKGNCIlrUfUst3ALQMXbY4mMTwV60bk36F6IWFrsnqIuo7cmWFCwpSwoU/Nj1f7VlTD+K0M0iCFptBG2iSCKkdePtB4bQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Hcavef1eYK2JUIntYwsCEucLqJvsk/zZxGjjFNbIJURnVnhSwb4oQI7ZiFU1/z9CmTKSqp+4+IMdYmI5DcwdlFTurQmmpwKGtwFZ2AL9QLB/uFY8US3DWxBHH0zBWi5rc5MhJruZOqqSj45dwZOgqdAuepvOiDwP22mZJxxFXG4edI/nUDZOH1hwP6eCUKmdAcpesNbiNh0QUEG+jXzMH2Pv0XNudNDdhqL6BfRvFntHuQlocdhwquFocH2xcCO+yb28vHXnM8ajW8KbWtnFSnn/dw2E/cBabqXlIQWs1zNk+69BKj81tQ9hR6za6pBVCxBBPyPxACWCFqwaH9GA/w==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Grygorii Strashko <grygorii_strashko@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Jason Andryuk <jason.andryuk@xxxxxxx>, Victor Lira <victorm.lira@xxxxxxx>
  • Delivery-date: Thu, 18 Dec 2025 15:15:47 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHccDEmmUShmwm5mkaS+qWQBIDIEg==
  • Thread-topic: [XEN][PATCH v3] coverage: extend coverage on .init and lib code

From: Grygorii Strashko <grygorii_strashko@xxxxxxxx>

Extend coverage support on .init and lib code.

To enable coverage support on .init code the gcc special
section should stay in memory after Xen boot when COVERAGE=y.

So, add hidden Kconfig option RELAX_INIT_CHECK "Relax strict check for
.init sections only in %.init.o files", which is selected when COVERAGE=y
and allows to bypass strict check for .init sections only in %.init.o
files.

Signed-off-by: Grygorii Strashko <grygorii_strashko@xxxxxxxx>
---
changes in v3:
 - drop DO_NOT_FREE_INIT_MEMORY: only gcc special section should stay
   in memory after Xen boot
 - split make cmd quiet_cmd_obj_init_o on two: obj_init_check and
   obj_init_check
 - drop libfdt/libelf changes - they need additional work
   -- before v2 of this patch libfdt/libelf were out of code coverage scope
   -- v2 allowed to enable coverage for libfdt/libelf easily thanks to 
DO_NOT_FREE_INIT_MEMORY
      which kept all .init code in memory
   -- without DO_NOT_FREE_INIT_MEMORY it's not so easy any more, so drop 
libfdt/libelf changes

changes in v2:
 - add RELAX_INIT_CHECK and DO_NOT_FREE_INIT_MEMORY, those are two different 
things,
   both potentially reusable
 - enable coverage for libfdt/libelf always
 - enable colverage for .init always

v2: 
https://patchwork.kernel.org/project/xen-devel/patch/20251205193411.1368659-1-grygorii_strashko@xxxxxxxx/
v1: 
https://patchwork.kernel.org/project/xen-devel/patch/20251203222436.660044-1-grygorii_strashko@xxxxxxxx/
 xen/Kconfig.debug |  6 ++++++
 xen/Rules.mk      | 22 +++++++++++++++-------
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/xen/Kconfig.debug b/xen/Kconfig.debug
index d900d926c555..7770de87a44b 100644
--- a/xen/Kconfig.debug
+++ b/xen/Kconfig.debug
@@ -39,11 +39,17 @@ config COVERAGE
        bool "Code coverage support"
        depends on SYSCTL && !LIVEPATCH
        select SUPPRESS_DUPLICATE_SYMBOL_WARNINGS if !ENFORCE_UNIQUE_SYMBOLS
+       select RELAX_INIT_CHECK
        help
          Enable code coverage support.
 
          If unsure, say N here.
 
+config RELAX_INIT_CHECK
+       bool
+       help
+         Relax strict check for .init sections only in %.init.o files.
+
 config CONDITION_COVERAGE
        bool "Condition coverage support"
        depends on COVERAGE && CC_HAS_MCDC
diff --git a/xen/Rules.mk b/xen/Rules.mk
index 2b28d1ac3c18..25aeb08cbfef 100644
--- a/xen/Rules.mk
+++ b/xen/Rules.mk
@@ -33,11 +33,15 @@ cov-cflags-y :=
 nocov-y :=
 noubsan-y :=
 
+# when coverage is enabled the gcc special section should stay in memory
+# after Xen boot
+ifneq ($(CONFIG_COVERAGE),y)
 SPECIAL_DATA_SECTIONS := rodata $(foreach a,1 2 4 8 16, \
                                             $(foreach w,1 2 4, \
                                                         rodata.str$(w).$(a)) \
                                             rodata.cst$(a)) \
                          $(foreach r,rel rel.ro,data.$(r).local)
+endif
 
 # The filename build.mk has precedence over Makefile
 include $(firstword $(wildcard $(srcdir)/build.mk) $(srcdir)/Makefile)
@@ -146,10 +150,9 @@ endif
 $(call cc-option-add,cov-cflags-$(CONFIG_COVERAGE),CC,-fprofile-update=atomic)
 
 # Reset cov-cflags-y in cases where an objects has another one as prerequisite
-$(nocov-y) $(filter %.init.o, $(obj-y) $(obj-bin-y) $(extra-y)): \
-    cov-cflags-y :=
+$(nocov-y) $(extra-y): cov-cflags-y :=
 
-$(non-init-objects): _c_flags += $(cov-cflags-y)
+$(obj-y) $(obj-bin-y) $(extra-y) $(lib-y): _c_flags += $(cov-cflags-y)
 
 ifeq ($(CONFIG_UBSAN),y)
 # Any -fno-sanitize= options need to come after any -fsanitize= options
@@ -259,8 +262,8 @@ $(obj)/%.o: $(src)/%.S FORCE
        $(call if_changed_dep,cc_o_S)
 
 
-quiet_cmd_obj_init_o = INIT_O  $@
-define cmd_obj_init_o
+quiet_cmd_obj_init_check = INIT_C  $@
+define cmd_obj_init_check
     $(OBJDUMP) -h $< | while read idx name sz rest; do \
         case "$$name" in \
         .*.local) ;; \
@@ -269,12 +272,17 @@ define cmd_obj_init_o
             echo "Error: size of $<:$$name is 0x$$sz" >&2; \
             exit $$(expr $$idx + 1);; \
         esac; \
-    done || exit $$?; \
+    done || exit $$?
+endef
+
+quiet_cmd_obj_init_objcopy = INIT_O  $@
+define cmd_obj_init_objcopy
     $(OBJCOPY) $(foreach s,$(SPECIAL_DATA_SECTIONS),--rename-section 
.$(s)=.init.$(s)) $< $@
 endef
 
 $(filter %.init.o,$(obj-y) $(obj-bin-y) $(extra-y)): $(obj)/%.init.o: 
$(obj)/%.o FORCE
-       $(call if_changed,obj_init_o)
+       $(if $(filter y,$(CONFIG_RELAX_INIT_CHECK)),,$(call 
if_changed,obj_init_check))
+       $(call if_changed,obj_init_objcopy)
 
 quiet_cmd_cpp_i_c = CPP     $@
 cmd_cpp_i_c = $(CPP) $(call cpp_flags,$(c_flags)) -MQ $@ -o $@ $<
-- 
2.34.1



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.