[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 1/4] xen: introduce CONFIG_GENERIC_BUG_FRAME
On 16/02/2023 12:09 pm, Oleksii wrote: > On Thu, 2023-02-16 at 12:44 +0200, Oleksii wrote: >> On Thu, 2023-02-16 at 08:31 +0100, Jan Beulich wrote: >>> On 15.02.2023 18:59, Oleksii wrote: >>>> Hello Jan and community, >>>> >>>> I experimented and switched RISC-V to x86 implementation. All >>>> that >>>> I >>>> changed in x86 implementation for RISC-V was _ASM_BUGFRAME_TEXT. >>>> Other >>>> things are the same as for x86. >>>> >>>> For RISC-V it is fine to skip '%c' modifier so _ASM_BUGFRAME_TEXT >>>> will >>>> look like: >>>> >>>> #define _ASM_BUGFRAME_TEXT(second_frame) \ >>>> ".Lbug%=: ebreak\n" >>>> ".pushsection .bug_frames.%[bf_type], \"a\", @progbits\n" >>>> ".p2align 2\n" >>>> ".Lfrm%=:\n" >>>> ".long (.Lbug%= - .Lfrm%=) + %[bf_line_hi]\n" >>>> ".long (%[bf_ptr] - .Lfrm%=) + %[bf_line_lo]\n" >>>> ".if " #second_frame "\n" >>>> ".long 0, %[bf_msg] - .Lfrm%=\n" >>>> ".endif\n" >>>> ".popsection\n" >>> I expect this could be further abstracted such that only the actual >>> instruction is arch-specific. >> Generally, the only thing that can't be abstracted ( as you mentioned >> is an instruction ). >> >> So we can make additional defines: >> 1. #define MODIFIER "" or "c" (depends on architecture) and use it >> >> the following way: >> ".pushsection .bug_frames.%"MODIFIER"[bf_type], \"a\", >> @progbits\n" >> ... >> 2. #define BUG_INSTR "ebreak" | "ud2" | "..." and use it in the >> following way: >> ".Lbug%=: "BUG_ISNTR"\n" >> ... >> Except for these defines which should be specified for each >> architecture >> all other code will be the same for all architectures. >> >> But as I understand with modifier 'c' can be issues that not all >> compilers support but for ARM and x86 before immediate is present >> punctuation # or $ which are removed by modifier 'c'. And I am >> wondering what other ways to remove punctuation before immediate >> exist. >> >> Do you think we should consider that as an issue? >> >>>> The only thing I am worried about is: >>>> >>>> #define _ASM_BUGFRAME_INFO(type, line, ptr, msg) \ >>>> [bf_type] "i" (type), ... >>>> because as I understand it can be an issue with 'i' modifier in >>>> case of >>>> PIE. I am not sure that Xen enables PIE somewhere but still... >>>> If it is not an issue then we can use x86 implementation as a >>>> generic >>>> one. >>> "i" is not generally an issue with PIE, it only is when the value >>> is >>> the >>> address of a symbol. Here "type" is a constant in all cases. (Or >>> else >>> how would you express an immediate operand of an instruction in an >>> asm()?) >> Hmm. I don't know other ways to express an immediate operand except >> 'i'. >> >> It looks like type, line, msg are always 'constants' >> ( >> they possibly can be passed without 'i' and used directly inside >> asm(): >> ... >> ".pushsection .bug_frames." __stringify(type) ", \"a\", >> %progbits\n"\ >> ... >> ) but the issue will be with 'ptr' for which we have to use 'i'. >> >> And I am not sure about all 'constants'. For example, I think that it >> can be an issue with 'line' = '((line & ((1 << BUG_LINE_LO_WIDTH) - >> 1)) >> << BUG_DISP_WIDTH)' if we will use that directly inside asm(...). >> > I think we can avoid 'i' by using 'r' + some kind of mov instruction to > write a register value to memory. The code below is pseudo-code: > #define _ASM_BUGFRAME_TEXT(second_frame) > ... > "loc_disp:\n" > " .long 0x0" > "mov [loc_disp], some_register" > ... > And the we have to define mov for each architecture. No, you really cannot. This is the asm equivalent of writing something like this: static struct bugframe __section(.bug_frames.1) foo = { .loc = insn - &foo + LINE_LO, .msg = "bug string" - &foo + LINE_HI, }; It is a data structure, not executable code. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |