Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bbba38a authored by Huang Ying's avatar Huang Ying Committed by Len Brown
Browse files

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
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -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;
}