On Fri, Aug 19, 2022 at 01:24:47PM +0200, Mark Kettenis wrote:
>
> This is one of those annoying corners where there is too much
> unecessary MD variation. Currently travelling without a laptop, so I
> can't easily check the tree. But one note I wanted to make is that the
> definition of struct clockframe and the CLKF_XXX macros should stay
> together.
Sure. Here's a version that consolidates the CLKF macros into frame.h
alongside the clockframe definitions.
Notes by arch:
alpha, amd64, hppa, i386, m88k, mips64, powerpc64, sh, sparc64:
- clockframe is defined in cpu.h with CLKF macros.
- Move clockframe definition and CLKF macros from cpu.h to frame.h.
arm, powerpc:
- clockframe is defined in frame.h.
- CLKF macros are defined in cpu.h.
- Move CLKF macros from cpu.h to frame.h.
arm64, riscv64:
- clockframe is defined in cpu.h with CLKF macros.
- clockframe is *also* defined in frame.h.
- Delete clockframe definition from frame.h
- Move (other) clockframe definition and CLKF macros from cpu.h to frame.h.
sparc64 remains the only one that looks not-quite-right because
trapframe64 is defined in reg.h, not frame.h.
Index: alpha/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/alpha/include/cpu.h,v
retrieving revision 1.66
diff -u -p -r1.66 cpu.h
--- alpha/include/cpu.h 10 Aug 2022 10:41:35 -0000 1.66
+++ alpha/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -297,25 +297,6 @@ cpu_rnd_messybits(void)
}
/*
- * Arguments to hardclock and gatherstats encapsulate the previous
- * machine state in an opaque clockframe. On the Alpha, we use
- * what we push on an interrupt (a trapframe).
- */
-struct clockframe {
- struct trapframe cf_tf;
-};
-#define CLKF_USERMODE(framep)
\
- (((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE) != 0)
-#define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
-
-/*
- * This isn't perfect; if the clock interrupt comes in before the
- * r/m/w cycle is complete, we won't be counted... but it's not
- * like this statistic has to be extremely accurate.
- */
-#define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
-
-/*
* This is used during profiling to integrate system time.
*/
#define PROC_PC(p) ((p)->p_md.md_tf->tf_regs[FRAME_PC])
Index: alpha/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/alpha/include/frame.h,v
retrieving revision 1.4
diff -u -p -r1.4 frame.h
--- alpha/include/frame.h 23 Mar 2011 16:54:34 -0000 1.4
+++ alpha/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -92,4 +92,23 @@ struct trapframe {
unsigned long tf_regs[FRAME_SIZE]; /* See above */
};
+/*
+ * Arguments to hardclock and gatherstats encapsulate the previous
+ * machine state in an opaque clockframe. On the Alpha, we use
+ * what we push on an interrupt (a trapframe).
+ */
+struct clockframe {
+ struct trapframe cf_tf;
+};
+#define CLKF_USERMODE(framep)
\
+ (((framep)->cf_tf.tf_regs[FRAME_PS] & ALPHA_PSL_USERMODE) != 0)
+#define CLKF_PC(framep) ((framep)->cf_tf.tf_regs[FRAME_PC])
+
+/*
+ * This isn't perfect; if the clock interrupt comes in before the
+ * r/m/w cycle is complete, we won't be counted... but it's not
+ * like this statistic has to be extremely accurate.
+ */
+#define CLKF_INTR(framep) (curcpu()->ci_intrdepth)
+
#endif /* _MACHINE_FRAME_H_ */
Index: amd64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v
retrieving revision 1.149
diff -u -p -r1.149 cpu.h
--- amd64/include/cpu.h 25 Aug 2022 17:25:25 -0000 1.149
+++ amd64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -336,17 +336,6 @@ cpu_rnd_messybits(void)
#define curpcb curcpu()->ci_curpcb
/*
- * Arguments to hardclock, softclock and statclock
- * encapsulate the previous machine state in an opaque
- * clockframe; for now, use generic intrframe.
- */
-#define clockframe intrframe
-
-#define CLKF_USERMODE(frame) USERMODE((frame)->if_cs,
(frame)->if_rflags)
-#define CLKF_PC(frame) ((frame)->if_rip)
-#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
-
-/*
* Give a profiling tick to the current process when the user profiling
* buffer pages are invalid. On the i386, request an ast to send us
* through usertrap(), marking the proc as needing a profiling tick.
Index: amd64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/amd64/include/frame.h,v
retrieving revision 1.10
diff -u -p -r1.10 frame.h
--- amd64/include/frame.h 10 Jul 2018 08:57:44 -0000 1.10
+++ amd64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -171,4 +171,14 @@ struct callframe {
long f_arg0;
};
+/*
+ * Arguments to hardclock, softclock and statclock
+ * encapsulate the previous machine state in an opaque
+ * clockframe; for now, use generic intrframe.
+ */
+#define clockframe intrframe
+#define CLKF_USERMODE(frame) USERMODE((frame)->if_cs, (frame)->if_rflags)
+#define CLKF_PC(frame) ((frame)->if_rip)
+#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
+
#endif /* _MACHINE_FRAME_H_ */
Index: arm/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/arm/include/cpu.h,v
retrieving revision 1.61
diff -u -p -r1.61 cpu.h
--- arm/include/cpu.h 6 Jul 2021 09:34:06 -0000 1.61
+++ arm/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -104,25 +104,6 @@
/* 1 == use cpu_sleep(), 0 == don't */
extern int cpu_do_powersave;
-/* All the CLKF_* macros take a struct clockframe * as an argument. */
-
-/*
- * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
- * frame came from USR mode or not.
- */
-#define CLKF_USERMODE(frame) ((frame->if_spsr & PSR_MODE) == PSR_USR32_MODE)
-
-/*
- * CLKF_INTR: True if we took the interrupt from inside another
- * interrupt handler.
- */
-#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
-
-/*
- * CLKF_PC: Extract the program counter from a clockframe
- */
-#define CLKF_PC(frame) (frame->if_pc)
-
/*
* PROC_PC: Find out the program counter for the given process.
*/
Index: arm/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/arm/include/frame.h,v
retrieving revision 1.13
diff -u -p -r1.13 frame.h
--- arm/include/frame.h 30 Jun 2018 15:23:37 -0000 1.13
+++ arm/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -144,7 +144,25 @@ typedef struct irqframe {
unsigned int if_pad;
} irqframe_t;
+/* All the CLKF_* macros take a struct clockframe * as an argument. */
#define clockframe irqframe
+
+/*
+ * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
+ * frame came from USR mode or not.
+ */
+#define CLKF_USERMODE(frame) ((frame->if_spsr & PSR_MODE) == PSR_USR32_MODE)
+
+/*
+ * CLKF_INTR: True if we took the interrupt from inside another
+ * interrupt handler.
+ */
+#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
+
+/*
+ * CLKF_PC: Extract the program counter from a clockframe
+ */
+#define CLKF_PC(frame) (frame->if_pc)
/*
* Switch frame
Index: arm64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/arm64/include/cpu.h,v
retrieving revision 1.28
diff -u -p -r1.28 cpu.h
--- arm64/include/cpu.h 29 Aug 2022 02:01:18 -0000 1.28
+++ arm64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -47,26 +47,6 @@
#include <machine/frame.h>
#include <machine/armreg.h>
-/* All the CLKF_* macros take a struct clockframe * as an argument. */
-
-#define clockframe trapframe
-/*
- * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
- * frame came from USR mode or not.
- */
-#define CLKF_USERMODE(frame) ((frame->tf_elr & (1ul << 63)) == 0)
-
-/*
- * CLKF_INTR: True if we took the interrupt from inside another
- * interrupt handler.
- */
-#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
-
-/*
- * CLKF_PC: Extract the program counter from a clockframe
- */
-#define CLKF_PC(frame) (frame->tf_elr)
-
/*
* PROC_PC: Find out the program counter for the given process.
*/
Index: arm64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/arm64/include/frame.h,v
retrieving revision 1.3
diff -u -p -r1.3 frame.h
--- arm64/include/frame.h 30 Jun 2018 15:23:37 -0000 1.3
+++ arm64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -26,7 +26,6 @@
/*
* Exception/Trap Stack Frame
*/
-#define clockframe trapframe
typedef struct trapframe {
register_t tf_sp;
register_t tf_lr;
@@ -34,6 +33,26 @@ typedef struct trapframe {
register_t tf_spsr;
register_t tf_x[30];
} trapframe_t;
+
+/* All the CLKF_* macros take a struct clockframe * as an argument. */
+#define clockframe trapframe
+
+/*
+ * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
+ * frame came from USR mode or not.
+ */
+#define CLKF_USERMODE(frame) ((frame->tf_elr & (1ul << 63)) == 0)
+
+/*
+ * CLKF_INTR: True if we took the interrupt from inside another
+ * interrupt handler.
+ */
+#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
+
+/*
+ * CLKF_PC: Extract the program counter from a clockframe
+ */
+#define CLKF_PC(frame) (frame->tf_elr)
/*
* pushed on stack for signal delivery
Index: hppa/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/hppa/include/cpu.h,v
retrieving revision 1.95
diff -u -p -r1.95 cpu.h
--- hppa/include/cpu.h 6 Jul 2021 09:34:06 -0000 1.95
+++ hppa/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -210,12 +210,6 @@ extern int cpu_hvers;
#define HPPA_SPA_ENABLE 0x00000020
#define HPPA_NMODSPBUS 64
-#define clockframe trapframe
-#define CLKF_PC(framep) ((framep)->tf_iioq_head)
-#define CLKF_INTR(framep) ((framep)->tf_flags & TFF_INTR)
-#define CLKF_USERMODE(framep) ((framep)->tf_flags & T_USER)
-#define CLKF_SYSCALL(framep) ((framep)->tf_flags & TFF_SYS)
-
#define need_proftick(p) setsoftast(p)
#define PROC_PC(p) ((p)->p_md.md_regs->tf_iioq_head &
~HPPA_PC_PRIV_MASK)
#define PROC_STACK(p) ((p)->p_md.md_regs->tf_sp)
Index: hppa/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/hppa/include/frame.h,v
retrieving revision 1.19
diff -u -p -r1.19 frame.h
--- hppa/include/frame.h 21 Jun 2012 00:56:59 -0000 1.19
+++ hppa/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -136,6 +136,12 @@ struct trapframe {
unsigned long tf_pad[3]; /* pad to 256 bytes */
};
+#define clockframe trapframe
+#define CLKF_PC(framep) ((framep)->tf_iioq_head)
+#define CLKF_INTR(framep) ((framep)->tf_flags & TFF_INTR)
+#define CLKF_USERMODE(framep) ((framep)->tf_flags & T_USER)
+#define CLKF_SYSCALL(framep) ((framep)->tf_flags & TFF_SYS)
+
#ifdef _KERNEL
int setstack(struct trapframe *, u_long, register_t);
#endif /* _KERNEL */
Index: i386/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/i386/include/cpu.h,v
retrieving revision 1.179
diff -u -p -r1.179 cpu.h
--- i386/include/cpu.h 29 Aug 2022 02:58:13 -0000 1.179
+++ i386/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -55,15 +55,6 @@
#endif /* _KERNEL */
-/*
- * Arguments to hardclock, softclock and statclock
- * encapsulate the previous machine state in an opaque
- * clockframe; for now, use generic intrframe.
- *
- * XXX intrframe has a lot of gunk we don't need.
- */
-#define clockframe intrframe
-
#include <sys/device.h>
#include <sys/sched.h>
#include <sys/sensors.h>
@@ -274,10 +265,6 @@ unsigned int cpu_rnd_messybits(void);
*/
extern void need_resched(struct cpu_info *);
#define clear_resched(ci) (ci)->ci_want_resched = 0
-
-#define CLKF_USERMODE(frame) USERMODE((frame)->if_cs,
(frame)->if_eflags)
-#define CLKF_PC(frame) ((frame)->if_eip)
-#define CLKF_INTR(frame) (IDXSEL((frame)->if_cs) == GICODE_SEL)
/*
* This is used during profiling to integrate system time.
Index: i386/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/i386/include/frame.h,v
retrieving revision 1.13
diff -u -p -r1.13 frame.h
--- i386/include/frame.h 15 Jun 2018 17:58:41 -0000 1.13
+++ i386/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -170,4 +170,17 @@ struct sigframe {
struct sigcontext sf_sc;
siginfo_t sf_si;
};
+
+/*
+ * Arguments to hardclock, softclock and statclock
+ * encapsulate the previous machine state in an opaque
+ * clockframe; for now, use generic intrframe.
+ *
+ * XXX intrframe has a lot of gunk we don't need.
+ */
+#define clockframe intrframe
+#define CLKF_USERMODE(frame) USERMODE((frame)->if_cs,
(frame)->if_eflags)
+#define CLKF_PC(frame) ((frame)->if_eip)
+#define CLKF_INTR(frame) (IDXSEL((frame)->if_cs) == GICODE_SEL)
+
#endif
Index: m88k/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/m88k/include/cpu.h,v
retrieving revision 1.70
diff -u -p -r1.70 cpu.h
--- m88k/include/cpu.h 6 Jul 2021 09:34:06 -0000 1.70
+++ m88k/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -250,22 +250,6 @@ unsigned int cpu_rnd_messybits(void);
#include <sys/mplock.h>
#endif
-/*
- * Arguments to hardclock and gatherstats encapsulate the previous
- * machine state in an opaque clockframe. CLKF_INTR is only valid
- * if the process is in kernel mode. Clockframe is really trapframe,
- * so pointer to clockframe can be safely cast into a pointer to
- * trapframe.
- */
-struct clockframe {
- struct trapframe tf;
-};
-
-#define CLKF_USERMODE(framep) (((framep)->tf.tf_epsr & PSR_MODE) == 0)
-#define CLKF_PC(framep) ((framep)->tf.tf_sxip & XIP_ADDR)
-#define CLKF_INTR(framep) \
- (((struct cpu_info *)(framep)->tf.tf_cpu)->ci_intrdepth > 1)
-
#define aston(p) ((p)->p_md.md_astpending = 1)
/*
Index: m88k/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/m88k/include/frame.h,v
retrieving revision 1.4
diff -u -p -r1.4 frame.h
--- m88k/include/frame.h 15 Nov 2007 21:24:12 -0000 1.4
+++ m88k/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -87,4 +87,20 @@ struct trapframe {
#define tf_fprl tf_regs.fprl
#define tf_fpit tf_regs.fpit
+/*
+ * Arguments to hardclock and gatherstats encapsulate the previous
+ * machine state in an opaque clockframe. CLKF_INTR is only valid
+ * if the process is in kernel mode. Clockframe is really trapframe,
+ * so pointer to clockframe can be safely cast into a pointer to
+ * trapframe.
+ */
+struct clockframe {
+ struct trapframe tf;
+};
+
+#define CLKF_USERMODE(framep) (((framep)->tf.tf_epsr & PSR_MODE) == 0)
+#define CLKF_PC(framep) ((framep)->tf.tf_sxip & XIP_ADDR)
+#define CLKF_INTR(framep) \
+ (((struct cpu_info *)(framep)->tf.tf_cpu)->ci_intrdepth > 1)
+
#endif /* _M88K_FRAME_H_ */
Index: mips64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/mips64/include/cpu.h,v
retrieving revision 1.139
diff -u -p -r1.139 cpu.h
--- mips64/include/cpu.h 22 Aug 2022 00:35:06 -0000 1.139
+++ mips64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -265,17 +265,6 @@ unsigned int cpu_rnd_messybits(void);
#include <machine/frame.h>
/*
- * Arguments to hardclock encapsulate the previous machine state in
- * an opaque clockframe.
- */
-#define clockframe trapframe /* Use normal trap frame */
-
-#define SR_KSU_USER 0x00000010
-#define CLKF_USERMODE(framep) ((framep)->sr & SR_KSU_USER)
-#define CLKF_PC(framep) ((framep)->pc)
-#define CLKF_INTR(framep) (curcpu()->ci_intrdepth > 1) /* XXX
*/
-
-/*
* This is used during profiling to integrate system time.
*/
#define PROC_PC(p) ((p)->p_md.md_regs->pc)
Index: mips64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/mips64/include/frame.h,v
retrieving revision 1.8
diff -u -p -r1.8 frame.h
--- mips64/include/frame.h 29 Apr 2021 12:49:19 -0000 1.8
+++ mips64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -111,4 +111,14 @@ struct trapframe {
register_t fsr;
};
+/*
+ * Arguments to hardclock encapsulate the previous machine state in
+ * an opaque clockframe.
+ */
+#define clockframe trapframe /* Use normal trap frame */
+#define SR_KSU_USER 0x00000010
+#define CLKF_USERMODE(framep) ((framep)->sr & SR_KSU_USER)
+#define CLKF_PC(framep) ((framep)->pc)
+#define CLKF_INTR(framep) (curcpu()->ci_intrdepth > 1) /* XXX
*/
+
#endif /* !_MIPS64_FRAME_H_ */
Index: powerpc/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc/include/cpu.h,v
retrieving revision 1.72
diff -u -p -r1.72 cpu.h
--- powerpc/include/cpu.h 24 Jul 2022 00:28:09 -0000 1.72
+++ powerpc/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -155,10 +155,6 @@ void cpu_unidle(struct cpu_info *);
extern struct cpu_info cpu_info[PPC_MAXPROCS];
-#define CLKF_USERMODE(frame) (((frame)->srr1 & PSL_PR) != 0)
-#define CLKF_PC(frame) ((frame)->srr0)
-#define CLKF_INTR(frame) ((frame)->depth != 0)
-
extern int ppc_cpuidle;
extern int ppc_proc_is_64b;
extern int ppc_nobat;
Index: powerpc/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc/include/frame.h,v
retrieving revision 1.7
diff -u -p -r1.7 frame.h
--- powerpc/include/frame.h 6 Jan 2006 18:53:05 -0000 1.7
+++ powerpc/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -55,6 +55,10 @@ struct clockframe {
int depth;
};
+#define CLKF_USERMODE(frame) (((frame)->srr1 & PSL_PR) != 0)
+#define CLKF_PC(frame) ((frame)->srr0)
+#define CLKF_INTR(frame) ((frame)->depth != 0)
+
/*
* Call frame for PowerPC used during fork.
*/
Index: powerpc64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/include/cpu.h,v
retrieving revision 1.32
diff -u -p -r1.32 cpu.h
--- powerpc64/include/cpu.h 9 Aug 2022 04:40:08 -0000 1.32
+++ powerpc64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -161,12 +161,6 @@ void mp_setperf(int);
#endif
-#define clockframe trapframe
-
-#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
-#define CLKF_USERMODE(frame) (frame->srr1 & PSL_PR)
-#define CLKF_PC(frame) (frame->srr0)
-
#define aston(p) ((p)->p_md.md_astpending = 1)
#define need_proftick(p) aston(p)
Index: powerpc64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/include/frame.h,v
retrieving revision 1.5
diff -u -p -r1.5 frame.h
--- powerpc64/include/frame.h 13 Jul 2020 22:37:37 -0000 1.5
+++ powerpc64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -101,4 +101,9 @@ struct switchframe {
register_t sf_r31;
};
+#define clockframe trapframe
+#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
+#define CLKF_USERMODE(frame) (frame->srr1 & PSL_PR)
+#define CLKF_PC(frame) (frame->srr0)
+
#endif /* _MACHDEP_FRAME_H_ */
Index: riscv64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/riscv64/include/cpu.h,v
retrieving revision 1.14
diff -u -p -r1.14 cpu.h
--- riscv64/include/cpu.h 29 Aug 2022 02:01:18 -0000 1.14
+++ riscv64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -42,26 +42,6 @@
#include <machine/frame.h>
#include <machine/riscvreg.h>
-/* All the CLKF_* macros take a struct clockframe * as an argument. */
-
-#define clockframe trapframe
-/*
- * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
- * frame came from USR mode or not.
- */
-#define CLKF_USERMODE(frame) ((frame->tf_sstatus & SSTATUS_SPP) == 0)
-
-/*
- * CLKF_INTR: True if we took the interrupt from inside another
- * interrupt handler.
- */
-#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
-
-/*
- * CLKF_PC: Extract the program counter from a clockframe
- */
-#define CLKF_PC(frame) (frame->tf_sepc)
-
/*
* PROC_PC: Find out the program counter for the given process.
*/
Index: riscv64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/riscv64/include/frame.h,v
retrieving revision 1.3
diff -u -p -r1.3 frame.h
--- riscv64/include/frame.h 24 Feb 2022 14:19:10 -0000 1.3
+++ riscv64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -49,7 +49,6 @@
/*
* Exception/Trap Stack Frame
*/
-#define clockframe trapframe
typedef struct trapframe {
/* Standard Registers */
register_t tf_ra;
@@ -66,6 +65,26 @@ typedef struct trapframe {
register_t tf_scause;
register_t tf_pad;
} trapframe_t;
+
+/* All the CLKF_* macros take a struct clockframe * as an argument. */
+#define clockframe trapframe
+
+/*
+ * CLKF_USERMODE: Return TRUE/FALSE (1/0) depending on whether the
+ * frame came from USR mode or not.
+ */
+#define CLKF_USERMODE(frame) ((frame->tf_sstatus & SSTATUS_SPP) == 0)
+
+/*
+ * CLKF_INTR: True if we took the interrupt from inside another
+ * interrupt handler.
+ */
+#define CLKF_INTR(frame) (curcpu()->ci_idepth > 1)
+
+/*
+ * CLKF_PC: Extract the program counter from a clockframe
+ */
+#define CLKF_PC(frame) (frame->tf_sepc)
/*
* pushed on stack for signal delivery
Index: sh/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/sh/include/cpu.h,v
retrieving revision 1.33
diff -u -p -r1.33 cpu.h
--- sh/include/cpu.h 21 Feb 2022 10:44:58 -0000 1.33
+++ sh/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -88,21 +88,6 @@ extern struct cpu_info cpu_info_store;
#define CPU_BUSY_CYCLE() do {} while (0)
-
-/*
- * Arguments to hardclock and gatherstats encapsulate the previous
- * machine state in an opaque clockframe.
- */
-struct clockframe {
- int spc; /* program counter at time of interrupt */
- int ssr; /* status register at time of interrupt */
- int ssp; /* stack pointer at time of interrupt */
-};
-
-#define CLKF_USERMODE(cf) (!KERNELMODE((cf)->ssr))
-#define CLKF_PC(cf) ((cf)->spc)
-#define CLKF_INTR(cf) 0 /* XXX */
-
/*
* This is used during profiling to integrate system time. It can safely
* assume that the process is resident.
Index: sh/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/sh/include/frame.h,v
retrieving revision 1.3
diff -u -p -r1.3 frame.h
--- sh/include/frame.h 18 May 2016 20:21:13 -0000 1.3
+++ sh/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -130,4 +130,18 @@ struct switchframe {
int sf_mach;
};
+/*
+ * Arguments to hardclock and gatherstats encapsulate the previous
+ * machine state in an opaque clockframe.
+ */
+struct clockframe {
+ int spc; /* program counter at time of interrupt */
+ int ssr; /* status register at time of interrupt */
+ int ssp; /* stack pointer at time of interrupt */
+};
+
+#define CLKF_USERMODE(cf) (!KERNELMODE((cf)->ssr))
+#define CLKF_PC(cf) ((cf)->spc)
+#define CLKF_INTR(cf) 0 /* XXX */
+
#endif /* !_SH_FRAME_H_ */
Index: sparc64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/include/cpu.h,v
retrieving revision 1.98
diff -u -p -r1.98 cpu.h
--- sparc64/include/cpu.h 6 Jul 2021 09:34:07 -0000 1.98
+++ sparc64/include/cpu.h 29 Aug 2022 16:28:56 -0000
@@ -265,20 +265,6 @@ do {
\
: : : "memory"); \
} while (0)
-/*
- * Arguments to hardclock, softclock and gatherstats encapsulate the
- * previous machine state in an opaque clockframe. The ipl is here
- * as well for strayintr (see locore.s:interrupt and intr.c:strayintr).
- */
-struct clockframe {
- struct trapframe64 t;
- int saved_intr_level;
-};
-
-#define CLKF_USERMODE(framep) (((framep)->t.tf_tstate & TSTATE_PRIV)
== 0)
-#define CLKF_PC(framep) ((framep)->t.tf_pc)
-#define CLKF_INTR(framep) ((framep)->saved_intr_level != 0)
-
extern void (*cpu_start_clock)(void);
#define aston(p) ((p)->p_md.md_astpending = 1)
Index: sparc64/include/frame.h
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/include/frame.h,v
retrieving revision 1.6
diff -u -p -r1.6 frame.h
--- sparc64/include/frame.h 23 Mar 2011 16:54:37 -0000 1.6
+++ sparc64/include/frame.h 29 Aug 2022 16:28:56 -0000
@@ -116,4 +116,19 @@ struct frame64 {
*/
#define BIAS (2048-1)
+/*
+ * Arguments to hardclock, softclock and gatherstats encapsulate the
+ * previous machine state in an opaque clockframe. The ipl is here
+ * as well for strayintr (see locore.s:interrupt and intr.c:strayintr).
+ */
+struct trapframe64;
+struct clockframe {
+ struct trapframe64 t;
+ int saved_intr_level;
+};
+
+#define CLKF_USERMODE(framep) (((framep)->t.tf_tstate & TSTATE_PRIV)
== 0)
+#define CLKF_PC(framep) ((framep)->t.tf_pc)
+#define CLKF_INTR(framep) ((framep)->saved_intr_level != 0)
+
#endif /* _MACHINE_FRAME_H_ */