]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/plr/patches/perfcnt.diff
update
[l4.git] / l4 / pkg / plr / patches / perfcnt.diff
1 diff --git a/src/kern/thread_object.cpp b/src/kern/thread_object.cpp
2 index 4c24387..7efc871 100644
3 --- a/src/kern/thread_object.cpp
4 +++ b/src/kern/thread_object.cpp
5 @@ -681,6 +681,60 @@ Thread_object::sys_thread_stats(L4_msg_tag const &/*tag*/, Utcb *utcb)
6      drq(handle_sys_thread_stats_remote, &value, 0, Drq::Any_ctxt);
7    else
8      {
9 +         if (utcb->values[1] == 12)
10 +               {
11 +                 //printf("KERN STATS TIME ");
12 +                 //printf("%lx %lx %lx\n", utcb->values[2], utcb->values[3], utcb->values[4]);
13 +                 if (utcb->values[2] == 0x1E) // TEST
14 +                   {
15 +                         Mword a, b, c, d;
16 +
17 +                         a = 0; b = 0; c = 0; d = 0;
18 +                         asm volatile ("cpuid"
19 +                             : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
20 +                             : "a" (a), "b" (b), "c" (c), "d" (d)
21 +                         );
22 +                         //printf("::CPUID.MAX: %08lx\n", a);
23 +
24 +                         a = 0x0A;
25 +                         asm volatile ("cpuid"
26 +                             : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
27 +                             : "a" (a), "b" (b), "c" (c), "d" (d)
28 +                         );
29 +                         //printf("::Perfmon capabilities:\n");
30 +                         //printf("::A %08lx B %08lx C %08lx D %08lx\n", a, b, c, d);
31 +                       }
32 +                 else if (utcb->values[2] == 0x5E) // SETUP
33 +                   {
34 +                         //printf("SETUP\n");
35 +                         Cpu::wrmsr(utcb->values[3], 0x186);
36 +                         Cpu::wrmsr(utcb->values[4], 0x187);
37 +                         Cpu::wrmsr(utcb->values[5], 0x188);
38 +                         Cpu::wrmsr(utcb->values[6], 0x189);
39 +
40 +                         Cpu::wrmsr(0, 0xC1);
41 +                         Cpu::wrmsr(0, 0xC2);
42 +                         Cpu::wrmsr(0, 0xC3);
43 +                         Cpu::wrmsr(0, 0xC4);
44 +                   }
45 +                 else if (utcb->values[2] == 0xAE) // READ
46 +                       {
47 +                         //printf("READ\n");
48 +                         Unsigned64 v1, v2, v3, v4;
49 +                         v1 = Cpu::rdmsr(0xC1);
50 +                         v2 = Cpu::rdmsr(0xC2);
51 +                         v3 = Cpu::rdmsr(0xC3);
52 +                         v4 = Cpu::rdmsr(0xC4);
53 +                         utcb->values[0] = v1 & 0xFFFFFFFF;
54 +                         utcb->values[1] = (v1 >> 32) & 0xFFFFFFFF;
55 +                         utcb->values[2] = v2 & 0xFFFFFFFF;
56 +                         utcb->values[3] = (v2 >> 32) & 0xFFFFFFFF;
57 +                         utcb->values[4] = v3 & 0xFFFFFFFF;
58 +                         utcb->values[5] = (v3 >> 32) & 0xFFFFFFFF;
59 +                         utcb->values[6] = v4 & 0xFFFFFFFF;
60 +                         utcb->values[7] = (v4 >> 32) & 0xFFFFFFFF;
61 +                       }
62 +               }
63        // Respect the fact that the consumed time is only updated on context switch
64        if (this == current())
65          update_consumed_time();