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

Re: [Xen-devel] [PATCH 4] MCA physical address check when calculate domain



>>> On 07.05.11 at 22:29, "Liu, Jinsong" <jinsong.liu@xxxxxxxxx> wrote:
> MCA physical address check when calculate domain
> 
> Bank addr maybe invalid, or 
> Bank addr maybe physical/memory/linear address or segment offset.
> This patch add mca MCi_STATUS_MISCV/MCi_STATUS_ADDRV check, and add physical 
> address verify,
> so that it work safe when calculate domain.
> 
> Signed-off-by: Liu, Jinsong <jinsong.liu@xxxxxxxxx>
> 
> diff -r e4e1efda200f xen/arch/x86/cpu/mcheck/mce.c
> --- a/xen/arch/x86/cpu/mcheck/mce.c   Thu May 05 13:54:29 2011 +0800
> +++ b/xen/arch/x86/cpu/mcheck/mce.c   Fri May 06 13:56:21 2011 +0800
> @@ -151,7 +151,6 @@ static struct mcinfo_bank *mca_init_bank
>                                           struct mc_info *mi, int bank)
>  {
>      struct mcinfo_bank *mib;
> -    uint64_t addr=0, misc = 0;
>  
>      if (!mi)
>          return NULL;
> @@ -170,22 +169,23 @@ static struct mcinfo_bank *mca_init_bank
>      mib->common.size = sizeof (struct mcinfo_bank);
>      mib->mc_bank = bank;
>  
> -    addr = misc = 0;
>      if (mib->mc_status & MCi_STATUS_MISCV)
>          mib->mc_misc = mca_rdmsr(MSR_IA32_MCx_MISC(bank));
>  
>      if (mib->mc_status & MCi_STATUS_ADDRV)
> -    {
>          mib->mc_addr = mca_rdmsr(MSR_IA32_MCx_ADDR(bank));
>  
> -        if (mfn_valid(paddr_to_pfn(mib->mc_addr))) {
> -            struct domain *d;
> +    if ((mib->mc_status & MCi_STATUS_MISCV) &&
> +        (mib->mc_status & MCi_STATUS_ADDRV) &&
> +        ((mib->mc_misc & MCi_MISC_ADDRMOD_MASK) == MCi_MISC_PHYSMOD) && 
> +          mfn_valid(paddr_to_pfn(mib->mc_addr)))
> +    {
> +        struct domain *d;
>  
> -            d = maddr_get_owner(mib->mc_addr);
> -            if (d != NULL && (who == MCA_POLLER ||
> -                              who == MCA_CMCI_HANDLER))
> -                mib->mc_domid = d->domain_id;
> -        }
> +        d = maddr_get_owner(mib->mc_addr);
> +        if (d != NULL && (who == MCA_POLLER ||
> +                          who == MCA_CMCI_HANDLER))
> +            mib->mc_domid = d->domain_id;

This wasn't very logical before, and would probably be good if it
got changed while you re-structure it anyway: Rather than
calling maddr_get_owner() and *then* checking "who", that
check should be added to the other surrounding ones, thus
avoiding the possibly pointless call.

Further I wonder whether there aren't more cases for which the
domain ID could be set, as well as whether the !MISCV case
shouldn't also assume the address to be physical. Wouldn't that
be the case e.g. on older CPUs?

Jan

>      }
>  
>      if (who == MCA_CMCI_HANDLER) {




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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