aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/lockdown.c
diff options
context:
space:
mode:
Diffstat (limited to 'litmus/lockdown.c')
-rw-r--r--litmus/lockdown.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/litmus/lockdown.c b/litmus/lockdown.c
index 8e10bc66b86..a718ffc9c9b 100644
--- a/litmus/lockdown.c
+++ b/litmus/lockdown.c
@@ -79,6 +79,7 @@ void litmus_setup_lockdown(void __iomem *base, u32 id)
79extern void v7_flush_kern_dcache_area(void *, size_t); 79extern void v7_flush_kern_dcache_area(void *, size_t);
80 80
81static void __iomem *cache_base; 81static void __iomem *cache_base;
82
82static void __iomem *lockreg_d; 83static void __iomem *lockreg_d;
83static void __iomem *lockreg_i; 84static void __iomem *lockreg_i;
84static raw_spinlock_t prefetch_lock; 85static raw_spinlock_t prefetch_lock;
@@ -115,7 +116,11 @@ u32 color_read_in_mem(u32 lock_val, u32 unlock_val, void *start, void *end)
115 : [addr] "+r" (start), 116 : [addr] "+r" (start),
116 [val] "+r" (v) 117 [val] "+r" (v)
117 : [end] "r" (end), 118 : [end] "r" (end),
119#ifdef CONFIG_CACHE_PL310
120 [cachereg] "r" (ld_d_reg(raw_smp_processor_id())),
121#else
118 [cachereg] "r" (lockreg_d), 122 [cachereg] "r" (lockreg_d),
123#endif
119 [lockval] "r" (lock_val) 124 [lockval] "r" (lock_val)
120 : "cc"); 125 : "cc");
121 126
@@ -139,7 +144,10 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end)
139 unsigned long flags; 144 unsigned long flags;
140 u32 v = 0; 145 u32 v = 0;
141 146
147#ifndef CONFIG_CACHE_PL310
142 raw_spin_lock_irqsave(&prefetch_lock, flags); 148 raw_spin_lock_irqsave(&prefetch_lock, flags);
149#endif
150
143 __asm__ __volatile__ ( 151 __asm__ __volatile__ (
144" .align 5\n" 152" .align 5\n"
145" str %[lockval], [%[cachereg]]\n" 153" str %[lockval], [%[cachereg]]\n"
@@ -150,11 +158,18 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end)
150 : [addr] "+r" (start), 158 : [addr] "+r" (start),
151 [val] "+r" (v) 159 [val] "+r" (v)
152 : [end] "r" (end), 160 : [end] "r" (end),
161#ifdef CONFIG_CACHE_PL310
162 [cachereg] "r" (ld_d_reg(raw_smp_processor_id())),
163#else
153 [cachereg] "r" (lockreg_d), 164 [cachereg] "r" (lockreg_d),
165#endif
154 [lockval] "r" (lock_val), 166 [lockval] "r" (lock_val),
155 [unlockval] "r" (unlock_val) 167 [unlockval] "r" (unlock_val)
156 : "cc"); 168 : "cc");
169
170#ifndef CONFIG_CACHE_PL310
157 raw_spin_unlock_irqrestore(&prefetch_lock, flags); 171 raw_spin_unlock_irqrestore(&prefetch_lock, flags);
172#endif
158 173
159 return v; 174 return v;
160} 175}
@@ -334,9 +349,16 @@ int litmus_lockdown_proc_handler(struct ctl_table *table, int write,
334 349
335#define TRIALS 1000 350#define TRIALS 1000
336 351
352static void sleep_ns(int ns)
353{
354 int i;
355 lt_t start = litmus_clock();
356 for (i = 0; litmus_clock() - start < ns;i++);
357}
358
337static int test_get_cycles_overhead(void) 359static int test_get_cycles_overhead(void)
338{ 360{
339 u64 sum = 0, min = (u64)-1, max = 0; 361 u64 avg = 0, min = (u64)-1, max = 0;
340 unsigned long flags; 362 unsigned long flags;
341 cycles_t a, b; 363 cycles_t a, b;
342 int i; 364 int i;
@@ -346,6 +368,7 @@ static int test_get_cycles_overhead(void)
346 local_irq_save(flags); 368 local_irq_save(flags);
347 preempt_disable(); 369 preempt_disable();
348 a = litmus_get_cycles(); 370 a = litmus_get_cycles();
371 sleep_ns(15000);
349 b = litmus_get_cycles(); 372 b = litmus_get_cycles();
350 preempt_enable(); 373 preempt_enable();
351 local_irq_restore(flags); 374 local_irq_restore(flags);
@@ -354,10 +377,11 @@ static int test_get_cycles_overhead(void)
354 max = diff; 377 max = diff;
355 if (diff < min) 378 if (diff < min)
356 min = diff; 379 min = diff;
357 sum += diff; 380 avg += div64_u64(diff, TRIALS);
358 } 381 }
359 printk("cycle test: avg: %llu min: %llu max: %llu\n", 382 printk("cycle test 15us: avg: %llu min: %llu max: %llu\n",
360 div64_u64(sum, TRIALS), min, max); 383 avg, min, max);
384
361 return 0; 385 return 0;
362} 386}
363 387
@@ -665,7 +689,7 @@ int litmus_test_prefetch_proc_handler(struct ctl_table *table, int write,
665 689
666 free_page((unsigned long)vaddr); 690 free_page((unsigned long)vaddr);
667 691
668 //test_get_cycles_overhead(); 692 test_get_cycles_overhead();
669 test_read_in(); 693 test_read_in();
670 694
671 return 0; 695 return 0;