aboutsummaryrefslogtreecommitdiff
path: root/sys/arm/include/pcpu.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm/include/pcpu.h')
-rw-r--r--sys/arm/include/pcpu.h63
1 files changed, 53 insertions, 10 deletions
diff --git a/sys/arm/include/pcpu.h b/sys/arm/include/pcpu.h
index 184db4c047c8..f12f903016fc 100644
--- a/sys/arm/include/pcpu.h
+++ b/sys/arm/include/pcpu.h
@@ -32,6 +32,7 @@
#ifdef _KERNEL
+#include <machine/cpuconf.h>
#include <machine/frame.h>
#define ALT_STACK_SIZE 128
@@ -40,7 +41,18 @@ struct vmspace;
#endif /* _KERNEL */
-#define PCPU_MD_FIELDS
+#ifdef ARM_VFP_SUPPORT
+#define PCPU_MD_FIELDS \
+ unsigned int pc_cpu; \
+ unsigned int pc_vfpsid; \
+ unsigned int pc_vfpmvfr0; \
+ unsigned int pc_vfpmvfr1; \
+ struct thread *pc_vfpcthread; \
+ struct pmap *pc_curpmap;
+#else
+#define PCPU_MD_FIELDS
+#endif
+
#ifdef _KERNEL
@@ -48,19 +60,50 @@ struct pcb;
struct pcpu;
extern struct pcpu *pcpup;
-extern struct pcpu __pcpu;
+#if ARM_ARCH_6 || ARM_ARCH_7A
+/* or ARM_TP_ADDRESS mark REMOVE ME NOTE */
+static inline struct pcpu *
+get_pcpu(void)
+{
+ void *pcpu;
-#define PCPU_GET(member) (__pcpu.pc_ ## member)
+ __asm __volatile("mrc p15, 0, %0, c13, c0, 4" : "=r" (pcpu));
+ return (pcpu);
+}
-/*
- * XXX The implementation of this operation should be made atomic
- * with respect to preemption.
- */
-#define PCPU_ADD(member, value) (__pcpu.pc_ ## member += (value))
+static inline void
+set_pcpu(void *pcpu)
+{
+
+ __asm __volatile("mcr p15, 0, %0, c13, c0, 4" : : "r" (pcpu));
+}
+
+static inline void *
+get_tls(void)
+{
+ void *tls;
+
+ __asm __volatile("mrc p15, 0, %0, c13, c0, 3" : "=r" (tls));
+ return (tls);
+}
+
+static inline void
+set_tls(void *tls)
+{
+
+ __asm __volatile("mcr p15, 0, %0, c13, c0, 3" : : "r" (tls));
+}
+#else
+#define get_pcpu() pcpup
+#endif
+
+#define PCPU_GET(member) (get_pcpu()->pc_ ## member)
+#define PCPU_ADD(member, value) (get_pcpu()->pc_ ## member += (value))
#define PCPU_INC(member) PCPU_ADD(member, 1)
-#define PCPU_PTR(member) (&__pcpu.pc_ ## member)
-#define PCPU_SET(member,value) (__pcpu.pc_ ## member = (value))
+#define PCPU_PTR(member) (&pcpup->pc_ ## member)
+#define PCPU_SET(member,value) (pcpup->pc_ ## member = (value))
+void pcpu0_init(void);
#endif /* _KERNEL */
#endif /* !_MACHINE_PCPU_H_ */