|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] tools/xen-mceinj: support AMD
>>> On 05.10.12 at 16:07, Christoph Egger <Christoph.Egger@xxxxxxx> wrote:
> #define LOGFILE stdout
>
> int dump;
>+int opt_exception;
> struct xen_mc_msrinject msr_inj;
>+int cpu_is_amd;
>+int cpu_is_intel;
Albeit I realize that this isn't the case with the context code here,
let's not continue bad habits: The newly added variables should
be static and - as long as not precluded by their use - bool.
>+
>
> static void Lprintf(const char *fmt, ...)
> {
>...
> case MCi_type_MISC:
> addr = MSR_IA32_MC0_CTL + (bank * 4) + type;
> break;
>+ case MC4_type_MISC1:
>+ addr = 0xc0000408;
>+ break;
>+ case MC4_type_MISC2:
>+ addr = 0xc0000409;
>+ break;
>+ case MC4_type_MISC3:
>+ addr = 0xc000040a;
>+ break;
> case MCi_type_CTL2:
> addr = MSR_IA32_MC0_CTL2 + bank;
> break;
What makes it only bank 4 being added here? This question also
applies to the hypervisor side patch you sent on Friday.
>- sprintf(path, "/local/domain/%d/memory/target", domid);
>+ snprintf(path, sizeof(path), "/local/domain/%d/memory/target", domid);
While fine with me, this is completely unrelated.
>+static void cpuid(const unsigned int *input, unsigned int *regs)
While it makes no difference to the treatment of the parameter or
the generated code, this should still be "unsigned int regs[4]" for
documentation purposes.
>+{
>+ unsigned int count = (input[1] == XEN_CPUID_INPUT_UNUSED) ? 0 : input[1];
>+ asm (
>+#ifdef __i386__
>+ "push %%ebx; push %%edx\n\t"
>+#else
>+ "push %%rbx; push %%rdx\n\t"
>+#endif
>+ "cpuid\n\t"
>+ "mov %%ebx,4(%4)\n\t"
>+ "mov %%edx,12(%4)\n\t"
>+#ifdef __i386__
>+ "pop %%edx; pop %%ebx\n\t"
>+#else
>+ "pop %%rdx; pop %%rbx\n\t"
>+#endif
>+ : "=a" (regs[0]), "=c" (regs[2])
>+ : "0" (input[0]), "1" (count), "S" (regs)
>+ : "memory" );
>+}
What did you clone this from? It re-introduces a bug long fixed in
libxc (use of push/pop here collides with the 64-bit red zone; see
tools/libxc/xc_cpuid_x86.c:cpuid() and its history).
>+static void cpuid_brand_get(char *str)
>+{
>+ unsigned int input[2] = { 0, 0 };
>+ unsigned int regs[4];
>+
>+ cpuid(input, regs);
>+
>+ *(uint32_t *)(str + 0) = regs[1];
>+ *(uint32_t *)(str + 4) = regs[3];
>+ *(uint32_t *)(str + 8) = regs[2];
>+ str[12] = '\0';
>+}
I believe that by way of using a suitably defined union you can
get away here without any type casts (which I would generally
expect the compiler to warn about, as I think [hope] that the
tools don't get built with -fno-strict-aliasing).
Also, the file use hypervisor coding style, so please follow that
in the adjustments you are doing (and in particular please don't
do any adjustments just to _remove_ that coding style).
>- int type = MCE_SRAO_MEM;
>+ int type;
>...
>+ if (cpu_is_intel)
>+ type = INTEL_MCE_SRAO_MEM;
So on AMD "type" remains uninitialized unless the -t option was
used?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |