From owner-svn-src-user@FreeBSD.ORG Wed Nov 11 02:25:28 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F338E106566B; Wed, 11 Nov 2009 02:25:27 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E201D8FC20; Wed, 11 Nov 2009 02:25:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nAB2PRJ9079579; Wed, 11 Nov 2009 02:25:27 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAB2PR4v079575; Wed, 11 Nov 2009 02:25:27 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200911110225.nAB2PR4v079575@svn.freebsd.org> From: Kip Macy Date: Wed, 11 Nov 2009 02:25:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199168 - in user/kmacy/releng_7_2_xen/sys/i386: i386 include xen X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Nov 2009 02:25:28 -0000 Author: kmacy Date: Wed Nov 11 02:25:27 2009 New Revision: 199168 URL: http://svn.freebsd.org/changeset/base/199168 Log: make xen kernel rely on normal interrupt flags Modified: user/kmacy/releng_7_2_xen/sys/i386/i386/vm_machdep.c user/kmacy/releng_7_2_xen/sys/i386/include/cpufunc.h user/kmacy/releng_7_2_xen/sys/i386/xen/xen_machdep.c Modified: user/kmacy/releng_7_2_xen/sys/i386/i386/vm_machdep.c ============================================================================== --- user/kmacy/releng_7_2_xen/sys/i386/i386/vm_machdep.c Wed Nov 11 02:07:01 2009 (r199167) +++ user/kmacy/releng_7_2_xen/sys/i386/i386/vm_machdep.c Wed Nov 11 02:25:27 2009 (r199168) @@ -268,14 +268,7 @@ cpu_fork(td1, p2, td2, flags) /* Setup to release spin count in fork_exit(). */ td2->td_md.md_spinlock_count = 1; - /* - * XXX XEN need to check on PSL_USER is handled - */ -#ifdef XEN - td2->td_md.md_saved_flags = 0; -#else td2->td_md.md_saved_flags = PSL_KERNEL | PSL_I; -#endif /* * Now, cpu_switch() can schedule the new process. * pcb_esp is loaded pointing to the cpu_switch() stack frame @@ -463,11 +456,7 @@ cpu_set_upcall(struct thread *td, struct /* Setup to release spin count in fork_exit(). */ td->td_md.md_spinlock_count = 1; -#ifdef XEN - td->td_md.md_saved_flags = 0; -#else td->td_md.md_saved_flags = PSL_KERNEL | PSL_I; -#endif } /* Modified: user/kmacy/releng_7_2_xen/sys/i386/include/cpufunc.h ============================================================================== --- user/kmacy/releng_7_2_xen/sys/i386/include/cpufunc.h Wed Nov 11 02:07:01 2009 (r199167) +++ user/kmacy/releng_7_2_xen/sys/i386/include/cpufunc.h Wed Nov 11 02:25:27 2009 (r199168) @@ -49,8 +49,8 @@ extern u_int xen_rcr2(void); extern void xen_load_cr3(u_int data); extern void xen_tlb_flush(void); extern void xen_invlpg(u_int addr); -extern int xen_save_and_cli(void); -extern void xen_restore_flags(u_int eflags); +extern void write_eflags(u_int eflags); +extern u_int read_eflags(void); #endif struct region_descriptor; @@ -337,7 +337,11 @@ ia32_pause(void) } static __inline u_int +#ifdef XEN +_read_eflags(void) +#else read_eflags(void) +#endif { u_int ef; @@ -379,7 +383,11 @@ wbinvd(void) } static __inline void +#ifdef XEN +_write_eflags(u_int ef) +#else write_eflags(u_int ef) +#endif { __asm __volatile("pushl %0; popfl" : : "r" (ef)); } @@ -683,23 +691,16 @@ intr_disable(void) { register_t eflags; -#ifdef XEN - eflags = xen_save_and_cli(); -#else eflags = read_eflags(); disable_intr(); -#endif + return (eflags); } static __inline void intr_restore(register_t eflags) { -#ifdef XEN - xen_restore_flags(eflags); -#else write_eflags(eflags); -#endif } #else /* !(__GNUCLIKE_ASM && __CC_SUPPORTS___INLINE) */ Modified: user/kmacy/releng_7_2_xen/sys/i386/xen/xen_machdep.c ============================================================================== --- user/kmacy/releng_7_2_xen/sys/i386/xen/xen_machdep.c Wed Nov 11 02:07:01 2009 (r199167) +++ user/kmacy/releng_7_2_xen/sys/i386/xen/xen_machdep.c Wed Nov 11 02:25:27 2009 (r199168) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -70,7 +71,6 @@ __FBSDID("$FreeBSD$"); #include #endif - #include @@ -343,25 +343,41 @@ xen_load_cr3(u_int val) PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void -xen_restore_flags(u_int eflags) +static __inline u_int +rebp(void) { - if (eflags > 1) - eflags = ((eflags & PSL_I) == 0); + u_int data; - __restore_flags(eflags); + __asm __volatile("movl 4(%%ebp),%0" : "=r" (data)); + return (data); } -int -xen_save_and_cli(void) +u_int +read_eflags(void) { - int eflags; - - __save_and_cli(eflags); + vcpu_info_t *_vcpu; + u_int eflags; + + eflags = _read_eflags(); + _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; + if (_vcpu->evtchn_upcall_mask) + eflags &= ~PSL_I; + return (eflags); } void +write_eflags(u_int eflags) +{ + u_int intr; + + CTR2(KTR_SPARE1, "%x xen_restore_flags eflags %x", rebp(), eflags); + intr = ((eflags & PSL_I) == 0); + __restore_flags(intr); + _write_eflags(eflags); +} + +void xen_cli(void) { __cli();