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

Re: [Xen-devel] [PATCH v2 06/10] x86: Introduce a new function to get capability of Intel PT



> > --- a/xen/arch/x86/cpu/ipt.c
> > +++ b/xen/arch/x86/cpu/ipt.c
> > @@ -25,11 +25,74 @@
> >  #include <asm/ipt.h>
> >  #include <asm/msr.h>
> >
> > +#define EAX 0
> > +#define ECX 1
> > +#define EDX 2
> > +#define EBX 3
> > +#define CPUID_REGS_NUM   4 /* number of regsters (eax, ebx, ecx, edx) */
> > +
> > +#define BIT(nr)                 (1UL << (nr))
> 
> I don't particularly like any such pretty generic things to be added to 
> individual files, but I also have nothing better to suggest. But
> please add the missing i to the comment.
> 
> > +#define IPT_CAP(_n, _l, _r, _m)                               \
> > +    [IPT_CAP_ ## _n] = { .name = __stringify(_n), .leaf = _l, \
> > +        .reg = _r, .mask = _m }
> > +
> > +static struct ipt_cap_desc {
> > +    const char    *name;
> > +    unsigned int  leaf;
> > +    unsigned char reg;
> 
> I don't think leaf needs to be full 32 bits wide? Once shrunk by at least two 
> bits, the size of the overall structure could go down
> from 24 to 16 bytes.

OK, will change it from " unsigned int  " to "unsinged char".

> 
> > +    unsigned int  mask;
> > +} ipt_caps[] = {
> > +    IPT_CAP(max_subleaf,            0, EAX, 0xffffffff),
> > +    IPT_CAP(cr3_filter,             0, EBX, BIT(0)),
> > +    IPT_CAP(psb_cyc,                0, EBX, BIT(1)),
> > +    IPT_CAP(ip_filter,              0, EBX, BIT(2)),
> > +    IPT_CAP(mtc,                    0, EBX, BIT(3)),
> > +    IPT_CAP(ptwrite,                0, EBX, BIT(4)),
> > +    IPT_CAP(power_event,            0, EBX, BIT(5)),
> > +    IPT_CAP(topa_output,            0, ECX, BIT(0)),
> > +    IPT_CAP(topa_multi_entry,       0, ECX, BIT(1)),
> > +    IPT_CAP(single_range_output,    0, ECX, BIT(2)),
> > +    IPT_CAP(output_subsys,          0, ECX, BIT(3)),
> > +    IPT_CAP(payloads_lip,           0, ECX, BIT(31)),
> > +    IPT_CAP(addr_range,             1, EAX, 0x7),
> > +    IPT_CAP(mtc_period,             1, EAX, 0xffff0000),
> > +    IPT_CAP(cycle_threshold,        1, EBX, 0xffff),
> > +    IPT_CAP(psb_freq,               1, EBX, 0xffff0000),
> > +};
> 
> const?

Oh, will add it.

> 
> > +static unsigned int ipt_cap(const struct cpuid_leaf *cpuid_ipt, enum
> > +ipt_cap cap) {
> > +    const struct ipt_cap_desc *cd = &ipt_caps[cap];
> > +    unsigned int shift = ffs(cd->mask) - 1;
> 
> Do you really need this?
> 
> > +    unsigned int val = 0;
> > +
> > +    cpuid_ipt += cd->leaf;
> > +
> > +    switch ( cd->reg )
> > +    {
> > +    case EAX:
> > +        val = cpuid_ipt->a;
> > +        break;
> > +    case EBX:
> > +        val = cpuid_ipt->b;
> > +        break;
> > +    case ECX:
> > +        val = cpuid_ipt->c;
> > +        break;
> > +    case EDX:
> > +        val = cpuid_ipt->d;
> > +        break;
> > +    }
> > +
> > +    return (val & cd->mask) >> shift;
> 
> If all masks are indeed contiguous series of set bits, MASK_EXTR() can be 
> used here afaict.

Yes, it is a good define to me. Will fix it.

> 
> > +}
> > +
> >  static int __init parse_ipt_params(const char *str)  {
> >      if ( !strcmp("guest", str) )
> 
> So this is the end of the changes to this file, and the function you 
> introduce is static. I'm pretty sure compilers will warn about the
> unused static, and hence the build will fail at this point of the series (due 
> to -Werror). I think you want to introduce the function
> together with its first user.

I can't reproduce this issue by:
#./configure
# make build-xen         (-Werror has been included during build)
Could you tell me how to?

Thanks,
Luwei Kang


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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