Module Name: src
Committed By: cherry
Date: Sun Nov 18 23:50:48 UTC 2018
Modified Files:
src/sys/arch/amd64/include: cpu.h
src/sys/arch/i386/include: cpu.h
src/sys/arch/x86/include: cpu.h
src/sys/arch/xen/x86: hypervisor_machdep.c
src/sys/arch/xen/xen: clock.c
Log Message:
On Xen, copy just the bits we need from the trapframe for hardclock(9)
and statclock(9).
Current, the macros that use the trapframe are:
CLKF_USERMODE()
CLKF_PC()
CLKF_INTR()
Of these, CLKF_INTR() already ignores the frame and uses the ci_idepth
variable to do its job.
Convert the two remaining ones to do this, but only for XEN.
To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/sys/arch/amd64/include/cpu.h
cvs rdiff -u -r1.179 -r1.180 src/sys/arch/i386/include/cpu.h
cvs rdiff -u -r1.99 -r1.100 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.31 -r1.32 src/sys/arch/xen/x86/hypervisor_machdep.c
cvs rdiff -u -r1.73 -r1.74 src/sys/arch/xen/xen/clock.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/include/cpu.h
diff -u src/sys/arch/amd64/include/cpu.h:1.62 src/sys/arch/amd64/include/cpu.h:1.63
--- src/sys/arch/amd64/include/cpu.h:1.62 Fri Mar 16 12:21:50 2018
+++ src/sys/arch/amd64/include/cpu.h Sun Nov 18 23:50:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.62 2018/03/16 12:21:50 maxv Exp $ */
+/* $NetBSD: cpu.h,v 1.63 2018/11/18 23:50:48 cherry Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -83,8 +83,13 @@ cpu_set_curpri(int pri)
}
#endif /* __GNUC__ && !_MODULE */
+#ifdef XEN
+#define CLKF_USERMODE(frame) (curcpu()->ci_xen_clockf_usermode)
+#define CLKF_PC(frame) (curcpu()->ci_xen_clockf_pc)
+#else /* XEN */
#define CLKF_USERMODE(frame) USERMODE((frame)->cf_if.if_tf.tf_cs)
#define CLKF_PC(frame) ((frame)->cf_if.if_tf.tf_rip)
+#endif /* XEN */
#define CLKF_INTR(frame) (curcpu()->ci_idepth > 0)
#define LWP_PC(l) ((l)->l_md.md_regs->tf_rip)
Index: src/sys/arch/i386/include/cpu.h
diff -u src/sys/arch/i386/include/cpu.h:1.179 src/sys/arch/i386/include/cpu.h:1.180
--- src/sys/arch/i386/include/cpu.h:1.179 Sun Sep 17 09:41:35 2017
+++ src/sys/arch/i386/include/cpu.h Sun Nov 18 23:50:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.179 2017/09/17 09:41:35 maxv Exp $ */
+/* $NetBSD: cpu.h,v 1.180 2018/11/18 23:50:48 cherry Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -81,8 +81,13 @@ cpu_set_curpri(int pri)
}
#endif
+#ifdef XEN
+#define CLKF_USERMODE(frame) (curcpu()->ci_xen_clockf_usermode)
+#define CLKF_PC(frame) (curcpu()->ci_xen_clockf_pc)
+#else /* XEN */
#define CLKF_USERMODE(frame) USERMODE((frame)->cf_if.if_cs)
#define CLKF_PC(frame) ((frame)->cf_if.if_eip)
+#endif /* XEN */
#define CLKF_INTR(frame) (curcpu()->ci_idepth > 0)
#define LWP_PC(l) ((l)->l_md.md_regs->tf_eip)
Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.99 src/sys/arch/x86/include/cpu.h:1.100
--- src/sys/arch/x86/include/cpu.h:1.99 Sun Nov 18 10:24:09 2018
+++ src/sys/arch/x86/include/cpu.h Sun Nov 18 23:50:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.99 2018/11/18 10:24:09 cherry Exp $ */
+/* $NetBSD: cpu.h,v 1.100 2018/11/18 23:50:48 cherry Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -286,7 +286,8 @@ struct cpu_info {
* Clockframe for timer interrupt handler.
* Saved at entry via event callback.
*/
- struct clockframe ci_event_clockframe;
+ vaddr_t ci_xen_clockf_pc; /* RIP at last event interrupt */
+ bool ci_xen_clockf_usermode; /* Was the guest in usermode ? */
/* Event counters for various pathologies that might happen. */
struct evcnt ci_xen_cpu_tsc_backwards_evcnt;
Index: src/sys/arch/xen/x86/hypervisor_machdep.c
diff -u src/sys/arch/xen/x86/hypervisor_machdep.c:1.31 src/sys/arch/xen/x86/hypervisor_machdep.c:1.32
--- src/sys/arch/xen/x86/hypervisor_machdep.c:1.31 Sun Nov 18 10:24:09 2018
+++ src/sys/arch/xen/x86/hypervisor_machdep.c Sun Nov 18 23:50:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: hypervisor_machdep.c,v 1.31 2018/11/18 10:24:09 cherry Exp $ */
+/* $NetBSD: hypervisor_machdep.c,v 1.32 2018/11/18 23:50:48 cherry Exp $ */
/*
*
@@ -54,7 +54,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hypervisor_machdep.c,v 1.31 2018/11/18 10:24:09 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hypervisor_machdep.c,v 1.32 2018/11/18 23:50:48 cherry Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -263,7 +263,8 @@ do_hypervisor_callback(struct intrframe
/* Save trapframe for clock handler */
KASSERT(regs != NULL);
- ci->ci_event_clockframe.cf_if = *regs;
+ ci->ci_xen_clockf_usermode = USERMODE(regs->if_tf.tf_cs);
+ ci->ci_xen_clockf_pc = regs->if_tf.tf_rip;
// DDD printf("do_hypervisor_callback\n");
Index: src/sys/arch/xen/xen/clock.c
diff -u src/sys/arch/xen/xen/clock.c:1.73 src/sys/arch/xen/xen/clock.c:1.74
--- src/sys/arch/xen/xen/clock.c:1.73 Sun Nov 18 10:24:10 2018
+++ src/sys/arch/xen/xen/clock.c Sun Nov 18 23:50:48 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: clock.c,v 1.73 2018/11/18 10:24:10 cherry Exp $ */
+/* $NetBSD: clock.c,v 1.74 2018/11/18 23:50:48 cherry Exp $ */
/*-
* Copyright (c) 2017, 2018 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.73 2018/11/18 10:24:10 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.74 2018/11/18 23:50:48 cherry Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -811,7 +811,7 @@ xen_timer_handler(void *cookie, struct c
KASSERT(cpu_intr_p());
KASSERT(cookie == ci);
- frame = &ci->ci_event_clockframe;
+ frame = NULL; /* We use values cached in curcpu() */
again:
/*
* Find how many nanoseconds of Xen system time has elapsed