/* * ControlX * * Forked from nLaunchy https://github.com/Excale/nLaunchy * * Copyright (C) 2012-2013 nLaunch team * Copyright (C) 2013 nLaunch CX guy * Copyright (C) 2013-2016 Excale * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, as * published by the Free Software Foundation. * * This program is distributed in the hope that 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, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // see Makefile for included Ndless installers #include "../types.h" #include "../patchos.h" #ifdef DVT // development -> disable production-only OSes #undef OS_300_EVT14 #undef OS_300_1319 #undef OS_301 #undef OS_302_1791 #undef OS_302_1793 #undef OS_310_0 #undef OS_310_157 #undef OS_310_236 #undef OS_310_392 #undef OS_320_1212 #undef OS_320_1219 #undef OS_323 #undef OS_324 #undef OS_330_538 #undef OS_360_546_550 #undef OS_390_461 #undef OS_390_463 #undef OS_391 #undef OS_400 #undef OS_402 #undef OS_403 #undef OS_42 #undef OS_430_547 #undef OS_430_702 #undef OS_440_531 #undef OS_440_532 #undef OS_450_845 #undef OS_450_1180 #undef OS_451_X #undef OS_452_8 #undef OS_453_14 #undef OS_454_48 #undef OS_455_79 #else // production -> disable development-only OSes #undef OS_300_DEVBUILD #undef OS_300_1045 #undef OS_300_1503 #undef OS_320_776 #undef OS_320_1030 #undef OS_320_1180 #undef OS_330_218 #undef OS_360_427 #undef OS_360_521 #endif #ifndef CAS // non-CAS -> disable CAS-only OSes #undef OS_300_1319 #undef OS_310_157 #undef OS_330_218 #undef OS_360_427 #undef OS_360_521 #undef OS_430_547 #undef OS_440_531 #else // CAS -> disable numeric-only OSes #undef OS_300_DEVBUILD #undef OS_300_EVT14 #undef OS_300_1045 #undef OS_300_1503 #undef OS_310_0 #undef OS_310_236 #undef OS_450_845 #endif #ifdef CM // CM -> disable CX-only OSes #undef OS_455_79 #undef OS_454_48 #undef OS_453_14 #undef OS_452_8 #undef OS_451_X #undef OS_450_1180 #undef OS_450_845 #undef OS_440_532 #undef OS_440_531 #undef OS_430_702 #undef OS_430_547 #undef OS_42 #undef OS_403 #undef OS_402 #undef OS_400 #undef OS_391 #undef OS_390_463 #undef OS_390_461 #undef OS_360_546_550 #undef OS_360_521 #undef OS_360_427 #undef OS_330_538 #undef OS_330_218 #undef OS_324 #undef OS_323 #undef OS_302_1793 #undef OS_302_1791 #undef OS_301 #undef OS_300_DEVBUILD #undef OS_300_EVT14 #undef OS_300_1045 #undef OS_300_1319 #undef OS_300_1503 #else // CX -> disable CM-only OSes #undef OS_310_0 #undef OS_310_157 #undef OS_310_236 #endif #ifdef OS_310_392 #define NDLESS_31 #endif #ifdef OS_360_546_550 #define NDLESS_36 #endif #if defined(OS_390_461) || defined(OS_390_463) #undef NDLESS_390 // non working (incomplete ndless_resources file) #endif #ifdef OS_391 #define NDLESS_391 #endif #ifdef OS_400 #define NDLESS_400 #endif #ifdef OS_403 #define NDLESS_403 #endif #ifdef OS_42 #define NDLESS_42 #endif #ifdef OS_430_702 #define NDLESS_43 #endif #ifdef OS_440_532 #define NDLESS_44 #endif #ifdef OS_450_1180 #define NDLESS_45 #endif #ifdef OS_451_X #define NDLESS_451 #endif #ifdef OS_453_14 #define NDLESS_453 #endif #ifdef OS_454_48 #define NDLESS_454 #endif #ifdef OS_455_79 #define NDLESS_455 #endif #if defined(NDLESS_31) || defined(NDLESS_36) || defined(NDLESS_390) || defined(NDLESS_391) || defined(NDLESS_400) || defined(NDLESS_403) || defined(NDLESS_42) || defined(NDLESS_43) || defined(NDLESS_44) || defined(NDLESS_45) || defined(NDLESS_451) || defined(NDLESS_453) || defined(NDLESS_454) || defined(NDLESS_455) #define PATCH_NDLESS #endif #if defined(OS_300_DEVBUILD) || defined(OS_300_EVT14) || defined(OS_300_1045) || defined(OS_300_1319) || defined(OS_300_1503) || defined(OS_301) || defined(OS_310_0) || defined(OS_310_157) || defined(OS_310_236) || defined(OS_310_392) || defined(OS_320_776) || defined(OS_320_1030) || defined(OS_320_1180) || defined(OS_320_1212) || defined(OS_320_1219) || defined(OS_323) || defined(OS_324) || defined(OS_330_218) || defined(OS_330_538) || defined(OS_360_427) || defined(OS_360_521) || defined(OS_360_546_550) || defined(OS_390_461)|| defined(OS_390_463) || defined(OS_391) || defined(OS_400) #define PATCH_LT_400 #endif #if defined(OS_390_461) || defined(OS_390_463) || defined(OS_391) || defined(OS_400) || defined(OS_402) || defined(OS_403) || defined(OS_42) || defined(OS_430_547) || defined(OS_430_702) || defined(OS_440_531) || defined(OS_440_532) || defined(OS_450_845) || defined(OS_450_1180) || defined(OS_451_X) || defined(OS_452_8) || defined(OS_453_14) || defined(OS_454_48) || defined(OS_455_79) #define PATCH_GT_39 #endif #if defined(OS_360_427) || defined(OS_360_521) || defined(OS_360_546_550) || defined(PATCH_GT_39) #define PATCH_GT_36 #endif // os: num CAS #ifdef PATCH_GT_36 static const uint32_t SELFDpatch_addr[] = { // patch discrepency for OS 3.6+ #ifdef OS_360_427 SELFDCXC360_427, #endif #ifdef OS_360_521 SELFDCXC360_521, #endif #ifdef OS_360_546_550 #ifndef CAS SELFDCX360_5XX, #else SELFDCXC360_546_550, #endif #endif #ifdef OS_390_461 #ifndef CAS SELFDCX390_461, #else SELFDCXC390_461, #endif #endif #ifdef OS_390_463 #ifndef CAS SELFDCX390_463, #else SELFDCXC390_463, #endif #endif #ifdef OS_391 #ifndef CAS SELFDCX391_38, #else SELFDCXC391_38, #endif #endif #ifdef OS_400 #ifndef CAS SELFDCX400_235, #else SELFDCXC400_235, #endif #endif #ifdef OS_402 #ifndef CAS SELFDCX402_27, #else SELFDCXC402_27, #endif #endif #ifdef OS_403 #ifndef CAS SELFDCX403_29, #else SELFDCXC403_29, #endif #endif #ifdef OS_42 #ifndef CAS SELFDCX420_532, #else SELFDCXC420_532, #endif #endif #ifdef OS_430_547 SELFDCXC430_547, #endif #ifdef OS_430_702 #ifndef CAS SELFDCX430_702, #else SELFDCXC430_702, #endif #endif #ifdef OS_440_531 SELFDCXC440_531, #endif #ifdef OS_440_532 #ifndef CAS SELFDCX440_532, #else SELFDCXC440_532, #endif #endif #ifdef OS_450_845 SELFDCX450_845, #endif #ifdef OS_450_1180 #ifndef CAS SELFDCX450_1180, #else SELFDCXC450_1180, #endif #endif #ifdef OS_451_X #ifndef CAS SELFDCX451_X, #else SELFDCXC451_X, #endif #endif #ifdef OS_452_8 #ifndef CAS SELFDCX4523_X, #else SELFDCXC4523_X, #endif #endif #ifdef OS_453_14 #ifndef CAS SELFDCX4523_X, #else SELFDCXC4523_X, #endif #endif #ifdef OS_454_48 #ifndef CAS SELFDCX454_48, #else SELFDCXC454_48, #endif #endif #ifdef OS_455_79 #ifndef CAS SELFDCX455_79, #else SELFDCXC455_79, #endif #endif }; static const uint32_t ASIC1patch_addr[] = { #ifdef OS_360_427 ASIC1CXC360_427, #endif #ifdef OS_360_521 ASIC1CXC360_521, #endif #ifdef OS_360_546_550 #ifndef CAS ASIC1CX360_5XX, #else ASIC1CXC360_546_550, #endif #endif #ifdef OS_390_461 #ifndef CAS ASIC1CX390_46X, #else ASIC1CXC390_46X, #endif #endif #ifdef OS_390_463 #ifndef CAS ASIC1CX390_46X, #else ASIC1CXC390_46X, #endif #endif #ifdef OS_391 #ifndef CAS ASIC1CX391_38, #else ASIC1CXC391_38, #endif #endif #ifdef OS_400 #ifndef CAS ASIC1CX400_235, #else ASIC1CXC400_235, #endif #endif #ifdef OS_402 #ifndef CAS ASIC1CX402_27, #else ASIC1CXC402_27, #endif #endif #ifdef OS_403 #ifndef CAS ASIC1CX403_29, #else ASIC1CXC403_29, #endif #endif #ifdef OS_42 #ifndef CAS ASIC1CX420_532, #else ASIC1CXC420_532, #endif #endif #ifdef OS_430_547 ASIC1CXC430_547, #endif #ifdef OS_430_702 #ifndef CAS ASIC1CX430_702, #else ASIC1CXC430_702, #endif #endif #ifdef OS_440_531 ASIC1CXC440_53X, #endif #ifdef OS_440_532 #ifndef CAS ASIC1CX440_532, #else ASIC1CXC440_53X, #endif #endif #ifdef OS_450_845 ASIC1CX450_845, #endif #ifdef OS_450_1180 #ifndef CAS ASIC1CX450_1180, #else ASIC1CXC450_1180, #endif #endif #ifdef OS_451_X #ifndef CAS ASIC1CX451_X, #else ASIC1CXC451_X, #endif #endif #ifdef OS_452_8 #ifndef CAS ASIC1CX4523_X, #else ASIC1CXC4523_X, #endif #endif #ifdef OS_453_14 #ifndef CAS ASIC1CX4523_X, #else ASIC1CXC4523_X, #endif #endif #ifdef OS_454_48 #ifndef CAS ASIC1CX454_48, #else ASIC1CXC454_48, #endif #endif #ifdef OS_455_79 #ifndef CAS ASIC1CX455_79, #else ASIC1CXC455_79, #endif #endif }; #endif #ifdef PATCH_GT_39 static const uint32_t ASIC2patch_addr[] = { #ifdef OS_390_461 #ifndef CAS ASIC2CX390_461, #else ASIC2CXC390_461, #endif #endif #ifdef OS_390_463 #ifndef CAS ASIC2CX390_463, #else ASIC2CXC390_463, #endif #endif #ifdef OS_391 #ifndef CAS ASIC2CX391_38, #else ASIC2CXC391_38, #endif #endif #ifdef OS_400 #ifndef CAS ASIC2CX400_235, #else ASIC2CXC400_235, #endif #endif #ifdef OS_402 #ifndef CAS ASIC2CX402_27, #else ASIC2CXC402_27, #endif #endif #ifdef OS_403 #ifndef CAS ASIC2CX403_29, #else ASIC2CXC403_29, #endif #endif #ifdef OS_42 #ifndef CAS ASIC2CX420_532, #else ASIC2CXC420_532, #endif #endif #ifdef OS_430_547 ASIC2CXC430_547, #endif #ifdef OS_430_702 #ifndef CAS ASIC2CX430_702, #else ASIC2CXC430_702, #endif #endif #ifdef OS_440_531 ASIC2CXC440_531, #endif #ifdef OS_440_532 #ifndef CAS ASIC2CX440_532, #else ASIC2CXC440_532, #endif #endif #ifdef OS_450_845 ASIC2CX450_845, #endif #ifdef OS_450_1180 #ifndef CAS ASIC2CX450_1180, #else ASIC2CXC450_1180, #endif #endif #ifdef OS_451_X #ifndef CAS ASIC2CX451_X, #else ASIC2CXC451_X, #endif #endif #ifdef OS_452_8 #ifndef CAS ASIC2CX452_8, #else ASIC2CXC452_8, #endif #endif #ifdef OS_453_14 #ifndef CAS ASIC2CX453_14, #else ASIC2CXC453_14, #endif #endif #ifdef OS_454_48 #ifndef CAS ASIC2CX454_48, #else ASIC2CXC454_48, #endif #endif #ifdef OS_455_79 #ifndef CAS ASIC2CX455_79, #else ASIC2CXC455_79, #endif #endif }; #endif #ifdef PATCH_LT_400 static const uint32_t NBOOTpatch_addr[] = { // nBoot patch for OS 4.0.0- #ifdef OS_300_DEVBUILD NBOOTCX300_DEVBUILD, #endif #ifdef OS_300_EVT14 NBOOTCX300_EVT14, #endif #ifdef OS_300_1045 NBOOTCX300_1045, #endif #ifdef OS_300_1319 NBOOTCXC300_1319, #endif #ifdef OS_300_1503 NBOOTCX300_1503, #endif #ifdef OS_301 #ifndef CAS NBOOTCX301_1753, #else NBOOTCXC301_1753, #endif #endif #ifndef CAS #ifdef OS_302_1791 NBOOTCX302_1791, #endif #ifdef OS_302_1793 NBOOTCX302_1793, #endif #else #ifdef OS_302_1791 NBOOTCXC302_1791, #endif #ifdef OS_302_1793 NBOOTCXC302_1793, #endif #endif #ifdef OS_310_0 NBOOTCM310_0, #endif #ifdef OS_310_157 NBOOTCMC310_157, #endif #ifdef OS_310_236 NBOOTCM310_236, #endif #ifdef OS_310_392 #ifndef CM #ifndef CAS NBOOTCX310_392, #else NBOOTCXC310_392, #endif #else #ifndef CAS NBOOTCM310_392, #else NBOOTCMC310_392, #endif #endif #endif #if defined(OS_320_776) #ifndef CAS NBOOTCX320_776, #else NBOOTCXC320_776, #endif #endif #if defined(OS_320_1030) #ifndef CAS NBOOTCX320_1030, #else NBOOTCXC320_1030, #endif #endif #if defined(OS_320_1180) #ifndef CAS NBOOTCX320_1180, #else NBOOTCXC320_1180, #endif #endif #if defined(OS_320_1212) || defined(OS_320_1219) #ifndef CM #ifndef CAS NBOOTCX320_121X, #else NBOOTCXC320_121X, #endif #else #ifndef CAS NBOOTCM320_121X, #else NBOOTCMC320_121X, #endif #endif #endif #if defined(OS_323) || defined(OS_324) #ifndef CAS NBOOTCX32X_123X, #else NBOOTCXC32X_123X, #endif #endif #if defined(OS_330_218) NBOOTCXC330_218, #endif #if defined(OS_330_538) #ifndef CAS NBOOTCX330_538, #else NBOOTCXC330_538, #endif #endif #ifdef OS_360_427 NBOOTCXC360_427, #endif #ifdef OS_360_521 NBOOTCXC360_521, #endif #ifdef OS_360_546_550 #ifndef CAS NBOOTCX360_5XX, #else NBOOTCXC360_546_550, #endif #endif #if defined(OS_390_461) #ifndef CAS NBOOTCX390_46X, #else NBOOTCXC390_46X, #endif #endif #if defined(OS_390_463) #ifndef CAS NBOOTCX390_46X, #else NBOOTCXC390_46X, #endif #endif #ifdef OS_391 #ifndef CAS NBOOTCX391_38, #else NBOOTCXC391_38, #endif #endif #ifdef OS_400 #ifndef CAS NBOOTCX400_235, #else NBOOTCXC400_235, #endif #endif }; #endif #ifdef PATCH_NDLESS static const uint32_t ndless_load_addr[] = { #ifdef NDLESS_31 #ifndef CM #ifndef CAS UPDBOOT2CX310_392, #else UPDBOOT2CXC310_392, #endif #else #ifndef CAS UPDBOOT2CM310_392, #else UPDBOOT2CMC310_392, #endif #endif #endif #ifdef NDLESS_36 #ifndef CAS UPDBOOT2CX360_5XX, #else UPDBOOT2CXC360_546_550, #endif #endif #ifdef NDLESS_390 #ifndef CAS UPDBOOT2CX390_46X, #else UPDBOOT2CXC390_46X, #endif #endif #ifdef NDLESS_391 #ifndef CAS UPDBOOT2CX391_38, #else UPDBOOT2CXC391_38, #endif #endif #ifdef NDLESS_400 #ifndef CAS UPDBOOT2CX400_235, #else UPDBOOT2CXC400_235, #endif #endif #ifdef NDLESS_403 #ifndef CAS UPDBOOT2CX403_29, #else UPDBOOT2CXC403_29, #endif #endif #ifdef NDLESS_42 #ifndef CAS UPDBOOT2CX420_532, #else UPDBOOT2CXC420_532, #endif #endif #ifdef NDLESS_43 #ifndef CAS UPDBOOT2CX430_702, #else UPDBOOT2CXC430_702, #endif #endif #ifdef NDLESS_44 #ifndef CAS UPDBOOT2CX440_532, #else UPDBOOT2CXC440_53X, #endif #endif #ifdef NDLESS_45 #ifndef CAS UPDBOOT2CX450_1180, #else UPDBOOT2CXC450_1180, #endif #endif #ifdef NDLESS_451 #ifndef CAS UPDBOOT2CX451_X, #else UPDBOOT2CXC451_X, #endif #endif #ifdef NDLESS_453 #ifndef CAS UPDBOOT2CX4523_X, #else UPDBOOT2CXC4523_X, #endif #endif #ifdef NDLESS_454 #ifndef CAS UPDBOOT2CX454_48, #else UPDBOOT2CXC454_48, #endif #endif #ifdef NDLESS_455 #ifndef CAS UPDBOOT2CX455_79, #else UPDBOOT2CXC455_79, #endif #endif }; static const uint32_t ndless_loader_model_specific[][5] = { /* fopen, stat, malloc, fread, fclose */ #ifdef NDLESS_31 #ifndef CM #ifndef CAS { FOPENCX310_392, STATCX310_392, MALLOCCX310_392, FREADCX310_392, FCLOSECX310_392}, #else { FOPENCXC310_392, STATCXC310_392, MALLOCCXC310_392, FREADCXC310_392, FCLOSECXC310_392}, #endif #else #ifndef CAS { FOPENCM310_392, STATCM310_392, MALLOCCM310_392, FREADCM310_392, FCLOSECM310_392}, #else { FOPENCMC310_392, STATCMC310_392, MALLOCCMC310_392, FREADCMC310_392, FCLOSECMC310_392}, #endif #endif #endif #ifdef NDLESS_36 #ifndef CAS { FOPENCX360_5XX, STATCX360_5XX, MALLOCCX360_5XX, FREADCX360_5XX, FCLOSECX360_5XX}, #else { FOPENCXC360_546_550, STATCXC360_546_550, MALLOCCXC360_546_550, FREADCXC360_546_550, FCLOSECXC360_546_550}, #endif #endif #ifdef NDLESS_390 #ifndef CAS { FOPENCX390_46X, STATCX390_46X, MALLOCCX390_46X, FREADCX390_46X, FCLOSECX390_46X}, #else { FOPENCXC390_46X, STATCXC390_46X, MALLOCCXC390_46X, FREADCXC390_46X, FCLOSECXC390_46X}, #endif #endif #ifdef NDLESS_391 #ifndef CAS { FOPENCX391_38, STATCX391_38, MALLOCCX391_38, FREADCX391_38, FCLOSECX391_38}, #else { FOPENCXC391_38, STATCXC391_38, MALLOCCXC391_38, FREADCXC391_38, FCLOSECXC391_38}, #endif #endif #ifdef NDLESS_400 #ifndef CAS { FOPENCX400_235, STATCX400_235, MALLOCCX400_235, FREADCX400_235, FCLOSECX400_235}, #else { FOPENCXC400_235, STATCXC400_235, MALLOCCXC400_235, FREADCXC400_235, FCLOSECXC400_235}, #endif #endif #ifdef NDLESS_403 #ifndef CAS { FOPENCX403_29, STATCX403_29, MALLOCCX403_29, FREADCX403_29, FCLOSECX403_29}, #else { FOPENCXC403_29, STATCXC403_29, MALLOCCXC403_29, FREADCXC403_29, FCLOSECXC403_29}, #endif #endif #ifdef NDLESS_42 #ifndef CAS {FOPENCX420_532, STATCX420_532, MALLOCCX420_532, FREADCX420_532, FCLOSECX420_532}, #else {FOPENCXC420_532, STATCXC420_532, MALLOCCXC420_532, FREADCXC420_532, FCLOSECXC420_532}, #endif #endif #ifdef NDLESS_43 #ifndef CAS {FOPENCX430_702, STATCX430_702, MALLOCCX430_702, FREADCX430_702, FCLOSECX430_702}, #else {FOPENCXC430_702, STATCXC430_702, MALLOCCXC430_702, FREADCXC430_702, FCLOSECXC430_702}, #endif #endif #ifdef NDLESS_44 #ifndef CAS {FOPENCX440_532, STATCX440_532, MALLOCCX440_532, FREADCX440_532, FCLOSECX440_532}, #else {FOPENCXC440_532, STATCXC440_532, MALLOCCXC440_532, FREADCXC440_532, FCLOSECXC440_532}, #endif #endif #ifdef NDLESS_45 #ifndef CAS {FOPENCX450_1180, STATCX450_1180, MALLOCCX450_1180, FREADCX450_1180, FCLOSECX450_1180}, #else {FOPENCXC450_1180, STATCXC450_1180, MALLOCCXC450_1180, FREADCXC450_1180, FCLOSECXC450_1180}, #endif #endif #ifdef NDLESS_451 #ifndef CAS {FOPENCX451_12, STATCX451_12, MALLOCCX451_12, FREADCX451_12, FCLOSECX451_12}, #else {FOPENCXC451_12, STATCXC451_12, MALLOCCXC451_12, FREADCXC451_12, FCLOSECXC451_12}, #endif #endif #ifdef NDLESS_453 #ifndef CAS {FOPENCX453_14, STATCX453_14, MALLOCCX453_14, FREADCX453_14, FCLOSECX453_14}, #else {FOPENCXC453_14, STATCXC453_14, MALLOCCXC453_14, FREADCXC453_14, FCLOSECXC453_14}, #endif #endif #ifdef NDLESS_454 #ifndef CAS {FOPENCX454_48, STATCX454_48, MALLOCCX454_48, FREADCX454_48, FCLOSECX454_48}, #else {FOPENCXC454_48, STATCXC454_48, MALLOCCXC454_48, FREADCXC454_48, FCLOSECXC454_48}, #endif #endif #ifdef NDLESS_455 #ifndef CAS {FOPENCX455_79, STATCX455_79, MALLOCCX455_79, FREADCX455_79, FCLOSECX455_79}, #else {FOPENCXC455_79, STATCXC455_79, MALLOCCXC455_79, FREADCXC455_79, FCLOSECXC455_79}, #endif #endif }; #endif void __attribute__((naked)) ndless_loader(void) { uint32_t id=*((volatile uint32_t *)0x10000020); #if defined(PATCH_LT_400) || defined(PATCH_GT_36) || defined(PATCH_NDLESS) int32_t os_misc=-1; #endif #if defined(PATCH_LT_400) || defined(PATCH_GT_36) switch (id) { #ifdef OS_455_79 #ifdef CAS case CXC455_79: #else case CX455_79: #endif os_misc++; #endif #ifdef OS_454_48 #ifdef CAS case CXC454_48: #else case CX454_48: #endif os_misc++; #endif #ifdef OS_453_14 #ifdef CAS case CXC453_14: #else case CX453_14: #endif os_misc++; #endif #ifdef OS_452_8 #ifdef CAS case CXC452_8: #else case CX452_8: #endif os_misc++; #endif #ifdef OS_451_X #ifdef CAS case CXC451_X: #else case CX451_X: #endif os_misc++; #endif #ifdef OS_450_1180 #ifdef CAS case CXC450_1180: #else case CX450_1180: #endif os_misc++; #endif #ifdef OS_450_845 case CX450_845: os_misc++; #endif #ifdef OS_440_532 #ifdef CAS case CXC440_532: #else case CX440_532: #endif os_misc++; #endif #ifdef OS_440_531 case CXC440_531: os_misc++; #endif #ifdef OS_430_702 #ifdef CAS case CXC430_702: #else case CX430_702: #endif os_misc++; #endif #ifdef OS_430_547 case CXC430_547: os_misc++; #endif #ifdef OS_42 #ifdef CAS case CXC420_532: #else case CX420_532: #endif os_misc++; #endif #ifdef OS_403 #ifdef CAS case CXC403_29: #else case CX403_29: #endif os_misc++; #endif #ifdef OS_402 #ifdef CAS case CXC402_27: #else case CX402_27: #endif os_misc++; #endif #ifdef OS_400 #ifdef CAS case CXC400_235: #else case CX400_235: #endif os_misc++; #endif #ifdef OS_391 #ifdef CAS case CXC391_38: #else case CX391_38: #endif os_misc++; #endif #if defined(OS_390_461) || defined(OS_390_463) #ifdef CAS case CXC390_46X: #if defined(OS_390_461) && defined(OS_390_463) if(*((volatile uint32_t *)(0x10000020)) != CXC390_46X || *((volatile uint32_t *)(0x10A0A084)) == 0x6F68702F) // not 3.9.0 or 463 os_misc++; #endif #else case CX390_46X: #if defined(OS_390_461) && defined(OS_390_463) if(*((volatile uint32_t *)(0x10000020)) != CX390_46X || *((volatile uint32_t *)(0x109A9604)) == 0x6F68702F) // not 3.9.0 or 463 os_misc++; #endif #endif os_misc++; #endif #ifdef PATCH_GT_39 if(os_misc>=0) { #ifdef CAS *(uint32_t*)(ASIC2patch_addr[os_misc]+0x118)=0x04000001; // CX CAS ASIC2 #else *(uint32_t*)(ASIC2patch_addr[os_misc]+0x118)=0; // CX ASIC2 #endif *(uint16_t*)(ASIC2patch_addr[os_misc])=0x2110; *(uint32_t*)(ASIC2patch_addr[os_misc]+8)=0; } #endif #ifdef OS_360_546_550 #ifdef CAS case CXC360_546_550: #else case CX360_5XX: #endif os_misc++; #endif #ifdef OS_360_521 case CXC360_521: os_misc++; #endif #ifdef OS_360_427 case CXC360_427: os_misc++; #endif #ifdef PATCH_GT_36 if(os_misc>=0) { #ifdef CAS *(uint32_t*)(ASIC1patch_addr[os_misc]+0x17)=0xE3A04341; // CX CAS ASIC1 *(uint32_t*)(ASIC1patch_addr[os_misc]+0x48B)=0x00010105; // CX CAS ASIC1 #else *(uint32_t*)(ASIC1patch_addr[os_misc]+0x17)=0xE3A04000; // CX ASIC1 *(uint32_t*)(ASIC1patch_addr[os_misc]+0x48B)=0; // CX ASIC1 #endif *(uint32_t*)SELFDpatch_addr[os_misc]=0xE12FFF1E; *(uint8_t*)ASIC1patch_addr[os_misc]=0x54; *(uint32_t*)(ASIC1patch_addr[os_misc]+0x1B)=0; } #endif #if defined(OS_330_538) #ifdef CAS case CXC330_538: #else case CX330_538: #endif os_misc++; #endif #if defined(OS_330_218) case CXC330_218: os_misc++; #endif #if defined(OS_323) || defined(OS_324) #ifdef CAS #ifdef OS_323 case CXC323_1233: #endif #ifdef OS_324 case CXC324_1237: #endif #else case CX32X_123X: #endif os_misc++; #endif #if defined(OS_320_1212) || defined(OS_320_1219) #ifdef CM #ifdef CAS #ifdef OS_320_1212 case CMC320_1212: #endif #ifdef OS_320_1219 case CMC320_1219: #endif #else #ifdef OS_320_1212 case CM320_1212: #endif #ifdef OS_320_1219 case CM320_1219: #endif #endif #else #ifdef CAS #ifdef OS_320_1212 case CXC320_1212: #endif #ifdef OS_320_1219 case CXC320_1219: #endif #else #ifdef OS_320_1212 case CX320_1212: #endif #ifdef OS_320_1219 case CX320_1219: #endif #endif #endif os_misc++; #endif #ifdef OS_320_1180 #ifdef CAS case CXC320_1180: #else case CX320_1180: #endif os_misc++; #endif #ifdef OS_320_1030 #ifdef CAS case CXC320_1030: #else case CX320_1030: #endif os_misc++; #endif #ifdef OS_320_776 #ifdef CAS case CXC320_776: #else case CX320_776: #endif os_misc++; #endif #ifdef OS_310_392 #ifdef CM #ifdef CAS case CMC310_392: #else case CM310_392: #endif #else #ifdef CAS case CXC310_392: #else case CX310_392: #endif #endif os_misc++; #endif #ifdef OS_310_236 case CM310_236: os_misc++; #endif #ifdef OS_310_157 case CMC310_157: os_misc++; #endif #ifdef OS_310_0 case CM310_0: os_misc++; #endif #if defined(OS_302_1791) || defined(OS_302_1793) #ifdef CAS case CXC302_179X: #if defined(OS_302_1791) && defined(OS_302_1793) if(*((volatile uint32_t *)(0x10000020)) != CXC302_179X || *((volatile uint32_t *)(0x10831D18)) == 0x6F68702F) // not 3.0.2 or 1793 os_misc++; #endif #else case CX302_179X: #if defined(OS_302_1791) && defined(OS_302_1793) if(*((volatile uint32_t *)(0x10000020)) != CX302_179X || *((volatile uint32_t *)(0x107D60E0)) == 0x6F68702F) // not 3.0.2 or 1793 os_misc++; #endif #endif os_misc++; #endif #ifdef OS_301 #ifdef CAS case CXC301_1753: #else case CX301_1753: #endif os_misc++; #endif #ifdef OS_300_1503 case CX300_1503: os_misc++; #endif #ifdef OS_300_1319 case CXC300_1319: os_misc++; #endif #ifdef OS_300_1045 case CX300_1045: os_misc++; #endif #ifdef OS_300_EVT14 case CX300_EVT14: os_misc++; #endif #ifdef OS_300_DEVBUILD case CX300_DEVBUILD: os_misc++; #endif #ifdef PATCH_LT_400 if(os_misc>=0) *(uint32_t*)NBOOTpatch_addr[os_misc]=0; #endif } #endif #ifdef PATCH_NDLESS static uint32_t ndless_loader[] = { NDLESS_LOADER }; #ifdef PATCH_GT_36 os_misc=-1; #endif switch (id) { #if defined(NDLESS_455) #ifdef CAS case CXC455_79: #else case CX455_79: #endif os_misc++; #endif #if defined(NDLESS_454) #ifdef CAS case CXC454_48: #else case CX454_48: #endif os_misc++; #endif #if defined(NDLESS_453) #ifdef CAS case CXC453_14: #else case CX453_14: #endif os_misc++; #endif #if defined(NDLESS_451) #ifdef CAS case CXC451_X: #else case CX451_X: #endif os_misc++; #endif #if defined(NDLESS_45) #ifdef CAS case CXC450_1180: #else case CX450_1180: #endif os_misc++; #endif #if defined(NDLESS_44) #ifdef CAS case CXC440_532: #else case CX440_532: #endif os_misc++; #endif #if defined(NDLESS_43) #ifdef CAS case CXC430_702: #else case CX430_702: #endif os_misc++; #endif #if defined(NDLESS_42) #ifdef CAS case CXC420_532: #else case CX420_532: #endif os_misc++; #endif #if defined(NDLESS_403) #ifdef CAS case CXC403_29: #else case CX403_29: #endif os_misc++; #endif #if defined(NDLESS_400) #ifdef CAS case CXC400_235: #else case CX400_235: #endif os_misc++; #endif #if defined(NDLESS_391) #ifdef CAS case CXC391_38: #else case CX391_38: #endif os_misc++; #endif #if defined(NDLESS_390) #ifdef CAS case CXC390_46X: #else case CX390_46X: #endif os_misc++; #endif #if defined(NDLESS_36) #ifdef CAS case CXC360_546_550: #else case CX360_5XX: #endif os_misc++; #endif #if defined(NDLESS_31) #ifdef CM #ifdef CAS case CMC310_392: #else case CM310_392: #endif #else #ifdef CAS case CXC310_392: #else case CX310_392: #endif #endif os_misc++; #endif if(os_misc>=0) { __builtin_memcpy(ndless_loader+OFFSET_MODEL, ndless_loader_model_specific[os_misc], sizeof(ndless_loader_model_specific[0])); uint32_t * dest = (uint32_t *)ndless_load_addr[os_misc]; for (uint32_t i = 0; i < sizeof(ndless_loader)/sizeof(ndless_loader[0]); i++) *dest++ = ndless_loader[i]; } } #endif __asm volatile( "LDR PC, =0x10000000 \n" ); __builtin_unreachable(); }