On 06/12/2025 9:10 am, Grygorii Strashko wrote: > > > On 05.12.25 22:00, Andrew Cooper wrote: >> On 05/12/2025 7:34 pm, Grygorii Strashko wrote: >>> From: Grygorii Strashko <[email protected]> >>> >>> Extend coverage support on .init and lib code. >>> Add two hidden Kconfig options: >>> - RELAX_INIT_CHECK "Relax strict check for .init sections only in >>> %.init.o >>> files" >>> - DO_NOT_FREE_INIT_MEMORY "Prevent freeing of .init sections at the >>> end of >>> Xen boot." >>> >>> Both selected selected when COVERAGE=y, as getting coverage report for >>> ".init" code is required: >>> - to bypass strict check for .init sections only in %.init.o files; >>> - the .init code stay in memory after Xen boot. >>> >>> RELAX_INIT_CHECK/DO_NOT_FREE_INIT_MEMORY could be used by other debug >>> features in the future. >>> >>> Signed-off-by: Grygorii Strashko <[email protected]> >>> --- >>> 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 >> >> This is a lot nicer (i.e. more simple). >> >> But, I still don't know why we need to avoid freeing init memory to make >> this work. What explodes if we dont? >> > > It will just crash when coverage data is collected. > > First I made changes in make file to get .init covered > then I hit a crash > then I checked %.init.o > conclusion was obvious. > > For example: > objdump -x bzimage.init.o | grep gcov > > 0000000000000010 l O .bss 0000000000000028 __gcov0.bzimage_check > 0000000000000040 l O .bss 0000000000000040 > __gcov0.bzimage_headroom > 0000000000000000 l O .bss 0000000000000008 __gcov0.output_length > 0000000000000080 l O .bss 0000000000000060 __gcov0.bzimage_parse > 0000000000000098 l O .init.data.rel.local 0000000000000028 > __gcov_.bzimage_parse > 0000000000000070 l O .init.data.rel.local 0000000000000028 > __gcov_.bzimage_headroom > 0000000000000048 l O .init.data.rel.local 0000000000000028 > __gcov_.bzimage_check > 0000000000000020 l O .init.data.rel.local 0000000000000028 > __gcov_.output_length > 0000000000000000 *UND* 0000000000000000 __gcov_init > 0000000000000000 *UND* 0000000000000000 __gcov_exit > 0000000000000000 *UND* 0000000000000000 __gcov_merge_add > 0000000000000008 R_X86_64_PLT32 __gcov_init-0x0000000000000004 > 0000000000000012 R_X86_64_PLT32 __gcov_exit-0x0000000000000004 > 0000000000000020 R_X86_64_64 __gcov_merge_add >
Aah, we should exclude the OJBCOPY too. That's what's moving .data.rel.local amongst other sections we target with attributes directly. ~Andrew
