From: Wei Liu Date: Wed, 12 Dec 2018 16:19:52 +0000 (+0000) Subject: xxx debug X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e7158d0f499301d453e676fd5d44734f077f7062;p=people%2Fliuw%2Fxen.git xxx debug --- diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 1431f347f3..9d801025ee 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -365,8 +365,10 @@ void __init arch_init_memory(void) ASSERT(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS); if ( l4_table_offset(split_va) == l4_table_offset(split_va - 1) ) { - l3_pgentry_t *l3tab = alloc_xen_pagetable(); - + l3_pgentry_t *l3tab; + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); + l3tab = alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); if ( l3tab ) { const l3_pgentry_t *l3idle = @@ -4764,8 +4766,10 @@ void *alloc_xen_pagetable(void) { if ( system_state != SYS_STATE_early_boot ) { - void *ptr = alloc_xenheap_page(); - + void *ptr; + printk(" XXXX %s:%d\n", __FILE__, __LINE__); + ptr = alloc_xenheap_page(); + printk(" XXXX %s:%d %p\n", __FILE__, __LINE__, ptr); BUG_ON(!hardware_domain && !ptr); return ptr; } @@ -4789,8 +4793,10 @@ static l3_pgentry_t *virt_to_xen_l3e(unsigned long v) if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) ) { bool locking = system_state > SYS_STATE_boot; - l3_pgentry_t *pl3e = alloc_xen_pagetable(); - + l3_pgentry_t *pl3e; + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); + pl3e = alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d %p\n", __FILE__, __func__, __LINE__, pl3e); if ( !pl3e ) return NULL; clear_page(pl3e); @@ -4824,8 +4830,10 @@ static l2_pgentry_t *virt_to_xen_l2e(unsigned long v) if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) ) { bool locking = system_state > SYS_STATE_boot; - l2_pgentry_t *pl2e = alloc_xen_pagetable(); - + l2_pgentry_t *pl2e; + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); + pl2e= alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d %p\n", __FILE__, __func__, __LINE__, pl2e); if ( !pl2e ) return NULL; clear_page(pl2e); @@ -4857,8 +4865,10 @@ l1_pgentry_t *virt_to_xen_l1e(unsigned long v) if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) ) { bool locking = system_state > SYS_STATE_boot; - l1_pgentry_t *pl1e = alloc_xen_pagetable(); - + l1_pgentry_t *pl1e; + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); + pl1e = alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d %p\n", __FILE__, __func__, __LINE__, pl1e); if ( !pl1e ) return NULL; clear_page(pl1e); @@ -5007,8 +5017,9 @@ int map_pages_to_xen( nr_mfns -= i; continue; } - + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); pl2e = alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); if ( pl2e == NULL ) return -ENOMEM; @@ -5106,8 +5117,9 @@ int map_pages_to_xen( nr_mfns -= i; goto check_l3; } - + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); pl1e = alloc_xen_pagetable(); + printk(" XXXX %s:%s:%d\n", __FILE__, __func__, __LINE__); if ( pl1e == NULL ) return -ENOMEM; diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 126a486d2e..3758c8cbc1 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -511,8 +511,10 @@ void __init paging_init(void) if ( !(l4e_get_flags(idle_pg_table[l4_table_offset(va)]) & _PAGE_PRESENT) ) { - l3_pgentry_t *pl3t = alloc_xen_pagetable(); - + l3_pgentry_t *pl3t; + printk(" XXXX %s:%d\n", __FILE__, __LINE__); + pl3t = alloc_xen_pagetable(); + printk(" XXXX %s:%d\n", __FILE__, __LINE__); if ( !pl3t ) goto nomem; clear_page(pl3t); @@ -520,14 +522,16 @@ void __init paging_init(void) l4e_from_paddr(__pa(pl3t), __PAGE_HYPERVISOR_RW)); } } - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); /* Create user-accessible L2 directory to map the MPT for guests. */ if ( (l3_ro_mpt = alloc_xen_pagetable()) == NULL ) goto nomem; + printk(" XXXX %s:%d\n", __FILE__, __LINE__); clear_page(l3_ro_mpt); + printk(" XXXX %s:%d\n", __FILE__, __LINE__); l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)], l4e_from_paddr(__pa(l3_ro_mpt), __PAGE_HYPERVISOR_RO | _PAGE_USER)); - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); /* * Allocate and map the machine-to-phys table. * This also ensures L3 is present for fixmaps. @@ -565,6 +569,7 @@ void __init paging_init(void) i += (1UL << PAGETABLE_ORDER) - 1; continue; } + printk(" XXXX %s:%d\n", __FILE__, __LINE__); if ( holes == 0 && (l1_pg = alloc_domheap_pages(NULL, 2 * PAGETABLE_ORDER, memflags)) != NULL ) diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index efd2b79a54..b5154047ff 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -2189,17 +2189,18 @@ void *alloc_xenheap_pages(unsigned int order, unsigned int memflags) memflags &= ~MEMF_bits(~0U); if ( !(memflags >> _MEMF_bits) ) memflags |= MEMF_bits(xenheap_bits); - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); pg = alloc_domheap_pages(NULL, order, memflags | MEMF_no_scrub); if ( unlikely(pg == NULL) ) return NULL; - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); for ( i = 0; i < (1u << order); i++ ) pg[i].count_info |= PGC_xen_heap; - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); mfn = page_to_mfn(pg); - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); v = vmap(&mfn, 1u << order); + printk(" XXXX %s:%d\n", __FILE__, __LINE__); /* The assumption is xenheap is always mapped */ ASSERT(v); return v; diff --git a/xen/common/vmap.c b/xen/common/vmap.c index 37922f735b..165db5ed89 100644 --- a/xen/common/vmap.c +++ b/xen/common/vmap.c @@ -112,7 +112,7 @@ static void *vm_alloc(unsigned int nr, unsigned int align, if ( start >= vm_top[t] ) { unsigned long va = (unsigned long)vm_bitmap(t) + vm_top[t] / 8; - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); if ( !map_pages_to_xen(va, page_to_mfn(pg), 1, PAGE_HYPERVISOR) ) { clear_page((void *)va); @@ -122,7 +122,7 @@ static void *vm_alloc(unsigned int nr, unsigned int align, continue; } } - + printk(" XXXX %s:%d\n", __FILE__, __LINE__); free_domheap_page(pg); if ( start >= vm_top[t] ) @@ -214,11 +214,18 @@ void *__vmap(const mfn_t *mfn, unsigned int granularity, for ( ; va && nr--; ++mfn, cur += PAGE_SIZE * granularity ) { - if ( map_pages_to_xen(cur, *mfn, granularity, flags) ) + int rc; + printk(" XXXX %s:%d\n", __FILE__, __LINE__); + printk(" XXX map %lx, %"PRI_mfn", %u, %x\n", cur, mfn_x(*mfn), + granularity, flags); + rc = map_pages_to_xen(cur, *mfn, granularity, flags); + if ( rc ) { + printk(" XXX rc = %d\n", rc); vunmap(va); va = NULL; } + printk(" XXXX %s:%d\n", __FILE__, __LINE__); } return va; diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 6faa563167..c2785c4586 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -315,6 +315,13 @@ static inline struct page_info *__virt_to_page(const void *v) ASSERT(va >= XEN_VIRT_START); ASSERT(va < DIRECTMAP_VIRT_END); + +#if 0 + /* XXX interaction with the rest? See config.h for whole map. */ + if ( va >= VMAP_VIRT_START && va < VMAP_VIRT_END ) + return vmap_to_page(va); +#endif + if ( va < XEN_VIRT_END ) va += DIRECTMAP_VIRT_START - XEN_VIRT_START + xen_phys_start; else