Commit 8664240e authored by Mark Starovoytov's avatar Mark Starovoytov Committed by David S. Miller

net: atlantic: add alignment checks in hw_atl2_utils_fw.c

This patch adds alignment checks in all the helper macros in
hw_atl2_utils_fw.c
These alignment checks are compile-time, so runtime is not affected.

All these helper macros assume the length to be aligned (multiple of 4).
If it's not aligned, then there might be issues, e.g. stack corruption.
Signed-off-by: default avatarMark Starovoytov <mstarovoitov@marvell.com>
Signed-off-by: default avatarIgor Russkikh <irusskikh@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6ec99221
...@@ -16,15 +16,29 @@ ...@@ -16,15 +16,29 @@
#define AQ_A2_FW_READ_TRY_MAX 1000 #define AQ_A2_FW_READ_TRY_MAX 1000
#define hw_atl2_shared_buffer_write(HW, ITEM, VARIABLE) \ #define hw_atl2_shared_buffer_write(HW, ITEM, VARIABLE) \
{\
BUILD_BUG_ON_MSG((offsetof(struct fw_interface_in, ITEM) % \
sizeof(u32)) != 0,\
"Unaligned write " # ITEM);\
BUILD_BUG_ON_MSG((sizeof(VARIABLE) % sizeof(u32)) != 0,\
"Unaligned write length " # ITEM);\
hw_atl2_mif_shared_buf_write(HW,\ hw_atl2_mif_shared_buf_write(HW,\
(offsetof(struct fw_interface_in, ITEM) / sizeof(u32)),\ (offsetof(struct fw_interface_in, ITEM) / sizeof(u32)),\
(u32 *)&(VARIABLE), sizeof(VARIABLE) / sizeof(u32)) (u32 *)&(VARIABLE), sizeof(VARIABLE) / sizeof(u32));\
}
#define hw_atl2_shared_buffer_get(HW, ITEM, VARIABLE) \ #define hw_atl2_shared_buffer_get(HW, ITEM, VARIABLE) \
{\
BUILD_BUG_ON_MSG((offsetof(struct fw_interface_in, ITEM) % \
sizeof(u32)) != 0,\
"Unaligned get " # ITEM);\
BUILD_BUG_ON_MSG((sizeof(VARIABLE) % sizeof(u32)) != 0,\
"Unaligned get length " # ITEM);\
hw_atl2_mif_shared_buf_get(HW, \ hw_atl2_mif_shared_buf_get(HW, \
(offsetof(struct fw_interface_in, ITEM) / sizeof(u32)),\ (offsetof(struct fw_interface_in, ITEM) / sizeof(u32)),\
(u32 *)&(VARIABLE), \ (u32 *)&(VARIABLE), \
sizeof(VARIABLE) / sizeof(u32)) sizeof(VARIABLE) / sizeof(u32));\
}
/* This should never be used on non atomic fields, /* This should never be used on non atomic fields,
* treat any > u32 read as non atomic. * treat any > u32 read as non atomic.
...@@ -33,7 +47,9 @@ ...@@ -33,7 +47,9 @@
{\ {\
BUILD_BUG_ON_MSG((offsetof(struct fw_interface_out, ITEM) % \ BUILD_BUG_ON_MSG((offsetof(struct fw_interface_out, ITEM) % \
sizeof(u32)) != 0,\ sizeof(u32)) != 0,\
"Non aligned read " # ITEM);\ "Unaligned read " # ITEM);\
BUILD_BUG_ON_MSG((sizeof(VARIABLE) % sizeof(u32)) != 0,\
"Unaligned read length " # ITEM);\
BUILD_BUG_ON_MSG(sizeof(VARIABLE) > sizeof(u32),\ BUILD_BUG_ON_MSG(sizeof(VARIABLE) > sizeof(u32),\
"Non atomic read " # ITEM);\ "Non atomic read " # ITEM);\
hw_atl2_mif_shared_buf_read(HW, \ hw_atl2_mif_shared_buf_read(HW, \
...@@ -42,10 +58,18 @@ ...@@ -42,10 +58,18 @@
} }
#define hw_atl2_shared_buffer_read_safe(HW, ITEM, DATA) \ #define hw_atl2_shared_buffer_read_safe(HW, ITEM, DATA) \
({\
BUILD_BUG_ON_MSG((offsetof(struct fw_interface_out, ITEM) % \
sizeof(u32)) != 0,\
"Unaligned read_safe " # ITEM);\
BUILD_BUG_ON_MSG((sizeof(((struct fw_interface_out *)0)->ITEM) % \
sizeof(u32)) != 0,\
"Unaligned read_safe length " # ITEM);\
hw_atl2_shared_buffer_read_block((HW), \ hw_atl2_shared_buffer_read_block((HW), \
(offsetof(struct fw_interface_out, ITEM) / sizeof(u32)),\ (offsetof(struct fw_interface_out, ITEM) / sizeof(u32)),\
sizeof(((struct fw_interface_out *)0)->ITEM) / sizeof(u32),\ sizeof(((struct fw_interface_out *)0)->ITEM) / sizeof(u32),\
(DATA)) (DATA));\
})
static int hw_atl2_shared_buffer_read_block(struct aq_hw_s *self, static int hw_atl2_shared_buffer_read_block(struct aq_hw_s *self,
u32 offset, u32 dwords, void *data) u32 offset, u32 dwords, void *data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment