mirror of https://gitee.com/openkylin/linux.git
e6599adfad
Previously, vpu->recv_buf and send_buf are forced cast from
void __iomem *tcm. vpu->recv_buf->share_buf is passed to
vpu_ipi_desc.handler(). It's not able to do unaligned access. Otherwise
kernel would crash due to unable to handle kernel paging request.
struct vpu_run {
u32 signaled;
char fw_ver[VPU_FW_VER_LEN];
unsigned int dec_capability;
unsigned int enc_capability;
wait_queue_head_t wq;
};
fw_ver starts at 4 byte boundary. If system enables
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS, strscpy() will do
read_word_at_a_time(), which tries to read 8-byte: *(unsigned long *)addr
vpu_init_ipi_handler() calls strscpy(), which would lead to crash.
vpu_init_ipi_handler() and several other handlers (eg.
vpu_dec_ipi_handler) only do read access to this data, so they can be
const, and we can use memcpy_fromio() to copy the buf to another non iomem
buffer then pass to handler.
Fixes:
|
||
---|---|---|
.. | ||
vdec | ||
venc | ||
Makefile | ||
mtk_vcodec_dec.c | ||
mtk_vcodec_dec.h | ||
mtk_vcodec_dec_drv.c | ||
mtk_vcodec_dec_pm.c | ||
mtk_vcodec_dec_pm.h | ||
mtk_vcodec_drv.h | ||
mtk_vcodec_enc.c | ||
mtk_vcodec_enc.h | ||
mtk_vcodec_enc_drv.c | ||
mtk_vcodec_enc_pm.c | ||
mtk_vcodec_enc_pm.h | ||
mtk_vcodec_intr.c | ||
mtk_vcodec_intr.h | ||
mtk_vcodec_util.c | ||
mtk_vcodec_util.h | ||
vdec_drv_base.h | ||
vdec_drv_if.c | ||
vdec_drv_if.h | ||
vdec_ipi_msg.h | ||
vdec_vpu_if.c | ||
vdec_vpu_if.h | ||
venc_drv_base.h | ||
venc_drv_if.c | ||
venc_drv_if.h | ||
venc_ipi_msg.h | ||
venc_vpu_if.c | ||
venc_vpu_if.h |