提交 0bbba38a 编写于 作者: H Huang Ying 提交者: Len Brown

ACPI, APEI, Fix ERST MOVE_DATA instruction implementation

The src_base and dst_base fields in apei_exec_context are physical
address, so they should be ioremaped before being used in ERST
MOVE_DATA instruction.
Reported-by: NJavier Martinez Canillas <martinez.javier@gmail.com>
Reported-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NHuang Ying <ying.huang@intel.com>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 0c827eeb
...@@ -266,13 +266,30 @@ static int erst_exec_move_data(struct apei_exec_context *ctx, ...@@ -266,13 +266,30 @@ static int erst_exec_move_data(struct apei_exec_context *ctx,
{ {
int rc; int rc;
u64 offset; u64 offset;
void *src, *dst;
/* ioremap does not work in interrupt context */
if (in_interrupt()) {
pr_warning(ERST_PFX
"MOVE_DATA can not be used in interrupt context");
return -EBUSY;
}
rc = __apei_exec_read_register(entry, &offset); rc = __apei_exec_read_register(entry, &offset);
if (rc) if (rc)
return rc; return rc;
memmove((void *)ctx->dst_base + offset,
(void *)ctx->src_base + offset, src = ioremap(ctx->src_base + offset, ctx->var2);
ctx->var2); if (!src)
return -ENOMEM;
dst = ioremap(ctx->dst_base + offset, ctx->var2);
if (!dst)
return -ENOMEM;
memmove(dst, src, ctx->var2);
iounmap(src);
iounmap(dst);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册