Date: Wed, 25 Jul 2007 09:16:31 GMT From: Rink Springer <rink@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 124077 for review Message-ID: <200707250916.l6P9GVVT088006@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124077 Change 124077 by rink@rink_pitchfork2 on 2007/07/25 09:16:27 First set of fixed for GCC 4. This includes massive changes to the paging initalization code (it's a lot more like NetBSD now). Futhermore, avoid polluting i386/i386/locore.S and ship our own file (the changes to i386/i38/locore.S will be reversted) Affected files ... .. //depot/projects/xen3/src/sys/conf/files.i386-xen#9 edit .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/locore.s#1 add .. //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#18 edit .. //depot/projects/xen3/src/sys/i386-xen/include/xenvar.h#9 edit .. //depot/projects/xen3/src/sys/i386/i386/locore.s#4 edit Differences ... ==== //depot/projects/xen3/src/sys/conf/files.i386-xen#9 (text+ko) ==== @@ -279,7 +279,7 @@ i386/i386/k6_mem.c optional mem i386/i386/legacy.c standard i386/i386/local_apic.c optional apic -i386/i386/locore.s standard no-obj +i386-xen/i386-xen/locore.s standard no-obj i386/i386/longrun.c optional cpu_enable_longrun i386-xen/i386-xen/machdep.c standard i386/i386/mem.c optional mem ==== //depot/projects/xen3/src/sys/i386-xen/i386-xen/xen_machdep.c#18 (text+ko) ==== @@ -72,10 +72,9 @@ shared_info_t *HYPERVISOR_shared_info; unsigned long *xen_machine_phys = ((unsigned long *)VADDR(1008, 0)); unsigned long *xen_phys_machine; -int preemptable; -int init_first; +int preemptable, init_first; +extern unsigned int avail_space; - void ni_cli(void); void ni_sti(void); @@ -314,6 +313,7 @@ struct mmuext_op op; op.cmd = MMUEXT_PIN_L1_TABLE; op.arg1.mfn = ma >> PAGE_SHIFT; + printk("xen_pt_pin(): mfn=%x\n", op.arg1.mfn); xen_flush_queue(); PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } @@ -583,6 +583,52 @@ bootmem_current -= size; } +static vm_paddr_t +xpmap_mtop2(vm_paddr_t mpa) +{ + return ((machine_to_phys_mapping[mpa >> PAGE_SHIFT] << PAGE_SHIFT) + ) | (mpa & ~PG_FRAME); +} + +static pd_entry_t +xpmap_get_bootpde(vm_paddr_t va) +{ + + return ((pd_entry_t *)xen_start_info->pt_base)[va >> 22]; +} + +static pd_entry_t +xpmap_get_vbootpde(vm_paddr_t va) +{ + pd_entry_t pde; + + pde = xpmap_get_bootpde(va); + if ((pde & PG_V) == 0) + return (pde & ~PG_FRAME); + return (pde & ~PG_FRAME) | + (xpmap_mtop2(pde & PG_FRAME) + KERNBASE); +} + +static pt_entry_t * +xpmap_get_bootptep(vm_paddr_t va) +{ + pd_entry_t pde; + + pde = xpmap_get_vbootpde(va); + if ((pde & PG_V) == 0) + return (void *)-1; +#define PT_MASK 0x003ff000 /* page table address bits */ + return &(((pt_entry_t *)(pde & PG_FRAME))[(va & PT_MASK) >> PAGE_SHIFT]); +} + +static pt_entry_t +xpmap_get_bootpte(vm_paddr_t va) +{ + + return xpmap_get_bootptep(va)[0]; +} + + static vm_offset_t *pdir_shadow; #ifdef ADD_ISA_HOLE @@ -614,9 +660,6 @@ for (i = 0; i < nr_pages; i++) { xen_machphys_update(phys_machine[i], i); } - - - memset(phys_machine, INVALID_P2M_ENTRY, PAGE_SIZE); } @@ -625,16 +668,13 @@ void initvalues(start_info_t *startinfo) { - int i, round_tmpindex; + int i; + unsigned int cur_space = avail_space; vm_paddr_t pdir_shadow_ma, KPTphys, *IdlePTDma; physdev_op_t op; -#ifdef SMP - int j; -#endif + printk("initvalues(): wooh - availmem=%x,%x\n",avail_space, cur_space); - printk("initvalues(): wooh\n"); - #ifdef WRITABLE_PAGETABLES printk("using writable pagetables\n"); HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); @@ -644,14 +684,13 @@ xen_phys_machine = (unsigned long *)startinfo->mfn_list; /* number of pages allocated after the pts + 1*/; - unsigned long tmpindex = (VTOPFN(xen_start_info->pt_base) + xen_start_info->nr_pt_frames) + 3; - printk("KERNBASE=%x,pt_base=%x, VTOPFN(base)=%x, nr_pt_frames=%x, initial tmpindex = %x\n", KERNBASE,xen_start_info->pt_base, VTOPFN(xen_start_info->pt_base), xen_start_info->nr_pt_frames, tmpindex); + printk("KERNBASE=%x,pt_base=%x, VTOPFN(base)=%x, nr_pt_frames=%x\n", KERNBASE,xen_start_info->pt_base, VTOPFN(xen_start_info->pt_base), xen_start_info->nr_pt_frames); xendebug_flags = 0; /* 0xffffffff; */ /* allocate 4 pages for bootmem allocator */ - bootmem_start = bootmem_current = (char *)PFNTOV(tmpindex); - tmpindex += 4; - bootmem_end = (char *)PFNTOV(tmpindex); + bootmem_start = bootmem_current = (char *)cur_space; + cur_space += (4 * PAGE_SIZE); + bootmem_end = (char *)cur_space; #ifdef ADD_ISA_HOLE shift_phys_machine(xen_phys_machine, xen_start_info->nr_pages); @@ -659,10 +698,9 @@ /* * pre-zero unused mapped pages - mapped on 4MB boundary */ -#ifndef PAE - round_tmpindex = (((tmpindex - 1) / 1024) + 1)*1024; -#endif - bzero((char *)PFNTOV(tmpindex), (round_tmpindex - tmpindex)*PAGE_SIZE); +/* + bzero((char *)cur_space, (cur_space + 0x3fffff) % 0x400000); + */ IdlePTD = (pd_entry_t *)VTOP(startinfo->pt_base); IdlePTDma = (pd_entry_t *)xpmap_ptom(VTOP(startinfo->pt_base)); @@ -674,111 +712,84 @@ xen_start_info->flags, xen_start_info->pt_base, xen_start_info->mod_start, xen_start_info->mod_len); + XENPRINTF("c0100000: %08x\n", + xpmap_get_bootpte(0xc0100000)); /* Map proc0's KSTACK */ - proc0kstack = PFNTOV(tmpindex); - tmpindex += KSTACK_PAGES; + proc0kstack = cur_space; cur_space += (KSTACK_PAGES * PAGE_SIZE); + printk("proc0kstack=%u\n", proc0kstack); /* allocate page for gdt */ - gdt = (union descriptor *)PFNTOV(tmpindex); - tmpindex++; + gdt = (union descriptor *)cur_space; cur_space += PAGE_SIZE; /* allocate page for ldt */ - ldt = (union descriptor *)PFNTOV(tmpindex); - tmpindex++; + ldt = (union descriptor *)cur_space; cur_space += PAGE_SIZE; /* vm86/bios stack */ - tmpindex += 1; + cur_space += PAGE_SIZE; /* Map space for the vm86 region */ - vm86paddr = (vm_offset_t)PFNTOV(tmpindex); - tmpindex += 3; - + vm86paddr = (vm_offset_t)cur_space; + cur_space += (PAGE_SIZE * 3); /* initialize page directory shadow page */ - pdir_shadow = (vm_offset_t *)PFNTOV(tmpindex); - i686_pagezero(pdir_shadow); - pdir_shadow_ma = xpmap_ptom(tmpindex << PAGE_SHIFT); + pdir_shadow = (vm_offset_t *)cur_space; cur_space += PAGE_SIZE; + bzero(pdir_shadow, PAGE_SIZE); + pdir_shadow_ma = xpmap_ptom(VTOP(pdir_shadow)); + XENPRINTF("pdir_shadow=%x,pdir_shadow_ma=%x\n", pdir_shadow, pdir_shadow_ma); PT_SET_MA(pdir_shadow, pdir_shadow_ma | PG_V | PG_A); - tmpindex++; /* setup shadow mapping first so vtomach will work */ - xen_pt_pin((vm_paddr_t)pdir_shadow_ma); + xen_pt_pin(pdir_shadow_ma); xen_queue_pt_update((vm_paddr_t)(IdlePTDma + PTDPTDI), pdir_shadow_ma | PG_KERNEL); xen_queue_pt_update(pdir_shadow_ma + PTDPTDI*sizeof(vm_paddr_t), ((vm_paddr_t)IdlePTDma) | PG_V | PG_A); xen_queue_pt_update(pdir_shadow_ma + (KPTDI + ISA_PDR_OFFSET)*sizeof(vm_paddr_t), KPTphys | PG_V | PG_A); - xen_flush_queue(); - - -#ifdef SMP - /* allocate cpu0 private page */ - cpu0prvpage = PFNTOV(tmpindex); - tmpindex++; - - /* allocate SMP page table */ - SMPpt = (unsigned long *)PFNTOV(tmpindex); - - /* Map the private page into the SMP page table */ - SMPpt[0] = vtomach(cpu0prvpage) | PG_RW | PG_M | PG_V | PG_A; - - /* map SMP page table RO */ - PT_SET_MA(SMPpt, *vtopte((vm_offset_t)SMPpt) & ~PG_RW); - - /* put the page table into the page directory */ - xen_queue_pt_update((vm_paddr_t)(IdlePTDma + MPPTDI), - xpmap_ptom((tmpindex << PAGE_SHIFT))| PG_KERNEL); - xen_queue_pt_update(pdir_shadow_ma + MPPTDI*sizeof(vm_paddr_t), - xpmap_ptom((tmpindex << PAGE_SHIFT))| PG_V | PG_A); - tmpindex++; -#endif - -#ifdef PMAP_DEBUG - pteinfo_list = (pteinfo_t *)PFNTOV(tmpindex); - tmpindex += ((xen_start_info->nr_pages >> 10) + 1)*(1 + XPQ_CALL_DEPTH*XPQ_CALL_COUNT); - - if (tmpindex > 980) - __asm__("int3"); -#endif - /* unmap remaining pages from initial 4MB chunk - */ - //printk("tmpindex=%lu,i=%lu\n", tmpindex, tmpindex - ISA_INDEX_OFFSET); - for (i = (tmpindex - ISA_INDEX_OFFSET); i%400 != 0; i++) { - //printk("doing page %lu(m=%lu)\n", i, i%400 /* XXX 1024 */); + /* unmap remaining pages from initial 4MB chunk */ + for (i = cur_space >> PAGE_SHIFT; i%400 != 0; i++) { xen_queue_pt_update(KPTphys + i*sizeof(vm_paddr_t), 0); } xen_flush_queue(); + /* allocate remainder of NKPT pages */ - for (i = 0; i < NKPT-1; i++, tmpindex++) { + printk("#1\n"); + for (i = 0; i < NKPT-1; i++, cur_space += PAGE_SIZE) { /* KERNBASE left unmapped (+ 1) KERNLOAD already mapped (+1) == + 2 */ - xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI + i + 1 + ISA_PDR_OFFSET), - xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL)); - xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 1 + ISA_PDR_OFFSET)*sizeof(vm_paddr_t), - xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A)); + printk("#2: i=%i,offs=%u->%x\n", i, KPTDI + i + 1, + xpmap_ptom(VTOP(cur_space)) | PG_KERNEL); +/* + xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI + i + 1), + xpmap_ptom(VTOP(cur_space)) | PG_KERNEL);*/ + PT_UPDATES_FLUSH(); + xen_queue_pt_update(pdir_shadow_ma + (KPTDI + i + 1)*sizeof(vm_paddr_t), + xpmap_ptom(VTOP(cur_space)) | PG_V | PG_A); + PT_UPDATES_FLUSH(); } - tmpindex += NKPT-1; - PT_UPDATES_FLUSH(); + printk("#3\n"); - HYPERVISOR_shared_info = (shared_info_t *)PFNTOV(tmpindex); + HYPERVISOR_shared_info = (shared_info_t *)cur_space; PT_SET_MA(HYPERVISOR_shared_info, xen_start_info->shared_info | PG_KERNEL); - tmpindex++; + cur_space += PAGE_SIZE; + + printk("#4\n"); - xen_store = (struct ringbuf_head *)PFNTOV(tmpindex); + xen_store = (struct ringbuf_head *)cur_space; PT_SET_MA(xen_store, (xen_start_info->store_mfn << PAGE_SHIFT)| PG_KERNEL); - tmpindex++; - console_page = (char *)PFNTOV(tmpindex); + cur_space += PAGE_SIZE; + console_page = (char *)cur_space; PT_SET_MA(console_page, (xen_start_info->console_mfn << PAGE_SHIFT)| PG_KERNEL); - tmpindex++; - + cur_space += PAGE_SIZE; + + printk("#5\n"); HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list = (unsigned long)xen_phys_machine; #ifdef SMP @@ -796,14 +807,17 @@ op.cmd = PHYSDEVOP_SET_IOPL; op.u.set_iopl.iopl = 1; PANIC_IF(HYPERVISOR_physdev_op(&op)); + + printk("#6\n"); /* add page table for KERNBASE */ xen_queue_pt_update((vm_paddr_t)(IdlePTDma + KPTDI), - xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_KERNEL)); + xpmap_ptom(VTOP(cur_space) | PG_KERNEL)); xen_queue_pt_update(pdir_shadow_ma + KPTDI*sizeof(vm_paddr_t), - xpmap_ptom((tmpindex << PAGE_SHIFT)| PG_V | PG_A)); + xpmap_ptom(VTOP(cur_space) | PG_V | PG_A)); xen_flush_queue(); - tmpindex++; + cur_space += PAGE_SIZE; + printk("#6\n"); if (xen_start_info->flags & SIF_INITDOMAIN) { /* Map first megabyte */ @@ -811,8 +825,12 @@ PT_SET_MA(KERNBASE + i, i | PG_KERNEL | PG_NC_PCD); xen_flush_queue(); } - init_first = tmpindex; + printk("#7\n"); + + init_first = (cur_space >> PAGE_SHIFT); + + printk("#8, proc0kstack=%u\n", proc0kstack); } ==== //depot/projects/xen3/src/sys/i386-xen/include/xenvar.h#9 (text+ko) ==== @@ -27,7 +27,7 @@ */ -#define ADD_ISA_HOLE +#undef ADD_ISA_HOLE /* XXX */ #ifdef ADD_ISA_HOLE #define ISA_INDEX_OFFSET 1024 ==== //depot/projects/xen3/src/sys/i386/i386/locore.s#4 (text+ko) ==== @@ -58,7 +58,7 @@ #ifdef XEN .section __xen_guest - .asciz "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xc0400000" + .asciz "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xc0000000" #endif /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707250916.l6P9GVVT088006>
