|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v7 00/14] arm/mem_access: Walk guest page tables in SW if mem_access is active
Hi Julien,
On 08/04/2017 11:15 AM, Sergej Proskurin wrote:
> Hi Julien,
>
> Sorry for the late reply.
>
> On 07/31/2017 04:38 PM, Julien Grall wrote:
>>
>> On 18/07/17 13:24, Sergej Proskurin wrote:
>>> Hi all,
>> Hi,
>>
>>> The function p2m_mem_access_check_and_get_page is called from the function
>>> get_page_from_gva if mem_access is active and the hardware-aided
>>> translation of
>>> the given guest virtual address (gva) into machine address fails. That is,
>>> if
>>> the stage-2 translation tables constrain access to the guests's page tables,
>>> hardware-assisted translation will fail. The idea of the function
>>> p2m_mem_access_check_and_get_page is thus to translate the given gva and
>>> check
>>> the requested access rights in software. However, as the current
>>> implementation
>>> of p2m_mem_access_check_and_get_page makes use of the hardware-aided gva to
>>> ipa
>>> translation, the translation might also fail because of reasons stated above
>>> and will become equally relevant for the altp2m implementation on ARM. As
>>> such, we provide a software guest translation table walk to address the
>>> above
>>> mentioned issue.
>>>
>>> The current version of the implementation supports translation of both the
>>> short-descriptor as well as the long-descriptor translation table format on
>>> ARMv7 and ARMv8 (AArch32/AArch64).
>>>
>>> This revised version incorporates the comments of the previous patch
>>> series. In
>>> this patch version we refine the definition of PAGE_SIZE_GRAN and
>>> PAGE_MASK_GRAN. In particular, we use PAGE_SIZE_GRAN to define
>>> PAGE_MASK_GRAN
>>> and thus avoid these defines to have a differing type. We also changed the
>>> previously introduced macro BITS_PER_LONG_LONG to BITS_PER_LLONG. Further
>>> changes comprise minor adjustments in comments and renaming of macros and
>>> function parameters. Some additional changes comprising code readability and
>>> correct type usage have been made and stated in the individual commits.
>>>
>>> The following patch series can be found on Github[0].
>> I tried this series today with the change [1] in Xen to check the translation
>> is valid. However, I got a failure when booting non-LPAE arm32 Dom0:
>>
> That's odd.. Thanks for the information. I will investigate this issue
> next week, as soon as I have access to our ARMv7 board.
>
>> (XEN) Loading kernel from boot module @ 0000000080008000
>> (XEN) Allocating 1:1 mappings totalling 512MB for dom0:
>> (XEN) BANK[0] 0x000000a0000000-0x000000c0000000 (512MB)
>> (XEN) Grant table range: 0x000000ffe00000-0x000000ffe6a000
>> (XEN) Loading zImage from 0000000080008000 to
>> 00000000a7800000-00000000a7f50e28
>> (XEN) Allocating PPI 16 for event channel interrupt
>> (XEN) Loading dom0 DTB to 0x00000000a8000000-0x00000000a8001f8e
>> (XEN) Std. Loglevel: All
>> (XEN) Guest Loglevel: All
>> (XEN) guest_walk_tables: gva 0xffeff018 pipa 0x1c090018
>> (XEN) access_guest_memory_by_ipa: gpa 0xa0207ff8
>> (XEN) access_guest_memory_by_ipa: gpa 0xffffffffa13aebfc
>> (XEN) d0: guestcopy: failed to get table entry.
>> (XEN) Xen BUG at traps.c:2737
>> (XEN) ----[ Xen-4.10-unstable arm32 debug=y Not tainted ]----
>> (XEN) CPU: 0
>> (XEN) PC: 00264dc0 do_trap_guest_sync+0x161c/0x1804
>> (XEN) CPSR: a000005a MODE:Hypervisor
>> (XEN) R0: ffffffea R1: 00000000 R2: 00000000 R3: 0000004a
>> (XEN) R4: 93830007 R5: 47fcff58 R6: 93830007 R7: 00000007
>> (XEN) R8: 1c090000 R9: 00000000 R10:00000000 R11:47fcff54 R12:ffffffea
>> (XEN) HYP: SP: 47fcfee4 LR: 00258dec
>> (XEN)
>> (XEN) VTCR_EL2: 80003558
>> (XEN) VTTBR_EL2: 00010008f3ffc000
>> (XEN)
>> (XEN) SCTLR_EL2: 30cd187f
>> (XEN) HCR_EL2: 000000000038663f
>> (XEN) TTBR0_EL2: 00000000fff02000
>> (XEN)
>> (XEN) ESR_EL2: 00000000
>> (XEN) HPFAR_EL2: 00000000001c0900
>> (XEN) HDFAR: ffeff018
>> (XEN) HIFAR: 00000000
>> (XEN)
>> (XEN) Xen stack trace from sp=47fcfee4:
>> (XEN) 00000000 47fcff34 00256008 47fcfefc 47fcfefc 200000da 00000004
>> 47fd48f4
>> (XEN) 002d5ef0 00000004 002d1f00 00000004 00000000 002d1f00 c163f740
>> 93830007
>> (XEN) ffeff018 1c090018 00000000 47fcff44 c15e70ac 0000005b c15e70ac
>> c074400c
>> (XEN) 00000031 00000000 c0743ff8 47fcff58 00268ce0 c15e70ac 0000005b
>> 00000031
>> (XEN) ffeff000 c15e70ac 0000005b c15e70ac c074400c 00000031 00000000
>> c0743ff8
>> (XEN) 00000000 0000001f ffffffff 00000000 c074401c 200001d3 93830007
>> 00000000
>> (XEN) c161cac0 c161cac0 c1501de0 c0735640 c161cacc c161cacc c161cad8
>> c161cad8
>> (XEN) 00000000 00000000 00000000 00000000 00000000 c161cae4 c161cae4
>> 400001d3
>> (XEN) 00000000 00000000 00000000 00000000 00000000 dfdfdfcf cfdfdfdf
>> (XEN) Xen call trace:
>> (XEN) [<00264dc0>] do_trap_guest_sync+0x161c/0x1804 (PC)
>> (XEN) [<00258dec>] access_guest_memory_by_ipa+0x25c/0x284 (LR)
>> (XEN) [<00268ce0>] entry.o#return_from_trap+0/0x4
>> (XEN)
>> (XEN)
>> (XEN) ****************************************
>> (XEN) Panic on CPU 0:
>> (XEN) Xen BUG at traps.c:2737
>> (XEN) ****************************************
>> (XEN)
>> (XEN) Reboot in five seconds...
>>
>> The IPA 0xffffffffa13aebfc is not valid for the domain.
>>
>> Cheers,
>>
>> [1]
>> diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c
>> index 4ee07fcea3..89c5ebf3cf 100644
>> --- a/xen/arch/arm/guestcopy.c
>> +++ b/xen/arch/arm/guestcopy.c
>> @@ -139,6 +139,8 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t
>> gpa, void *buf,
>> return -EINVAL;
>> }
>>
>> + printk("%s: gpa 0x%llx\n", __FUNCTION__, gpa);
>> +
>> page = get_page_from_gfn(d, paddr_to_pfn(gpa), &p2mt, P2M_ALLOC);
>> if ( !page )
>> {
>> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
>> index c07999b518..904abafcae 100644
>> --- a/xen/arch/arm/traps.c
>> +++ b/xen/arch/arm/traps.c
>> @@ -2688,6 +2688,8 @@ static bool try_map_mmio(gfn_t gfn)
>> return !map_regions_p2mt(d, gfn, 1, mfn, p2m_mmio_direct_c);
>> }
>>
>> +#include <asm/guest_walk.h>
>> +
>> static void do_trap_data_abort_guest(struct cpu_user_regs *regs,
>> const union hsr hsr)
>> {
>> @@ -2725,6 +2727,17 @@ static void do_trap_data_abort_guest(struct
>> cpu_user_regs *regs,
>> return; /* Try again */
>> }
>>
>> + {
>> + paddr_t ipa, pipa;
>> + rc = gva_to_ipa(info.gva, &info.ipa, GV2M_READ);
There is no ipa field in mmio_info_t. But even if you used info.gpa
instead, the test that you have provided is unfortunately flawed:
>> + BUG_ON(rc);
>> + printk("guest_walk_tables: gva 0x%x pipa 0x%llx\n",
>> + info.gva, pipa);
>> + rc = guest_walk_tables(current, info.gva, &ipa, NULL);
>> + BUG_ON(rc);
>> + BUG_ON(ipa != pipa);
In your test-case you don't initialize pipa at all, however you test for
it in BUG_ON, which is the reason why it fails. I have adopted your test
case and it runs on ARMv7 (non-LPAE guest) and ARMv8 (LPAE guest)
without any issues. It would be great if you would verify this behaviour
by applying the following patch to the arm-gpt-walk-v7 patch [0] as before:
From a28db6321780c442b1c97aa78883dccbd84de7dd Mon Sep 17 00:00:00 2001
From: Sergej Proskurin <proskurin@xxxxxxxxxxxxx>
Date: Tue, 8 Aug 2017 13:30:00 +0200
Subject: [PATCH] Julien Grall's test case
---
xen/arch/arm/guestcopy.c | 2 ++
xen/arch/arm/traps.c | 13 +++++++++++++
2 files changed, 15 insertions(+)
diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c
index 4ee07fcea3..f2758ebd45 100644
--- a/xen/arch/arm/guestcopy.c
+++ b/xen/arch/arm/guestcopy.c
@@ -139,6 +139,8 @@ int access_guest_memory_by_ipa(struct domain *d,
paddr_t gpa, void *buf,
return -EINVAL;
}
+ printk("%s: gpa 0x%"PRIpaddr"\n", __FUNCTION__, gpa);
+
page = get_page_from_gfn(d, paddr_to_pfn(gpa), &p2mt, P2M_ALLOC);
if ( !page )
{
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index c07999b518..9b0b79a3fe 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -2688,6 +2688,8 @@ static bool try_map_mmio(gfn_t gfn)
return !map_regions_p2mt(d, gfn, 1, mfn, p2m_mmio_direct_c);
}
+#include <asm/guest_walk.h>
+
static void do_trap_data_abort_guest(struct cpu_user_regs *regs,
const union hsr hsr)
{
@@ -2725,6 +2727,17 @@ static void do_trap_data_abort_guest(struct
cpu_user_regs *regs,
return; /* Try again */
}
+ {
+ paddr_t ipa;
+ rc = gva_to_ipa(info.gva, &info.gpa, GV2M_READ);
+ BUG_ON(rc);
+ printk("guest_walk_tables: gva 0x%"PRIvaddr" pipa 0x%"PRIpaddr"\n",
+ info.gva, info.gpa);
+ rc = guest_walk_tables(current, info.gva, &ipa, NULL);
+ BUG_ON(rc);
+ BUG_ON(ipa != info.gpa);
+ }
+
switch ( fsc )
{
case FSC_FLT_PERM:
--
2.13.3
Thanks,
~Sergej
[0] https://github.com/sergej-proskurin/xen (branch arm-gpt-walk-v7)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |