|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] tools/xen-mceinj: support AMD
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.
>>
>> 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.
>>
>> #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
>
>> +#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 |