ACPI, APEI, Fix ERST MOVE_DATA instruction implementation
Subsystems (3)
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 <[email protected]>
Reported-by Andrew Morton <[email protected]>
Signed-off-by Huang Ying <[email protected]>
--- drivers/acpi/apei/erst.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/acpi/apei/erst.c +17 -3
@@ -266,13 +266,27 @@ static int erst_exec_move_data(struct ap {int rc;u64 offset; +void *src, *dst; + +/* ioremap does not work in interrupt context */ +if (in_interrupt ()) +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 ; }