First commit
This commit is contained in:
commit
a18b89a143
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/cmake-build-debug
|
||||
.idea
|
7
CMakeLists.txt
Normal file
7
CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.13)
|
||||
project(src)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
|
||||
add_executable(fsmd src/fsmd.cpp src/device/PCIEDevice.cpp src/device/PCIEDevice.h)
|
||||
add_executable(fsm src/fsm.cpp)
|
5
src/device/Device.h
Normal file
5
src/device/Device.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
class Device{
|
||||
virtual void get() const;
|
||||
};
|
76
src/device/PCIEDevice.cpp
Normal file
76
src/device/PCIEDevice.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include "PCIEDevice.h"
|
||||
|
||||
std::vector<PCIEDevice::DeviceEntry> PCIEDevice::DeviceEntry::find() {
|
||||
std::vector<PCIEDevice::DeviceEntry> entries;
|
||||
|
||||
//TODO: BSD?
|
||||
|
||||
DIR *folder;
|
||||
|
||||
folder = opendir("/sys/bus/pci/devices");
|
||||
if (folder == nullptr) {
|
||||
return entries;
|
||||
}
|
||||
|
||||
struct dirent *entry;
|
||||
|
||||
std::string fileName;
|
||||
|
||||
while ((entry = readdir(folder))) {
|
||||
if (entry->d_type == DT_DIR || entry->d_type == DT_LNK) {
|
||||
fileName = "/sys/bus/pci/devices/";
|
||||
fileName += entry->d_name;
|
||||
fileName += "/vendor";
|
||||
|
||||
FILE *vendorBytesPointer = fopen(fileName.c_str(), "rb");
|
||||
if (vendorBytesPointer != nullptr) {
|
||||
char *vendorBytesBuffer = nullptr;
|
||||
size_t vendorBytesLen;
|
||||
size_t vendorBytesRead = getdelim(&vendorBytesBuffer, &vendorBytesLen, '\0', vendorBytesPointer);
|
||||
if (vendorBytesRead != -1) {
|
||||
int vendor = (int) strtol(vendorBytesBuffer, nullptr, 0);
|
||||
|
||||
if (vendor == 0x8086) { //Intel Corporation
|
||||
|
||||
fileName = "/sys/bus/pci/devices/";
|
||||
fileName += entry->d_name;
|
||||
fileName += "/device";
|
||||
FILE *classBytesPointer = fopen(fileName.c_str(), "rb");
|
||||
if (classBytesPointer != nullptr) {
|
||||
char *classBytesBuffer = nullptr;
|
||||
size_t classBytesLen;
|
||||
size_t classBytesRead = getdelim(&classBytesBuffer, &classBytesLen, '\0',
|
||||
classBytesPointer);
|
||||
if (classBytesRead != -1) {
|
||||
int _class = (int) strtol(classBytesBuffer, nullptr, 0);
|
||||
|
||||
if (_class == 0x15a4 || _class == 0x15d0 || _class == 0x15d5) { //FM10000 devices
|
||||
fileName = "/sys/bus/pci/devices/";
|
||||
fileName += entry->d_name;
|
||||
fileName += "/resource4";
|
||||
if (access(fileName.c_str(), F_OK) == 0) {
|
||||
entries.emplace_back(fileName, vendor, _class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (classBytesBuffer != nullptr) {
|
||||
free(classBytesBuffer);
|
||||
}
|
||||
fclose(classBytesPointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vendorBytesBuffer != nullptr) {
|
||||
free(vendorBytesBuffer);
|
||||
}
|
||||
fclose(vendorBytesPointer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
45
src/device/PCIEDevice.h
Normal file
45
src/device/PCIEDevice.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "Device.h"
|
||||
|
||||
class PCIEDevice: public Device {
|
||||
|
||||
public:
|
||||
|
||||
class DeviceEntry{
|
||||
|
||||
public:
|
||||
DeviceEntry(std::string path, uint16_t vendor, uint16_t _class) : m_path(std::move(path)), m_class(_class), m_vendor(vendor){
|
||||
|
||||
}
|
||||
static std::vector<DeviceEntry> find();
|
||||
|
||||
const std::string& getPath() const{
|
||||
return m_path;
|
||||
}
|
||||
|
||||
uint16_t getVendor() const{
|
||||
return m_vendor;
|
||||
}
|
||||
|
||||
uint16_t getClass() const{
|
||||
return m_class;
|
||||
}
|
||||
private:
|
||||
std::string m_path;
|
||||
uint16_t m_vendor;
|
||||
uint16_t m_class;
|
||||
};
|
||||
|
||||
PCIEDevice(const std::string& path){
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
std::string m_path;
|
||||
};
|
||||
|
||||
|
6
src/fsm.cpp
Normal file
6
src/fsm.cpp
Normal file
|
@ -0,0 +1,6 @@
|
|||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
std::cout << "Hello, World!" << std::endl;
|
||||
return 0;
|
||||
}
|
6
src/fsmd.cpp
Normal file
6
src/fsmd.cpp
Normal file
|
@ -0,0 +1,6 @@
|
|||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
std::cout << "Hello, World!" << std::endl;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue