]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/drivers/arm/cache_func_gen.cpp
Some minor fixes.
[l4.git] / kernel / fiasco / src / drivers / arm / cache_func_gen.cpp
1 // Source for generating some asm for cut'n'paste, why program asm ourselves
2 // when the compiler can do it?
3 // arm-linux-g++ -fverbose-asm -fPIC -W -Wall -Os -S cache_func_gen.cpp
4
5 #include <cstdio>
6
7 enum {
8   DEBUG = 0,
9 };
10
11 void num_way_l1_cache_op()
12 {
13   asm volatile("@ Start:");
14   register unsigned long ccsidr;
15   asm volatile("mcr p15, 2, %0, c0, c0, 0" : : "r" (0)); // L1, data or unified
16   asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (ccsidr));
17
18   if (DEBUG)
19     printf("ccsidr = %08lx\n", ccsidr);
20
21   // sets
22   register unsigned numsets = ((ccsidr >> 13) & ((1 << 15) - 1));
23   // associativity - 1
24   register unsigned numways = ((ccsidr >>  3) & ((1 << 10) - 1));
25   // linesize
26   register unsigned linesizel2 = (ccsidr >> 0) & ((1 << 3) - 1);
27
28   if (DEBUG)
29     printf("linesizel2: %d  numways: %d numsets: %d\n",
30            linesizel2, numways + 1, numsets + 1);
31
32   register int shiftways = __builtin_clz(numways);
33   register int shiftset  = linesizel2 + 4;
34
35   if (DEBUG)
36     printf("shiftways: %d shiftset: %d\n", shiftways, shiftset);
37
38   unsigned int cnt = 0;
39   for (register int w = numways; w >= 0; --w)
40     for (register int s = numsets; s >= 0; --s)
41       {
42         register unsigned long v = (w << shiftways) | (s << shiftset);
43         if (!DEBUG)
44           // invalidate num/way
45           asm volatile("mcr p15, 0, %0, c7, c6, 2" : : "r" (v));
46         if (DEBUG)
47           printf("w=%d s=%d: %08lx\n", w, s, v);
48         if (DEBUG)
49           cnt++;
50       }
51
52   asm volatile("isb");
53   asm volatile("dsb");
54   asm volatile("@ End:");
55   if (DEBUG)
56     printf("cnt: %d\n", cnt);
57 }