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

Re: [Xen-devel] [PATCH] VTd/dmar: Tweak how the DMAR table is clobbered


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxx>
  • From: "Tian, Kevin" <kevin.tian@xxxxxxxxx>
  • Date: Fri, 10 Apr 2015 01:23:26 +0000
  • Accept-language: en-US
  • Cc: "Zhang, Yang Z" <yang.z.zhang@xxxxxxxxx>
  • Delivery-date: Fri, 10 Apr 2015 01:24:03 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: AQHQcjR3egj5wdFPq0iagfCU4jkWiJ1FdOhg
  • Thread-topic: [PATCH] VTd/dmar: Tweak how the DMAR table is clobbered

> From: Andrew Cooper [mailto:andrew.cooper3@xxxxxxxxxx]
> Sent: Thursday, April 09, 2015 3:45 AM
> 
> Intead of clobbering DMAR -> XMAR and back, clobber to RMAD instead.
> This
> means that changing the signature does not alter the checksum, which allows
> the clobbering/unclobbering to be peformed atomically and idempotently,
> which
> is an advantage on the kexec path which can reenter acpi_dmar_reinstate().
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Yang Zhang <yang.z.zhang@xxxxxxxxx>
> CC: Kevin Tian <kevin.tian@xxxxxxxxx>

Acked-by: Kevin Tian <kevin.tian@xxxxxxxxx>

and curious do you observe a real atomic issue in kexec or just catch this
potential issue when reading code? :-)

Thanks
Kevin

> ---
>  xen/drivers/passthrough/vtd/dmar.c |   20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/xen/drivers/passthrough/vtd/dmar.c
> b/xen/drivers/passthrough/vtd/dmar.c
> index 1152c3a..18d7903 100644
> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -28,6 +28,7 @@
>  #include <xen/xmalloc.h>
>  #include <xen/pci.h>
>  #include <xen/pci_regs.h>
> +#include <asm/atomic.h>
>  #include <asm/string.h>
>  #include "dmar.h"
>  #include "iommu.h"
> @@ -838,8 +839,7 @@ static int __init acpi_parse_dmar(struct
> acpi_table_header *table)
> 
>  out:
>      /* Zap ACPI DMAR signature to prevent dom0 using vt-d HW. */
> -    dmar->header.signature[0] = 'X';
> -    dmar->header.checksum -= 'X'-'D';
> +    acpi_dmar_zap();
>      return ret;
>  }
> 
> @@ -867,18 +867,18 @@ int __init acpi_dmar_init(void)
> 
>  void acpi_dmar_reinstate(void)
>  {
> -    if ( dmar_table == NULL )
> -        return;
> -    dmar_table->signature[0] = 'D';
> -    dmar_table->checksum += 'X'-'D';
> +    uint32_t sig = 0x52414d44; /* "DMAR" */
> +
> +    if ( dmar_table )
> +        write_atomic((uint32_t*)&dmar_table->signature[0], sig);
>  }
> 
>  void acpi_dmar_zap(void)
>  {
> -    if ( dmar_table == NULL )
> -        return;
> -    dmar_table->signature[0] = 'X';
> -    dmar_table->checksum -= 'X'-'D';
> +    uint32_t sig = 0x44414d52; /* "RMAD" - doesn't alter table checksum */
> +
> +    if ( dmar_table )
> +        write_atomic((uint32_t*)&dmar_table->signature[0], sig);
>  }
> 
>  int platform_supports_intremap(void)
> --
> 1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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