iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
  • * [PATCH AUTOSEL 4.19 128/258] iommu/arm-smmu-v3: Avoid memory corruption from Hisilicon MSI payloads
           [not found] <20190128155924.51521-1-sashal@kernel.org>
           [not found] ` <20190128155924.51521-1-sashal-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
    @ 2019-01-28 15:57 ` Sasha Levin
      2019-01-28 15:57 ` [PATCH AUTOSEL 4.19 130/258] iommu/arm-smmu-v3: Use explicit mb() when moving cons pointer Sasha Levin
      2 siblings, 0 replies; 4+ messages in thread
    From: Sasha Levin @ 2019-01-28 15:57 UTC (permalink / raw)
      To: linux-kernel, stable; +Cc: Zhen Lei, Will Deacon, Sasha Levin, iommu
    
    From: Zhen Lei <thunder.leizhen@huawei.com>
    
    [ Upstream commit 84a9a75774961612d0c7dd34a1777e8f98a65abd ]
    
    The GITS_TRANSLATER MMIO doorbell register in the ITS hardware is
    architected to be 4 bytes in size, yet on hi1620 and earlier, Hisilicon
    have allocated the adjacent 4 bytes to carry some IMPDEF sideband
    information which results in an 8-byte MSI payload being delivered when
    signalling an interrupt:
    
    MSIAddr:
    	 |----4bytes----|----4bytes----|
    	 |    MSIData   |    IMPDEF    |
    
    This poses no problem for the ITS hardware because the adjacent 4 bytes
    are reserved in the memory map. However, when delivering MSIs to memory,
    as we do in the SMMUv3 driver for signalling the completion of a SYNC
    command, the extended payload will corrupt the 4 bytes adjacent to the
    "sync_count" member in struct arm_smmu_device. Fortunately, the current
    layout allocates these bytes to padding, but this is fragile and we
    should make this explicit.
    
    Reviewed-by: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
    [will: Rewrote commit message and comment]
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
     drivers/iommu/arm-smmu-v3.c | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
    index 3e02aace38b1..4afb9cb99ea3 100644
    --- a/drivers/iommu/arm-smmu-v3.c
    +++ b/drivers/iommu/arm-smmu-v3.c
    @@ -586,7 +586,11 @@ struct arm_smmu_device {
     
     	struct arm_smmu_strtab_cfg	strtab_cfg;
     
    -	u32				sync_count;
    +	/* Hi16xx adds an extra 32 bits of goodness to its MSI payload */
    +	union {
    +		u32			sync_count;
    +		u64			padding;
    +	};
     
     	/* IOMMU core code handle */
     	struct iommu_device		iommu;
    -- 
    2.19.1
    
    ^ permalink raw reply related	[flat|nested] 4+ messages in thread
  • * [PATCH AUTOSEL 4.19 130/258] iommu/arm-smmu-v3: Use explicit mb() when moving cons pointer
           [not found] <20190128155924.51521-1-sashal@kernel.org>
           [not found] ` <20190128155924.51521-1-sashal-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
      2019-01-28 15:57 ` [PATCH AUTOSEL 4.19 128/258] iommu/arm-smmu-v3: Avoid memory corruption from Hisilicon MSI payloads Sasha Levin
    @ 2019-01-28 15:57 ` Sasha Levin
      2 siblings, 0 replies; 4+ messages in thread
    From: Sasha Levin @ 2019-01-28 15:57 UTC (permalink / raw)
      To: linux-kernel, stable; +Cc: Will Deacon, Robin Murphy, Sasha Levin, iommu
    
    From: Will Deacon <will.deacon@arm.com>
    
    [ Upstream commit a868e8530441286342f90c1fd9c5f24de3aa2880 ]
    
    After removing an entry from a queue (e.g. reading an event in
    arm_smmu_evtq_thread()) it is necessary to advance the MMIO consumer
    pointer to free the queue slot back to the SMMU. A memory barrier is
    required here so that all reads targetting the queue entry have
    completed before the consumer pointer is updated.
    
    The implementation of queue_inc_cons() relies on a writel() to complete
    the previous reads, but this is incorrect because writel() is only
    guaranteed to complete prior writes. This patch replaces the call to
    writel() with an mb(); writel_relaxed() sequence, which gives us the
    read->write ordering which we require.
    
    Cc: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
     drivers/iommu/arm-smmu-v3.c | 8 +++++++-
     1 file changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
    index 4afb9cb99ea3..9ae3678844eb 100644
    --- a/drivers/iommu/arm-smmu-v3.c
    +++ b/drivers/iommu/arm-smmu-v3.c
    @@ -688,7 +688,13 @@ static void queue_inc_cons(struct arm_smmu_queue *q)
     	u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
     
     	q->cons = Q_OVF(q, q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
    -	writel(q->cons, q->cons_reg);
    +
    +	/*
    +	 * Ensure that all CPU accesses (reads and writes) to the queue
    +	 * are complete before we update the cons pointer.
    +	 */
    +	mb();
    +	writel_relaxed(q->cons, q->cons_reg);
     }
     
     static int queue_sync_prod(struct arm_smmu_queue *q)
    -- 
    2.19.1
    
    ^ permalink raw reply related	[flat|nested] 4+ messages in thread

  • end of thread, other threads:[~2019-01-28 15:57 UTC | newest]
    
    Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <20190128155924.51521-1-sashal@kernel.org>
         [not found] ` <20190128155924.51521-1-sashal-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
    2019-01-28 15:57   ` [PATCH AUTOSEL 4.19 118/258] iommu/amd: Fix amd_iommu=force_isolation Sasha Levin
    2019-01-28 15:57   ` [PATCH AUTOSEL 4.19 129/258] iommu/arm-smmu: Add support for qcom, smmu-v2 variant Sasha Levin
    2019-01-28 15:57 ` [PATCH AUTOSEL 4.19 128/258] iommu/arm-smmu-v3: Avoid memory corruption from Hisilicon MSI payloads Sasha Levin
    2019-01-28 15:57 ` [PATCH AUTOSEL 4.19 130/258] iommu/arm-smmu-v3: Use explicit mb() when moving cons pointer Sasha Levin
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox;
    as well as URLs for NNTP newsgroup(s).