From owner-p4-projects@FreeBSD.ORG Tue Jan 22 08:22:38 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C9BC416A41A; Tue, 22 Jan 2008 08:22:37 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8EAF916A421 for ; Tue, 22 Jan 2008 08:22:37 +0000 (UTC) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6121B13C45D for ; Tue, 22 Jan 2008 08:22:37 +0000 (UTC) (envelope-from scottl@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0M8Mb4A088380 for ; Tue, 22 Jan 2008 08:22:37 GMT (envelope-from scottl@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0M8MbkD088377 for perforce@freebsd.org; Tue, 22 Jan 2008 08:22:37 GMT (envelope-from scottl@freebsd.org) Date: Tue, 22 Jan 2008 08:22:37 GMT Message-Id: <200801220822.m0M8MbkD088377@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to scottl@freebsd.org using -f From: Scott Long To: Perforce Change Reviews Cc: Subject: PERFORCE change 133854 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2008 08:22:38 -0000 http://perforce.freebsd.org/chv.cgi?CH=133854 Change 133854 by scottl@scottl-deimos on 2008/01/22 08:21:37 Catch up to more pmap/vm fixes and changes. Affected files ... .. //depot/projects/xen31-xenbus/sys/i386/i386/machdep.c#3 integrate .. //depot/projects/xen31-xenbus/sys/i386/i386/trap.c#2 integrate .. //depot/projects/xen31-xenbus/sys/i386/include/vmparam.h#2 integrate .. //depot/projects/xen31-xenbus/sys/i386/include/xen/hypercall.h#2 integrate .. //depot/projects/xen31-xenbus/sys/i386/xen/exception.s#2 integrate .. //depot/projects/xen31-xenbus/sys/i386/xen/locore.s#2 integrate .. //depot/projects/xen31-xenbus/sys/i386/xen/pmap.c#5 integrate .. //depot/projects/xen31-xenbus/sys/i386/xen/xen_machdep.c#3 integrate .. //depot/projects/xen31-xenbus/sys/sys/cdefs.h#2 integrate Differences ... ==== //depot/projects/xen31-xenbus/sys/i386/i386/machdep.c#3 (text+ko) ==== @@ -2162,9 +2162,7 @@ extern vm_paddr_t *pdir_shadow; -#define MTOPSIZE (1<<(12 + PAGE_SHIFT)) - - +#define MTOPSIZE (1<<(14 + PAGE_SHIFT)) void init386(int first) { ==== //depot/projects/xen31-xenbus/sys/i386/i386/trap.c#2 (text+ko) ==== @@ -746,7 +746,7 @@ struct vmspace *vm = NULL; vm_map_t map; int rv = 0; - vm_prot_t ftype; + vm_prot_t ftype = 0; struct thread *td = curthread; struct proc *p = td->td_proc; @@ -832,7 +832,11 @@ trap_fatal(frame, eva); return (-1); } - +#ifdef XEN + if (rv == KERN_PROTECTION_FAILURE) + printf("SIGBUS: p=%s va=0x%x ftype=0x%x eip=0x%x\n", p->p_comm, va, ftype, frame->tf_eip); +#endif + return((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV); } ==== //depot/projects/xen31-xenbus/sys/i386/include/vmparam.h#2 (text+ko) ==== @@ -160,7 +160,11 @@ * messy at times, but hey, we'll do anything to save a page :-) */ +#ifdef XEN +#define VM_MAX_KERNEL_ADDRESS HYPERVISOR_VIRT_START +#else #define VM_MAX_KERNEL_ADDRESS VADDR(KPTDI+NKPDE-1, NPTEPG-1) +#endif #define VM_MIN_KERNEL_ADDRESS VADDR(PTDPTDI, PTDPTDI) #define KERNBASE VADDR(KPTDI, 0) ==== //depot/projects/xen31-xenbus/sys/i386/include/xen/hypercall.h#2 (text+ko) ==== @@ -33,80 +33,91 @@ #include #include -#define _hypercall0(type, name) \ -({ \ - long __res; \ - asm volatile ( \ - TRAP_INSTR \ - : "=a" (__res) \ - : "0" (__HYPERVISOR_##name) \ - : "memory" ); \ - (type)__res; \ +#define __STR(x) #x +#define STR(x) __STR(x) + +#if defined(XEN) +#define HYPERCALL_STR(name) \ + "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)" +#else +#define HYPERCALL_STR(name) \ + "mov hypercall_stubs,%%eax; " \ + "add $("STR(__HYPERVISOR_##name)" * 32),%%eax; " \ + "call *%%eax" +#endif + +#define _hypercall0(type, name) \ +({ \ + long __res; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res) \ + : \ + : "memory" ); \ + (type)__res; \ }) -#define _hypercall1(type, name, a1) \ -({ \ - long __res, __ign1; \ - __asm__ volatile ( \ - TRAP_INSTR \ - : "=a" (__res), "=b" (__ign1) \ - : "0" (__HYPERVISOR_##name), "1" ((long)(a1)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall1(type, name, a1) \ +({ \ + long __res, __ign1; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res), "=b" (__ign1) \ + : "1" ((long)(a1)) \ + : "memory" ); \ + (type)__res; \ }) -#define _hypercall2(type, name, a1, a2) \ -({ \ - long __res, __ign1, __ign2; \ - __asm__ volatile ( \ - TRAP_INSTR \ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \ - : "0" (__HYPERVISOR_##name), "1" ((long)(a1)), \ - "2" ((long)(a2)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall2(type, name, a1, a2) \ +({ \ + long __res, __ign1, __ign2; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \ + : "1" ((long)(a1)), "2" ((long)(a2)) \ + : "memory" ); \ + (type)__res; \ }) -#define _hypercall3(type, name, a1, a2, a3) \ -({ \ - long __res, __ign1, __ign2, __ign3; \ - __asm__ volatile ( \ - TRAP_INSTR \ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3) \ - : "0" (__HYPERVISOR_##name), "1" ((long)(a1)), \ - "2" ((long)(a2)), "3" ((long)(a3)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall3(type, name, a1, a2, a3) \ +({ \ + long __res, __ign1, __ign2, __ign3; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ + "=d" (__ign3) \ + : "1" ((long)(a1)), "2" ((long)(a2)), \ + "3" ((long)(a3)) \ + : "memory" ); \ + (type)__res; \ }) -#define _hypercall4(type, name, a1, a2, a3, a4) \ -({ \ - long __res, __ign1, __ign2, __ign3, __ign4; \ - __asm__ volatile ( \ - TRAP_INSTR \ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4) \ - : "0" (__HYPERVISOR_##name), "1" ((long)(a1)), \ - "2" ((long)(a2)), "3" ((long)(a3)), \ - "4" ((long)(a4)) \ - : "memory" ); \ - (type)__res; \ +#define _hypercall4(type, name, a1, a2, a3, a4) \ +({ \ + long __res, __ign1, __ign2, __ign3, __ign4; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ + "=d" (__ign3), "=S" (__ign4) \ + : "1" ((long)(a1)), "2" ((long)(a2)), \ + "3" ((long)(a3)), "4" ((long)(a4)) \ + : "memory" ); \ + (type)__res; \ }) -#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ -({ \ - long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \ - __asm__ volatile ( \ - TRAP_INSTR \ - : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \ - : "0" (__HYPERVISOR_##name), "1" ((long)(a1)), \ - "2" ((long)(a2)), "3" ((long)(a3)), \ - "4" ((long)(a4)), "5" ((long)(a5)) \ - : "memory" ); \ - (type)__res; \ -}) +#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ +({ \ + long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \ + __asm__ volatile ( \ + HYPERCALL_STR(name) \ + : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ + "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \ + : "1" ((long)(a1)), "2" ((long)(a2)), \ + "3" ((long)(a3)), "4" ((long)(a4)), \ + "5" ((long)(a5)) \ + : "memory" ); \ + (type)__res; \ +}) static inline int HYPERVISOR_set_trap_table( ==== //depot/projects/xen31-xenbus/sys/i386/xen/exception.s#2 (text+ko) ==== @@ -37,10 +37,12 @@ #include #include + #include "assym.s" #define SEL_RPL_MASK 0x0002 - +#define __HYPERVISOR_iret 23 + /* Offsets into shared_info_t. */ #define evtchn_upcall_pending /* 0 */ #define evtchn_upcall_mask 1 @@ -367,7 +369,7 @@ addl $8,%esp .globl doreti_iret doreti_iret: - iret + jmp hypercall_page + (__HYPERVISOR_iret * 32) .globl ecrit ecrit: /* ==== //depot/projects/xen31-xenbus/sys/i386/xen/locore.s#2 (text+ko) ==== @@ -56,7 +56,7 @@ #define __ASSEMBLY__ #include - + /* The defines below have been lifted out of */ #define FLAT_RING1_CS 0xe019 /* GDT index 259 */ #define FLAT_RING1_DS 0xe021 /* GDT index 260 */ @@ -76,15 +76,12 @@ ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .long, KERNBASE) ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .long, KERNBASE) ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .long, btext) -#ifdef notyet ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long, hypercall_page) -#endif ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW, .long, HYPERVISOR_VIRT_START) -#ifdef notyet +#if 0 ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel") -#else - ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "pae_pgdir_above_4gb|supervisor_mode_kernel|writable_descriptor_tables") #endif + ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_page_tables|supervisor_mode_kernel|writable_descriptor_tables") #ifdef PAE ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz, "yes") @@ -242,6 +239,16 @@ .long tmpstack, KERNEL_DS .text + +.p2align 12, 0x90 + +#define HYPERCALL_PAGE_OFFSET 0x1000 +.org HYPERCALL_PAGE_OFFSET +ENTRY(hypercall_page) + .cfi_startproc + .skip 0x1000 + .cfi_endproc + /********************************************************************** * * This is where the bootblocks start us, set the ball rolling... ==== //depot/projects/xen31-xenbus/sys/i386/xen/pmap.c#5 (text+ko) ==== @@ -1173,7 +1173,7 @@ pt_entry_t *pte; pte = vtopte(va); - pte_clear(pte); + PT_CLEAR_VA(pte, FALSE); } /* @@ -1224,13 +1224,15 @@ endpte = pte + count; while (pte < endpte) { oldpte |= *pte; - pte_store(pte, VM_PAGE_TO_PHYS(*ma) | pgeflag | PG_RW | PG_V); + PT_SET_VA(pte, VM_PAGE_TO_PHYS(*ma) | pgeflag | PG_RW | PG_V, FALSE); pte++; ma++; } if ((oldpte & PG_V) != 0) pmap_invalidate_range(kernel_pmap, sva, sva + count * PAGE_SIZE); + else + PT_UPDATES_FLUSH(); } /* @@ -3056,8 +3058,7 @@ * accessed (referenced) bits * during the copy. */ - *dst_pte = ptetemp & ~(PG_W | PG_M | - PG_A); + PT_SET_VA_MA(dst_pte, ptetemp & ~(PG_W | PG_M | PG_A), FALSE); dst_pmap->pm_stats.resident_count++; } else { free = NULL; @@ -3077,6 +3078,7 @@ } if (*PMAP1) *PMAP1 = 0; + PT_UPDATES_FLUSH(); sched_unpin(); vm_page_unlock_queues(); PMAP_UNLOCK(src_pmap); @@ -3319,8 +3321,8 @@ (uintmax_t)tpte)); - pte_clear(pte); - + PT_CLEAR_VA(pte, FALSE); + /* * Update the vm_page_t clean/reference bits. */ @@ -3342,6 +3344,7 @@ pmap->pm_stats.resident_count--; } } + PT_UPDATES_FLUSH(); if (allfree) { PV_STAT(pv_entry_spare -= _NPCPV); PV_STAT(pc_chunk_count--); @@ -3408,16 +3411,8 @@ pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr) { pt_entry_t *pte; - boolean_t rv; + boolean_t rv = FALSE; - rv = FALSE; - /* XXX - * in order for writable pagetables to help, - * this has to work - check if we aren't doing - * an invlpg on the page tables linear mappings - */ - return (rv); - PMAP_LOCK(pmap); if (*pmap_pde(pmap, addr)) { pte = vtopte(addr); ==== //depot/projects/xen31-xenbus/sys/i386/xen/xen_machdep.c#3 (text+ko) ==== @@ -261,7 +261,6 @@ struct mmuext_op op; op.cmd = MMUEXT_INVLPG_ALL; op.arg1.linear_addr = va & ~PAGE_MASK; - xen_flush_queue(); PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } @@ -710,7 +709,13 @@ HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); - + HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments); +#ifdef notyet + /* + * need to install handler + */ + HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify); +#endif xen_start_info = startinfo; xen_phys_machine = (xen_pfn_t *)startinfo->mfn_list; ==== //depot/projects/xen31-xenbus/sys/sys/cdefs.h#2 (text+ko) ==== @@ -49,7 +49,7 @@ * Can update to a more recent version when we implement * the hypercall page */ -#define __XEN_INTERFACE_VERSION__ 0x00030202 +#define __XEN_INTERFACE_VERSION__ 0x00030204 #endif /* * This code has been put in place to help reduce the addition of