From 295ba490aad3bfc199d066d7001373d40e651f29 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Wed, 5 May 2021 03:38:58 -0400 Subject: [PATCH] Settings: Mark termination enables as an unaligned ptr Unfortunately, the termination enables are not always at an aligned boundary, and MSVC needs to taint the ptr type with __unaligned in that case. --- include/icsneo/device/idevicesettings.h | 9 +++++---- .../icsneo/device/tree/neovifire2/neovifire2settings.h | 2 +- .../icsneo/device/tree/radgigalog/radgigalogsettings.h | 2 +- .../device/tree/radgigastar/radgigastarsettings.h | 2 +- .../tree/valuecan4/settings/valuecan4-2elsettings.h | 2 +- .../tree/valuecan4/settings/valuecan4-2settings.h | 2 +- .../tree/valuecan4/settings/valuecan4-4settings.h | 2 +- .../valuecan4/settings/valuecan4industrialsettings.h | 2 +- include/icsneo/device/tree/vividcan/vividcansettings.h | 4 ++-- include/icsneo/platform/unaligned.h | 10 ++++++++++ 10 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 include/icsneo/platform/unaligned.h 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