Skip to content

Commit 6a39dd6

Browse files
Daniel JacobowitzRussell King
authored andcommitted
[ARM] 3759/2: Remove uses of %?
Patch from Daniel Jacobowitz The ARM kernel has several uses of asm("foo%?"). %? is a GCC internal modifier used to output conditional execution predicates. However, no version of GCC supports conditionalizing asm statements. GCC 4.2 will correctly expand %? to the empty string in user asms. Earlier versions may reuse the condition from the previous instruction. In 'if (foo) asm ("bar%?");' this is somewhat likely to be right... but not reliable. So, the only safe thing to do is to remove the uses of %?. I believe the tlbflush.h occurances were supposed to be removed before, based on the comment about %? not working at the top of that file. Old versions of GCC could omit branches around user asms if the asm didn't mark the condition codes as clobbered. This problem hasn't been seen on any recent (3.x or 4.x) GCC, but it could theoretically happen. So, where %? was removed a cc clobber was added. Signed-off-by: Daniel Jacobowitz <dan@codesourcery.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
1 parent 681a499 commit 6a39dd6

File tree

5 files changed

+62
-59
lines changed

5 files changed

+62
-59
lines changed

arch/arm/kernel/traps.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
191191
if (tsk != current)
192192
fp = thread_saved_fp(tsk);
193193
else
194-
asm("mov%? %0, fp" : "=r" (fp));
194+
asm("mov %0, fp" : "=r" (fp) : : "cc");
195195

196196
c_backtrace(fp, 0x10);
197197
barrier();

arch/arm/mach-footbridge/dc21285.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,16 @@ dc21285_read_config(struct pci_bus *bus, unsigned int devfn, int where,
6969
if (addr)
7070
switch (size) {
7171
case 1:
72-
asm("ldr%?b %0, [%1, %2]"
73-
: "=r" (v) : "r" (addr), "r" (where));
72+
asm("ldrb %0, [%1, %2]"
73+
: "=r" (v) : "r" (addr), "r" (where) : "cc");
7474
break;
7575
case 2:
76-
asm("ldr%?h %0, [%1, %2]"
77-
: "=r" (v) : "r" (addr), "r" (where));
76+
asm("ldrh %0, [%1, %2]"
77+
: "=r" (v) : "r" (addr), "r" (where) : "cc");
7878
break;
7979
case 4:
80-
asm("ldr%? %0, [%1, %2]"
81-
: "=r" (v) : "r" (addr), "r" (where));
80+
asm("ldr %0, [%1, %2]"
81+
: "=r" (v) : "r" (addr), "r" (where) : "cc");
8282
break;
8383
}
8484

@@ -103,16 +103,19 @@ dc21285_write_config(struct pci_bus *bus, unsigned int devfn, int where,
103103
if (addr)
104104
switch (size) {
105105
case 1:
106-
asm("str%?b %0, [%1, %2]"
107-
: : "r" (value), "r" (addr), "r" (where));
106+
asm("strb %0, [%1, %2]"
107+
: : "r" (value), "r" (addr), "r" (where)
108+
: "cc");
108109
break;
109110
case 2:
110-
asm("str%?h %0, [%1, %2]"
111-
: : "r" (value), "r" (addr), "r" (where));
111+
asm("strh %0, [%1, %2]"
112+
: : "r" (value), "r" (addr), "r" (where)
113+
: "cc");
112114
break;
113115
case 4:
114-
asm("str%? %0, [%1, %2]"
115-
: : "r" (value), "r" (addr), "r" (where));
116+
asm("str %0, [%1, %2]"
117+
: : "r" (value), "r" (addr), "r" (where)
118+
: "cc");
116119
break;
117120
}
118121

arch/arm/vfp/vfpinstr.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@
7373

7474
#define fmrx(_vfp_) ({ \
7575
u32 __v; \
76-
asm("mrc%? p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmrx %0, " #_vfp_ \
77-
: "=r" (__v)); \
76+
asm("mrc p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmrx %0, " #_vfp_ \
77+
: "=r" (__v) : : "cc"); \
7878
__v; \
7979
})
8080

8181
#define fmxr(_vfp_,_var_) \
82-
asm("mcr%? p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmxr " #_vfp_ ", %0" \
83-
: : "r" (_var_))
82+
asm("mcr p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmxr " #_vfp_ ", %0" \
83+
: : "r" (_var_) : "cc")
8484

8585
u32 vfp_single_cpdo(u32 inst, u32 fpscr);
8686
u32 vfp_single_cprt(u32 inst, u32 fpscr, struct pt_regs *regs);

