Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Nov 2009 02:25:27 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r199168 - in user/kmacy/releng_7_2_xen/sys/i386: i386 include xen
Message-ID:  <200911110225.nAB2PR4v079575@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
+#include <sys/ktr.h>
 #include <sys/lock.h>
 #include <sys/mount.h>
 #include <sys/malloc.h>
@@ -70,7 +71,6 @@ __FBSDID("$FreeBSD$");
 #include <machine/privatespace.h>
 #endif
 
-
 #include <vm/vm_page.h>
 
 
@@ -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();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911110225.nAB2PR4v079575>