|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: Violations of MISRA C Rule 20.7 in xen/arch/x86/include/asm/hvm/trace.h
On 01/03/2024 11:43 am, Nicola Vetrini wrote:
> Reporting the discussion that took place on Matrix on the matter, so
> that it can carry on here with all interested parties:
>
>> Hi everyone. I was looking at MISRA violations for Rule 20.7
>> ("Expressions resulting from the expansion of macro parameters shall
>> be enclosed in parentheses") generated by
>>
>> #define TRC_PAR_LONG(par) ((uint32_t)(par)), ((par) >> 32)
>>
>> The thing here is this: the simplest fix is
>>
>> -#define TRC_PAR_LONG(par) ((uint32_t)(par)), ((par) >> 32)
>> +#define TRC_PAR_LO(par) ((uint32_t)(par))
>> +#define TRC_PAR_HI(par) ((par) >> 32)
>>
>> and then replace all call sites accordingly. However, in certain
>> places (e.g., svm.c:1445), this causes a build error:
>>
>> arch/x86/hvm/svm/svm.c: In function ‘svm_inject_event’:
>> arch/x86/hvm/svm/svm.c:1445:1: error: macro "HVMTRACE_3D"
>> requires 4 arguments, but only 3 given
>> 1445 | TRC_PAR_LO(_event.cr2), TRC_PAR_HI(_event.cr2));
>> | ^
>> In file included from arch/x86/hvm/svm/svm.c:31:
>>
>> this is due to the somewhat strange definition of HVMTRACE_3D which
>> works with the previous form of the macro, but not the current one,
>> as the macro argument in HVMTRACE_LONG_2D is now split (_LO is d2 and
>> _HI is variadic), and therefore it's not passed to HVMTRACE_3D
>> anymore as two arguments.
>> I have a proposal: introduce a d3 argument to HVMTRACE_LONG_2D to
>> supply the additional argument and/or make HVMTRACE_LONG_2D
>> non-variadic. This would of course apply to the similarly named
>> macros in xen/arch/x86/include/asm/hvm/trace.h
>
> Andrew Cooper:
>> sigh - I'm half way through deleting all of that
>> guess I ought to finish
>
> Andrew Cooper:
>> @Nicola Vetrini:
>> https://xenbits.xen.org/gitweb/?p=people/andrewcoop/xen.git;a=shortlog;h=refs/heads/xen-trace
>> On second thoughts I'm not sure it fixes the problem
>> just changes it. The problem is the use of macros to split a 64bit
>> quantity across two 32bit fields
>
> Nicola Vetrini:
>> It seems so, yes. But afaict this can be fixed by splitting the macro
>> definition in two, as done above, which wouldn't incur in the
>> compilation error on the new API
>
> Andrew Cooper:
>> given the users of TRACE_PARAM64() by the end, I'd prefer to do that
>> with real structs rather than perpetuating the macro mess
>
> George Dunlap:
>> It's been a long time since I looked at all this, but FWIW I
>> inherited all the weird macro stuff, never liked it, and myself used
>> structs for all new traces. So without having looked at the code at
>> all, I'm predisposed to agree w/ Andy's assessment that we should
>> just rip out the offending macros and replace them with structs.
>
> @gwd: I believe the file that I was concerned about does not fall
> under the XENTRACE entry in MAINTAINERS; you may want to rectify that.
>
My vague plan to fix this is to still take
https://xenbits.xen.org/gitweb/?p=people/andrewcoop/xen.git;a=commitdiff;h=8636f0eaa0f163f8a433eb17b9e0d2e87db284b6
but not introduce TRACE_PARAM64
The users are as follows:
xen.git/xen$ git grep TRACE_PARAM64
arch/x86/hvm/emulate.c:2183: TRACE(TRC_HVM_CR_READ64, reg,
TRACE_PARAM64(*val));
arch/x86/hvm/emulate.c:2199: TRACE(TRC_HVM_CR_WRITE64, reg,
TRACE_PARAM64(val));
arch/x86/hvm/emulate.c:2244: TRACE(TRC_HVM_XCR_READ64, reg,
TRACE_PARAM64(*val));
arch/x86/hvm/emulate.c:2254: TRACE(TRC_HVM_XCR_WRITE64, reg,
TRACE_PARAM64(val));
arch/x86/hvm/hpet.c:308: TRACE_PARAM64(diff_ns),
TRACE_PARAM64(period_ns));
arch/x86/hvm/hvm.c:2155: TRACE(TRC_HVM_CR_WRITE64, cr,
TRACE_PARAM64(val));
arch/x86/hvm/hvm.c:2220: TRACE(TRC_HVM_CR_READ64, cr,
TRACE_PARAM64(val));
arch/x86/hvm/hvm.c:3631: TRACE(TRC_HVM_MSR_READ, msr,
TRACE_PARAM64(*msr_content));
arch/x86/hvm/hvm.c:3647: TRACE(TRC_HVM_MSR_WRITE, msr,
TRACE_PARAM64(msr_content));
arch/x86/hvm/svm/svm.c:1442: TRACE_PARAM64(_event.cr2));
arch/x86/hvm/svm/svm.c:2402: TRACE(TRC_HVM_INVLPG64, 0,
TRACE_PARAM64(linear));
arch/x86/hvm/svm/svm.c:2630: exit_reason,
TRACE_PARAM64(regs->rip));
arch/x86/hvm/svm/svm.c:2826: TRACE(TRC_HVM_PF_XEN64,
regs->error_code, TRACE_PARAM64(va));
arch/x86/hvm/vlapic.c:738:
TRACE_TIME(TRC_HVM_EMUL_LAPIC_START_TIMER, TRACE_PARAM64(delta),
arch/x86/hvm/vlapic.c:739: TRACE_PARAM64(is_periodic ?
period : 0), vlapic->pt.irq);
arch/x86/hvm/vlapic.c:1209:
TRACE_TIME(TRC_HVM_EMUL_LAPIC_START_TIMER, TRACE_PARAM64(delta),
arch/x86/hvm/vlapic.c:1210: TRACE_PARAM64(0LL),
vlapic->pt.irq);
arch/x86/hvm/vlapic.c:1223:
TRACE_TIME(TRC_HVM_EMUL_LAPIC_START_TIMER, TRACE_PARAM64(0LL),
arch/x86/hvm/vlapic.c:1224: TRACE_PARAM64(0LL),
vlapic->pt.irq);
arch/x86/hvm/vlapic.c:1477:
TRACE_TIME(TRC_HVM_EMUL_LAPIC_START_TIMER, TRACE_PARAM64(period),
arch/x86/hvm/vlapic.c:1478: TRACE_PARAM64(is_periodic ?
period : 0LL), s->pt.irq);
arch/x86/hvm/vmx/vmx.c:2093:
TRACE_PARAM64(curr->arch.hvm.guest_cr[2]));
arch/x86/hvm/vmx/vmx.c:3099: TRACE(TRC_HVM_INVLPG64, /*invlpga=*/ 0,
TRACE_PARAM64(linear));
arch/x86/hvm/vmx/vmx.c:3160: TRACE(TRC_HVM_LMSW64,
TRACE_PARAM64(value));
arch/x86/hvm/vmx/vmx.c:4064: TRACE_TIME(TRC_HVM_VMEXIT64,
exit_reason, TRACE_PARAM64(regs->rip));
arch/x86/hvm/vmx/vmx.c:4346:
TRACE_PARAM64(exit_qualification));
include/xen/trace.h:87:#define TRACE_PARAM64(p) (uint32_t)(p), ((p)
>> 32)
and there are probably enough examples of "reg32, val64" to justify
making a helper. We're touching every site anyway, so adjudging for the
next version of the series is easy.
I might repost the first few patches right now. All the fixes in the
scheduler have been reviewed and ready to go for 3 release of Xen already...
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |