riscv: Avoid io read/write cause wrong result
authorNick Hu <nick.hu@sifive.com>
Mon, 18 Oct 2021 03:50:05 +0000 (11:50 +0800)
committerLeo Yu-Chi Liang <ycliang@andestech.com>
Wed, 20 Oct 2021 02:59:17 +0000 (10:59 +0800)
io read/write may cause wrong result because they may read/write data
from/to register instead of memory. Add 'volatile' to avoid it.

Signed-off-by: Nick Hu <nick.hu@sifive.com>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/riscv/include/asm/io.h

index acf5a96..3540773 100644 (file)
@@ -44,15 +44,15 @@ static inline phys_addr_t map_to_sysmem(const void *ptr)
  * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
  * to the architecture specific code.
  */
-#define __arch_getb(a)                 (*(unsigned char *)(a))
-#define __arch_getw(a)                 (*(unsigned short *)(a))
-#define __arch_getl(a)                 (*(unsigned int *)(a))
-#define __arch_getq(a)                 (*(unsigned long long *)(a))
-
-#define __arch_putb(v, a)              (*(unsigned char *)(a) = (v))
-#define __arch_putw(v, a)              (*(unsigned short *)(a) = (v))
-#define __arch_putl(v, a)              (*(unsigned int *)(a) = (v))
-#define __arch_putq(v, a)              (*(unsigned long long *)(a) = (v))
+#define __arch_getb(a)                 (*(volatile unsigned char *)(a))
+#define __arch_getw(a)                 (*(volatile unsigned short *)(a))
+#define __arch_getl(a)                 (*(volatile unsigned int *)(a))
+#define __arch_getq(a)                 (*(volatile unsigned long long *)(a))
+
+#define __arch_putb(v, a)              (*(volatile unsigned char *)(a) = (v))
+#define __arch_putw(v, a)              (*(volatile unsigned short *)(a) = (v))
+#define __arch_putl(v, a)              (*(volatile unsigned int *)(a) = (v))
+#define __arch_putq(v, a)              (*(volatile unsigned long long *)(a) = (v))
 
 #define __raw_writeb(v, a)             __arch_putb(v, a)
 #define __raw_writew(v, a)             __arch_putw(v, a)