include/asm-arm/arch-l7200/io.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
static inline unsigned int __arch_getw(unsigned long a)
3232
{
3333
unsigned int value;
34-
__asm__ __volatile__("ldr%?h %0, [%1, #0] @ getw"
34+
__asm__ __volatile__("ldrh %0, [%1, #0] @ getw"
3535
: "=&r" (value)
36-
: "r" (a));
36+
: "r" (a) : "cc");
3737
return value;
3838
}
3939

@@ -42,8 +42,8 @@ static inline unsigned int __arch_getw(unsigned long a)
4242

4343
static inline void __arch_putw(unsigned int value, unsigned long a)
4444
{
45-
__asm__ __volatile__("str%?h %0, [%1, #0] @ putw"
46-
: : "r" (value), "r" (a));
45+
__asm__ __volatile__("strh %0, [%1, #0] @ putw"
46+
: : "r" (value), "r" (a) : "cc");
4747
}
4848

4949
/*

include/asm-arm/tlbflush.h

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -247,16 +247,16 @@ static inline void local_flush_tlb_all(void)
247247
const unsigned int __tlb_flag = __cpu_tlb_flags;
248248

249249
if (tlb_flag(TLB_WB))
250-
asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
250+
asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (zero) : "cc");
251251

252252
if (tlb_flag(TLB_V3_FULL))
253-
asm("mcr%? p15, 0, %0, c6, c0, 0" : : "r" (zero));
253+
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc");
254254
if (tlb_flag(TLB_V4_U_FULL | TLB_V6_U_FULL))
255-
asm("mcr%? p15, 0, %0, c8, c7, 0" : : "r" (zero));
255+
asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
256256
if (tlb_flag(TLB_V4_D_FULL | TLB_V6_D_FULL))
257-
asm("mcr%? p15, 0, %0, c8, c6, 0" : : "r" (zero));
257+
asm("mcr p15, 0, %0, c8, c6, 0" : : "r" (zero) : "cc");
258258
if (tlb_flag(TLB_V4_I_FULL | TLB_V6_I_FULL))
259-
asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
259+
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
260260
}
261261

262262
static inline void local_flush_tlb_mm(struct mm_struct *mm)
@@ -266,25 +266,25 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
266266
const unsigned int __tlb_flag = __cpu_tlb_flags;
267267

268268
if (tlb_flag(TLB_WB))
269-
asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
269+
asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (zero) : "cc");
270270

271271
if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) {
272272
if (tlb_flag(TLB_V3_FULL))
273-
asm("mcr%? p15, 0, %0, c6, c0, 0" : : "r" (zero));
273+
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc");
274274
if (tlb_flag(TLB_V4_U_FULL))
275-
asm("mcr%? p15, 0, %0, c8, c7, 0" : : "r" (zero));
275+
asm("mcr p15, 0, %0, c8, c7, 0" : : "r" (zero) : "cc");
276276
if (tlb_flag(TLB_V4_D_FULL))
277-
asm("mcr%? p15, 0, %0, c8, c6, 0" : : "r" (zero));
277+
asm("mcr p15, 0, %0, c8, c6, 0" : : "r" (zero) : "cc");
278278
if (tlb_flag(TLB_V4_I_FULL))
279-
asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
279+
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
280280
}
281281

282282
if (tlb_flag(TLB_V6_U_ASID))
283-
asm("mcr%? p15, 0, %0, c8, c7, 2" : : "r" (asid));
283+
asm("mcr p15, 0, %0, c8, c7, 2" : : "r" (asid) : "cc");
284284
if (tlb_flag(TLB_V6_D_ASID))
285-
asm("mcr%? p15, 0, %0, c8, c6, 2" : : "r" (asid));
285+
asm("mcr p15, 0, %0, c8, c6, 2" : : "r" (asid) : "cc");
286286
if (tlb_flag(TLB_V6_I_ASID))
287-
asm("mcr%? p15, 0, %0, c8, c5, 2" : : "r" (asid));
287+
asm("mcr p15, 0, %0, c8, c5, 2" : : "r" (asid) : "cc");
288288
}
289289

290290
static inline void
@@ -296,27 +296,27 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
296296
uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm);
297297

298298
if (tlb_flag(TLB_WB))
299-
asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
299+
asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (zero));
300300

301301
if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) {
302302
if (tlb_flag(TLB_V3_PAGE))
303-
asm("mcr%? p15, 0, %0, c6, c0, 0" : : "r" (uaddr));
303+
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (uaddr) : "cc");
304304
if (tlb_flag(TLB_V4_U_PAGE))
305-
asm("mcr%? p15, 0, %0, c8, c7, 1" : : "r" (uaddr));
305+
asm("mcr p15, 0, %0, c8, c7, 1" : : "r" (uaddr) : "cc");
306306
if (tlb_flag(TLB_V4_D_PAGE))
307-
asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (uaddr));
307+
asm("mcr p15, 0, %0, c8, c6, 1" : : "r" (uaddr) : "cc");
308308
if (tlb_flag(TLB_V4_I_PAGE))
309-
asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (uaddr));
309+
asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (uaddr) : "cc");
310310
if (!tlb_flag(TLB_V4_I_PAGE) && tlb_flag(TLB_V4_I_FULL))
311-
asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
311+
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
312312
}
313313

314314
if (tlb_flag(TLB_V6_U_PAGE))
315-
asm("mcr%? p15, 0, %0, c8, c7, 1" : : "r" (uaddr));
315+
asm("mcr p15, 0, %0, c8, c7, 1" : : "r" (uaddr) : "cc");
316316
if (tlb_flag(TLB_V6_D_PAGE))
317-
asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (uaddr));
317+
asm("mcr p15, 0, %0, c8, c6, 1" : : "r" (uaddr) : "cc");
318318
if (tlb_flag(TLB_V6_I_PAGE))
319-
asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (uaddr));
319+
asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (uaddr) : "cc");
320320
}
321321

322322
static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
@@ -327,31 +327,31 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
327327
kaddr &= PAGE_MASK;
328328

329329
if (tlb_flag(TLB_WB))
330-
asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
330+
asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (zero) : "cc");
331331

332332
if (tlb_flag(TLB_V3_PAGE))
333-
asm("mcr%? p15, 0, %0, c6, c0, 0" : : "r" (kaddr));
333+
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (kaddr) : "cc");
334334
if (tlb_flag(TLB_V4_U_PAGE))
335-
asm("mcr%? p15, 0, %0, c8, c7, 1" : : "r" (kaddr));
335+
asm("mcr p15, 0, %0, c8, c7, 1" : : "r" (kaddr) : "cc");
336336
if (tlb_flag(TLB_V4_D_PAGE))
337-
asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr));
337+
asm("mcr p15, 0, %0, c8, c6, 1" : : "r" (kaddr) : "cc");
338338
if (tlb_flag(TLB_V4_I_PAGE))
339-
asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr));
339+
asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (kaddr) : "cc");
340340
if (!tlb_flag(TLB_V4_I_PAGE) && tlb_flag(TLB_V4_I_FULL))
341-
asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
341+
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
342342

343343
if (tlb_flag(TLB_V6_U_PAGE))
344-
asm("mcr%? p15, 0, %0, c8, c7, 1" : : "r" (kaddr));
344+
asm("mcr p15, 0, %0, c8, c7, 1" : : "r" (kaddr) : "cc");
345345
if (tlb_flag(TLB_V6_D_PAGE))
346-
asm("mcr%? p15, 0, %0, c8, c6, 1" : : "r" (kaddr));
346+
asm("mcr p15, 0, %0, c8, c6, 1" : : "r" (kaddr) : "cc");
347347
if (tlb_flag(TLB_V6_I_PAGE))
348-
asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (kaddr));
348+
asm("mcr p15, 0, %0, c8, c5, 1" : : "r" (kaddr) : "cc");
349349

350350
/* The ARM ARM states that the completion of a TLB maintenance
351351
* operation is only guaranteed by a DSB instruction
352352
*/
353353
if (tlb_flag(TLB_V6_U_PAGE | TLB_V6_D_PAGE | TLB_V6_I_PAGE))
354-
asm("mcr%? p15, 0, %0, c7, c10, 4" : : "r" (zero));
354+
asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (zero) : "cc");
355355
}
356356

357357
/*
@@ -373,20 +373,20 @@ static inline void flush_pmd_entry(pmd_t *pmd)
373373
const unsigned int __tlb_flag = __cpu_tlb_flags;
374374

375375
if (tlb_flag(TLB_DCLEAN))
376-
asm("mcr%? p15, 0, %0, c7, c10, 1 @ flush_pmd"
377-
: : "r" (pmd));
376+
asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
377+
: : "r" (pmd) : "cc");
378378
if (tlb_flag(TLB_WB))
379-
asm("mcr%? p15, 0, %0, c7, c10, 4 @ flush_pmd"
380-
: : "r" (zero));
379+
asm("mcr p15, 0, %0, c7, c10, 4 @ flush_pmd"
380+
: : "r" (zero) : "cc");
381381
}
382382

383383
static inline void clean_pmd_entry(pmd_t *pmd)
384384
{
385385
const unsigned int __tlb_flag = __cpu_tlb_flags;
386386

387387
if (tlb_flag(TLB_DCLEAN))
388-
asm("mcr%? p15, 0, %0, c7, c10, 1 @ flush_pmd"
389-
: : "r" (pmd));
388+
asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
389+
: : "r" (pmd) : "cc");
390390
}
391391

392392
#undef tlb_flag

0 commit comments

Comments
 (0)