Date: Tue, 31 Jan 2012 15:53:11 +0000 (UTC) From: Grzegorz Bernacki <gber@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r230826 - in projects/armv6/sys/arm: arm include Message-ID: <201201311553.q0VFrBpk043298@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: gber Date: Tue Jan 31 15:53:11 2012 New Revision: 230826 URL: http://svn.freebsd.org/changeset/base/230826 Log: Fix set/get pcpu for pre-armv6 cores. - bring back old pcpu function for pre-armv6 cores - move pcpu related functions to common file. Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S projects/armv6/sys/arm/arm/machdep.c projects/armv6/sys/arm/include/cpufunc.h projects/armv6/sys/arm/include/pcpu.h Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:53:11 2012 (r230826) @@ -241,20 +241,3 @@ ENTRY(armv7_drain_writebuf) dsb RET -/* Use Privileged Thread Id register as a holder for pcpu pointer */ -ENTRY(get_pcpu) - mrc p15, 0, r0, c13, c0, 4 - RET - -ENTRY(set_pcpu) - mcr p15, 0, r0, c13, c0, 4 - RET - -/* Use Privileged Thread Id register as a holder for tls pointer */ -ENTRY(get_tls) - mrc p15, 0, r0, c13, c0, 3 - RET - -ENTRY(set_tls) - mcr p15, 0, r0, c13, c0, 3 - RET Modified: projects/armv6/sys/arm/arm/machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/machdep.c Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/arm/machdep.c Tue Jan 31 15:53:11 2012 (r230826) @@ -729,8 +729,9 @@ fake_preload_metadata(void) void pcpu0_init(void) { - +#if ARM_ARCH_7A || defined(CPU_MV_PJ4B) set_pcpu(pcpup); +#endif pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); } Modified: projects/armv6/sys/arm/include/cpufunc.h ============================================================================== --- projects/armv6/sys/arm/include/cpufunc.h Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/include/cpufunc.h Tue Jan 31 15:53:11 2012 (r230826) @@ -510,10 +510,7 @@ void pj4bv7_setup (char *string); void pj4bv6_setup (char *string); void pj4b_config (void); -int get_core_id (void); -void set_pcpu (void *); -void set_tls (void *); -void *get_tls (void); +int get_core_id (void); void armadaxp_idcache_wbinv_all (void); Modified: projects/armv6/sys/arm/include/pcpu.h ============================================================================== --- projects/armv6/sys/arm/include/pcpu.h Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/include/pcpu.h Tue Jan 31 15:53:11 2012 (r230826) @@ -32,6 +32,7 @@ #ifdef _KERNEL +#include <machine/cpuconf.h> #include <machine/frame.h> #define ALT_STACK_SIZE 128 @@ -48,14 +49,44 @@ struct pcb; struct pcpu; extern struct pcpu *pcpup; +#if ARM_ARCH_6 || ARM_ARCH_7A +static inline struct pcpu * +get_pcpu(void) +{ + void *pcpu; + + __asm __volatile("mrc p15, 0, %0, c13, c0, 4" : "=r" (pcpu)); + return (pcpu); +} + +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) (pcpup->pc_ ## member) - -/* - * XXX The implementation of this operation should be made atomic - * with respect to preemption. - */ -#define PCPU_ADD(member, value) (pcpup->pc_ ## member += (value)) +#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) (&pcpup->pc_ ## member) #define PCPU_SET(member,value) (pcpup->pc_ ## member = (value))
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201311553.q0VFrBpk043298>