Просмотр исходного кода

qcacmn: Align 8 bytes for qdf_mem_header address

In the function list_empty(), there is macro READ_ONCE() and
assembler instruction "ldar" will be used. It requests 8 byptes
alignment for qdf_mem_header address or data abort will happen.

To resolve this issue, align the qdf_mem_header address when
invoking function qdf_mem_dma_get_header().

CRs-Fixed: 2997107
Change-Id: I3d079c3c7e0f3634d85f891327284aefb7a65711
Paul Zhang 3 лет назад
Родитель
Сommit
4b21f23fdd
1 измененных файлов с 8 добавлено и 2 удалено
  1. 8 2
      qdf/linux/src/qdf_mem.c

+ 8 - 2
qdf/linux/src/qdf_mem.c

@@ -154,6 +154,9 @@ struct qdf_mem_header {
 	uint64_t time;
 };
 
+/* align the qdf_mem_header to 8 bytes */
+#define QDF_DMA_MEM_HEADER_ALIGN 8
+
 static uint64_t WLAN_MEM_HEADER = 0x6162636465666768;
 static uint64_t WLAN_MEM_TRAILER = 0x8081828384858687;
 
@@ -162,10 +165,13 @@ static inline struct qdf_mem_header *qdf_mem_get_header(void *ptr)
 	return (struct qdf_mem_header *)ptr - 1;
 }
 
+/* make sure the header pointer is 8bytes aligned */
 static inline struct qdf_mem_header *qdf_mem_dma_get_header(void *ptr,
 							    qdf_size_t size)
 {
-	return (struct qdf_mem_header *) ((uint8_t *) ptr + size);
+	return (struct qdf_mem_header *)
+				qdf_roundup((size_t)((uint8_t *)ptr + size),
+					    QDF_DMA_MEM_HEADER_ALIGN);
 }
 
 static inline uint64_t *qdf_mem_get_trailer(struct qdf_mem_header *header)
@@ -184,7 +190,7 @@ static inline void *qdf_mem_get_ptr(struct qdf_mem_header *header)
 
 /* number of bytes needed for the qdf dma memory debug information */
 #define QDF_DMA_MEM_DEBUG_SIZE \
-	(sizeof(struct qdf_mem_header))
+	(sizeof(struct qdf_mem_header) + QDF_DMA_MEM_HEADER_ALIGN)
 
 static void qdf_mem_trailer_init(struct qdf_mem_header *header)
 {