aboutsummaryrefslogtreecommitdiff
path: root/sys/sparc64/include/critical.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/sparc64/include/critical.h')
-rw-r--r--sys/sparc64/include/critical.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/sys/sparc64/include/critical.h b/sys/sparc64/include/critical.h
new file mode 100644
index 000000000000..eee9914adc12
--- /dev/null
+++ b/sys/sparc64/include/critical.h
@@ -0,0 +1,75 @@
+/*-
+ * Copyright (c) 2002 Matthew Dillon. This code is distributed under
+ * the BSD copyright, /usr/src/COPYRIGHT.
+ *
+ * This file contains prototypes and high-level inlines related to
+ * machine-level critical function support:
+ *
+ * cpu_critical_enter() - inlined
+ * cpu_critical_exit() - inlined
+ * cpu_critical_fork_exit() - prototyped
+ * cpu_thread_link() - prototyped
+ * related support functions residing
+ * in <arch>/<arch>/critical.c - prototyped
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_CRITICAL_H_
+#define _MACHINE_CRITICAL_H_
+
+__BEGIN_DECLS
+
+/*
+ * Prototypes - see <arch>/<arch>/critical.c
+ */
+void cpu_critical_fork_exit(void);
+void cpu_thread_link(struct thread *td);
+
+#ifdef __GNUC__
+
+/*
+ * cpu_critical_enter:
+ *
+ * This routine is called from critical_enter() on the 0->1 transition
+ * of td_critnest, prior to it being incremented to 1.
+ */
+static __inline void
+cpu_critical_enter(void)
+{
+ struct thread *td;
+ critical_t pil;
+
+ td = curthread;
+ pil = rdpr(pil);
+ wrpr(pil, 0, 14);
+ td->td_md.md_savecrit = pil;
+}
+
+
+/*
+ * cpu_critical_exit:
+ *
+ * This routine is called from critical_exit() on a 1->0 transition
+ * of td_critnest, after it has been decremented to 0. We are
+ * exiting the last critical section.
+ */
+static __inline void
+cpu_critical_exit(void)
+{
+ struct thread *td;
+
+ td = curthread;
+ wrpr(pil, td->td_md.md_savecrit, 0);
+}
+
+#else /* !__GNUC__ */
+
+void cpu_critical_enter(void)
+void cpu_critical_exit(void)
+
+#endif /* __GNUC__ */
+
+__END_DECLS
+
+#endif /* !_MACHINE_CRITICAL_H_ */