diff options
author | Oleksandr Tymoshenko <gonzo@FreeBSD.org> | 2012-08-15 03:03:03 +0000 |
---|---|---|
committer | Oleksandr Tymoshenko <gonzo@FreeBSD.org> | 2012-08-15 03:03:03 +0000 |
commit | cf1a573f04f16c213467a06efded779b4e049edd (patch) | |
tree | 68d86df1ea7d9bfea335c91632747716f5a0df4a /sys/arm/include/pcpu.h | |
parent | 8340ece577b9a6c1bcd060ba5ce9f17d9544af62 (diff) | |
download | src-cf1a573f04f16c213467a06efded779b4e049edd.tar.gz src-cf1a573f04f16c213467a06efded779b4e049edd.zip |
Merging projects/armv6, part 1
Cummulative patch of changes that are not vendor-specific:
- ARMv6 and ARMv7 architecture support
- ARM SMP support
- VFP/Neon support
- ARM Generic Interrupt Controller driver
- Simplification of startup code for all platforms
Notes
Notes:
svn path=/head/; revision=239268
Diffstat (limited to 'sys/arm/include/pcpu.h')
-rw-r--r-- | sys/arm/include/pcpu.h | 63 |
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_ */ |