diff options
author | Renato Botelho <renato@netgate.com> | 2016-10-12 11:41:26 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2016-10-12 11:41:26 -0300 |
commit | cb642130dfc50717bb970a104c44aa7690930a38 (patch) | |
tree | c67f108534217a209198c6b201949ecc73acaba3 /sys/arm/include/pcpu.h | |
parent | 5dd7ab172435dc99e1abc1f7d73fd5e720050bbc (diff) | |
parent | cd04fbc5e631c6b3e80a14eb7044c3be35fba2d2 (diff) | |
download | FreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.zip FreeBSD-src-cb642130dfc50717bb970a104c44aa7690930a38.tar.gz |
Merge remote-tracking branch 'origin/stable/11' into devel-11
Diffstat (limited to 'sys/arm/include/pcpu.h')
-rw-r--r-- | sys/arm/include/pcpu.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/arm/include/pcpu.h b/sys/arm/include/pcpu.h index 19cb666..c9ebd5e 100644 --- a/sys/arm/include/pcpu.h +++ b/sys/arm/include/pcpu.h @@ -103,7 +103,8 @@ get_tls(void) { void *tls; - __asm __volatile("mrc p15, 0, %0, c13, c0, 3" : "=r" (tls)); + /* TPIDRURW contains the authoritative value. */ + __asm __volatile("mrc p15, 0, %0, c13, c0, 2" : "=r" (tls)); return (tls); } @@ -111,7 +112,15 @@ static inline void set_tls(void *tls) { - __asm __volatile("mcr p15, 0, %0, c13, c0, 3" : : "r" (tls)); + /* + * Update both TPIDRURW and TPIDRURO. TPIDRURW needs to be written + * first to ensure that a context switch between the two writes will + * still give the desired result of updating both. + */ + __asm __volatile( + "mcr p15, 0, %0, c13, c0, 2\n" + "mcr p15, 0, %0, c13, c0, 3\n" + : : "r" (tls)); } #define curthread get_curthread() |