|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [PATCH 30/40] arm64: set the mapping for console and xenbus
On Mon, Nov 06, 2017 at 05:31:43PM +0000, Julien Grall wrote:
> Hi Shijie,
>
> On 03/11/17 03:12, Huang Shijie wrote:
> > This patch sets the mapping for console and xenbus:
> > .1) Use the page granule (4K) to setup the page table.
>
> This should belong to the patch building page-table.
Please just keep it here..
This is the first place where we use the 4k page size.
>
> > .2) Use the alloc_new_page() to get new page from the memory
> > system.
> >
> > Change-Id: Ic512c89412e40cbff8ebb1635e798357378485a0
> > Jira: ENTOS-247
> > Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx>
> > ---
> > arch/arm/mm.c | 60
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> > 1 file changed, 55 insertions(+), 5 deletions(-)
> >
> > diff --git a/arch/arm/mm.c b/arch/arm/mm.c
> > index fb7886c..f85e5a0 100644
> > --- a/arch/arm/mm.c
> > +++ b/arch/arm/mm.c
> > @@ -37,16 +37,43 @@ static inline void set_pgt_entry(lpae_t *ptr, lpae_t
> > val)
> > isb();
> > }
> > +static void build_pte(lpae_t *pud, unsigned long vaddr, unsigned long vend,
> > + paddr_t phys, long mem_type)
> > +{
> > + lpae_t *pte;
> > +
> > + pte = (lpae_t *)to_virt((*pud) & ~ATTR_MASK_L) + l3_pgt_idx(vaddr);
> > + do {
> > + set_pgt_entry(pte, (phys & L3_MASK) | mem_type | L3_PAGE);
> > +
> > + vaddr += L3_SIZE;
> > + phys += L3_SIZE;
> > + pte++;
> > + } while (vaddr < vend);
> > +}
> > +
> > static void build_pud(lpae_t *pgd, unsigned long vaddr, unsigned long
> > vend,
> > paddr_t phys, long mem_type,
> > paddr_t (*new_page)(void), int level)
> > {
> > lpae_t *pud;
> > + unsigned long next;
> > pud = (lpae_t *)to_virt((*pgd) & ~ATTR_MASK_L) + l2_pgt_idx(vaddr);
> > do {
> > - if (level == 2)
> > + if (level == 2) {
> > set_pgt_entry(pud, (phys & L2_MASK) | mem_type | L2_BLOCK);
> > + } else if (level == 3) {
> > + next = vaddr + L2_SIZE;
> > + if (next > vend)
> > + next = vend;
> > +
> > + if ((*pud) == L2_INVAL)
> > + set_pgt_entry(pud, (new_page()) | PT_PT);
> > +
> > + build_pte(pud, vaddr, next, phys, mem_type);
> > + }
> > +
> > vaddr += L2_SIZE;
> > phys += L2_SIZE;
> > pud++;
> > @@ -113,11 +140,38 @@ void init_pagetable(unsigned long *start_pfn,
> > unsigned long base_pfn,
> > *start_pfn = first_free_pfn;
> > }
> > +
> > +static paddr_t alloc_new_page(void)
> > +{
> > + unsigned long page;
> > +
> > + page = alloc_page();
> > + if (!page)
> > + BUG();
> > + memset((void *)page, 0, PAGE_SIZE);
> > + dsb(ishst);
> > + return to_phys(page);
> > +}
> > +
> > +unsigned long map_frame_virt(unsigned long mfn)
> > +{
> > + unsigned long vaddr = (unsigned long)mfn_to_virt(mfn);
>
> If you look at the implementation of to_virt on Arm64, it can return an
> address within the 64-bit address space. But you only support 39 bits of VA.
Currently, it is 39bit. but we can expand it in future.
>
> As you can't assume where it the console/xenbus frame in the memory layout,
> there are chance the virtual addresses will be well above 39-bits. Resulting
> to an access fault.
39bit is 512G. Does the mini-os can beyond 512G memory?
There is no virtual address above 39-bits now. If it really exits, we
can extand the address space to 64-bits.
>
> So you should allocate the virtual address on demand. You can look what x86
> does.
I will check that.
>
> This will also benefits when we will need to map lists of MFN in a
> contiguous way in the VA space.
>
> > +
> > + build_pagetable(vaddr, mfn, 1, BLOCK_DEF_ATTR, alloc_new_page, 3);
>
> I am a bit surprised that build_pagetable does not return an error. At least
> it may not be possible to allocate page-table.
If the build_pagetable() fails, it will reach the BUG().
If we need the return value of build_pagetable(), we can add it in
future. But currently, it is okay.
Thanks
Huang Shijie
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |