Multiple changes for June release
[samplevnf.git] / VNFs / DPPD-PROX / msr.c
1 /*
2 // Copyright (c) 2010-2017 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16
17 #include <inttypes.h>
18 #include <unistd.h>
19 #include <string.h>
20 #include <stdio.h>
21 #include <fcntl.h>
22
23 #include "msr.h"
24 #include "log.h"
25
26 int msr_fd[RTE_MAX_LCORE];
27 int n_msr_fd;
28 int msr_init(void)
29 {
30         char msr_path[1024];
31
32         if (n_msr_fd) {
33                 return 0;
34         }
35
36         for (uint32_t i = 0; i < sizeof(msr_fd)/sizeof(*msr_fd); ++i, n_msr_fd = i) {
37                 snprintf(msr_path, sizeof(msr_path), "/dev/cpu/%u/msr", i);
38                 msr_fd[i] = open(msr_path, O_RDWR);
39                 if (msr_fd[i] < 0) {
40                         return i == 0? -1 : 0;
41                 }
42         }
43
44         return 0;
45 }
46
47 void msr_cleanup(void)
48 {
49         for (int i = 0; i < n_msr_fd; ++i) {
50                 close(msr_fd[i]);
51         }
52
53         n_msr_fd = 0;
54 }
55
56 int msr_read(uint64_t *ret, int lcore_id, off_t offset)
57 {
58         if (lcore_id > n_msr_fd) {
59                 return -1;
60         }
61
62         if (0 > pread(msr_fd[lcore_id], ret, sizeof(uint64_t), offset)) {
63                 return -1;
64         }
65
66         return 0;
67 }
68
69 int msr_write(int lcore_id, uint64_t val, off_t offset)
70 {
71         if (lcore_id > n_msr_fd) {
72                 return -1;
73         }
74
75         if (sizeof(uint64_t) != pwrite(msr_fd[lcore_id], &val, sizeof(uint64_t), offset)) {
76                 return -1;
77         }
78         // plogx_dbg("\t\tmsr_write(core %d, offset %x, val %lx)\n", lcore_id, (int)offset, val);
79         return 0;
80 }