aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/kernel
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2016-09-08 08:55:38 -0400
committerWill Deacon <will.deacon@arm.com>2016-09-09 06:43:50 -0400
commitadf7589997927b1d84a5d003027b866bbef61ef2 (patch)
treef3bb449f2bda4e8992983b5d87e7dab1415fa17e /arch/arm64/kernel
parent1f3d8699be82583c713e2a1099c597a740ebaf4d (diff)
arm64: simplify sysreg manipulation
A while back we added {read,write}_sysreg accessors to handle accesses to system registers, without the usual boilerplate asm volatile, temporary variable, etc. This patch makes use of these across arm64 to make code shorter and clearer. For sequences with a trailing ISB, the existing isb() macro is also used so that asm blocks can be removed entirely. A few uses of inline assembly for msr/mrs are left as-is. Those manipulating sp_el0 for the current thread_info value have special clobber requiremends. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/kernel')
-rw-r--r--arch/arm64/kernel/cacheinfo.c8
-rw-r--r--arch/arm64/kernel/debug-monitors.c8
-rw-r--r--arch/arm64/kernel/process.c14
-rw-r--r--arch/arm64/kernel/sys_compat.c2
4 files changed, 13 insertions, 19 deletions
diff --git a/arch/arm64/kernel/cacheinfo.c b/arch/arm64/kernel/cacheinfo.c
index b8629d52fba9..9617301f76b5 100644
--- a/arch/arm64/kernel/cacheinfo.c
+++ b/arch/arm64/kernel/cacheinfo.c
@@ -39,7 +39,7 @@ static inline enum cache_type get_cache_type(int level)
39 39
40 if (level > MAX_CACHE_LEVEL) 40 if (level > MAX_CACHE_LEVEL)
41 return CACHE_TYPE_NOCACHE; 41 return CACHE_TYPE_NOCACHE;
42 asm volatile ("mrs %x0, clidr_el1" : "=r" (clidr)); 42 clidr = read_sysreg(clidr_el1);
43 return CLIDR_CTYPE(clidr, level); 43 return CLIDR_CTYPE(clidr, level);
44} 44}
45 45
@@ -55,11 +55,9 @@ u64 __attribute_const__ cache_get_ccsidr(u64 csselr)
55 55
56 WARN_ON(preemptible()); 56 WARN_ON(preemptible());
57 57
58 /* Put value into CSSELR */ 58 write_sysreg(csselr, csselr_el1);
59 asm volatile("msr csselr_el1, %x0" : : "r" (csselr));
60 isb(); 59 isb();
61 /* Read result out of CCSIDR */ 60 ccsidr = read_sysreg(ccsidr_el1);
62 asm volatile("mrs %x0, ccsidr_el1" : "=r" (ccsidr));
63 61
64 return ccsidr; 62 return ccsidr;
65} 63}
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c
index d97fdc1f6a38..73ae90ef434c 100644
--- a/arch/arm64/kernel/debug-monitors.c
+++ b/arch/arm64/kernel/debug-monitors.c
@@ -46,16 +46,14 @@ static void mdscr_write(u32 mdscr)
46{ 46{
47 unsigned long flags; 47 unsigned long flags;
48 local_dbg_save(flags); 48 local_dbg_save(flags);
49 asm volatile("msr mdscr_el1, %0" :: "r" (mdscr)); 49 write_sysreg(mdscr, mdscr_el1);
50 local_dbg_restore(flags); 50 local_dbg_restore(flags);
51} 51}
52NOKPROBE_SYMBOL(mdscr_write); 52NOKPROBE_SYMBOL(mdscr_write);
53 53
54static u32 mdscr_read(void) 54static u32 mdscr_read(void)
55{ 55{
56 u32 mdscr; 56 return read_sysreg(mdscr_el1);
57 asm volatile("mrs %0, mdscr_el1" : "=r" (mdscr));
58 return mdscr;
59} 57}
60NOKPROBE_SYMBOL(mdscr_read); 58NOKPROBE_SYMBOL(mdscr_read);
61 59
@@ -134,7 +132,7 @@ NOKPROBE_SYMBOL(disable_debug_monitors);
134 */ 132 */
135static int clear_os_lock(unsigned int cpu) 133static int clear_os_lock(unsigned int cpu)
136{ 134{
137 asm volatile("msr oslar_el1, %0" : : "r" (0)); 135 write_sysreg(0, oslar_el1);
138 isb(); 136 isb();
139 return 0; 137 return 0;
140} 138}
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 6cd2612236dc..a4f5f766af08 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -202,7 +202,7 @@ void show_regs(struct pt_regs * regs)
202 202
203static void tls_thread_flush(void) 203static void tls_thread_flush(void)
204{ 204{
205 asm ("msr tpidr_el0, xzr"); 205 write_sysreg(0, tpidr_el0);
206 206
207 if (is_compat_task()) { 207 if (is_compat_task()) {
208 current->thread.tp_value = 0; 208 current->thread.tp_value = 0;
@@ -213,7 +213,7 @@ static void tls_thread_flush(void)
213 * with a stale shadow state during context switch. 213 * with a stale shadow state during context switch.
214 */ 214 */
215 barrier(); 215 barrier();
216 asm ("msr tpidrro_el0, xzr"); 216 write_sysreg(0, tpidrro_el0);
217 } 217 }
218} 218}
219 219
@@ -253,7 +253,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start,
253 * Read the current TLS pointer from tpidr_el0 as it may be 253 * Read the current TLS pointer from tpidr_el0 as it may be
254 * out-of-sync with the saved value. 254 * out-of-sync with the saved value.
255 */ 255 */
256 asm("mrs %0, tpidr_el0" : "=r" (*task_user_tls(p))); 256 *task_user_tls(p) = read_sysreg(tpidr_el0);
257 257
258 if (stack_start) { 258 if (stack_start) {
259 if (is_compat_thread(task_thread_info(p))) 259 if (is_compat_thread(task_thread_info(p)))
@@ -289,17 +289,15 @@ static void tls_thread_switch(struct task_struct *next)
289{ 289{
290 unsigned long tpidr, tpidrro; 290 unsigned long tpidr, tpidrro;
291 291
292 asm("mrs %0, tpidr_el0" : "=r" (tpidr)); 292 tpidr = read_sysreg(tpidr_el0);
293 *task_user_tls(current) = tpidr; 293 *task_user_tls(current) = tpidr;
294 294
295 tpidr = *task_user_tls(next); 295 tpidr = *task_user_tls(next);
296 tpidrro = is_compat_thread(task_thread_info(next)) ? 296 tpidrro = is_compat_thread(task_thread_info(next)) ?
297 next->thread.tp_value : 0; 297 next->thread.tp_value : 0;
298 298
299 asm( 299 write_sysreg(tpidr, tpidr_el0);
300 " msr tpidr_el0, %0\n" 300 write_sysreg(tpidrro, tpidrro_el0);
301 " msr tpidrro_el0, %1"
302 : : "r" (tpidr), "r" (tpidrro));
303} 301}
304 302
305/* Restore the UAO state depending on next's addr_limit */ 303/* Restore the UAO state depending on next's addr_limit */
diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c
index 28c511b06edf..abaf582fc7a8 100644
--- a/arch/arm64/kernel/sys_compat.c
+++ b/arch/arm64/kernel/sys_compat.c
@@ -94,7 +94,7 @@ long compat_arm_syscall(struct pt_regs *regs)
94 * See comment in tls_thread_flush. 94 * See comment in tls_thread_flush.
95 */ 95 */
96 barrier(); 96 barrier();
97 asm ("msr tpidrro_el0, %0" : : "r" (regs->regs[0])); 97 write_sysreg(regs->regs[0], tpidrro_el0);
98 return 0; 98 return 0;
99 99
100 default: 100 default: