diff --git a/include/icsneo/device/idevicesettings.h b/include/icsneo/device/idevicesettings.h index 6ca4455..c8474c3 100644 --- a/include/icsneo/device/idevicesettings.h +++ b/include/icsneo/device/idevicesettings.h @@ -2,6 +2,7 @@ #define __IDEVICESETTINGS_H_ #include +#include "icsneo/platform/unaligned.h" #pragma pack(push, 2) @@ -736,14 +737,14 @@ protected: IDeviceSettings(warn_t createInoperableSettings, std::shared_ptr com) : disabled(true), readonly(true), report(com->report), structSize(0) { (void)createInoperableSettings; } - virtual const uint64_t* getTerminationEnables() const { return nullptr; } - virtual uint64_t* getMutableTerminationEnables() { + virtual ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const { return nullptr; } + virtual ICSNEO_UNALIGNED(uint64_t*) getMutableTerminationEnables() { if(disabled || readonly) return nullptr; - const uint8_t* offset = (const uint8_t*)getTerminationEnables(); + const auto offset = reinterpret_cast(getTerminationEnables()); if(offset == nullptr) return nullptr; - return reinterpret_cast((void*)(settings.data() + (offset - settingsInDeviceRAM.data()))); + return reinterpret_cast((void*)(settings.data() + (offset - settingsInDeviceRAM.data()))); } }; diff --git a/include/icsneo/device/tree/neovifire2/neovifire2settings.h b/include/icsneo/device/tree/neovifire2/neovifire2settings.h index b56d3be..cffa9a0 100644 --- a/include/icsneo/device/tree/neovifire2/neovifire2settings.h +++ b/include/icsneo/device/tree/neovifire2/neovifire2settings.h @@ -210,7 +210,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/radgigalog/radgigalogsettings.h b/include/icsneo/device/tree/radgigalog/radgigalogsettings.h index 3a146aa..3e6377d 100644 --- a/include/icsneo/device/tree/radgigalog/radgigalogsettings.h +++ b/include/icsneo/device/tree/radgigalog/radgigalogsettings.h @@ -171,7 +171,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/radgigastar/radgigastarsettings.h b/include/icsneo/device/tree/radgigastar/radgigastarsettings.h index 5460daa..4389098 100644 --- a/include/icsneo/device/tree/radgigastar/radgigastarsettings.h +++ b/include/icsneo/device/tree/radgigastar/radgigastarsettings.h @@ -150,7 +150,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/valuecan4/settings/valuecan4-2elsettings.h b/include/icsneo/device/tree/valuecan4/settings/valuecan4-2elsettings.h index 7fba7c1..e31ffde 100644 --- a/include/icsneo/device/tree/valuecan4/settings/valuecan4-2elsettings.h +++ b/include/icsneo/device/tree/valuecan4/settings/valuecan4-2elsettings.h @@ -46,7 +46,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/valuecan4/settings/valuecan4-2settings.h b/include/icsneo/device/tree/valuecan4/settings/valuecan4-2settings.h index 353fef5..6b978fa 100644 --- a/include/icsneo/device/tree/valuecan4/settings/valuecan4-2settings.h +++ b/include/icsneo/device/tree/valuecan4/settings/valuecan4-2settings.h @@ -45,7 +45,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/valuecan4/settings/valuecan4-4settings.h b/include/icsneo/device/tree/valuecan4/settings/valuecan4-4settings.h index 5c64eb9..f7e667f 100644 --- a/include/icsneo/device/tree/valuecan4/settings/valuecan4-4settings.h +++ b/include/icsneo/device/tree/valuecan4/settings/valuecan4-4settings.h @@ -60,7 +60,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/valuecan4/settings/valuecan4industrialsettings.h b/include/icsneo/device/tree/valuecan4/settings/valuecan4industrialsettings.h index 9a6a722..b28c787 100644 --- a/include/icsneo/device/tree/valuecan4/settings/valuecan4industrialsettings.h +++ b/include/icsneo/device/tree/valuecan4/settings/valuecan4industrialsettings.h @@ -46,7 +46,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { auto cfg = getStructurePointer(); if(cfg == nullptr) return nullptr; diff --git a/include/icsneo/device/tree/vividcan/vividcansettings.h b/include/icsneo/device/tree/vividcan/vividcansettings.h index dc5f092..c2b0c79 100644 --- a/include/icsneo/device/tree/vividcan/vividcansettings.h +++ b/include/icsneo/device/tree/vividcan/vividcansettings.h @@ -114,7 +114,7 @@ public: } protected: - const uint64_t* getTerminationEnables() const override { + ICSNEO_UNALIGNED(const uint64_t*) getTerminationEnables() const override { // Check the structure pointer even though we're not using it so // all of the other checks that go along with it are performed if(getStructurePointer() == nullptr) @@ -122,7 +122,7 @@ protected: return &activeTerminationEnables; } - uint64_t* getMutableTerminationEnables() override { + ICSNEO_UNALIGNED(uint64_t*) getMutableTerminationEnables() override { if(getMutableStructurePointer() == nullptr) return nullptr; return &queuedTerminationEnables; diff --git a/include/icsneo/platform/unaligned.h b/include/icsneo/platform/unaligned.h new file mode 100644 index 0000000..bf251ad --- /dev/null +++ b/include/icsneo/platform/unaligned.h @@ -0,0 +1,10 @@ +#ifndef __UNALIGNED_H_ +#define __UNALIGNED_H_ + +#if defined(MSVC) +#define ICSNEO_UNALIGNED(x) __unaligned x +#else +#define ICSNEO_UNALIGNED(x) x +#endif + +#endif \ No newline at end of file