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);
9 + if (utcb->values[1] == 12)
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
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)
22 + //printf("::CPUID.MAX: %08lx\n", a);
25 + asm volatile ("cpuid"
26 + : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
27 + : "a" (a), "b" (b), "c" (c), "d" (d)
29 + //printf("::Perfmon capabilities:\n");
30 + //printf("::A %08lx B %08lx C %08lx D %08lx\n", a, b, c, d);
32 + else if (utcb->values[2] == 0x5E) // SETUP
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);
40 + Cpu::wrmsr(0, 0xC1);
41 + Cpu::wrmsr(0, 0xC2);
42 + Cpu::wrmsr(0, 0xC3);
43 + Cpu::wrmsr(0, 0xC4);
45 + else if (utcb->values[2] == 0xAE) // READ
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;
63 // Respect the fact that the consumed time is only updated on context switch
64 if (this == current())
65 update_consumed_time();