Repository navigation
Expand file tree
/
Copy pathIntelMSR.p
More file actions
145 lines (117 loc) · 4.65 KB
/
Copy pathIntelMSR.p
File metadata and controls
145 lines (117 loc) · 4.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// PawnIO Modules - Modules for various hardware to be used with PawnIO.
// Copyright (C) 2025 namazso <admin@namazso.eu>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// SPDX-License-Identifier: LGPL-2.1-or-later
#include <pawnio.inc>
#define MSR_IA32_PACKAGE_THERM_STATUS 0x000001b1
#define MSR_IA32_PERF_STATUS 0x00000198
#define MSR_IA32_TEMPERATURE_TARGET 0x000001a2
#define MSR_IA32_THERM_STATUS 0x0000019c
#define MSR_VR_CURRENT_CONFIG 0x00000601
#define MSR_VR_MAILBOX_INTERFACE 0x00000607
#define MSR_VR_MAILBOX_DATA 0x00000608
#define MSR_PKG_POWER_LIMIT 0x00000610
#define MSR_PKG_ENERGY_STATUS 0x00000611
#define MSR_PKG_PERF_STATUS 0x00000613
#define MSR_PKG_POWER_INFO 0x00000614
#define MSR_DRAM_POWER_LIMIT 0x00000618
#define MSR_DRAM_ENERGY_STATUS 0x00000619
#define MSR_DRAM_PERF_STATUS 0x0000061b
#define MSR_DRAM_POWER_INFO 0x0000061c
#define MSR_UNC_PERF_GLOBAL_CTRL 0x00000620
#define MSR_UNC_PERF_GLOBAL_STATUS 0x00000621
#define MSR_PP0_POWER_LIMIT 0x00000638
#define MSR_PP0_ENERGY_STATUS 0x00000639
#define MSR_PP0_POLICY 0x0000063a
#define MSR_PP0_PERF_STATUS 0x0000063b
#define MSR_PP1_POWER_LIMIT 0x00000640
#define MSR_PP1_ENERGY_STATUS 0x00000641
#define MSR_PP1_POLICY 0x00000642
#define MSR_PLATFORM_ENERGY_STATUS 0x0000064D
#define MSR_RAPL_POWER_UNIT 0x00000606
#define MSR_PLATFORM_INFO 0x000000ce
#define MSR_EBL_CR_POWERON 0x0000002a
#define MSR_TURBO_RATIO_LIMIT 0x000001ad
#define MSR_IA32_MPERF 0x000000e7
#define MSR_IA32_APERF 0x000000e8
#define MSR_OC_MAILBOX 0x00000150
// Hardware prefetcher controls (Intel SDM Vol. 4): bit 0 L2 HW prefetcher, bit 1 L2
// adjacent-line, bit 2 DCU, bit 3 DCU IP. Used for CPU tuning.
#define MSR_MISC_FEATURE_CONTROL 0x000001a4
bool:is_allowed_msr_read(msr) {
switch (msr) {
case MSR_IA32_PACKAGE_THERM_STATUS, MSR_IA32_PERF_STATUS, MSR_IA32_TEMPERATURE_TARGET,
MSR_IA32_THERM_STATUS, MSR_IA32_MPERF, MSR_IA32_APERF,
MSR_VR_CURRENT_CONFIG, MSR_PKG_POWER_LIMIT, MSR_PKG_ENERGY_STATUS, MSR_PKG_PERF_STATUS, MSR_PKG_POWER_INFO,
MSR_DRAM_POWER_LIMIT, MSR_DRAM_ENERGY_STATUS, MSR_DRAM_PERF_STATUS, MSR_DRAM_POWER_INFO,
MSR_UNC_PERF_GLOBAL_CTRL, MSR_UNC_PERF_GLOBAL_STATUS,
MSR_PP0_POWER_LIMIT, MSR_PP0_ENERGY_STATUS, MSR_PP0_POLICY, MSR_PP0_PERF_STATUS,
MSR_PP1_POWER_LIMIT, MSR_PP1_ENERGY_STATUS, MSR_PP1_POLICY,
MSR_PLATFORM_ENERGY_STATUS, MSR_RAPL_POWER_UNIT, MSR_PLATFORM_INFO,
MSR_EBL_CR_POWERON, MSR_TURBO_RATIO_LIMIT, MSR_OC_MAILBOX, MSR_VR_MAILBOX_INTERFACE, MSR_VR_MAILBOX_DATA,
MSR_MISC_FEATURE_CONTROL:
return true;
default:
return false;
}
return false;
}
bool:is_allowed_msr_write(msr) {
switch (msr) {
case MSR_VR_CURRENT_CONFIG, MSR_PKG_POWER_LIMIT, MSR_OC_MAILBOX, MSR_VR_MAILBOX_INTERFACE, MSR_VR_MAILBOX_DATA,
MSR_MISC_FEATURE_CONTROL:
return true;
default:
return false;
}
return false;
}
/// Read MSR.
///
/// @param in [0] = MSR
/// @param in_size Must be 1
/// @param out [0] = Value read
/// @param out_size Must be 1
/// @return An NTSTATUS
DEFINE_IOCTL_SIZED(ioctl_read_msr, 1, 1) {
new msr = in[0] & 0xFFFFFFFF;
if (!is_allowed_msr_read(msr))
return STATUS_ACCESS_DENIED;
new value = 0;
new NTSTATUS:status = msr_read(msr, value);
out[0] = value;
return status;
}
/// Write MSR.
///
/// @param in [0] = MSR, [1] = Value
/// @param in_size Must be 2
/// @param out_size Must be 0
/// @return An NTSTATUS
DEFINE_IOCTL_SIZED(ioctl_write_msr, 2, 0) {
new msr = in[0] & 0xFFFFFFFF;
if (!is_allowed_msr_write(msr))
return STATUS_ACCESS_DENIED;
return msr_write(msr, in[1]);
}
NTSTATUS:main() {
if (get_arch() != ARCH_X64)
return STATUS_NOT_SUPPORTED;
if (get_cpu_vendor() != CpuVendor_Intel)
return STATUS_NOT_SUPPORTED;
return STATUS_SUCCESS;
}