From 8b050853e28b849724eac5a5b45757641d1ab061 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Fri, 10 Sep 2021 17:59:14 +0300 Subject: [PATCH] solid: partially deal with TODO related to CPU instructions Signed-off-by: Ivailo Monev --- .../solid/backends/devinfo/devinfodevice.cpp | 22 ++++++++++++++----- solid/solid/backends/devinfo/devinfodevice.h | 4 +++- .../backends/devinfo/devinfoprocessor.cpp | 12 +++++++++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/solid/solid/backends/devinfo/devinfodevice.cpp b/solid/solid/backends/devinfo/devinfodevice.cpp index 45deb018..12d2bb11 100644 --- a/solid/solid/backends/devinfo/devinfodevice.cpp +++ b/solid/solid/backends/devinfo/devinfodevice.cpp @@ -155,7 +155,7 @@ QString DevinfoDevice::product() const return QLatin1String("Loopback device Interface"); } } else if(queryDeviceInterface(Solid::DeviceInterface::Processor)) { - QByteArray hwmodel = sysctlByName("hw.model"); + const QByteArray hwmodel = DevinfoDevice::stringByName("hw.model"); return QString::fromLatin1(hwmodel.constData()); } @@ -275,18 +275,30 @@ QByteArray DevinfoDevice::deviceCtl(const char* field) const sysctldevicename += '.'; sysctldevicename += field; - return sysctlByName(sysctldevicename.constData()); + return DevinfoDevice::stringByName(sysctldevicename.constData()); } -QByteArray DevinfoDevice::sysctlByName(const char* sysctlname) const +QByteArray DevinfoDevice::stringByName(const char* sysctlname) { - size_t sysctlbuffsize = 200; + size_t sysctlbuffsize = 1024; char sysctlbuff[sysctlbuffsize]; ::memset(sysctlbuff, '\0', sysctlbuffsize * sizeof(char)); const int sysctlresult = ::sysctlbyname(sysctlname, sysctlbuff, &sysctlbuffsize, NULL, 0); if (sysctlresult == -1) { - // qWarning() << "sysctlbyname" << sysctldevicename << "failed for" << devicename; + // qWarning() << "sysctlbyname failed" << sysctlname; return QByteArray(); } return QByteArray(sysctlbuff, sysctlbuffsize); } + +qlonglong DevinfoDevice::integerByName(const char* sysctlname) +{ + size_t sysctlbuffsize = sizeof(qlonglong); + qlonglong sysctlbuff = 0; + const int sysctlresult = ::sysctlbyname(sysctlname, &sysctlbuff, &sysctlbuffsize, NULL, 0); + if (sysctlresult == -1) { + // qWarning() << "sysctlbyname failed" << sysctlname; + return -1; + } + return sysctlbuff; +} diff --git a/solid/solid/backends/devinfo/devinfodevice.h b/solid/solid/backends/devinfo/devinfodevice.h index 8dd2edcd..af449a85 100644 --- a/solid/solid/backends/devinfo/devinfodevice.h +++ b/solid/solid/backends/devinfo/devinfodevice.h @@ -68,7 +68,9 @@ public: QByteArray deviceProperty(const DeviceProperty property) const; QByteArray devicePnP(const PnPInfo pnp) const; QByteArray deviceCtl(const char* field) const; - QByteArray sysctlByName(const char* sysctlname) const; + + static QByteArray stringByName(const char* sysctlname); + static qlonglong integerByName(const char* sysctlname); private: QString m_device; diff --git a/solid/solid/backends/devinfo/devinfoprocessor.cpp b/solid/solid/backends/devinfo/devinfoprocessor.cpp index e2383d70..31168b19 100644 --- a/solid/solid/backends/devinfo/devinfoprocessor.cpp +++ b/solid/solid/backends/devinfo/devinfoprocessor.cpp @@ -55,8 +55,18 @@ bool Processor::canChangeFrequency() const Solid::Processor::InstructionSets Processor::instructionSets() const { - // TODO: + // TODO: IntelSse2, IntelSse3, IntelSse4, Amd3DNow, AltiVec + Solid::Processor::InstructionSets cpuinstructions = Solid::Processor::NoExtensions; + + const qlonglong instructionsse = DevinfoDevice::integerByName("hw.instruction_sse"); + // qDebug() << Q_FUNC_INFO << instructionsse; + if (instructionsse == 1) { + // for reference: freebsd-src/sys/amd64/amd64/initcpu.c + cpuinstructions |= Solid::Processor::IntelMmx; + cpuinstructions |= Solid::Processor::IntelSse; + } + return cpuinstructions; }