Root/
Source at commit HEAD created 12 years 4 months ago. By cosmo1t, moved from googlecode to here | |
---|---|
1 | #include "VoodooTSCSync.h"␊ |
2 | ␊ |
3 | // Define my superclass␊ |
4 | ␊ |
5 | #define super IOService␊ |
6 | ␊ |
7 | OSDefineMetaClassAndStructors(org_voodoo_driver_VoodooTSCSync, IOService)␊ |
8 | ␊ |
9 | //stamp the tsc␊ |
10 | extern "C" void stamp_tsc(void *tscp) {␊ |
11 | //␉IOLockLock(lock);␊ |
12 | //␉countCalled++;␊ |
13 | //␉IOLockUnlock(lock);␊ |
14 | ␉wrmsr64(MSR_IA32_TSC,*(uint64_t*)tscp);␊ |
15 | }␊ |
16 | ␊ |
17 | ␊ |
18 | bool org_voodoo_driver_VoodooTSCSync::init(OSDictionary *dictionary){␊ |
19 | ␉if (!super::init(dictionary)){ return false; }␊ |
20 | ␊ |
21 | //␉lock = IOLockAlloc();␊ |
22 | //␉if (lock == 0){␊ |
23 | //␉␉IOLog("Failed to alloc lock");␊ |
24 | //␉␉return false;␊ |
25 | //␉}␊ |
26 | ␉␉␊ |
27 | ␉return true;␊ |
28 | }␊ |
29 | ␊ |
30 | static IOPMPowerState powerStates[2] = {␊ |
31 | {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},␊ |
32 | {1, kIOPMPowerOn, kIOPMPowerOn, kIOPMPowerOn, 0, 0, 0, 0, 0, 0, 0, 0}␊ |
33 | };␊ |
34 | ␊ |
35 | IOReturn org_voodoo_driver_VoodooTSCSync::setPowerState(unsigned long powerStateOrdinal, IOService *whatDevice ) {␊ |
36 | if (powerStateOrdinal)␊ |
37 | this->doTSC();␊ |
38 | return IOPMAckImplied;␊ |
39 | }␊ |
40 | ␊ |
41 | void org_voodoo_driver_VoodooTSCSync::stop(IOService *provider)␊ |
42 | {␊ |
43 | PMstop();␊ |
44 | super::stop(provider);␊ |
45 | }␊ |
46 | ␊ |
47 | ␊ |
48 | bool org_voodoo_driver_VoodooTSCSync::start(IOService *provider)␊ |
49 | ␊ |
50 | {␉␊ |
51 | ␉if (!super::start(provider)){ return false; }␊ |
52 | //␉countCalled = 0;␊ |
53 | PMinit();␊ |
54 | registerPowerDriver(this, powerStates, 2);␊ |
55 | provider->joinPMtree(this);␊ |
56 | ␉return true;␊ |
57 | ␉␊ |
58 | }␊ |
59 | ␊ |
60 | ␊ |
61 | /*␊ |
62 | Update MSR on all processors.␊ |
63 | */␊ |
64 | void org_voodoo_driver_VoodooTSCSync::doTSC(){␊ |
65 | ␉␊ |
66 | ␉␊ |
67 | ␉uint64_t tsc = rdtsc64();␊ |
68 | ␉IOLog("Current tsc from rdtsc64() is %lld. Rendezvouing..\n",tsc);␊ |
69 | ␉␊ |
70 | ␉//now call the kernel function that will call this "action" on all cores/processors␊ |
71 | ␉mp_rendezvous_no_intrs(stamp_tsc, (void*)&tsc);␊ |
72 | ␉␊ |
73 | //␉IOLog("VoodooTSCSyn::doTsc(): stamp_tsc was called: %d times\n",countCalled);␊ |
74 | ␉//countCalled=0;␊ |
75 | }␊ |
76 |