|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] tools/xen-mceinj: support AMD
Egger, Christoph wrote:
> On 31.05.13 16:35, Liu, Jinsong wrote:
>> Christoph Egger wrote:
>>> On 31.05.13 13:31, Liu, Jinsong wrote:
>>>> Seems it cannot patch to latest tree, so please rebase (I agree
>>>> it's our fault not response in time ... sorry).
>>>> Some comments below.
>>>>
>>>> Thanks,
>>>> Jinsong
>>>>
>>>> Egger, Christoph wrote:
>>>>> a8206654c64f:patches chegger$ cat xen_mceinj.diff
>>>>> commit a277555e158c87aed34196f72eba0a4cf8f0fb38
>>>>> Author: Christoph Egger <chegger@xxxxxxxxx>
>>>>> Date: Wed Feb 27 14:52:19 2013 +0000
>>>>>
>>>>> xen-mceinj: Support AMD. Add -e option.
>>>>>
>>>>> Add support for AMD.
>>>>
>>>> It's pretty OK for this purpose, but ...
>>>>
>>>>> Add -e option to raise an exception.
>>>>
>>>> ... why need -e option w/ opt_exception variable?
>>>> AFAICT, it works fine w/o -e. Please add more comments
>>>> for strong reason, especially it need force user to change command
>>>> line.
>>>
>>> Without -e this allows you to test the polling handler and -e this
>>> allows you to test the exception handler.
>>
>> If for new polling purpose, isn't it more reasonable to add
>> another explicit option for polling?
>
> What do you suggest? -p is already in use for the physical address.
say, -P, considering how rarely polling case was tested, it's OK.
>
>> In this way we keep same
>> style/interface with old one, defaultly test mce.
>
> You sound you have scripts that require an adjustment when the
> default behaviour changes, right?
Our QA use scripts for nightly test (though it's not difficult to change
script).
As common usage, the default option should for most common case -- we always
use this tools to test mce case. It's just weird to me that user have to change
interface to add a special option for most common test case.
But anyway, if you don't want to change your approach, I don't strongly against
it, as far as Jan agree it.
Thanks,
Jinsong
>
>> What is more, please add description (especially the --help)
>> for polling purpose -- I didn't find it from code review or from
>> description.
>
> Ok, I clarify the --help message.
>
> Christoph
>
>>>
>>>>>
>>>>> Signed-off-by: Christoph Egger <chegger@xxxxxxxxx>
>>>>>
>>>>> diff --git a/tools/tests/mce-test/tools/xen-mceinj.c
>>>>> b/tools/tests/mce-test/tools/xen-mceinj.c
>>>>> index e3e62f7..7400a02 100644
>>>>> --- a/tools/tests/mce-test/tools/xen-mceinj.c
>>>>> +++ b/tools/tests/mce-test/tools/xen-mceinj.c
>>>>> @@ -1,6 +1,8 @@
>>>>> /*
>>>>> * xen-mceinj.c: utilities to inject fake MCE for x86.
>>>>> * Copyright (c) 2010, Intel Corporation.
>>>>> + * Copyright (c) 2012, AMD Cooperation Inc.
>>>>> + * Copyright (c) 2013, Amazon.com, Inc. or its affiliates. *
>>>>> * This program is free software; you can redistribute it and/or
>>>>> modify it
>>>>> * under the terms and conditions of the GNU General Public
>>>>> License, @@ -18,6 +20,7 @@
>>>>> * Authors: Yunhong Jiang <yunhong.jiang@xxxxxxxxx>
>>>>> * Haicheng Li <haicheng.li@xxxxxxxxx>
>>>>> * Xudong Hao <xudong.hao@xxxxxxxxx>
>>>>> + * Christoph Egger <chegger@xxxxxxxxx>
>>>>> */
>>>>>
>>>>>
>>>>> @@ -44,11 +47,14 @@
>>>>> #define MCi_type_STATUS 0x1
>>>>> #define MCi_type_ADDR 0x2
>>>>> #define MCi_type_MISC 0x3
>>>>> -#define MCi_type_CTL2 0x4
>>>>> +#define MC4_type_MISC1 0x4
>>>>> +#define MC4_type_MISC2 0x5
>>>>> +#define MC4_type_MISC3 0x6
>>>>> +#define MCi_type_CTL2 0x7
>>>>
>>>> Why change original sequence? I didn't see the necessity of doing
>>>> so --> please add new types behind old ones so that we don't need
>>>> test old logic again.
>>>
>>> See Jan's comment.
>>
>> Agree.
>>
>>>
>>>>>
>>>>> #define INVALID_MSR ~0UL
>>>>>
>>>>> -/* Intel MSRs */
>>>>> +/* X86 machine check MSRs */
>>>>> #define MSR_IA32_MCG_CAP 0x00000179
>>>>> #define MSR_IA32_MCG_STATUS 0x0000017a
>>>>> #define MSR_IA32_MCG_CTL 0x0000017b
>>>>> @@ -56,35 +62,63 @@
>>>>> #define MSR_IA32_MC0_STATUS 0x00000401
>>>>> #define MSR_IA32_MC0_ADDR 0x00000402
>>>>> #define MSR_IA32_MC0_MISC 0x00000403
>>>>> +
>>>>> +/* Intel MSRs */
>>>>> #define MSR_IA32_MC0_CTL2 0x00000280
>>>>>
>>>>> -/* LLC (Last Level Cache) EWB (Explicit Write Back) SRAO MCE */
>>>>> +/* Intel: LLC (Last Level Cache) EWB (Explicit Write Back) SRAO
>>>>> MCE */ #define MCG_STATUS_SRAO_LLC_VAL 0x5
>>>>> #define MCE_SRAO_LLC_BANK 0x7
>>>>> #define MCi_STATUS_SRAO_LLC_VAL 0xBD2000008000017AUL
>>>>> #define MCi_MISC_SRAO_LLC_VAL 0x86UL
>>>>>
>>>>> -/* Memory Patrol Scrub SRAO MCE */
>>>>> +/* Intel: Memory Patrol Scrub SRAO MCE */
>>>>> #define MCG_STATUS_SRAO_MEM_VAL 0x5
>>>>> #define MCE_SRAO_MEM_BANK 0x8
>>>>> #define MCi_STATUS_SRAO_MEM_VAL 0xBD000000004000CFUL
>>>>> #define MCi_MISC_SRAO_MEM_VAL 0x86UL
>>>>>
>>>>> -/* LLC EWB UCNA Error */
>>>>> +/* Intel: LLC EWB UCNA Error */
>>>>> #define MCG_STATUS_UCNA_LLC_VAL 0x0
>>>>> #define CMCI_UCNA_LLC_BANK 0x9
>>>>> #define MCi_STATUS_UCNA_LLC_VAL 0xBC20000080000136UL
>>>>> #define MCi_MISC_UCNA_LLC_VAL 0x86UL
>>>>>
>>>>> -/* Error Types */
>>>>> -#define MCE_SRAO_MEM 0x0
>>>>> -#define MCE_SRAO_LLC 0x1
>>>>> -#define CMCI_UCNA_LLC 0x2
>>>>> +/* Intel: Error Types */
>>>>> +#define INTEL_MCE_SRAO_MEM 0x0
>>>>> +#define INTEL_MCE_SRAO_LLC 0x1
>>>>> +#define INTEL_CMCI_UCNA_LLC 0x2
>>>>> +
>>>>> +/* AMD: Memory Error */
>>>>> +#define MCG_STATUS_MEM_VAL 0x5
>>>>> +#define MCE_MEM_BANK 0x4
>>>>> +#define MCi_STATUS_MEM_VAL 0xb4000000001c0100UL
>>>>> +//#define MCi_STATUS_MEM_VAL 0xb600000000000100UL
>>>>
>>>> Hmm, drop this test code please.
>>>
>>> What do you not like? The // ?
>>>
>>> Christoph
>>
>> Yes, If you like to keep test code, /* */ seems better -- Just my
>> personal prefer.
>>
>> Thanks,
>> Jinsong
>>
>>>
>>>>
>>>>> +#define MCi_MISC_MEM_VAL 0x0
>>>>> +
>>>>> +/* AMD: L3 Cache Error */
>>>>> +#define MCG_STATUS_L3_VAL 0x5
>>>>> +#define MCE_L3_BANK 0x4
>>>>> +#define MCi_STATUS_L3_VAL 0xbc000400001c010bULL
>>>>> +#define MC4_MISC0_VAL 0x0
>>>>> +#define MC4_MISC1_VAL 0x0
>>>>> +#define MC4_MISC2_L3_VAL 0xc008000000000003ULL + +/*
>>>>> AMD: Error Types */ +#define AMD_MCE_MEM 0x0 /*
>>>>> memory error */ +#define AMD_MCE_L3 0x1 /* l3
>>>>> cache */
>>>>>
>>>>> #define LOGFILE stdout
>>>>>
>>>>> -int dump;
>>>>> -struct xen_mc_msrinject msr_inj;
>>>>> +static int dump;
>>>>> +static int opt_exception;
>>>>> +static struct xen_mc_msrinject msr_inj;
>>>>> +
>>>>> +#define CPU_VENDOR_UNKNOWN -1
>>>>> +#define CPU_VENDOR_AMD 0
>>>>> +#define CPU_VENDOR_INTEL 1
>>>>> +static int cpu_vendor;
>>>>> +
>>>>>
>>>>> static void Lprintf(const char *fmt, ...)
>>>>> {
>>>>> @@ -145,7 +179,7 @@ static int mca_cpuinfo(xc_interface
>>>>> *xc_handle) return 0; }
>>>>>
>>>>> -static int inject_cmci(xc_interface *xc_handle, int cpu_nr)
>>>>> +static int intel_inject_cmci(xc_interface *xc_handle) {
>>>>> struct xen_mc mc; int nr_cpus;
>>>>> @@ -191,6 +225,15 @@ static uint64_t bank_addr(int bank, int type)
>>>>> 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;
>>>>> @@ -356,12 +399,11 @@ static int inject_mci_status(xc_interface
>>>>> *xc_handle, }
>>>>>
>>>>> static int inject_mci_misc(xc_interface *xc_handle,
>>>>> - uint32_t cpu_nr,
>>>>> - uint64_t bank,
>>>>> - uint64_t val)
>>>>> + uint32_t cpu_nr, uint32_t misctype,
>>>>> + uint64_t bank, uint64_t val) {
>>>>> return add_msr_bank_intpose(xc_handle, cpu_nr,
>>>>> MC_MSRINJ_F_INTERPOSE, - MCi_type_MISC, bank, val); +
>>>>> MCi_type_MISC + misctype, bank, val); }
>>>>>
>>>>> static int inject_mci_addr(xc_interface *xc_handle,
>>>>> @@ -373,10 +415,8 @@ static int inject_mci_addr(xc_interface
>>>>> *xc_handle, MCi_type_ADDR,
>>>>> bank, val); }
>>>>>
>>>>> -static int inject_llc_srao(xc_interface *xc_handle,
>>>>> - uint32_t cpu_nr,
>>>>> - uint32_t domain,
>>>>> - uint64_t gaddr)
>>>>> +static int intel_inject_llc_srao(xc_interface *xc_handle,
>>>>> + uint32_t cpu_nr, uint32_t domain, uint64_t gaddr) {
>>>>> uint64_t gpfn, mfn, haddr;
>>>>> int ret = 0;
>>>>> @@ -390,7 +430,7 @@ static int inject_llc_srao(xc_interface
>>>>> *xc_handle, if ( ret ) err(xc_handle, "Failed to inject
>>>>> MCi_STATUS MSR\n");
>>>>>
>>>>> - ret = inject_mci_misc(xc_handle, cpu_nr,
>>>>> + ret = inject_mci_misc(xc_handle, cpu_nr, 0,
>>>>> MCE_SRAO_LLC_BANK,
>>>>> MCi_MISC_SRAO_LLC_VAL); if ( ret ) err(xc_handle,
>>>>> "Failed to inject MCi_MISC MSR\n"); @@ -407,17 +447,18 @@ static
>>>>> int inject_llc_srao(xc_interface *xc_handle, ret =
>>>>> flush_msr_inj(xc_handle); if ( ret )
>>>>> err(xc_handle, "Failed to inject MSR\n");
>>>>> - ret = inject_mce(xc_handle, cpu_nr);
>>>>> - if ( ret )
>>>>> - err(xc_handle, "Failed to inject MCE error\n"); + +
>>>>> if (opt_exception) { + ret = inject_mce(xc_handle, cpu_nr);
>>>>> + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MCE error\n"); +
>>>>> }
>>>>>
>>>>> return 0;
>>>>> }
>>>>>
>>>>> -static int inject_mem_srao(xc_interface *xc_handle,
>>>>> - uint32_t cpu_nr,
>>>>> - uint32_t domain,
>>>>> - uint64_t gaddr)
>>>>> +static int intel_inject_mem_srao(xc_interface *xc_handle,
>>>>> + uint32_t cpu_nr, uint32_t domain, uint64_t gaddr) {
>>>>> uint64_t gpfn, mfn, haddr;
>>>>> int ret = 0;
>>>>> @@ -431,7 +472,7 @@ static int inject_mem_srao(xc_interface
>>>>> *xc_handle, if ( ret ) err(xc_handle, "Failed to inject
>>>>> MCi_STATUS MSR\n");
>>>>>
>>>>> - ret = inject_mci_misc(xc_handle, cpu_nr,
>>>>> + ret = inject_mci_misc(xc_handle, cpu_nr, 0,
>>>>> MCE_SRAO_MEM_BANK,
>>>>> MCi_MISC_SRAO_MEM_VAL); if ( ret ) err(xc_handle,
>>>>> "Failed to inject MCi_MISC MSR\n"); @@ -448,17 +489,18 @@ static
>>>>> int inject_mem_srao(xc_interface *xc_handle, ret =
>>>>> flush_msr_inj(xc_handle); if ( ret )
>>>>> err(xc_handle, "Failed to inject MSR\n");
>>>>> - ret = inject_mce(xc_handle, cpu_nr);
>>>>> - if ( ret )
>>>>> - err(xc_handle, "Failed to inject MCE error\n"); + +
>>>>> if (opt_exception) { + ret = inject_mce(xc_handle, cpu_nr);
>>>>> + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MCE error\n"); +
>>>>> }
>>>>>
>>>>> return 0;
>>>>> }
>>>>>
>>>>> -static int inject_llc_ucna(xc_interface *xc_handle,
>>>>> - uint32_t cpu_nr,
>>>>> - uint32_t domain,
>>>>> - uint64_t gaddr)
>>>>> +static int intel_inject_llc_ucna(xc_interface *xc_handle,
>>>>> + uint32_t cpu_nr, uint32_t domain, uint64_t gaddr) {
>>>>> uint64_t gpfn, mfn, haddr;
>>>>> int ret = 0;
>>>>> @@ -472,7 +514,7 @@ static int inject_llc_ucna(xc_interface
>>>>> *xc_handle, if ( ret ) err(xc_handle, "Failed to inject
>>>>> MCi_STATUS MSR\n");
>>>>>
>>>>> - ret = inject_mci_misc(xc_handle, cpu_nr,
>>>>> + ret = inject_mci_misc(xc_handle, cpu_nr, 0,
>>>>> CMCI_UCNA_LLC_BANK,
>>>>> MCi_MISC_UCNA_LLC_VAL); if ( ret ) err(xc_handle,
>>>>> "Failed to inject MCi_MISC MSR\n"); @@ -489,13 +531,108 @@ static
>>>>> int inject_llc_ucna(xc_interface *xc_handle, ret =
>>>>> flush_msr_inj(xc_handle); if ( ret )
>>>>> err(xc_handle, "Failed to inject MSR\n");
>>>>> - ret = inject_cmci(xc_handle, cpu_nr);
>>>>> + ret = intel_inject_cmci(xc_handle);
>>>>> if ( ret )
>>>>> err(xc_handle, "Failed to inject MCE error\n");
>>>>>
>>>>> return 0;
>>>>> }
>>>>>
>>>>> +static int amd_inject_mem(xc_interface *xc_handle,
>>>>> + uint32_t cpu_nr, uint32_t domain, uint64_t gaddr) +{
>>>>> + uint64_t gpfn, mfn, haddr;
>>>>> + int ret = 0;
>>>>> +
>>>>> + ret = inject_mcg_status(xc_handle, cpu_nr,
>>>>> MCG_STATUS_MEM_VAL); + if ( ret ) + err(xc_handle,
>>>>> "Failed to inject MCG_STATUS MSR\n"); + + ret =
>>>>> inject_mci_status(xc_handle, cpu_nr, +
>>>>> MCE_MEM_BANK, MCi_STATUS_MEM_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MCi_STATUS MSR\n"); + + ret =
>>>>> inject_mci_misc(xc_handle, cpu_nr, 0, +
>>>>> MCE_MEM_BANK, MCi_MISC_MEM_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MCi_MISC MSR\n"); + + gpfn =
>>>>> gaddr >> PAGE_SHIFT; + mfn = mca_gpfn_to_mfn(xc_handle, domain,
>>>>> gpfn); + if (!mfn_valid(mfn)) + err(xc_handle, "The MFN
>>>>> is not valid\n"); + haddr = (mfn << PAGE_SHIFT) | (gaddr &
>>>>> (PAGE_SIZE - 1)); + ret = inject_mci_addr(xc_handle, cpu_nr,
>>>>> MCE_MEM_BANK, haddr); + if ( ret ) + err(xc_handle,
>>>>> "Failed to inject MCi_ADDR MSR\n"); + + ret =
>>>>> flush_msr_inj(xc_handle); + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MSR\n");
>>>>> +
>>>>> + if (opt_exception) {
>>>>> + ret = inject_mce(xc_handle, cpu_nr);
>>>>> + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MCE error\n"); +
>>>>> } + + return 0;
>>>>> +}
>>>>> +
>>>>> +static int amd_inject_l3(xc_interface *xc_handle,
>>>>> + uint32_t cpu_nr, uint32_t domain, uint64_t gaddr) +{
>>>>> + uint64_t gpfn, mfn, haddr;
>>>>> + int ret = 0;
>>>>> +
>>>>> + ret = inject_mcg_status(xc_handle, cpu_nr,
>>>>> MCG_STATUS_L3_VAL); + if ( ret ) + err(xc_handle,
>>>>> "Failed to inject MCG_STATUS MSR\n"); + + ret =
>>>>> inject_mci_status(xc_handle, cpu_nr, +
>>>>> MCE_L3_BANK, MCi_STATUS_L3_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MCi_STATUS MSR\n"); + + ret =
>>>>> inject_mci_misc(xc_handle, cpu_nr, 0, +
>>>>> MCE_L3_BANK, MC4_MISC0_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MC4_MISC0 MSR\n"); + + ret =
>>>>> inject_mci_misc(xc_handle, cpu_nr, 1, +
>>>>> MCE_L3_BANK, MC4_MISC1_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MC4_MISC1 MSR\n"); + + ret =
>>>>> inject_mci_misc(xc_handle, cpu_nr, 2, +
>>>>> MCE_L3_BANK, MC4_MISC2_L3_VAL); + if ( ret ) +
>>>>> err(xc_handle, "Failed to inject MC4_MISC2 MSR\n"); + + gpfn =
>>>>> gaddr >> PAGE_SHIFT; + mfn = mca_gpfn_to_mfn(xc_handle, domain,
>>>>> gpfn); + if (!mfn_valid(mfn)) + err(xc_handle, "The MFN
>>>>> is not valid\n"); + haddr = (mfn << PAGE_SHIFT) | (gaddr &
>>>>> (PAGE_SIZE - 1)); + ret = inject_mci_addr(xc_handle, cpu_nr,
>>>>> MCE_L3_BANK, haddr); + if ( ret ) + err(xc_handle,
>>>>> "Failed to inject MCi_ADDR MSR\n"); + + ret =
>>>>> flush_msr_inj(xc_handle); + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MSR\n");
>>>>> +
>>>>> + if (opt_exception) {
>>>>> + ret = inject_mce(xc_handle, cpu_nr);
>>>>> + if ( ret )
>>>>> + err(xc_handle, "Failed to inject MCE error\n"); +
>>>>> } + + return 0;
>>>>> +}
>>>>> +
>>>>> +
>>>>> static long xs_get_dom_mem(int domid)
>>>>> {
>>>>> char path[128];
>>>>> @@ -508,7 +645,7 @@ static long xs_get_dom_mem(int domid) if
>>>>> (!xs) return -1;
>>>>>
>>>>> - sprintf(path, "/local/domain/%d/memory/target", domid);
>>>>> + snprintf(path, sizeof(path),
>>>>> "/local/domain/%d/memory/target", domid); memstr =
>>>>> xs_read(xs, XBT_NULL, path, &plen); xs_daemon_close(xs);
>>>>>
>>>>> @@ -540,30 +677,109 @@ static void help(void)
>>>>> " -D, --dump dump addr info without error
>>>>> injection\n" " -c, --cpu=CPU_ID target CPU\n"
>>>>> " -d, --domain=DomID target domain, the default is
>>>>> Xen itself\n" + " -e raise MCE
>>>>> exception\n" " -h, --help print this
>>>>> page\n" " -p, --phyaddr physical address\n"
>>>>> - " -t, --type=error error type\n"
>>>>> - " 0 : MCE_SRAO_MEM\n"
>>>>> - " 1 : MCE_SRAO_LLC\n"
>>>>> - " 2 : CMCI_UCNA_LLC\n"
>>>>> - "\n"
>>>>> );
>>>>> +
>>>>> + if (cpu_vendor == CPU_VENDOR_INTEL) {
>>>>> + printf(
>>>>> + " -t, --type=error error type\n"
>>>>> + " 0x0 : SRAO MEM\n"
>>>>> + " 0x1 : SRAO LLC\n"
>>>>> + " 0x2 : CMCI UCNA LLC\n"); +
>>>>> } + if (cpu_vendor == CPU_VENDOR_AMD) {
>>>>> + printf(
>>>>> + " -t, --type=error error type\n"
>>>>> + " 0x0: DRAM error\n"
>>>>> + " 0x1: L3 cache error\n"); + }
>>>>> + printf("\n"); +}
>>>>> +
>>>>> +static void cpuid(const unsigned int *input, unsigned int
>>>>> regs[4]) +{ + unsigned int count = (input[1] ==
>>>>> XEN_CPUID_INPUT_UNUSED) ? 0 : input[1]; +#ifdef __i386__
>>>>> + /* Use the stack to avoid reg constraint failures with some
>>>>> gcc flags */ + asm ( + "push %%ebx; push %%edx\n\t"
>>>>> + "cpuid\n\t"
>>>>> + "mov %%ebx,4(%4)\n\t"
>>>>> + "mov %%edx,12(%4)\n\t"
>>>>> + "pop %%edx; pop %%ebx\n\t"
>>>>> + : "=a" (regs[0]), "=c" (regs[2])
>>>>> + : "0" (input[0]), "1" (count), "S" (regs)
>>>>> + : "memory" );
>>>>> +#else
>>>>> + asm (
>>>>> + "cpuid"
>>>>> + : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d"
>>>>> (regs[3]) + : "0" (input[0]), "2" (count) ); +#endif +}
>>>>> +
>>>>> +/* Get the manufacturer brand name of the host processor. */
>>>>> +static void cpuid_brand_get(char *str, size_t len) +{
>>>>> + unsigned int input[2] = { 0, 0 };
>>>>> + union {
>>>>> + unsigned int regs[4];
>>>>> + struct {
>>>>> + char eax[4];
>>>>> + char ebx[4];
>>>>> + char ecx[4];
>>>>> + char edx[4];
>>>>> + } str_regs;
>>>>> + } cpu_branding;
>>>>> +
>>>>> + cpuid(input, cpu_branding.regs);
>>>>> +
>>>>> + snprintf(str, len, "%c%c%c%c%c%c%c%c%c%c%c%c",
>>>>> + cpu_branding.str_regs.ebx[0],
>>>>> cpu_branding.str_regs.ebx[1], +
>>>>> cpu_branding.str_regs.ebx[2], cpu_branding.str_regs.ebx[3], +
>>>>> cpu_branding.str_regs.edx[0], cpu_branding.str_regs.edx[1], +
>>>>> cpu_branding.str_regs.edx[2], cpu_branding.str_regs.edx[3], +
>>>>> cpu_branding.str_regs.ecx[0], cpu_branding.str_regs.ecx[1], +
>>>>> cpu_branding.str_regs.ecx[2], cpu_branding.str_regs.ecx[3]); }
>>>>>
>>>>> int main(int argc, char *argv[])
>>>>> {
>>>>> - int type = MCE_SRAO_MEM;
>>>>> + int type;
>>>>> int c, opt_index;
>>>>> uint32_t domid;
>>>>> xc_interface *xc_handle;
>>>>> - int cpu_nr;
>>>>> - int64_t gaddr, gpfn, mfn, haddr, max_gpa;
>>>>> + unsigned int cpu_nr;
>>>>> + uint64_t gaddr, gpfn, mfn, haddr, max_gpa;
>>>>> + char cpu_brand[13];
>>>>>
>>>>> /* Default Value */
>>>>> domid = DOMID_XEN;
>>>>> gaddr = 0x180020;
>>>>> cpu_nr = 0;
>>>>>
>>>>> + cpu_vendor = CPU_VENDOR_UNKNOWN;
>>>>> + cpuid_brand_get(cpu_brand, sizeof(cpu_brand));
>>>>> + if (strstr(cpu_brand, "AMD"))
>>>>> + cpu_vendor = CPU_VENDOR_AMD;
>>>>> + if (strstr(cpu_brand, "Intel"))
>>>>> + cpu_vendor = CPU_VENDOR_INTEL;
>>>>> +
>>>>> + switch (cpu_vendor) {
>>>>> + case CPU_VENDOR_AMD:
>>>>> + type = AMD_MCE_MEM;
>>>>> + break;
>>>>> + case CPU_VENDOR_INTEL:
>>>>> + type = INTEL_MCE_SRAO_MEM;
>>>>> + break;
>>>>> + case CPU_VENDOR_UNKNOWN:
>>>>> + default:
>>>>> + Lprintf("Unknown cpu vendor on this machine\n"); +
>>>>> exit(EXIT_FAILURE); + } +
>>>>> init_msr_inj();
>>>>> xc_handle = xc_interface_open(0, 0, 0);
>>>>> if ( !xc_handle ) {
>>>>> @@ -571,8 +787,8 @@ int main(int argc, char *argv[])
>>>>> exit(EXIT_FAILURE); }
>>>>>
>>>>> - while ( 1 ) {
>>>>> - c = getopt_long(argc, argv, "c:Dd:t:hp:r", opts,
>>>>> &opt_index); + for (;;) { + c = getopt_long(argc, argv,
>>>>> "c:Dd:t:hp:r:e", opts, &opt_index); if ( c == -1 )
>>>>> break; switch ( c ) {
>>>>> @@ -580,23 +796,26 @@ int main(int argc, char *argv[])
>>>>> dump=1; break; case 'c':
>>>>> - cpu_nr = strtol(optarg, &optarg, 10);
>>>>> + cpu_nr = strtoul(optarg, &optarg, 0);
>>>>> if ( strlen(optarg) != 0 )
>>>>> err(xc_handle, "Please input a digit parameter
>>>>> for CPU\n"); break; case 'd':
>>>>> - domid = strtol(optarg, &optarg, 10);
>>>>> + domid = strtoul(optarg, &optarg, 0);
>>>>> if ( strlen(optarg) != 0 )
>>>>> err(xc_handle, "Please input a digit parameter
>>>>> for domain\n"); break;
>>>>> case 'p':
>>>>> - gaddr = strtol(optarg, &optarg, 0);
>>>>> + gaddr = strtoul(optarg, &optarg, 0);
>>>>> if ( strlen(optarg) != 0 )
>>>>> err(xc_handle, "Please input correct page
>>>>> address\n"); break;
>>>>> case 't':
>>>>> type = strtol(optarg, NULL, 0);
>>>>> break;
>>>>> + case 'e':
>>>>> + opt_exception = 1;
>>>>> + break;
>>>>> case 'h':
>>>>> default:
>>>>> help();
>>>>> @@ -627,19 +846,36 @@ int main(int argc, char *argv[]) goto
>>>>> out; }
>>>>>
>>>>> - switch ( type )
>>>>> - {
>>>>> - case MCE_SRAO_MEM:
>>>>> - inject_mem_srao(xc_handle, cpu_nr, domid, gaddr);
>>>>> - break;
>>>>> - case MCE_SRAO_LLC:
>>>>> - inject_llc_srao(xc_handle, cpu_nr, domid, gaddr);
>>>>> - break;
>>>>> - case CMCI_UCNA_LLC:
>>>>> - inject_llc_ucna(xc_handle, cpu_nr, domid, gaddr); +
>>>>> switch ( cpu_vendor ) { + case CPU_VENDOR_INTEL: +
>>>>> switch ( type ) { + case INTEL_MCE_SRAO_MEM:
>>>>> + intel_inject_mem_srao(xc_handle, cpu_nr, domid,
>>>>> gaddr); + break; + case INTEL_MCE_SRAO_LLC:
>>>>> + intel_inject_llc_srao(xc_handle, cpu_nr, domid,
>>>>> gaddr); + break; + case INTEL_CMCI_UCNA_LLC:
>>>>> + intel_inject_llc_ucna(xc_handle, cpu_nr, domid,
>>>>> gaddr); + break; + default:
>>>>> + err(xc_handle, "Unsupported error type\n"); +
>>>>> break; + }
>>>>> break;
>>>>> - default:
>>>>> - err(xc_handle, "Unsupported error type\n"); + + case
>>>>> CPU_VENDOR_AMD: + switch ( type ) {
>>>>> + case AMD_MCE_MEM:
>>>>> + amd_inject_mem(xc_handle, cpu_nr, domid, gaddr); +
>>>>> break; + case AMD_MCE_L3:
>>>>> + amd_inject_l3(xc_handle, cpu_nr, domid, gaddr); +
>>>>> break; + default: + err(xc_handle, "Unsupported
>>>>> error type\n"); +
>>>>> break; + }
>>>>> break;
>>>>> }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |