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 bb93690c00c9..09712554c5b9 100644
--- a/litmus/lockdown.c
+++ b/litmus/lockdown.c
@@ -77,6 +77,7 @@ void litmus_setup_lockdown(void __iomem *base, u32 id)
77#else 77#else
78 78
79static void __iomem *cache_base; 79static void __iomem *cache_base;
80
80static void __iomem *lockreg_d; 81static void __iomem *lockreg_d;
81static void __iomem *lockreg_i; 82static void __iomem *lockreg_i;
82static raw_spinlock_t prefetch_lock; 83static raw_spinlock_t prefetch_lock;
@@ -113,7 +114,11 @@ u32 color_read_in_mem(u32 lock_val, u32 unlock_val, void *start, void *end)
113 : [addr] "+r" (start), 114 : [addr] "+r" (start),
114 [val] "+r" (v) 115 [val] "+r" (v)
115 : [end] "r" (end), 116 : [end] "r" (end),
117#ifdef CONFIG_CACHE_PL310
118 [cachereg] "r" (ld_d_reg(raw_smp_processor_id())),
119#else
116 [cachereg] "r" (lockreg_d), 120 [cachereg] "r" (lockreg_d),
121#endif
117 [lockval] "r" (lock_val) 122 [lockval] "r" (lock_val)
118 : "cc"); 123 : "cc");
119 124
@@ -137,7 +142,10 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end)
137 unsigned long flags; 142 unsigned long flags;
138 u32 v = 0; 143 u32 v = 0;
139 144
145#ifndef CONFIG_CACHE_PL310
140 raw_spin_lock_irqsave(&prefetch_lock, flags); 146 raw_spin_lock_irqsave(&prefetch_lock, flags);
147#endif
148
141 __asm__ __volatile__ ( 149 __asm__ __volatile__ (
142" .align 5\n" 150" .align 5\n"
143" str %[lockval], [%[cachereg]]\n" 151" str %[lockval], [%[cachereg]]\n"
@@ -148,11 +156,18 @@ u32 color_read_in_mem_lock(u32 lock_val, u32 unlock_val, void *start, void *end)
148 : [addr] "+r" (start), 156 : [addr] "+r" (start),
149 [val] "+r" (v) 157 [val] "+r" (v)
150 : [end] "r" (end), 158 : [end] "r" (end),
159#ifdef CONFIG_CACHE_PL310
160 [cachereg] "r" (ld_d_reg(raw_smp_processor_id())),
161#else
151 [cachereg] "r" (lockreg_d), 162 [cachereg] "r" (lockreg_d),
163#endif
152 [lockval] "r" (lock_val), 164 [lockval] "r" (lock_val),
153 [unlockval] "r" (unlock_val) 165 [unlockval] "r" (unlock_val)
154 : "cc"); 166 : "cc");
167
168#ifndef CONFIG_CACHE_PL310
155 raw_spin_unlock_irqrestore(&prefetch_lock, flags); 169 raw_spin_unlock_irqrestore(&prefetch_lock, flags);
170#endif
156 171
157 return v; 172 return v;
158} 173}
@@ -330,9 +345,16 @@ int litmus_lockdown_proc_handler(struct ctl_table *table, int write,
330 345
331#define TRIALS 1000 346#define TRIALS 1000
332 347
348static void sleep_ns(int ns)
349{
350 int i;
351 lt_t start = litmus_clock();
352 for (i = 0; litmus_clock() - start < ns;i++);
353}
354
333static int test_get_cycles_overhead(void) 355static int test_get_cycles_overhead(void)
334{ 356{
335 u64 sum = 0, min = (u64)-1, max = 0; 357 u64 avg = 0, min = (u64)-1, max = 0;
336 unsigned long flags; 358 unsigned long flags;
337 cycles_t a, b; 359 cycles_t a, b;
338 int i; 360 int i;
@@ -342,6 +364,7 @@ static int test_get_cycles_overhead(void)
342 local_irq_save(flags); 364 local_irq_save(flags);
343 preempt_disable(); 365 preempt_disable();
344 a = litmus_get_cycles(); 366 a = litmus_get_cycles();
367 sleep_ns(15000);
345 b = litmus_get_cycles(); 368 b = litmus_get_cycles();
346 preempt_enable(); 369 preempt_enable();
347 local_irq_restore(flags); 370 local_irq_restore(flags);
@@ -350,10 +373,11 @@ static int test_get_cycles_overhead(void)
350 max = diff; 373 max = diff;
351 if (diff < min) 374 if (diff < min)
352 min = diff; 375 min = diff;
353 sum += diff; 376 avg += div64_u64(diff, TRIALS);
354 } 377 }
355 printk("cycle test: avg: %llu min: %llu max: %llu\n", 378 printk("cycle test 15us: avg: %llu min: %llu max: %llu\n",
356 div64_u64(sum, TRIALS), min, max); 379 avg, min, max);
380
357 return 0; 381 return 0;
358} 382}
359 383
@@ -661,7 +685,7 @@ int litmus_test_prefetch_proc_handler(struct ctl_table *table, int write,
661 685
662 free_page((unsigned long)vaddr); 686 free_page((unsigned long)vaddr);
663 687
664 //test_get_cycles_overhead(); 688 test_get_cycles_overhead();
665 test_read_in(); 689 test_read_in();
666 690
667 return 0; 691 return 0;