|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 1/8] xen/arm: introduce early_ioremap
On Wed, 19 Dec 2012, Ian Campbell wrote:
> On Tue, 2012-12-18 at 18:46 +0000, Stefano Stabellini wrote:
> > Introduce a function to map a range of physical memory into Xen virtual
> > memory.
> > It doesn't need domheap to be setup.
> > It is going to be used to map the videoram.
> >
> > Add flush_xen_data_tlb_range, that flushes a range of virtual addresses.
> >
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> > ---
> > xen/arch/arm/mm.c | 32 ++++++++++++++++++++++++++++++++
> > xen/include/asm-arm/config.h | 2 ++
> > xen/include/asm-arm/mm.h | 3 ++-
> > xen/include/asm-arm/page.h | 23 +++++++++++++++++++++++
> > 4 files changed, 59 insertions(+), 1 deletions(-)
> >
> > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> > index 855f83d..0d7a163 100644
> > --- a/xen/arch/arm/mm.c
> > +++ b/xen/arch/arm/mm.c
> > @@ -367,6 +367,38 @@ void __init setup_frametable_mappings(paddr_t ps,
> > paddr_t pe)
> > frametable_virt_end = FRAMETABLE_VIRT_START + (nr_pages *
> > sizeof(struct page_info));
> > }
> >
> > +/* Map the physical memory range start - start + len into virtual
> > + * memory and return the virtual address of the mapping.
> > + * start has to be 2MB aligned.
> > + * len has to be < EARLY_VMAP_END - EARLY_VMAP_START.
> > + */
> > +void* early_ioremap(paddr_t start, size_t len, unsigned attributes)
>
> Should be __init I think, to discourage its use later on. If when we
> need that they proper vmap+ioremap should be implemented.
OK
> > +{
> > + static unsigned long virt_start = EARLY_VMAP_START;
>
> Is the idea that if/when we implement proper vmap + ioremap support we
> should initialise the vmap area with EARLY_VMAP_START..virt_start
> already assigned and virt_start..EARLY_VMAP_END free (removing all the
> EARLY_ I guess)?
Yes, that was the idea.
> At some point I suppose we will need to integrate this with
> xen/common/vmap.c.
>
> > + void* ret_addr = (void *)virt_start;
> > + paddr_t end = start + len;
> > +
> > + ASSERT(!(start & (~SECOND_MASK)));
> > + ASSERT(!(virt_start & (~SECOND_MASK)));
> > +
> > + /* The range we need to map is too big */
> > + if ( virt_start + len >= EARLY_VMAP_END )
> > + return NULL;
> > +
> > + while ( start < end )
> > + {
> > + lpae_t e = mfn_to_xen_entry(start >> PAGE_SHIFT);
> > + e.pt.ai = attributes;
> > + write_pte(xen_second + second_table_offset(virt_start), e);
> > +
> > + start += SECOND_SIZE;
> > + virt_start += SECOND_SIZE;
> > + }
> > + flush_xen_data_tlb_range((unsigned long) ret_addr, len);
>
> Just cast this in the return? At the moment you cast to void* only to
> cast it back to unsigned long.
OK
> > +
> > + return ret_addr;
> > +}
> > +
> > enum mg { mg_clear, mg_ro, mg_rw, mg_rx };
> > static void set_pte_flags_on_range(const char *p, unsigned long l, enum mg
> > mg)
> > {
> > diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
> > index 2a05539..87db0d1 100644
> > --- a/xen/include/asm-arm/config.h
> > +++ b/xen/include/asm-arm/config.h
> > @@ -73,9 +73,11 @@
> > #define FIXMAP_ADDR(n) (mk_unsigned_long(0x00400000) + (n) *
> > PAGE_SIZE)
> > #define BOOT_MISC_VIRT_START mk_unsigned_long(0x00600000)
> > #define FRAMETABLE_VIRT_START mk_unsigned_long(0x02000000)
> > +#define EARLY_VMAP_START mk_unsigned_long(0x10000000)
>
> There is a comment right above here which describes Xen virtual memory
> layout, this needs updating as Tim requested before.
>
> Also the convention is FOO_VIRT_START.
OK
> > #define XENHEAP_VIRT_START mk_unsigned_long(0x40000000)
> > #define DOMHEAP_VIRT_START mk_unsigned_long(0x80000000)
> >
> > +#define EARLY_VMAP_END XENHEAP_VIRT_START
> > #define HYPERVISOR_VIRT_START XEN_VIRT_START
> >
> > #define DOMHEAP_ENTRIES 1024 /* 1024 2MB mapping slots */
> > diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h
> > index e95ece1..4ed5df6 100644
> > --- a/xen/include/asm-arm/mm.h
> > +++ b/xen/include/asm-arm/mm.h
> > @@ -150,7 +150,8 @@ extern void setup_frametable_mappings(paddr_t ps,
> > paddr_t pe);
> > extern void set_fixmap(unsigned map, unsigned long mfn, unsigned
> > attributes);
> > /* Remove a mapping from a fixmap entry */
> > extern void clear_fixmap(unsigned map);
> > -
> > +/* map a 2MB aligned physical range in virtual memory. */
> > +void* early_ioremap(paddr_t start, size_t len, unsigned attributes);
> >
> > #define mfn_valid(mfn) ({
> > \
> > unsigned long __m_f_n = (mfn);
> > \
> > diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h
> > index d89261e..0790dda 100644
> > --- a/xen/include/asm-arm/page.h
> > +++ b/xen/include/asm-arm/page.h
> > @@ -328,6 +328,23 @@ static inline void flush_xen_data_tlb_va(unsigned long
> > va)
> > : : "r" (va) : "memory");
> > }
> >
> > +/*
> > + * Flush a range of VA's hypervisor mappings from the data TLB. This is not
> > + * sufficient when changing code mappings or for self modifying code.
> > + */
> > +static inline void flush_xen_data_tlb_range(unsigned long va, unsigned
> > long size)
> > +{
> > + unsigned long end = va + size;
> > + while ( va < end ) {
> > + asm volatile("dsb;" /* Ensure preceding are visible */
>
> Either this dsb should be on the next line (aligned with the following
> lines) or the following lines should be indented further to match (we
> have both styles in this file, but lets not have a 3rd).
OK
> Although it would probably be better to just call flush_xen_data_tlb_va
> here?
>
> Function should be flush_xen_data_tlb_range_va I think. I'm not sure it
> is worth a new function though, perhaps just add size to the existing
> flush_xen_data_tlb_va, there's not too many callers?
OK, I'll keep and rename the new function
> While I was grepping I noticed flush_xen_data_tlb_va(dest_va) in
> setup_pagetables(). dest_va has just been setup with a second level (2M
> mapping). Is it not a bit dodgy to only flush the first 4K of that?
You are right! WOW! Nice catch!
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |