Skip to content

Commit 9e1f80b

Browse files
authored
Merge pull request #447 from nealsid/driver-interface-update
Changes to DriverInterface
2 parents d7dd17b + c311546 commit 9e1f80b

13 files changed

+191
-189
lines changed

src/MacMSRDriver/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ set(CMAKE_CXX_FLAGS "-Wall")
77
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
88
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
99

10-
file(GLOB LIB_FILES DriverInterface.c PCIDriverInterface.cpp MSRAccessor.cpp)
10+
file(GLOB LIB_FILES PCIDriverInterface.cpp MSRAccessor.cpp)
1111

1212
find_library(IOKIT_LIBRARY IOKit)
1313
add_library(PcmMsr SHARED ${LIB_FILES})

src/MacMSRDriver/DriverInterface.c

-64
This file was deleted.

src/MacMSRDriver/DriverInterface.h

-18
This file was deleted.

src/MacMSRDriver/MSRAccessor.cpp

+110-46
Original file line numberDiff line numberDiff line change
@@ -4,99 +4,163 @@
44
//
55
#include "MSRAccessor.h"
66
#include <exception>
7-
MSRAccessor::MSRAccessor(){
7+
#include <iostream>
8+
#include <iomanip>
9+
10+
using namespace std;
11+
12+
MSRAccessor::MSRAccessor()
13+
{
814
service = IOServiceGetMatchingService(kIOMainPortDefault,
915
IOServiceMatching(kPcmMsrDriverClassName));
1016
openConnection();
1117
}
1218

13-
int32_t MSRAccessor::buildTopology(uint32_t num_cores ,void* pTopos){
14-
topologyEntry *entries = (topologyEntry*)pTopos;
15-
size_t size = sizeof(topologyEntry)*num_cores;
16-
kern_return_t ret = getTopologyInfo(connect, entries, &size);
19+
int32_t MSRAccessor::buildTopology(uint32_t num_cores, void* pTopos)
20+
{
21+
size_t topology_struct_size = sizeof(TopologyEntry)*num_cores;
22+
23+
kern_return_t ret = IOConnectCallStructMethod(connect, kBuildTopology,
24+
NULL, 0,
25+
pTopos, &topology_struct_size);
1726
return (ret == KERN_SUCCESS) ? 0 : -1;
1827
}
1928

20-
int32_t MSRAccessor::read(uint32_t core_num, uint64_t msr_num, uint64_t * value){
29+
int32_t MSRAccessor::read(uint32_t core_num, uint64_t msr_num, uint64_t * value)
30+
{
2131
pcm_msr_data_t idatas, odatas;
22-
size_t size = sizeof(pcm_msr_data_t);
32+
33+
size_t struct_size = sizeof(pcm_msr_data_t);
2334
idatas.msr_num = (uint32_t)msr_num;
2435
idatas.cpu_num = core_num;
25-
kern_return_t ret = readMSR(connect, &idatas, &size, &odatas, &size);
36+
37+
kern_return_t ret = IOConnectCallStructMethod(connect, kReadMSR,
38+
&idatas, struct_size,
39+
&odatas, &struct_size);
40+
2641
if(ret == KERN_SUCCESS)
2742
{
2843
*value = odatas.value;
2944
return sizeof(uint64_t);
30-
}
31-
else{
45+
} else {
3246
return -1;
3347
}
3448
}
3549

3650
int32_t MSRAccessor::write(uint32_t core_num, uint64_t msr_num, uint64_t value){
3751
pcm_msr_data_t idatas;
38-
size_t size = sizeof(pcm_msr_data_t);
52+
3953
idatas.value = value;
4054
idatas.msr_num = (uint32_t)msr_num;
4155
idatas.cpu_num = core_num;
42-
kern_return_t ret = writeMSR(connect, &idatas, &size);
56+
57+
kern_return_t ret = IOConnectCallStructMethod(connect, kWriteMSR,
58+
&idatas, sizeof(pcm_msr_data_t),
59+
NULL, NULL);
60+
4361
if(ret == KERN_SUCCESS)
4462
{
4563
return sizeof(uint64_t);
46-
}
47-
else
48-
{
64+
} else {
4965
return -1;
5066
}
5167
}
5268

53-
uint32_t MSRAccessor::getNumInstances(){
54-
uint32_t num_instances;
55-
getNumClients(connect, &num_instances);
56-
return num_instances;
69+
uint32_t MSRAccessor::getNumInstances()
70+
{
71+
kern_return_t kernResult;
72+
uint32_t output_count = 1;
73+
uint64_t knum_insts = 0;
74+
75+
kernResult = IOConnectCallScalarMethod(connect,
76+
kGetNumInstances,
77+
NULL, 0,
78+
&knum_insts, &output_count);
79+
80+
if (kernResult != KERN_SUCCESS)
81+
{
82+
cerr << "IOConnectCallScalarMethod returned 0x" << hex << setw(8) << kernResult << endl;
83+
}
84+
// TODO add error handling; also, number-of-instance related
85+
// functions may go away as they do not appear to be used.
86+
return knum_insts;
5787
}
5888

59-
uint32_t MSRAccessor::incrementNumInstances(){
60-
uint32_t num_instances;
61-
incrementNumClients(connect, &num_instances);
62-
return num_instances;
89+
uint32_t MSRAccessor::incrementNumInstances()
90+
{
91+
kern_return_t kernResult;
92+
uint32_t output_count = 1;
93+
uint64_t knum_insts = 0;
94+
95+
kernResult = IOConnectCallScalarMethod(connect,
96+
kIncrementNumInstances,
97+
NULL, 0,
98+
&knum_insts, &output_count);
99+
100+
if (kernResult != KERN_SUCCESS)
101+
{
102+
cerr << "IOConnectCallScalarMethod returned 0x" << hex << setw(8) << kernResult << endl;
103+
}
104+
// TODO add error handling; also, these functions may go away as
105+
// they do not appear to be used.
106+
return knum_insts;
63107
}
64108

65-
uint32_t MSRAccessor::decrementNumInstances(){
66-
uint32_t num_instances;
67-
decrementNumClients(connect, &num_instances);
68-
return num_instances;
109+
uint32_t MSRAccessor::decrementNumInstances()
110+
{
111+
kern_return_t kernResult;
112+
uint32_t output_count = 1;
113+
uint64_t knum_insts = 0;
114+
115+
kernResult = IOConnectCallScalarMethod(connect, kDecrementNumInstances,
116+
NULL, 0,
117+
&knum_insts, &output_count);
118+
119+
if (kernResult != KERN_SUCCESS)
120+
{
121+
cerr << "IOConnectCallScalarMethod returned 0x" << hex << setw(8) << kernResult << endl;
122+
}
123+
// TODO add error handling; also, these functions may go away as
124+
// they do not appear to be used.
125+
return knum_insts;
69126
}
70127

71-
MSRAccessor::~MSRAccessor(){
128+
MSRAccessor::~MSRAccessor()
129+
{
72130
closeConnection();
73131
}
74132

75-
kern_return_t MSRAccessor::openConnection(){
133+
kern_return_t MSRAccessor::openConnection()
134+
{
76135
kern_return_t kernResult = IOServiceOpen(service, mach_task_self(), 0, &connect);
77-
78-
if (kernResult != KERN_SUCCESS) {
79-
fprintf(stderr, "IOServiceOpen returned 0x%08x\n", kernResult);
80-
}
81-
else {
82-
kernResult = openMSRClient(connect);
83-
84-
if (kernResult != KERN_SUCCESS) {
85-
fprintf(stderr, "openClient returned 0x%08x.\n\n", kernResult);
136+
137+
if (kernResult != KERN_SUCCESS)
138+
{
139+
cerr << "IOServiceOpen returned 0x" << hex << setw(8) << kernResult << endl;
140+
} else {
141+
kernResult = IOConnectCallScalarMethod(connect, kOpenDriver, NULL, 0, NULL, NULL);
142+
143+
if (kernResult != KERN_SUCCESS)
144+
{
145+
cerr << "kOpenDriver returned 0x" << hex << setw(8) << kernResult << endl;
86146
}
87147
}
88-
148+
89149
return kernResult;
90150
}
91151

92-
void MSRAccessor::closeConnection(){
93-
kern_return_t kernResult = closeMSRClient(connect);
94-
if (kernResult != KERN_SUCCESS) {
95-
fprintf(stderr, "closeClient returned 0x%08x.\n\n", kernResult);
152+
void MSRAccessor::closeConnection()
153+
{
154+
kern_return_t kernResult = IOConnectCallScalarMethod(connect, kCloseDriver,
155+
NULL, 0, NULL, NULL);
156+
if (kernResult != KERN_SUCCESS)
157+
{
158+
cerr << "kCloseDriver returned 0x" << hex << setw(8) << kernResult << endl;
96159
}
97-
160+
98161
kernResult = IOServiceClose(connect);
99-
if (kernResult != KERN_SUCCESS) {
100-
fprintf(stderr, "IOServiceClose returned 0x%08x\n\n", kernResult);
162+
if (kernResult != KERN_SUCCESS)
163+
{
164+
cerr << "IOServiceClose returned 0x" << hex << setw(8) << kernResult << endl;
101165
}
102166
}

src/MacMSRDriver/MSRAccessor.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
// Copyright (c) 2012, Intel Corporation
33
// written by Austen Ott
44
//
5+
56
#include <IOKit/IOKitLib.h>
6-
extern "C" {
7-
#include "DriverInterface.h"
8-
}
7+
#include "PcmMsr/UserKernelShared.h"
98

10-
class MSRAccessor{
9+
class MSRAccessor
10+
{
1111
private:
1212
io_service_t service;
1313
io_connect_t connect;

src/MacMSRDriver/PcmMsr/PcmMsr.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void cpuWriteMSR(void* pIDatas){
5757
}
5858

5959
void cpuGetTopoData(void* pTopos){
60-
topologyEntry* entries = (topologyEntry*)pTopos;
60+
TopologyEntry* entries = (TopologyEntry*)pTopos;
6161
int cpu = cpu_number();
6262
int info[4];
6363
entries[cpu].os_id = cpu;
@@ -166,18 +166,18 @@ IOReturn PcmMsrDriverClassName::writeMSR(pcm_msr_data_t* idata){
166166
return ret;
167167
}
168168

169-
IOReturn PcmMsrDriverClassName::buildTopology(topologyEntry* odata, uint32_t input_num_cores)
169+
IOReturn PcmMsrDriverClassName::buildTopology(TopologyEntry* odata, uint32_t input_num_cores)
170170
{
171171
size_t topologyBufferSize;
172172

173173
// TODO figure out when input_num_cores is used rather than num_cores
174-
if (os_mul_overflow(sizeof(topologyEntry), (size_t) num_cores, &topologyBufferSize))
174+
if (os_mul_overflow(sizeof(TopologyEntry), (size_t) num_cores, &topologyBufferSize))
175175
{
176176
return kIOReturnBadArgument;
177177
}
178178

179-
topologyEntry *topologies =
180-
(topologyEntry *)IOMallocAligned(topologyBufferSize, 32);
179+
TopologyEntry *topologies =
180+
(TopologyEntry *)IOMallocAligned(topologyBufferSize, 32);
181181

182182
if (topologies == nullptr)
183183
{

src/MacMSRDriver/PcmMsr/PcmMsr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class PcmMsrDriverClassName : public IOService
1414

1515
virtual IOReturn writeMSR(pcm_msr_data_t* data);
1616
virtual IOReturn readMSR(pcm_msr_data_t* idata,pcm_msr_data_t* odata);
17-
virtual IOReturn buildTopology(topologyEntry* odata, uint32_t input_num_cores);
17+
virtual IOReturn buildTopology(TopologyEntry* odata, uint32_t input_num_cores);
1818
virtual bool init(OSDictionary *dict) override;
1919
virtual void free(void) override;
2020
virtual bool handleOpen(IOService* forClient, IOOptionBits opts, void* args) override;

src/MacMSRDriver/PcmMsr/PcmMsrClient.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,12 @@ IOReturn PcmMsrClientClassName::writeMSR(pcm_msr_data_t* data)
154154
}
155155

156156
IOReturn PcmMsrClientClassName::sBuildTopology(PcmMsrClientClassName* target, void* reference, IOExternalMethodArguments* args){
157-
return target -> buildTopology((topologyEntry*)args->structureOutput, args->structureOutputSize);
157+
return target -> buildTopology((TopologyEntry*)args->structureOutput, args->structureOutputSize);
158158
}
159159

160-
IOReturn PcmMsrClientClassName::buildTopology(topologyEntry* data, size_t output_size)
160+
IOReturn PcmMsrClientClassName::buildTopology(TopologyEntry* data, size_t output_size)
161161
{
162-
uint32_t num_cores = (uint32_t) (output_size / sizeof(topologyEntry) );
162+
uint32_t num_cores = (uint32_t) (output_size / sizeof(TopologyEntry) );
163163
IOReturn result = checkActiveAndOpened (__FUNCTION__);
164164

165165
if (result == kIOReturnSuccess)

src/MacMSRDriver/PcmMsr/PcmMsrClient.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class PcmMsrClientClassName : public IOUserClient
4444
virtual IOReturn writeMSR(pcm_msr_data_t* data);
4545

4646
static IOReturn sBuildTopology(PcmMsrClientClassName* target, void* reference, IOExternalMethodArguments* args);
47-
virtual IOReturn buildTopology(topologyEntry* data, size_t output_size);
47+
virtual IOReturn buildTopology(TopologyEntry* data, size_t output_size);
4848

4949
static IOReturn sGetNumInstances(PcmMsrClientClassName* target, void* reference, IOExternalMethodArguments* args);
5050
virtual IOReturn getNumInstances(uint32_t* num_insts);

0 commit comments

Comments
 (0)