diff --git a/Makefile b/Makefile index ff0e010e..70ba1949 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ include $(DEVKITPRO)/libnx/switch_rules TARGET := $(notdir $(CURDIR)) SOURCES := source DATA := data -INCLUDES := include +INCLUDES := include ../../common/include #--------------------------------------------------------------------------------- # options for code generation diff --git a/include/stratosphere.hpp b/include/stratosphere.hpp index fdd8b9d2..041d7274 100644 --- a/include/stratosphere.hpp +++ b/include/stratosphere.hpp @@ -33,3 +33,5 @@ #include "stratosphere/waitablemanager.hpp" #include "stratosphere/multithreadedwaitablemanager.hpp" + +#include "stratosphere/version_check.hpp" \ No newline at end of file diff --git a/include/stratosphere/version_check.hpp b/include/stratosphere/version_check.hpp new file mode 100644 index 00000000..336ea837 --- /dev/null +++ b/include/stratosphere/version_check.hpp @@ -0,0 +1,66 @@ +/* + * 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 +#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 major, minor, micro; + GetAtmosphereApiVersion(&major, &minor, µ, nullptr, nullptr); + + if (MakeAtmosphereVersion(major, minor, micro) < MakeAtmosphereVersion(ATMOSPHERE_RELEASE_VERSION_MAJOR, ATMOSPHERE_RELEASE_VERSION_MINOR, ATMOSPHERE_RELEASE_VERSION_MICRO)) { + fatalSimple(0xCAFE << 4 | 0xF); + } +} \ No newline at end of file