Rust will use common::Opaque to hide the details of C structures, which helps avoid direct manipulation of C memory from the Rust side.
Therefore, it is necessary to create a translation binding wrapper that returns a pointer to a MemoryRegionSection, instead of returning a copy by value. As a first step, make flatview_do_translate() return a pointer to a MemoryRegionSection so that we can build a wrapper around it. In addition, add a global variable `unassigned_section` to provide a pointer to an invalid MemoryRegionSection. Signed-off-by: Zhao Liu <[email protected]> --- system/physmem.c | 51 ++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/system/physmem.c b/system/physmem.c index f807e60aa348..418fc79ff2c0 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -104,6 +104,9 @@ AddressSpace address_space_io; AddressSpace address_space_memory; static MemoryRegion io_mem_unassigned; +static MemoryRegionSection unassigned_section = { + .mr = &io_mem_unassigned +}; typedef struct PhysPageEntry PhysPageEntry; @@ -419,14 +422,11 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x * This function is called from RCU critical section. It is the common * part of flatview_do_translate and address_space_translate_cached. */ -static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iommu_mr, - hwaddr *xlat, - hwaddr *plen_out, - hwaddr *page_mask_out, - bool is_write, - bool is_mmio, - AddressSpace **target_as, - MemTxAttrs attrs) +static MemoryRegionSection * +address_space_translate_iommu(IOMMUMemoryRegion *iommu_mr, hwaddr *xlat, + hwaddr *plen_out, hwaddr *page_mask_out, + bool is_write, bool is_mmio, + AddressSpace **target_as, MemTxAttrs attrs) { MemoryRegionSection *section; hwaddr page_mask = (hwaddr)-1; @@ -464,10 +464,10 @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm if (page_mask_out) { *page_mask_out = page_mask; } - return *section; + return section; unassigned: - return (MemoryRegionSection) { .mr = &io_mem_unassigned }; + return &unassigned_section; } /** @@ -490,15 +490,10 @@ unassigned: * * This function is called from RCU critical section */ -static MemoryRegionSection flatview_do_translate(FlatView *fv, - hwaddr addr, - hwaddr *xlat, - hwaddr *plen_out, - hwaddr *page_mask_out, - bool is_write, - bool is_mmio, - AddressSpace **target_as, - MemTxAttrs attrs) +static MemoryRegionSection * +flatview_do_translate(FlatView *fv, hwaddr addr, hwaddr *xlat, hwaddr *plen_out, + hwaddr *page_mask_out, bool is_write, bool is_mmio, + AddressSpace **target_as, MemTxAttrs attrs) { MemoryRegionSection *section; IOMMUMemoryRegion *iommu_mr; @@ -524,14 +519,14 @@ static MemoryRegionSection flatview_do_translate(FlatView *fv, *page_mask_out = ~TARGET_PAGE_MASK; } - return *section; + return section; } /* Called from RCU critical section */ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr, bool is_write, MemTxAttrs attrs) { - MemoryRegionSection section; + MemoryRegionSection *section; hwaddr xlat, page_mask; /* @@ -543,13 +538,13 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr, attrs); /* Illegal translation */ - if (section.mr == &io_mem_unassigned) { + if (section->mr == &io_mem_unassigned) { goto iotlb_fail; } /* Convert memory region offset into address space offset */ - xlat += section.offset_within_address_space - - section.offset_within_region; + xlat += section->offset_within_address_space - + section->offset_within_region; return (IOMMUTLBEntry) { .target_as = as, @@ -570,13 +565,13 @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat, MemTxAttrs attrs) { MemoryRegion *mr; - MemoryRegionSection section; + MemoryRegionSection *section; AddressSpace *as = NULL; /* This can be MMIO, so setup MMIO bit. */ section = flatview_do_translate(fv, addr, xlat, plen, NULL, is_write, true, &as, attrs); - mr = section.mr; + mr = section->mr; if (xen_map_cache_enabled() && memory_access_is_direct(mr, is_write, attrs)) { @@ -3908,7 +3903,7 @@ static inline MemoryRegion *address_space_translate_cached( const MemoryRegionCache *cache, hwaddr addr, hwaddr *xlat, hwaddr *plen, bool is_write, MemTxAttrs attrs) { - MemoryRegionSection section; + MemoryRegionSection *section; MemoryRegion *mr; IOMMUMemoryRegion *iommu_mr; AddressSpace *target_as; @@ -3926,7 +3921,7 @@ static inline MemoryRegion *address_space_translate_cached( section = address_space_translate_iommu(iommu_mr, xlat, plen, NULL, is_write, true, &target_as, attrs); - return section.mr; + return section->mr; } /* Called within RCU critical section. */ -- 2.34.1
