|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 03/12] xen/riscv: implement copy_to_guest_phys()
On 10.04.2026 17:54, Oleksii Kurochko wrote:
> Introduce copy_to_guest_phys() for RISC-V, based on the Arm implementation.
>
> Add a generic copy_guest() helper for copying to and from guest physical
> (and potentially virtual addresses in the future), and implement
> translate_get_page() to translate a guest physical address into a struct
> page_info via the domain p2m.
>
> Compared to the Arm code:
> - Drop COPY_flush_dcache(), as no such use cases exist on RISC-V.
> - Do not implement the linear mapping case, which is currently unused.
> - Use PAGE_OFFSET() to initialize the local offset variable in copy_guest().
>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
with ...
> --- /dev/null
> +++ b/xen/arch/riscv/guestcopy.c
> @@ -0,0 +1,116 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +#include <xen/domain_page.h>
> +#include <xen/page-size.h>
> +#include <xen/sched.h>
> +#include <xen/string.h>
> +
> +#include <asm/guest_access.h>
> +
> +#define COPY_from_guest 0U
> +#define COPY_to_guest BIT(0, U)
> +#define COPY_gpa 0U
> +#define COPY_gva BIT(1, U)
> +
> +typedef union
> +{
> + struct
> + {
> + struct vcpu *v;
> + } gva;
> +
> + struct
> + {
> + struct domain *d;
> + } gpa;
> +} copy_info_t;
> +
> +#define GVA_INFO(vcpu) ((copy_info_t) { .gva = { vcpu } })
> +#define GPA_INFO(domain) ((copy_info_t) { .gpa = { domain } })
> +
> +static struct page_info *translate_get_page(copy_info_t info, uint64_t addr,
> + bool gva, bool write)
> +{
> + p2m_type_t p2mt;
> + struct page_info *page;
> +
> + /*
> + * Not implemented yet.
> + *
> + * If gva == true, the operation will likely require a struct vcpu
> + * rather than just a struct domain. For this reason copy_info_t is
> + * already passed here instead of only struct domain.
> + */
> + BUG_ON(gva);
> +
> + page = get_page_from_gfn(info.gpa.d, paddr_to_pfn(addr), &p2mt,
> P2M_ALLOC);
> +
> + if ( !page )
> + return NULL;
> +
> + if ( write ? p2mt != p2m_ram_rw : !p2m_is_ram(p2mt) )
> + {
> + put_page(page);
> + return NULL;
> + }
> +
> + return page;
> +}
> +
> +static unsigned long copy_guest(void *buf, uint64_t addr, unsigned long len,
> + copy_info_t info, unsigned int flags)
> +{
> + unsigned int offset = PAGE_OFFSET(addr);
> +
> + BUILD_BUG_ON((sizeof(addr)) < sizeof(vaddr_t));
> + BUILD_BUG_ON((sizeof(addr)) < sizeof(paddr_t));
> +
> + while ( len )
> + {
> + void *p;
> + unsigned long size = min_t(unsigned long, len, PAGE_SIZE - offset);
... this adjusted to whatever the final shape is going to be on Arm.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |