[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v9 4/5] xen/arm: switch ARM to use generic implementation of bug.h
On 03.04.2023 20:40, Oleksii wrote: > Hello Julien, > On Fri, 2023-03-31 at 22:05 +0100, Julien Grall wrote: >> Hi Oleksii, >> >> I was going to ack the patch but then I spotted something that would >> want some clarification. >> >> On 29/03/2023 11:50, Oleksii Kurochko wrote: >>> diff --git a/xen/arch/arm/include/asm/bug.h >>> b/xen/arch/arm/include/asm/bug.h >>> index cacaf014ab..3fb0471a9b 100644 >>> --- a/xen/arch/arm/include/asm/bug.h >>> +++ b/xen/arch/arm/include/asm/bug.h >>> @@ -1,6 +1,24 @@ >>> #ifndef __ARM_BUG_H__ >>> #define __ARM_BUG_H__ >>> >>> +/* >>> + * Please do not include in the header any header that might >>> + * use BUG/ASSERT/etc maros asthey will be defined later after >>> + * the return to <xen/bug.h> from the current header: >>> + * >>> + * <xen/bug.h>: >>> + * ... >>> + * <asm/bug.h>: >>> + * ... >>> + * <any_header_which_uses_BUG/ASSERT/etc macros.h> >>> + * ... >>> + * ... >>> + * #define BUG() ... >>> + * ... >>> + * #define ASSERT() ... >>> + * ... >>> + */ >>> + >>> #include <xen/types.h> >>> >>> #if defined(CONFIG_ARM_32) >>> @@ -11,76 +29,7 @@ >>> # error "unknown ARM variant" >>> #endif >>> >>> -#define BUG_FRAME_STRUCT >>> - >>> -struct bug_frame { >>> - signed int loc_disp; /* Relative address to the bug address >>> */ >>> - signed int file_disp; /* Relative address to the filename */ >>> - signed int msg_disp; /* Relative address to the predicate >>> (for ASSERT) */ >>> - uint16_t line; /* Line number */ >>> - uint32_t pad0:16; /* Padding for 8-bytes align */ >>> -}; >>> - >>> -#define bug_loc(b) ((const void *)(b) + (b)->loc_disp) >>> -#define bug_file(b) ((const void *)(b) + (b)->file_disp); >>> -#define bug_line(b) ((b)->line) >>> -#define bug_msg(b) ((const char *)(b) + (b)->msg_disp) >>> - >>> -/* Many versions of GCC doesn't support the asm %c parameter which >>> would >>> - * be preferable to this unpleasantness. We use mergeable string >>> - * sections to avoid multiple copies of the string appearing in >>> the >>> - * Xen image. BUGFRAME_run_fn needs to be handled separately. >>> - */ >> >> Given this comment ... >> >>> -#define BUG_FRAME(type, line, file, has_msg, msg) do >>> { \ >>> - BUILD_BUG_ON((line) >> >>> 16); \ >>> - BUILD_BUG_ON((type) >= >>> BUGFRAME_NR); \ >>> - asm >>> ("1:"BUG_INSTR"\n" >>> \ >>> - ".pushsection .rodata.str, \"aMS\", %progbits, >>> 1\n" \ >>> - "2:\t.asciz " __stringify(file) >>> "\n" \ >>> - >>> "3:\n" >>> \ >>> - ".if " #has_msg >>> "\n" \ >>> - "\t.asciz " #msg >>> "\n" \ >>> - >>> ".endif\n" >>> \ >>> - >>> ".popsection\n" >>> \ >>> - ".pushsection .bug_frames." __stringify(type) ", \"a\", >>> %progbits\n"\ >>> - >>> "4:\n" >>> \ >>> - ".p2align >>> 2\n" \ >>> - ".long (1b - >>> 4b)\n" \ >>> - ".long (2b - >>> 4b)\n" \ >>> - ".long (3b - >>> 4b)\n" \ >>> - ".hword " __stringify(line) ", >>> 0\n" \ >>> - >>> ".popsection"); >>> \ >>> -} while (0) >>> - >>> -/* >>> - * GCC will not allow to use "i" when PIE is enabled (Xen doesn't >>> set the >>> - * flag but instead rely on the default value from the compiler). >>> So the >>> - * easiest way to implement run_in_exception_handler() is to pass >>> the to >>> - * be called function in a fixed register. >>> - */ >>> -#define run_in_exception_handler(fn) do >>> { \ >>> - asm ("mov " __stringify(BUG_FN_REG) ", >>> %0\n" \ >>> - >>> "1:"BUG_INSTR"\n" >>> \ >>> - ".pushsection .bug_frames." __stringify(BUGFRAME_run_fn) >>> "," \ >>> - " \"a\", >>> %%progbits\n" \ >>> - >>> "2:\n" >>> \ >>> - ".p2align >>> 2\n" \ >>> - ".long (1b - >>> 2b)\n" \ >>> - ".long 0, 0, >>> 0\n" \ >>> - ".popsection" :: "r" (fn) : __stringify(BUG_FN_REG) >>> ); \ >>> -} while (0) >>> - >>> -#define WARN() BUG_FRAME(BUGFRAME_warn, __LINE__, __FILE__, 0, "") >>> - >>> -#define BUG() do { \ >>> - BUG_FRAME(BUGFRAME_bug, __LINE__, __FILE__, 0, ""); \ >>> - unreachable(); \ >>> -} while (0) >>> - >>> -#define assert_failed(msg) do { \ >>> - BUG_FRAME(BUGFRAME_assert, __LINE__, __FILE__, 1, msg); \ >>> - unreachable(); \ >>> -} while (0) >>> +#define BUG_ASM_CONST "c" >> >> ... you should explain in the commit message why this is needed and >> the >> problem described above is not a problem anymore. >> >> For instance, I managed to build it without 'c' on arm64 [1]. But it >> does break on arm32 [2]. I know that Arm is also where '%c' was an >> issue. >> >> Skimming through linux, the reason seems to be that GCC may add '#' >> when >> it should not. That said, I haven't look at the impact on the generic >> implementation. Neither I looked at which version may be affected >> (the >> original message was from 2011). > You are right that some compilers add '#' when it shouldn't. The same > thing happens with RISC-V. RISC-V doesn't know of a '#' prefix, does it? '#' is a comment character there afaik, like for many other architectures. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |