diff --git a/include/stratosphere.hpp b/include/stratosphere.hpp index a3ff6987..32a9ac98 100644 --- a/include/stratosphere.hpp +++ b/include/stratosphere.hpp @@ -18,6 +18,8 @@ #include "stratosphere/scope_guard.hpp" +#include "stratosphere/version_check.hpp" + #include "stratosphere/hossynch.hpp" #include "stratosphere/message_queue.hpp" #include "stratosphere/iwaitable.hpp" diff --git a/include/stratosphere/version_check.hpp b/include/stratosphere/version_check.hpp new file mode 100644 index 00000000..b0fc54bd --- /dev/null +++ b/include/stratosphere/version_check.hpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2018 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include + +static inline void GetAtmosphereApiVersion(u32 *major, u32 *minor, u32 *micro, u32 *target_fw, u32 *mkey_rev) { + if (R_FAILED(splInitialize())) { + fatalSimple(0xCAFE << 4 | 0xD); + } + + /* Check for exosphere API compatibility. */ + u64 exosphere_cfg; + if (R_FAILED(splGetConfig((SplConfigItem)65000, &exosphere_cfg))) { + fatalSimple(0xCAFE << 4 | 0xE); + } + + if (mkey_rev) { + *mkey_rev = (u32)((exosphere_cfg >> 0x00) & 0xFF); + } + + if (target_fw) { + *target_fw = (u32)((exosphere_cfg >> 0x08) & 0xFF); + } + + if (micro) { + *micro = (u32)((exosphere_cfg >> 0x10) & 0xFF); + } + + if (minor) { + *minor = (u32)((exosphere_cfg >> 0x18) & 0xFF); + } + + if (major) { + *major = (u32)((exosphere_cfg >> 0x20) & 0xFF); + } + + splExit(); +} + +static inline u32 MakeAtmosphereVersion(u32 major, u32 minor, u32 micro) { + return (major << 16) | (minor << 8) | micro; +} + +static inline void CheckAtmosphereVersion(u32 expected_major, u32 expected_minor, u32 expected_micro) { + u32 major, minor, micro; + GetAtmosphereApiVersion(&major, &minor, µ, nullptr, nullptr); + + if (MakeAtmosphereVersion(major, minor, micro) < MakeAtmosphereVersion(expected_major, expected_minor, expected_micro)) { + fatalSimple(0xCAFE << 4 | 0xF); + } +} + +#define CURRENT_ATMOSPHERE_VERSION ATMOSPHERE_RELEASE_VERSION_MAJOR, ATMOSPHERE_RELEASE_VERSION_MINOR, ATMOSPHERE_RELEASE_VERSION_MICRO \ No newline at end of file