mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 15:58:47 +00:00
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: Javier Martinez Canillas <martinez.javier@gmail.com> Reported-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
0c827eebfc
commit
0bbba38a61
@ -266,13 +266,30 @@ static int erst_exec_move_data(struct apei_exec_context *ctx,
|
||||
{
|
||||
int rc;
|
||||
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);
|
||||
if (rc)
|
||||
return rc;
|
||||
memmove((void *)ctx->dst_base + offset,
|
||||
(void *)ctx->src_base + offset,
|
||||
ctx->var2);
|
||||
|
||||
src = ioremap(ctx->src_base + offset, 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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user