First commit

This commit is contained in:
DataHoarder 2021-10-23 12:13:49 +02:00
commit a18b89a143
7 changed files with 147 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/cmake-build-debug
.idea

7
CMakeLists.txt Normal file
View 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
View file

@ -0,0 +1,5 @@
#pragma once
class Device{
virtual void get() const;
};

76
src/device/PCIEDevice.cpp Normal file
View 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
View 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
View file

@ -0,0 +1,6 @@
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}

6
src/fsmd.cpp Normal file
View file

@ -0,0 +1,6 @@
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}