Commit 0bbba38a authored by Huang Ying's avatar Huang Ying Committed by 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: default avatarJavier Martinez Canillas <martinez.javier@gmail.com>
Reported-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarHuang Ying <ying.huang@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 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%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment