From: Julien Grall <julien@xen.org>
To: xen-devel@lists.xenproject.org
Cc: alex.bennee@linaro.org, masami.hiramatsu@linaro.org,
ehem+xen@m5p.com, bertrand.marquis@arm.com,
andre.przywara@arm.com, Julien Grall <jgrall@amazon.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Julien Grall <julien@xen.org>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>,
Wei Xu <xuwei5@hisilicon.com>
Subject: [PATCH 2/4] xen/arm: acpi: The fixmap area should always be cleared during failure/unmap
Date: Sat, 26 Sep 2020 21:55:40 +0100 [thread overview]
Message-ID: <20200926205542.9261-3-julien@xen.org> (raw)
In-Reply-To: <20200926205542.9261-1-julien@xen.org>
From: Julien Grall <jgrall@amazon.com>
Commit 022387ee1ad3 "xen/arm: mm: Don't open-code Xen PT update in
{set, clear}_fixmap()" enforced that each set_fixmap() should be
paired with a clear_fixmap(). Any failure to follow the model would
result to a platform crash.
Unfortunately, the use of fixmap in the ACPI code was overlooked as it
is calling set_fixmap() but not clear_fixmap().
The function __acpi_os_map_table() is reworked so:
- We know before the mapping whether the fixmap region is big
enough for the mapping.
- It will fail if the fixmap is always inuse.
The function __acpi_os_unmap_table() will now call clear_fixmap().
Reported-by: Wei Xu <xuwei5@hisilicon.com>
Signed-off-by: Julien Grall <jgrall@amazon.com>
---
The discussion on the original thread [1] suggested to also zap it on
x86. This is technically not necessary today, so it is left alone for
now.
I looked at making the fixmap code common but the index are inverted
between Arm and x86.
[1] https://lore.kernel.org/xen-devel/5E26C935.9080107@hisilicon.com/
---
xen/arch/arm/acpi/lib.c | 75 +++++++++++++++++++++++++++++++----------
1 file changed, 58 insertions(+), 17 deletions(-)
diff --git a/xen/arch/arm/acpi/lib.c b/xen/arch/arm/acpi/lib.c
index 2192a5519171..eebaca695562 100644
--- a/xen/arch/arm/acpi/lib.c
+++ b/xen/arch/arm/acpi/lib.c
@@ -25,38 +25,79 @@
#include <xen/init.h>
#include <xen/mm.h>
+static bool fixmap_inuse;
+
char *__acpi_map_table(paddr_t phys, unsigned long size)
{
- unsigned long base, offset, mapped_size;
- int idx;
+ unsigned long base, offset;
+ mfn_t mfn;
+ unsigned int idx;
/* No arch specific implementation after early boot */
if ( system_state >= SYS_STATE_boot )
return NULL;
offset = phys & (PAGE_SIZE - 1);
- mapped_size = PAGE_SIZE - offset;
- set_fixmap(FIXMAP_ACPI_BEGIN, maddr_to_mfn(phys), PAGE_HYPERVISOR);
- base = FIXMAP_ADDR(FIXMAP_ACPI_BEGIN);
+ base = FIXMAP_ADDR(FIXMAP_ACPI_BEGIN) + offset;
+
+ /* Check the fixmap is big enough to map the region */
+ if ( (FIXMAP_ADDR(FIXMAP_ACPI_END) + PAGE_SIZE - base) < size )
+ return NULL;
+
+ /* With the fixmap, we can only map one region at the time */
+ if ( fixmap_inuse )
+ return NULL;
- /* Most cases can be covered by the below. */
+ fixmap_inuse = true;
+
+ size += offset;
+ mfn = maddr_to_mfn(phys);
idx = FIXMAP_ACPI_BEGIN;
- while ( mapped_size < size )
- {
- if ( ++idx > FIXMAP_ACPI_END )
- return NULL; /* cannot handle this */
- phys += PAGE_SIZE;
- set_fixmap(idx, maddr_to_mfn(phys), PAGE_HYPERVISOR);
- mapped_size += PAGE_SIZE;
- }
- return ((char *) base + offset);
+ do {
+ set_fixmap(idx, mfn, PAGE_HYPERVISOR);
+ size -= min(size, (unsigned long)PAGE_SIZE);
+ mfn = mfn_add(mfn, 1);
+ idx++;
+ } while ( size > 0 );
+
+ return (char *)base;
}
bool __acpi_unmap_table(void *ptr, unsigned long size)
{
- return ( vaddr >= FIXMAP_ADDR(FIXMAP_ACPI_BEGIN) &&
- vaddr < (FIXMAP_ADDR(FIXMAP_ACPI_END) + PAGE_SIZE) );
+ vaddr_t vaddr = (vaddr_t)ptr;
+ unsigned int idx;
+
+ /* We are only handling fixmap address in the arch code */
+ if ( vaddr < FIXMAP_ADDR(FIXMAP_ACPI_BEGIN) ||
+ vaddr >= FIXMAP_ADDR(FIXMAP_ACPI_END) )
+ return false;
+
+ /*
+ * __acpi_map_table() will always return a pointer in the first page
+ * for the ACPI fixmap region. The caller is expected to free with
+ * the same address.
+ */
+ ASSERT((vaddr & PAGE_MASK) == FIXMAP_ADDR(FIXMAP_ACPI_BEGIN));
+
+ /* The region allocated fit in the ACPI fixmap region. */
+ ASSERT(size < (FIXMAP_ADDR(FIXMAP_ACPI_END) + PAGE_SIZE - vaddr));
+ ASSERT(fixmap_inuse);
+
+ fixmap_inuse = false;
+
+ size += FIXMAP_ADDR(FIXMAP_ACPI_BEGIN) - vaddr;
+ idx = FIXMAP_ACPI_BEGIN;
+
+ do
+ {
+ clear_fixmap(idx);
+ size -= min(size, (unsigned long)PAGE_SIZE);
+ idx++;
+ } while ( size > 0 );
+
+ return true;
}
/* True to indicate PSCI 0.2+ is implemented */
--
2.17.1
next prev parent reply other threads:[~2020-09-26 20:56 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-26 20:55 [PATCH 0/4] xen/arm: Unbreak ACPI Julien Grall
2020-09-26 20:55 ` [PATCH 1/4] xen/acpi: Rework acpi_os_map_memory() and acpi_os_unmap_memory() Julien Grall
2020-09-28 8:18 ` Jan Beulich
2020-09-28 9:58 ` Julien Grall
2020-09-28 10:09 ` Jan Beulich
2020-09-28 10:39 ` Julien Grall
2020-10-10 9:49 ` Julien Grall
2020-10-10 10:04 ` Julien Grall
2020-09-29 11:10 ` Rahul Singh
2020-10-01 0:06 ` Stefano Stabellini
2020-10-01 15:09 ` Julien Grall
2020-09-26 20:55 ` Julien Grall [this message]
2020-09-29 11:13 ` [PATCH 2/4] xen/arm: acpi: The fixmap area should always be cleared during failure/unmap Rahul Singh
2020-10-01 0:30 ` Stefano Stabellini
2020-10-01 15:14 ` Julien Grall
2020-09-26 20:55 ` [PATCH 3/4] xen/arm: Check if the platform is not using ACPI before initializing Dom0less Julien Grall
2020-09-29 11:17 ` Rahul Singh
2020-09-30 23:26 ` Stefano Stabellini
2020-09-26 20:55 ` [PATCH 4/4] xen/arm: Introduce fw_unreserved_regions() and use it Julien Grall
2020-09-30 23:40 ` Stefano Stabellini
2020-10-01 15:34 ` Julien Grall
2020-09-27 1:47 ` [PATCH 0/4] xen/arm: Unbreak ACPI Elliott Mitchell
2020-09-29 15:28 ` Elliott Mitchell
2020-09-28 6:47 ` Masami Hiramatsu
2020-09-28 12:41 ` [PATCH] xen: acpi: Hide UART address only if SPCR exists Masami Hiramatsu
2020-09-28 12:42 ` Masami Hiramatsu
2021-01-19 7:25 ` Elliott Mitchell
2021-01-20 18:05 ` Julien Grall
2020-09-28 13:00 ` [PATCH 0/4] xen/arm: Unbreak ACPI Masami Hiramatsu
2020-10-16 22:33 ` Xen-ARM EFI/ACPI problems (was: Re: [PATCH 0/4] xen/arm: Unbreak ACPI) Elliott Mitchell
2020-10-17 5:12 ` Elliott Mitchell
2020-10-08 18:39 ` [PATCH 0/4] xen/arm: Unbreak ACPI Elliott Mitchell
2020-10-09 9:39 ` Julien Grall
2020-10-09 14:22 ` Elliott Mitchell
2020-10-09 18:15 ` Julien Grall
2020-10-09 22:36 ` Elliott Mitchell
2020-10-09 21:49 ` Elliott Mitchell
2020-10-10 11:02 ` Julien Grall
2020-10-12 19:02 ` Stefano Stabellini
2020-10-12 21:34 ` Elliott Mitchell
2020-10-14 1:06 ` Stefano Stabellini
2020-10-14 1:37 ` Elliott Mitchell
2020-10-14 17:47 ` Julien Grall
2020-10-15 18:00 ` Stefano Stabellini
2020-10-14 17:44 ` Julien Grall
2020-09-29 11:10 ` Rahul Singh
2020-09-29 15:29 ` Alex Bennée
2020-09-29 17:07 ` Julien Grall
2020-09-29 21:11 ` Alex Bennée
2020-09-29 23:39 ` André Przywara
2020-09-30 8:51 ` Alex Bennée
2020-09-30 10:35 ` Julien Grall
2020-09-30 9:42 ` Julien Grall
2020-09-30 10:38 ` Alex Bennée
2020-09-30 11:10 ` Julien Grall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200926205542.9261-3-julien@xen.org \
--to=julien@xen.org \
--cc=Volodymyr_Babchuk@epam.com \
--cc=alex.bennee@linaro.org \
--cc=andre.przywara@arm.com \
--cc=bertrand.marquis@arm.com \
--cc=ehem+xen@m5p.com \
--cc=jgrall@amazon.com \
--cc=masami.hiramatsu@linaro.org \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
--cc=xuwei5@hisilicon.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).