Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*---------------------------------------------------------------------------*
- Copyright 2010-2012 Nintendo. All rights reserved.
- These coded instructions, statements, and computer programs contain
- proprietary information of Nintendo of America Inc. and/or Nintendo
- Company Ltd., and are protected by Federal copyright law. They may
- not be disclosed to third parties or copied or duplicated in any form,
- in whole or in part, without the prior written consent of Nintendo.
- *---------------------------------------------------------------------------*/
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Threading;
- namespace CafeX
- {
- partial class Program
- {
- #region environment variables
- internal static EnvVar CAFE_ROOT = new EnvVar("CAFE_ROOT");
- internal static EnvVar SDIO_BRIDGE_TOOLS = new EnvVar("SDIO_BRIDGE_TOOLS");
- internal static EnvVar MION_BRIDGE_TOOLS = new EnvVar("MION_BRIDGE_TOOLS");
- internal static EnvVar BRIDGE_CURRENT_NAME = new EnvVar("BRIDGE_CURRENT_NAME");
- internal static EnvVar BRIDGE_CURRENT_IP_ADDRESS = new EnvVar("BRIDGE_CURRENT_IP_ADDRESS");
- internal static EnvVar PLATFORM = new EnvVar("PLATFORM");
- internal static EnvVar CAFESTOP_STATUS = new EnvVar("CAFESTOP_STATUS");
- internal static EnvVar CAFERUN_OPTION_SOFT_LAUNCH = new EnvVar("CAFERUN_OPTION_SOFT_LAUNCH");
- internal static EnvVar HOSTSTOP_RVAL = new EnvVar("HOSTSTOP_RVAL");
- internal static EnvVar HOSTSTOP_RETRIES = new EnvVar("HOSTSTOP_RETRIES");
- internal static EnvVar HOSTSTOP_RESET_OPTION = new EnvVar("HOSTSTOP_RESET_OPTION");
- internal static EnvVar CAFE_HARDWARE = new EnvVar("CAFE_HARDWARE");
- internal static EnvVar MION_PWR_SEQ = new EnvVar("MION_PWR_SEQ");
- internal static EnvVar BRIDGE_TYPE = new EnvVar("BRIDGE_TYPE");
- internal static EnvVar TMP = new EnvVar("TMP");
- internal static EnvVar SESSION_MANAGER = new EnvVar("SESSION_MANAGER");
- internal static EnvVar SESSION_NAME = new EnvVar("SESSION_NAME");
- internal static EnvVar SESSION_DEBUG_OUT_PORT = new EnvVar("SESSION_DEBUG_OUT_PORT");
- internal static EnvVar SESSION_DEBUG_CONTROL_PORT = new EnvVar("SESSION_DEBUG_CONTROL_PORT");
- internal static EnvVar SESSION_HIO_OUT_PORT = new EnvVar("SESSION_HIO_OUT_PORT");
- internal static EnvVar SESSION_LAUNCH_CTRL_PORT = new EnvVar("SESSION_LAUNCH_CTRL_PORT");
- internal static EnvVar SESSION_PCFS_SATA_PORT = new EnvVar("SESSION_PCFS_SATA_PORT");
- internal static EnvVar SESSION_PATH_PREFIX = new EnvVar("SESSION_PATH_PREFIX");
- internal static EnvVar CAFE_DATA_DIR = new EnvVar("CAFE_DATA_DIR");
- internal static EnvVar CAFE_CONTENT_DIR = new EnvVar("CAFE_CONTENT_DIR");
- internal static EnvVar CAFE_META_DIR = new EnvVar("CAFE_META_DIR");
- internal static EnvVar CAFE_SAVE_DIR = new EnvVar("CAFE_SAVE_DIR");
- internal static EnvVar CAFE_SLC_DIR = new EnvVar("CAFE_SLC_DIR");
- internal static EnvVar CAFE_MLC_DIR = new EnvVar("CAFE_MLC_DIR");
- internal static EnvVar CAFE_DATA_TMP = new EnvVar("CAFE_DATA_TMP");
- internal static EnvVar LANG = new EnvVar("LANG");
- internal static EnvVar QUIET = new EnvVar("QUIET");
- internal static EnvVar CAFESTOP_ONLY_IF_FSEMUL = new EnvVar("CAFESTOP_ONLY_IF_FSEMUL");
- internal static EnvVar PPC_OS_FLAGS = new EnvVar("PPC_OS_FLAGS");
- internal static EnvVar PPC_APP_FLAGS = new EnvVar("PPC_APP_FLAGS");
- internal static EnvVar PCFS_SYNC_DATE = new EnvVar("PCFS_SYNC_DATE");
- internal static EnvVar MCP_LAUNCH_HINT = new EnvVar("MCP_LAUNCH_HINT");
- internal static EnvVar MCP_INFO_OPTION = new EnvVar("MCP_INFO_OPTION");
- internal static EnvVar DEBUGGER = new EnvVar("DEBUGGER");
- internal static EnvVar CAFE_CONSOLE = new EnvVar("CAFE_CONSOLE");
- internal static EnvVar CONSOLE = new EnvVar("CONSOLE");
- internal static EnvVar CAFE_DEBUG_PORT = new EnvVar("CAFE_DEBUG_PORT");
- internal static EnvVar DEBUG_ELF_FILE = new EnvVar("DEBUG_ELF_FILE");
- internal static EnvVar CAFERUN_OPTION_SOFT_RESTART = new EnvVar("CAFERUN_OPTION_SOFT_RESTART");
- internal static EnvVar CAFERUN_OPTION_MLC_EMU_LAUNCH = new EnvVar("CAFERUN_OPTION_MLC_EMU_LAUNCH");
- internal static EnvVar CAFERUN_OPTION_MLC_EMU_TITLEID = new EnvVar("CAFERUN_OPTION_MLC_EMU_TITLEID");
- internal static EnvVar CAFERUN_OS_MAJOR_VERSION_LO = new EnvVar("CAFERUN_OS_MAJOR_VERSION_LO");
- internal static EnvVar CAFERUN_OS_MAJOR_VERSION = new EnvVar("CAFERUN_OS_MAJOR_VERSION");
- internal static EnvVar CAFERUN_COLDBOOT_OS_VERSION = new EnvVar("CAFERUN_COLDBOOT_OS_VERSION");
- internal static EnvVar HEARTBEAT_DISABLE = new EnvVar("HEARTBEAT_DISABLE");
- internal static EnvVar PCFS_DIR_MAPPING = new EnvVar("PCFS_DIR_MAPPING");
- internal static EnvVar MAPDIR_MLC = new EnvVar("MAPDIR_MLC");
- internal static EnvVar MAPDIR_SLC = new EnvVar("MAPDIR_SLC");
- internal static EnvVar MAPDIR_CODE = new EnvVar("MAPDIR_CODE");
- internal static EnvVar MAPDIR_META = new EnvVar("MAPDIR_META");
- internal static EnvVar MAPDIR_CONTENT = new EnvVar("MAPDIR_CONTENT");
- internal static EnvVar MAPDIR_SAVE = new EnvVar("MAPDIR_SAVE");
- internal static EnvVar PCFS_LOG_TIMESTAMP = new EnvVar("PCFS_LOG_TIMESTAMP");
- internal static EnvVar PCFS_SRV_LOG_OUTPUT = new EnvVar("PCFS_SRV_LOG_OUTPUT");
- internal static EnvVar RUN_FROM_HDD_BANK = new EnvVar("RUN_FROM_HDD_BANK");
- internal static EnvVar BRIDGE_PARAMETERS = new EnvVar("BRIDGE_PARAMETERS");
- internal static EnvVar BRIDGE_PARAMETERS_WITH_E = new EnvVar("BRIDGE_PARAMETERS_WITH_E");
- internal static EnvVar PCFSSERVER_PARAMETERS = new EnvVar("PCFSSERVER_PARAMETERS");
- internal static EnvVar PCFS_OVER_SATA_PORT = new EnvVar("PCFS_OVER_SATA_PORT");
- internal static EnvVar PREPHDD_STAT = new EnvVar("PREPHDD_STAT");
- internal static EnvVar DISC_EMU_TID = new EnvVar("DISC_EMU_TID");
- internal static EnvVar SYSTEM_MODE = new EnvVar("SYSTEM_MODE");
- internal static EnvVar RPL_DIRS = new EnvVar("RPL_DIRS");
- internal static EnvVar RPL_FILES = new EnvVar("RPL_FILES");
- internal static EnvVar CAFERUN_OPTION_NO_DATA_SYNC = new EnvVar("CAFERUN_OPTION_NO_DATA_SYNC");
- internal static EnvVar CAFE_BOOT_MODE = new EnvVar("CAFE_BOOT_MODE");
- internal static EnvVar CAFERUN_HOSTBRIDGE_VERSION = new EnvVar("CAFERUN_HOSTBRIDGE_VERSION");
- internal static EnvVar CAFERUN_FW_VERSION = new EnvVar("CAFERUN_FW_VERSION");
- internal static EnvVar CAFE_DEBUG_INIT = new EnvVar("CAFE_DEBUG_INIT");
- internal static EnvVar CAFE_DEBUG_PREINIT = new EnvVar("CAFE_DEBUG_PREINIT");
- internal static EnvVar CAFE_DEBUG_DONTSTOP = new EnvVar("CAFE_DEBUG_DONTSTOP");
- internal static EnvVar CAFE_LAUNCH_DEBUG = new EnvVar("CAFE_LAUNCH_DEBUG");
- internal static EnvVar CAFE_SYSLOG_LEVEL = new EnvVar("CAFE_SYSLOG_LEVEL");
- internal static EnvVar CAFE_RUN_FORCERESTART = new EnvVar("CAFE_RUN_FORCERESTART");
- internal static EnvVar DEBUG_PROC_ID = new EnvVar("DEBUG_PROC_ID");
- internal static EnvVar DEBUG_FLAGS = new EnvVar("DEBUG_FLAGS");
- internal static EnvVar CATOUTPUT = new EnvVar("CATOUTPUT");
- internal static EnvVar CMDOUTPUT = new EnvVar("CMDOUTPUT");
- internal static EnvVar CAFE_AUTOTEST = new EnvVar("CAFE_AUTOTEST");
- internal static EnvVar DASH_A_ARGS = new EnvVar("DASH_A_ARGS");
- internal static EnvVar ARGS_WITH_BARS = new EnvVar("ARGS_WITH_BARS");
- internal static EnvVar DISC_EMU_TYPE = new EnvVar("DISC_EMU_TYPE");
- internal static EnvVar APP_XML_FILE = new EnvVar("APP_XML_FILE");
- internal static EnvVar USE_PCFS_OVER_SATA = new EnvVar("USE_PCFS_OVER_SATA");
- internal static EnvVar CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN = new EnvVar("CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN");
- internal static EnvVar SYSTEM_XML = new EnvVar("SYSTEM_XML");
- internal static EnvVar TEMP = new EnvVar("TEMP");
- internal static EnvVar CAFERUN_WORK_DIR = new EnvVar("CAFERUN_WORK_DIR");
- internal static EnvVar SYNCTOOL_SRC = new EnvVar("SYNCTOOL_SRC");
- internal static EnvVar SYNCTOOL_DEST = new EnvVar("SYNCTOOL_DEST");
- internal static EnvVar SYNCTOOL_CFG = new EnvVar("SYNCTOOL_CFG");
- internal static EnvVar SYNCTOOL_LOG = new EnvVar("SYNCTOOL_LOG");
- internal static EnvVar CAFE_ELF = new EnvVar("CAFE_ELF");
- internal static EnvVar CAFE_ELF_SRC_DIR = new EnvVar("CAFE_ELF_SRC_DIR");
- internal static EnvVar CAFE_ELF_DIR = new EnvVar("CAFE_ELF_DIR");
- internal static EnvVar CAFE_CODE_DIR = new EnvVar("CAFE_CODE_DIR");
- internal static EnvVar COS_XML_FILE = new EnvVar("COS_XML_FILE");
- internal static EnvVar META_XML_FILE = new EnvVar("META_XML_FILE");
- internal static EnvVar PREV_CAFE_ARGSTR = new EnvVar("PREV_CAFE_ARGSTR");
- internal static EnvVar CAFERUN_OS_VERSION_PARTIAL_UNIQUE_ID = new EnvVar("CAFERUN_OS_VERSION_PARTIAL_UNIQUE_ID");
- internal static EnvVar PCFS_SRV_LOG_DIR = new EnvVar("PCFS_SRV_LOG_DIR");
- internal static EnvVar CMD_RESULT = new EnvVar("CMD_RESULT");
- internal static EnvVar CAFERUN_COLDBOOT_OS_VERSION_HI = new EnvVar("CAFERUN_COLDBOOT_OS_VERSION_HI");
- internal static EnvVar CAFERUN_COLDBOOT_OS_VERSION_LO = new EnvVar("CAFERUN_COLDBOOT_OS_VERSION_LO");
- internal static EnvVar BOOTRUN_WORK_DIR = new EnvVar("BOOTRUN_WORK_DIR");
- internal static EnvVar WUMAD_WORK_DIR = new EnvVar("WUMAD_WORK_DIR");
- internal static EnvVar FIRMWARE_FILE = new EnvVar("FIRMWARE_FILE");
- internal static EnvVar TOOLCHAIN = new EnvVar("TOOLCHAIN");
- internal static EnvVar CAFE_SECURITY = new EnvVar("CAFE_SECURITY");
- internal static EnvVar BOOT_DLF_FILE = new EnvVar("BOOT_DLF_FILE");
- internal static EnvVar CAFE_WUMAD = new EnvVar("CAFE_WUMAD");
- internal static EnvVar CAFEMAKEDLF = new EnvVar("CAFEMAKEDLF");
- internal static EnvVar APP_TITLE_ID = new EnvVar("APP_TITLE_ID");
- internal static EnvVar APP_GROUP_ID = new EnvVar("APP_GROUP_ID");
- internal static EnvVar APP_TITLE_VERSION = new EnvVar("APP_TITLE_VERSION");
- internal static EnvVar CAFEDEVRUN_FILE = new EnvVar("CAFEDEVRUN_FILE");
- internal static EnvVar CAFEDEVRUN_EXT = new EnvVar("CAFEDEVRUN_EXT");
- internal static EnvVar CAFEDEVRUN_NAME = new EnvVar("CAFEDEVRUN_NAME");
- internal static EnvVar CAFEDEVRUN_FILENAME = new EnvVar("CAFEDEVRUN_FILENAME");
- internal static EnvVar CAFEDEVRUN_DIR = new EnvVar("CAFEDEVRUN_DIR");
- internal static EnvVar CAFEDEVRUN_WORK_DIR = new EnvVar("CAFEDEVRUN_WORK_DIR");
- internal static EnvVar INCLUDE_SYSTEM_DIR = new EnvVar("INCLUDE_SYSTEM_DIR");
- internal static EnvVar CAFE_BASEFILE_PATH = new EnvVar("CAFE_BASEFILE_PATH");
- internal static EnvVar DEFAULT_DDF = new EnvVar("DEFAULT_DDF");
- internal static EnvVar COMMON_DDF_FILE = new EnvVar("COMMON_DDF_FILE");
- internal static EnvVar INDIVIDUAL_DDF_FILE = new EnvVar("INDIVIDUAL_DDF_FILE");
- internal static EnvVar FSEMUL_PARAMS = new EnvVar("FSEMUL_PARAMS");
- internal static EnvVar BRIDGE_INSTALL_PATH = new EnvVar("BRIDGE_INSTALL_PATH");
- internal static EnvVar CAFE_DETACH_FSEMUL = new EnvVar("CAFE_DETACH_FSEMUL");
- internal static EnvVar PORT = new EnvVar("PORT");
- internal static EnvVar MULTIELF = new EnvVar("MULTIELF");
- internal static EnvVar CATTOUCAN_STATUS = new EnvVar("CATTOUCAN_STATUS");
- internal static EnvVar MULTI_CONNECT = new EnvVar("MULTI_CONNECT");
- internal static EnvVar CAFE_MULTI_INIT = new EnvVar("CAFE_MULTI_INIT");
- internal static EnvVar GHS_ROOT = new EnvVar("GHS_ROOT");
- internal static EnvVar CAFEON_DISABLE_BGD = new EnvVar("CAFEON_DISABLE_BGD");
- internal static EnvVar CAFEON_NOBGD_META = new EnvVar("CAFEON_NOBGD_META");
- internal static EnvVar CAFEON_OPTION_NO_DATA_SYNC = new EnvVar("CAFEON_OPTION_NO_DATA_SYNC");
- internal static EnvVar AUTOTEST_RUNNING = new EnvVar("AUTOTEST_RUNNING");
- internal static EnvVar CAFE_RUN_RUNNING = new EnvVar("CAFE_RUN_RUNNING");
- internal static EnvVar CATTOUCAN_TERM = new EnvVar("CATTOUCAN_TERM");
- internal static EnvVar OS_VERSION_LO = new EnvVar("OS_VERSION_LO");
- internal static EnvVar SDK_VER = new EnvVar("SDK_VER");
- internal static EnvVar SDK_MAJ_VER = new EnvVar("SDK_MAJ_VER");
- internal static EnvVar SDK_MIN_VER = new EnvVar("SDK_MIN_VER");
- internal static EnvVar SDK_MIC_VER = new EnvVar("SDK_MIC_VER");
- internal static EnvVar CAFEUPDATE_USE_SYSTEM_UPDATER = new EnvVar("CAFEUPDATE_USE_SYSTEM_UPDATER");
- internal static EnvVar CAFEUPDATE_TITLE = new EnvVar("CAFEUPDATE_TITLE");
- internal static EnvVar CAFEUPDATE_PACKAGE = new EnvVar("CAFEUPDATE_PACKAGE");
- internal static EnvVar CAFEUPDATE_PACKAGE_DEFAULT = new EnvVar("CAFEUPDATE_PACKAGE_DEFAULT");
- internal static EnvVar SCRIPT_EXE_TIMESTAMP = new EnvVar("SCRIPT_EXE_TIMESTAMP");
- internal static EnvVar LOGDIR = new EnvVar("LOGDIR");
- internal static EnvVar _CCRSYSCFG1 = new EnvVar("_CCRSYSCFG1");
- internal static EnvVar MONITOR_DEFAULT_TIMEOUT = new EnvVar("MONITOR_DEFAULT_TIMEOUT");
- internal static EnvVar COMPORTS_SUPPORT = new EnvVar("COMPORTS_SUPPORT");
- internal static EnvVar INITIALIZED_COMPORTS = new EnvVar("INITIALIZED_COMPORTS");
- internal static EnvVar MONITOR_FOR_OUTPUT_CALLS = new EnvVar("MONITOR_FOR_OUTPUT_CALLS");
- internal static EnvVar MON_RESULT_PASS = new EnvVar("MON_RESULT_PASS");
- internal static EnvVar MON_RESULT_TIMEOUT = new EnvVar("MON_RESULT_TIMEOUT");
- internal static EnvVar MON_RESULT_UNDEF = new EnvVar("MON_RESULT_UNDEF");
- internal static EnvVar MON_RESULT_MANUAL = new EnvVar("MON_RESULT_MANUAL");
- internal static EnvVar MON_RESULT_NOLOG = new EnvVar("MON_RESULT_NOLOG");
- internal static EnvVar MON_RESULT_FAIL = new EnvVar("MON_RESULT_FAIL");
- internal static EnvVar MON_RESULT_EXPECTED_TERM = new EnvVar("MON_RESULT_EXPECTED_TERM");
- internal static EnvVar MON_RESULT_EXEC_WIN_APP = new EnvVar("MON_RESULT_EXEC_WIN_APP");
- internal static EnvVar MON_RESULT_NOPPC = new EnvVar("MON_RESULT_NOPPC");
- internal static EnvVar MON_RESULT_BOOT1 = new EnvVar("MON_RESULT_BOOT1");
- internal static EnvVar MON_RESULT_RESTART = new EnvVar("MON_RESULT_RESTART");
- internal static EnvVar MON_RESULT_TEST_AS_RPL = new EnvVar("MON_RESULT_TEST_AS_RPL");
- internal static EnvVar MON_RESULT_END_OF_RPL_LOADER = new EnvVar("MON_RESULT_END_OF_RPL_LOADER");
- internal static EnvVar MON_RESULT_BRIDGE_COLLISION = new EnvVar("MON_RESULT_BRIDGE_COLLISION");
- internal static EnvVar MON_RESULT_TEST_DBG_OUT = new EnvVar("MON_RESULT_TEST_DBG_OUT");
- internal static EnvVar MON_RESULT_BRIDGE_OFF = new EnvVar("MON_RESULT_BRIDGE_OFF");
- internal static EnvVar MON_RESULT_ERROR = new EnvVar("MON_RESULT_ERROR");
- internal static EnvVar MON_RESULT_SKIP = new EnvVar("MON_RESULT_SKIP");
- internal static EnvVar MON_RESULT_FATAL_ERROR = new EnvVar("MON_RESULT_FATA_ERROR");
- internal static EnvVar MON_RESULT_MISSING = new EnvVar("MON_RESULT_MISSING");
- internal static EnvVar MON_RESULT_ABORTED = new EnvVar("MON_RESULT_ABORTED");
- internal static EnvVar MON_RESULT_KILL_AUTOTEST = new EnvVar("MON_RESULT_KILL_AUTOTEST");
- internal static EnvVar SYNCTOOL_RVAL = new EnvVar("SYNCTOOL_RVAL");
- internal static EnvVar PATH = new EnvVar("PATH");
- internal static EnvVar PCFS_HEADLESS_EMUL = new EnvVar("PCFS_HEADLESS_EMUL");
- internal static EnvVar TMP_SUB_DIR = new EnvVar("TMP_SUB_DIR");
- internal static EnvVar PCFSSERVERSYNC_RVAL = new EnvVar("PCFSSERVERSYNC_RVAL");
- internal static EnvVar CAFE_RUN_DEBUG = new EnvVar("CAFE_RUN_DEBUG");
- internal static EnvVar CYGWIN_PATH = new EnvVar("CYGWIN_PATH");
- internal static EnvVar CAFEX_STDIN_ENCODING = new EnvVar("CAFEX_STDIN_ENCODING");
- internal static EnvVar CAFEX_STDOUT_ENCODING = new EnvVar("CAFEX_STDOUT_ENCODING");
- //disrun in NAND mode
- internal static EnvVar ALLOW_DISCRUN_IN_SOFTLAUNCH = new EnvVar("ALLOW_DISCRUN_IN_SOFTLAUNCH");
- internal static EnvVar BOOTRUN_ELF_OPT = new EnvVar("BOOTRUN_ELF_OPT");
- internal static EnvVar BOOTRUN_ELF_VALUE = new EnvVar("BOOTRUN_ELF_VALUE");
- internal static EnvVar ELF_NEST_OPT = new EnvVar("ELF_NEST_OPT");
- internal static EnvVar ELF_NEST_VALUE = new EnvVar("ELF_NEST_VALUE");
- internal static EnvVar SOFT_LAUNCH_CAFE_ELF = new EnvVar("SOFT_LAUNCH_CAFE_ELF");
- internal static EnvVar CAFERUN_WUMAD_TITLE_ID = new EnvVar("CAFERUN_WUMAD_TITLE_ID");
- #endregion
- #region GLOBAL INTIALIZATION
- internal static char DEFAULT_DELIMITER = '\t';
- internal static string SYSCONFIGTOOL_TITLE_ID = "000500101f700500";
- internal static CAFEX_ERROR InitialEnvVarSetup()
- {
- #if DEBUG
- Log.WriteLine("InitialEnvVarSetup started.");
- #endif
- // THESE NEED TO BE SET IN CAFEX_ENV.BAT, BUT FOR NOW ARE HERE
- CAFE_ROOT.value = PathConverter.Windowsify(CAFE_ROOT.value);
- GHS_ROOT.value = PathConverter.Windowsify(GHS_ROOT.value);
- CAFE_HARDWARE.value = "catdevmp";
- //CAFE_BOOT_MODE.value = "PCFS";
- //CAFE_CONTENT_DIR.value = CAFE_ROOT.value + "\\data\\disc\\content";
- //CAFE_SAVE_DIR.value = CAFE_ROOT.value + "\\data\\save";
- //CAFE_SLC_DIR.value = CAFE_ROOT.value + "\\data\\slc";
- //CAFE_MLC_DIR.value = CAFE_ROOT.value + "\\data\\mlc";
- //CAFE_META_DIR.value = CAFE_ROOT.value + "\\data\\disc\\meta";
- CAFE_CONTENT_DIR.value = PathConverter.Windowsify(CAFE_CONTENT_DIR.value);
- CAFE_SAVE_DIR.value = PathConverter.Windowsify(CAFE_SAVE_DIR.value);
- CAFE_SLC_DIR.value = PathConverter.Windowsify(CAFE_SLC_DIR.value);
- CAFE_MLC_DIR.value = PathConverter.Windowsify(CAFE_MLC_DIR.value);
- CAFE_META_DIR.value = PathConverter.Windowsify(CAFE_META_DIR.value);
- TOOLCHAIN.value = "ghs";
- MONITOR_DEFAULT_TIMEOUT.value = "60";
- // carlosk - don't override this setting from environment
- //CAFE_CONSOLE.value = "cattoucan";
- if (string.IsNullOrEmpty(CAFE_CONSOLE.value))
- {
- CAFE_CONSOLE.value = "cattoucan";
- }
- // carlosk - need to remove this or it will always do pcfs over sata
- //USE_PCFS_OVER_SATA.value = "1";
- MON_RESULT_UNDEF.value = "-1";
- MON_RESULT_TIMEOUT.value = "0";
- MON_RESULT_PASS.value = "1";
- MON_RESULT_MANUAL.value = "2";
- MON_RESULT_NOLOG.value = "3";
- MON_RESULT_FAIL.value = "4";
- MON_RESULT_EXPECTED_TERM.value = "5";
- MON_RESULT_EXEC_WIN_APP.value = "6";
- MON_RESULT_NOPPC.value = "7";
- MON_RESULT_BOOT1.value = "8";
- MON_RESULT_RESTART.value = "9";
- MON_RESULT_TEST_AS_RPL.value = "10";
- MON_RESULT_END_OF_RPL_LOADER.value = "11";
- MON_RESULT_BRIDGE_COLLISION.value = "12";
- MON_RESULT_TEST_DBG_OUT.value = "13";
- MON_RESULT_BRIDGE_OFF.value = "14";
- MON_RESULT_KILL_AUTOTEST.value = "15";
- MON_RESULT_ERROR.value = "128";
- MON_RESULT_SKIP.value = "129";
- MON_RESULT_FATAL_ERROR.value = "255";
- MON_RESULT_MISSING.value = "131";
- MON_RESULT_ABORTED.value = "132";
- ALLOW_DISCRUN_IN_SOFTLAUNCH.value = "0";
- PATH.AddToVar(";C:\\cygwin\\bin\\", DEFAULT_DELIMITER);
- string sdk_ver_file = CAFE_ROOT.value + "\\system\\include\\sdk_ver.h";
- if (!File.Exists(sdk_ver_file))
- {
- sdk_ver_file = CAFE_ROOT.value + "\\system\\src\\build\\make\\os_version.mk";
- if (!File.Exists(sdk_ver_file))
- {
- Console.WriteLine("cafex run error: sdk_ver.h and os_version.mk do not exist: " + CAFE_ROOT.value + "\\system\\include\\sdk_ver.h" + sdk_ver_file);
- }
- else
- {
- FileStream fs = new FileStream(CAFE_ROOT.value + "\\system\\src\\build\\make\\os_version.mk", FileMode.Open, FileAccess.Read);
- StreamReader sr = new StreamReader(fs);
- bool found_line = false;
- while (!sr.EndOfStream)
- {
- string line = sr.ReadLine();
- if (line.Contains("SM := "))
- SDK_VER.value = line.Substring(25,1);
- if (line.Contains("Sm := "))
- SDK_VER.value = SDK_VER.value + "." + line.Substring(25, 2);
- if (line.Contains("Sc := "))
- {
- string sdk_ver = SDK_VER.value + "." + line.Substring(25, 2);
- SDK_VER.value = sdk_ver.Replace(".0", ".");
- found_line = true;
- break;
- }
- }
- sr.Close();
- if (!found_line)
- {
- Console.WriteLine("cafex run error: couldn't find sdk version in os_version.mk");
- return CAFEX_ERROR.RUN_COULDNT_PARSE_SDK_VERSION_HEADER;
- }
- }
- }
- else
- {
- FileStream fs = new FileStream(CAFE_ROOT.value + "\\system\\include\\sdk_ver.h", FileMode.Open, FileAccess.Read);
- StreamReader sr = new StreamReader(fs);
- bool found_line = false;
- while (!sr.EndOfStream)
- {
- string line = sr.ReadLine();
- if (line.Contains("#define CAFE_OS_SDK_VERSION_STRING"))
- {
- int index = line.IndexOf("#define CAFE_OS_SDK_VERSION_STRING");
- string version = line.Substring(61,7);
- SDK_VER.value = version.Replace(".0", ".");
- found_line = true;
- break;
- }
- }
- sr.Close();
- if (!found_line)
- {
- Console.WriteLine("cafex run error: couldn't find sdk version in sdk_ver.h");
- return CAFEX_ERROR.RUN_COULDNT_PARSE_SDK_VERSION_HEADER;
- }
- }
- SDK_MAJ_VER.value = mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 3");
- SDK_MIN_VER.value = mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 4");
- SDK_MIC_VER.value = mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 5");
- #region session setup
- if (SESSION_MANAGER.value == "1")
- {
- if (!File.Exists(MION_BRIDGE_TOOLS.value + "\\SessionManager.dll"))
- {
- Console.WriteLine("ERROR: SessionManager.dll not found and multi-CATDEV is enabled!");
- Console.WriteLine(" Please install HostBridge version 3.2.2.3+ or disable multi-CATDEV feature.");
- return CAFEX_ERROR.NO_SESSIONMANAGER_DLL;
- }
- string output = string.Empty;
- SessionManagerUtil.GetSessionInfo(out output);
- string[] output_array = output.Split(' ');
- SESSION_NAME.value = output_array[0];
- SESSION_DEBUG_OUT_PORT.value = output_array[1];
- SESSION_DEBUG_CONTROL_PORT.value = output_array[2];
- SESSION_HIO_OUT_PORT.value = output_array[3];
- SESSION_LAUNCH_CTRL_PORT.value = output_array[4];
- SESSION_PCFS_SATA_PORT.value = output_array[5];
- SESSION_PATH_PREFIX.value = SESSION_NAME.value + "_";
- CAFE_DATA_DIR.value = CAFE_ROOT.value + "\\" + SESSION_PATH_PREFIX.value + "data";
- // If the content location has been changed from the default, we should not touch and use it.
- // Otherwise, should modify by appending the CAFE_DATA_DIR.
- string defaultContentDir = CAFE_ROOT.value + "\\data\\disc\\content";
- if (CAFE_CONTENT_DIR.value == defaultContentDir)
- {
- CAFE_CONTENT_DIR.value = CAFE_DATA_DIR.value + "\\disc\\content";
- }
- CAFE_META_DIR.value = CAFE_DATA_DIR.value + "\\disc\\meta";
- CAFE_SAVE_DIR.value = CAFE_DATA_DIR.value + "\\save";
- CAFE_SLC_DIR.value = CAFE_DATA_DIR.value + "\\slc";
- CAFE_MLC_DIR.value = CAFE_DATA_DIR.value + "\\mlc";
- CAFE_DATA_TMP.value = CAFE_DATA_DIR.value + "\\tmp";
- }
- else
- {
- SESSION_NAME.value = "";
- SESSION_DEBUG_OUT_PORT.value = "6001";
- SESSION_DEBUG_CONTROL_PORT.value = "6002";
- SESSION_HIO_OUT_PORT.value = "6003";
- SESSION_LAUNCH_CTRL_PORT.value = "6006";
- SESSION_PCFS_SATA_PORT.value = "7500";
- SESSION_PATH_PREFIX.value = "";
- CAFE_DATA_DIR.value = CAFE_ROOT.value + "\\data";
- }
- #if DEBUG
- Log.WriteLine("SESSION_NAME = " + SESSION_NAME.value);
- Log.WriteLine("SESSION_DEBUG_OUT_PORT = " + SESSION_DEBUG_OUT_PORT.value);
- Log.WriteLine("SESSION_DEBUG_CONTROL_PORT = " + SESSION_DEBUG_CONTROL_PORT.value);
- Log.WriteLine("SESSION_HIO_OUT_PORT = " + SESSION_HIO_OUT_PORT.value);
- Log.WriteLine("SESSION_LAUNCH_CTRL_PORT = " + SESSION_LAUNCH_CTRL_PORT.value);
- Log.WriteLine("SESSION_PCFS_SATA_PORT = " + SESSION_PCFS_SATA_PORT.value);
- Log.WriteLine("SESSION_PATH_PREFIX = " + SESSION_PATH_PREFIX.value);
- Log.WriteLine("CAFE_DATA_DIR = " + CAFE_DATA_DIR.value);
- Log.WriteLine("CAFE_CONTENT_DIR = " + CAFE_CONTENT_DIR.value);
- Log.WriteLine("CAFEON_OPTION_NO_DATA_SYNC = " + CAFEON_OPTION_NO_DATA_SYNC.value);
- Log.WriteLine("CAFERUN_OPTION_NO_DATA_SYNC= " + CAFERUN_OPTION_NO_DATA_SYNC.value);
- #endif
- #endregion
- return CAFEX_ERROR.OK;
- }
- #endregion
- #region SCRIPT FUNCTIONS
- //Script function: cafestop
- static void stop(string[] args)
- {
- #if DEBUG
- Log.WriteLine("stop started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- if (args != null && args.Length > 0)
- {
- // Check for -h and display help
- if (args[0].ToLowerInvariant() == "-h")
- {
- // Display help and return;
- stop_usage();
- return;
- }
- // Check for -hostonly setting on first argument
- if (args[0].ToLowerInvariant() == "-hostonly")
- {
- // CafeX doesn't let you execute any function if bridge vars are not set, so there is no
- // reason to check them here again like in BASH.
- // -----------------------------------------------------------------------------------------
- // We want to kill any running processes, but don't want to talk to a (non-existent?) device
- ToucanReset.Stop();
- PCFSServer.Shutdown();
- return;
- }
- }
- PLATFORM.value = "cafe";
- if (CAFERUN_OPTION_SOFT_LAUNCH.value == "1")
- {
- #if DEBUG
- Log.WriteLine("CAFERUN_OPTION_SOFT_LAUNCH.value == 1 -> calling dkt.FlushOutputBuffer()");
- #endif
- int ret = dkt.FlushOutputBuffer();
- CAFESTOP_STATUS.value = ret.ToString();
- }
- else
- {
- #if DEBUG
- Log.WriteLine("CAFERUN_OPTION_SOFT_LAUNCH.value != 1 -> calling hoststop()");
- #endif
- hoststop(args);
- int ret = PCFSServer.Shutdown();
- CAFESTOP_STATUS.value = ret.ToString();
- }
- if (CAFESTOP_STATUS.value != "0")
- {
- Console.WriteLine("cafex stop error: CAFESTOP_STATUS=" + CAFESTOP_STATUS.value);
- }
- }
- //Script function: hoststop
- static void hoststop(string[] args)
- {
- #if DEBUG
- Log.WriteLine("hoststop started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- if (SDIO_BRIDGE_TOOLS.value == null)
- {
- if (MION_BRIDGE_TOOLS.value == null)
- {
- Console.WriteLine("cafex hoststop failed: Please install HostBridgeSetup and restart cafex_env.bat");
- return;
- }
- }
- HOSTSTOP_RVAL.value = "0";
- HOSTSTOP_RETRIES.value = "0";
- getbridgetype();
- HOSTSTOP_RESET_OPTION.value = "-SMCResetHold";
- if (CAFE_HARDWARE.value.StartsWith("ev"))
- {
- HOSTSTOP_RESET_OPTION.value = "-hold";
- MION_PWR_SEQ.value = "FOFF1";
- }
- if (BRIDGE_TYPE.value == "Mion")
- {
- checkbridgename.CheckName();
- if (args != null && args.Length > 0 && args[0] == "-makemine")
- {
- ToucanReset.Stop();
- FSEmul.makemine();
- }
- if (MION_PWR_SEQ.value == "smcreset")
- {
- int mionbutton_ret = MionButton.rsthold(args);
- HOSTSTOP_RVAL.value = mionbutton_ret.ToString();
- }
- else
- {
- if (MION_PWR_SEQ.value == "FOFF1")
- {
- int mionbutton_ret = MionButton.forceOff1(args);
- HOSTSTOP_RVAL.value = mionbutton_ret.ToString();
- }
- else
- {
- if (MION_PWR_SEQ.value == "G_SHUTDOWN")
- {
- int mionbutton_ret = MionButton.init_shutdown_w_FOFF2(args);
- HOSTSTOP_RVAL.value = mionbutton_ret.ToString();
- }
- else
- {
- HOSTSTOP_RVAL.value = "1";
- HOSTSTOP_RETRIES.value = "0";
- while (HOSTSTOP_RVAL.value != "0" && HexHandler.GetNumberFromString(HOSTSTOP_RETRIES.value) < 4)
- {
- if (HexHandler.GetNumberFromString(HOSTSTOP_RETRIES.value) > 0)
- {
- Console.WriteLine("WARNING: MionButton powerdown failed with err=" + HOSTSTOP_RVAL.value + ", will retry shortly, count=" + HOSTSTOP_RETRIES.value);
- Thread.Sleep(new TimeSpan(0,0,30));
- }
- int mionbutton_ret = MionButton.forceOff2_off_single_cgi(args);
- HOSTSTOP_RVAL.value = mionbutton_ret.ToString();
- HOSTSTOP_RETRIES.value = (HexHandler.GetNumberFromString(HOSTSTOP_RETRIES.value) + 1).ToString();
- }
- }
- }
- }
- if (HexHandler.GetNumberFromString(HOSTSTOP_RVAL.value) != 0)
- {
- Console.WriteLine("Gathering MION logs via telnet for the mionbutton return of " + HOSTSTOP_RVAL.value + ".");
- string logfile = TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log";
- FileStream fs = new FileStream(logfile, FileMode.Create);
- StreamWriter sw = new StreamWriter(fs);
- sw.WriteLine("----------------------------------------------------------------");
- sw.WriteLine("----- MION telnet debug log @ " + DateTime.Now.ToLocalTime().ToString() + " -----");
- sw.WriteLine("----------------------------------------------------------------");
- string output = string.Empty;
- int miontelnet_ret = miontelnet.Reboot(out output);
- sw.Write(output);
- sw.Flush();
- sw.Close();
- Console.WriteLine(" See " + logfile + " for details.");
- }
- }
- else
- {
- int toucanreset_ret = ToucanReset.Reset();
- HOSTSTOP_RVAL.value = toucanreset_ret.ToString();
- }
- ToucanReset.Stop();
- if (HOSTSTOP_RVAL.value != "0")
- {
- if (BRIDGE_TYPE.value == "Mion")
- {
- if (MION_PWR_SEQ.value == "G_SHUTDOWN" && HOSTSTOP_RVAL.value == "1")
- {
- Console.WriteLine("cafex hoststop warning: Software shutdown failed.");
- HOSTSTOP_RVAL.value = "0";
- }
- else
- {
- Console.WriteLine("cafex hoststop failed: Could not stop cafe through " + BRIDGE_CURRENT_NAME.value);
- checkbridgename.CheckName_IPOnly();
- }
- }
- else
- {
- Console.WriteLine("cafex hoststop failed: Could not stop cafe through Toucan.");
- }
- }
- }
- //Script function: getbridgetype
- static void getbridgetype()
- {
- #if DEBUG
- Log.WriteLine("getbridgetype started.");
- #endif
- if (CAFE_HARDWARE.value == "ev")
- {
- BRIDGE_TYPE.value = "Toucan";
- }
- else if (CAFE_HARDWARE.value == "ev_x4")
- {
- BRIDGE_TYPE.value = "Mion";
- }
- else if (CAFE_HARDWARE.value.Substring(6, 2) == "mp")
- {
- BRIDGE_TYPE.value = "Mion";
- }
- else if (CAFE_HARDWARE.value.Substring(6) == "1" || CAFE_HARDWARE.value.Substring(6) == "2")
- {
- BRIDGE_TYPE.value = "Toucan";
- }
- else
- {
- BRIDGE_TYPE.value = "Mion";
- }
- #if DEBUG
- Log.WriteLine("BRIDGE_TYPE set to = " + BRIDGE_TYPE.value);
- #endif
- }
- //Script function: caferun
- static CAFEX_ERROR run(string[] args)
- {
- #if DEBUG
- Log.WriteLine("run started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- #region setup
- // This tells if the current call contains wumad parameters.
- bool isWumadExecution = false;
- PLATFORM.value = "cafe";
- QUIET.value = "-q";
- CAFESTOP_ONLY_IF_FSEMUL.value = "0";
- PPC_OS_FLAGS.value = "0";
- PPC_APP_FLAGS.value = "0";
- PCFS_SYNC_DATE.value = "";
- MCP_LAUNCH_HINT.value = "";
- MCP_INFO_OPTION.value = "";
- if (DEBUGGER.value == null)
- {
- DEBUGGER.value = "none";
- }
- if (CAFE_CONSOLE.value == null)
- {
- CONSOLE.value = "cattoucan";
- }
- else
- {
- CONSOLE.value = CAFE_CONSOLE.value;
- }
- if (CAFE_DEBUG_PORT.value == null)
- {
- CAFE_DEBUG_PORT.value = "toucan";
- }
- if (DEBUG_ELF_FILE.value == null)
- {
- DEBUG_ELF_FILE.value = "";
- }
- CAFERUN_OPTION_SOFT_RESTART.value = "0";
- CAFERUN_OPTION_MLC_EMU_LAUNCH.value = "0";
- CAFERUN_OPTION_MLC_EMU_TITLEID.value = "0xFFFFFFFFFFFFFFFF";
- string sdk_ver_file = CAFE_ROOT.value + "\\system\\include\\sdk_ver.h";
- if (!File.Exists(sdk_ver_file))
- {
- Console.WriteLine("cafex run error: sdk_ver.h does not exist: " + sdk_ver_file);
- return CAFEX_ERROR.RUN_NO_SDK_VERSION_HEADER;
- }
- FileStream fs = new FileStream(CAFE_ROOT.value + "\\system\\include\\sdk_ver.h", FileMode.Open, FileAccess.Read);
- StreamReader sr = new StreamReader(fs);
- bool found_line = false;
- while (!sr.EndOfStream)
- {
- string line = sr.ReadLine();
- if (line.Contains("00050010"))
- {
- int index = line.IndexOf("00050010");
- string version = line.Substring(index, 16);
- CAFERUN_OS_MAJOR_VERSION_LO.value = version.Substring(8, 8);
- CAFERUN_OS_MAJOR_VERSION.value = version.Substring(14, 2);
- if (CAFERUN_COLDBOOT_OS_VERSION.value == null)
- CAFERUN_COLDBOOT_OS_VERSION.value = "0x00050010100040" + CAFERUN_OS_MAJOR_VERSION.value;
- else
- CAFERUN_COLDBOOT_OS_VERSION.value = "0x" + CAFERUN_COLDBOOT_OS_VERSION.value;
- found_line = true;
- break;
- }
- }
- sr.Close();
- if (!found_line)
- {
- Console.WriteLine("cafex run error: couldn't find sdk version in sdk_ver.h");
- return CAFEX_ERROR.RUN_COULDNT_PARSE_SDK_VERSION_HEADER;
- }
- #if DEBUG
- Log.WriteLine("CAFERUN_COLDBOOT_OS_VERSION set to '" + CAFERUN_COLDBOOT_OS_VERSION.value + "' from file " + CAFE_ROOT.value + "\\system\\include\\sdk_ver.h");
- #endif
- HEARTBEAT_DISABLE.value = "0";
- PCFS_DIR_MAPPING.value = "";
- MAPDIR_MLC.value = "";
- MAPDIR_SLC.value = "";
- MAPDIR_CODE.value = "";
- MAPDIR_META.value = "";
- MAPDIR_CONTENT.value = "";
- MAPDIR_SAVE.value = "";
- PCFS_LOG_TIMESTAMP.value = "";
- PCFS_SRV_LOG_OUTPUT.value = "";
- RUN_FROM_HDD_BANK.value = "";
- BRIDGE_PARAMETERS.value = "";
- PCFSSERVER_PARAMETERS.value = "";
- PCFS_OVER_SATA_PORT.value = "";
- if (PCFS_HEADLESS_EMUL.value == null)
- {
- PCFS_HEADLESS_EMUL.value = "-pcfsenable";
- }
- PREPHDD_STAT.value = "";
- DISC_EMU_TID.value = "";
- SYSTEM_MODE.value = "";
- RPL_DIRS.value = "";
- RPL_FILES.value = "";
- if (CAFERUN_OPTION_NO_DATA_SYNC.value == null)
- {
- CAFERUN_OPTION_NO_DATA_SYNC.value = "0";
- }
- if (command != "on" && command != "setbootmode" && CAFE_BOOT_MODE.value == "NAND")
- {
- CAFERUN_OPTION_SOFT_LAUNCH.value = "1";
- }
- else
- {
- CAFERUN_OPTION_SOFT_LAUNCH.value = "0";
- }
- #if DEBUG
- Log.WriteLine("CAFERUN_OPTION_SOFT_LAUNCH set to " + CAFERUN_OPTION_SOFT_LAUNCH.value);
- #endif
- CAFERUN_HOSTBRIDGE_VERSION.value = "unknown";
- CAFERUN_FW_VERSION.value = "unknown";
- if (CAFE_DEBUG_INIT.value == null)
- {
- CAFE_DEBUG_INIT.value = "0";
- }
- if (CAFE_DEBUG_PREINIT.value == null)
- {
- CAFE_DEBUG_PREINIT.value = "0";
- }
- if (CAFE_DEBUG_DONTSTOP.value == null)
- {
- CAFE_DEBUG_DONTSTOP.value = "0";
- }
- if (CAFE_LAUNCH_DEBUG.value == null)
- {
- CAFE_LAUNCH_DEBUG.value = "1";
- }
- if (CAFE_SYSLOG_LEVEL.value == null)
- {
- CAFE_SYSLOG_LEVEL.value = "1";
- }
- if (CAFE_RUN_FORCERESTART.value == null)
- {
- CAFE_RUN_FORCERESTART.value = "0";
- }
- if (DEBUG_PROC_ID.value == null)
- {
- DEBUG_PROC_ID.value = "15";
- }
- DEBUG_FLAGS.value = "0";
- if (CAFE_DEBUG_INIT.value != "0")
- {
- DEBUG_FLAGS.value = "16";
- }
- if (CAFE_DEBUG_DONTSTOP.value != "0")
- {
- DEBUG_FLAGS.value = "32";
- }
- if (CAFE_DEBUG_PREINIT.value != "0")
- {
- DEBUG_FLAGS.value = "64";
- }
- CATOUTPUT.value = "0";
- CMDOUTPUT.value = "0";
- switch (CONSOLE.value)
- {
- case "sdio":
- {
- CONSOLE.value = "toucan";
- break;
- }
- case "cattoucan":
- {
- CONSOLE.value = "toucan";
- DEBUGGER.value = "cattoucan";
- CATOUTPUT.value = "1";
- break;
- }
- case "cmdtoucan":
- {
- CONSOLE.value = "toucan";
- DEBUGGER.value = "cattoucan";
- CMDOUTPUT.value = "1";
- break;
- }
- }
- if (CAFE_AUTOTEST.value == "1")
- {
- DEBUGGER.value = "none";
- }
- #if DEBUG
- Log.WriteLine("CONSOLE = " + CONSOLE.value);
- Log.WriteLine("DEBUGGER = " + DEBUGGER.value);
- Log.WriteLine("CATOUTPUT= " + CATOUTPUT.value);
- Log.WriteLine("CMDOUTPUT= " + CMDOUTPUT.value);
- #endif
- #endregion
- int rpx_index = args.Length;
- for (int i = 0; i < args.Length; ++i)
- {
- if (args[i].ToLowerInvariant().Contains(".rpx") || args[i].ToLowerInvariant().Contains(".elf"))
- {
- // Ensure the RPX is not the argument of an option
- if ( i > 0 &&
- ( args[i - 1].ToLowerInvariant().Trim().Equals("-k") ||
- args[i - 1].ToLowerInvariant().Trim().Equals("-l") ||
- args[i - 1].ToLowerInvariant().Trim().Equals("-e")))
- {
- // Exceptions: If ELF/RPX is argument of "-k" or "-l".
- continue;
- }
- else
- {
- // Default: ELF/RPX found is the one to run.
- rpx_index = i;
- break;
- }
- }
- }
- #if DEBUG
- Log.WriteLine("Search for RPX index returned index = " + rpx_index.ToString());
- #endif
- #region arguments
- for (int i = 0; i < rpx_index; ++i)
- {
- switch (args[i])
- {
- case "-m":
- {
- Console.WriteLine("cafex run failed: memmap not supported");
- run_usage();
- return CAFEX_ERROR.RUN_MEMMAP_NOT_SUPPORTED;
- }
- case "-g":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- int prev_value = HexHandler.GetNumberFromString(PPC_OS_FLAGS.value);
- int arg_value = HexHandler.GetNumberFromString(args[i + 1]);
- int new_value = prev_value | arg_value;
- PPC_OS_FLAGS.value = new_value.ToString();
- ++i;
- break;
- }
- case "-p":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- DEBUG_PROC_ID.value = args[i + 1];
- ++i;
- break;
- }
- case "-d":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- DEBUGGER.value = args[i + 1];
- int debug_flags = HexHandler.GetNumberFromString(DEBUG_FLAGS.value);
- int debug_proc_id = HexHandler.GetNumberFromString(DEBUG_PROC_ID.value);
- int new_value = debug_flags | (debug_proc_id & 0xf);
- DEBUG_FLAGS.value = new_value.ToString();
- CAFE_RUN_FORCERESTART.value = "1";
- ++i;
- break;
- }
- case "-k":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- DEBUG_ELF_FILE.value = args[i + 1];
- ++i;
- break;
- }
- case "-w":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- int prev_value = HexHandler.GetNumberFromString(PPC_OS_FLAGS.value);
- int arg_value = 0;
- try
- {
- arg_value = HexHandler.GetNumberFromString(args[i + 1]);
- }
- catch (FormatException)
- {
- Console.WriteLine("cafex : argument for -w option is not a valid number and will be ignored.");
- }
- int new_value = prev_value | arg_value;
- PPC_OS_FLAGS.value = new_value.ToString();
- ++i;
- break;
- }
- case "-a":
- {
- if (!ArgumentChecks.ArgumentExists(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- DASH_A_ARGS.value = args[i + 1];
- ++i;
- break;
- }
- case "-o":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFERUN_COLDBOOT_OS_VERSION.value = args[i + 1];
- ++i;
- break;
- }
- case "-b":
- {
- CAFERUN_COLDBOOT_OS_VERSION.value = "0x00050010100080" + CAFERUN_OS_MAJOR_VERSION.value;
- break;
- }
- case "-u":
- {
- CAFERUN_COLDBOOT_OS_VERSION.value = "0x000500101000C0" + CAFERUN_OS_MAJOR_VERSION.value;
- break;
- }
- case "-n":
- {
- int prev_value = HexHandler.GetNumberFromString(PPC_OS_FLAGS.value);
- int new_value = prev_value | 0x02000;
- PPC_OS_FLAGS.value = new_value.ToString();
- break;
- }
- case "-i":
- {
- int prev_value = HexHandler.GetNumberFromString(DEBUG_FLAGS.value);
- int new_value = prev_value | 16;
- DEBUG_FLAGS.value = new_value.ToString();
- break;
- }
- case "-R":
- {
- int prev_value = HexHandler.GetNumberFromString(DEBUG_FLAGS.value);
- int new_value = prev_value | 32;
- DEBUG_FLAGS.value = new_value.ToString();
- break;
- }
- case "-j":
- {
- int prev_value = HexHandler.GetNumberFromString(DEBUG_FLAGS.value);
- int new_value = prev_value | 64;
- DEBUG_FLAGS.value = new_value.ToString();
- break;
- }
- case "-q":
- {
- CAFE_SYSLOG_LEVEL.value = "0";
- break;
- }
- case "-v":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFE_SYSLOG_LEVEL.value = args[i + 1];
- ++i;
- break;
- }
- case "-e":
- {
- if (!ArgumentChecks.ArgumentExists(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- if (args[i + 1].StartsWith("mcp"))
- {
- if (args[i + 1].Length < 4)
- {
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- string new_val = args[i + 1].Substring(4);
- MCP_INFO_OPTION.value = new_val;
- if (new_val.StartsWith("launch_hint"))
- {
- if (new_val.Length < 12)
- {
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- MCP_LAUNCH_HINT.value = new_val.Substring(12);
- }
- }
- else if (args[i + 1] == "nopcfs")
- {
- Console.WriteLine("cafex run: Emulating PCFS Headless Mode.");
- PCFS_HEADLESS_EMUL.value = "-pcfsdisable";
- }
- else if (args[i + 1] == "noFFIO")
- {
- // This is the designation for PCFSServer to disable Fast File IO
- Console.WriteLine("cafex run: Disabling PCFS Fast File IO.");
- PCFSSERVER_PARAMETERS.AddToVar("-noFFIO", ' ');
- }
- else if (args[i + 1].ToLowerInvariant().StartsWith("wumad"))
- {
- if (args[i + 1].Length < 6)
- {
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFE_WUMAD.value = PathConverter.Windowsify(args[i + 1].Substring(6));
- BRIDGE_PARAMETERS.AddToVar("-sata", ' ');
- BRIDGE_PARAMETERS_WITH_E.AddToVar("-e sata", ' ');
- CAFE_RUN_FORCERESTART.value = "1";
- isWumadExecution = true;
- }
- else if (args[i + 1].ToLowerInvariant().StartsWith("soft_launch_cafe_elf"))
- {
- // This is the CAFE_ELF of the top level execution
- // that invoked this run to power on. This is ued
- // to create the disk image.
- CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN.value = "yes";
- SOFT_LAUNCH_CAFE_ELF.value = args[i + 1].Substring(21);
- }
- else
- {
- BRIDGE_PARAMETERS.AddToVar("-" + args[i + 1], ' ');
- BRIDGE_PARAMETERS_WITH_E.AddToVar("-e " + args[i + 1], ' ');
- if (args[i + 1].StartsWith("h"))
- {
- if (args[i + 1].Length < 2)
- {
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- RUN_FROM_HDD_BANK.value = args[i + 1].Substring(2);
- }
- if (args[i + 1].StartsWith("pcfsport"))
- {
- if (args[i + 1].Length < 9)
- {
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- PCFS_OVER_SATA_PORT.value = args[i + 1].Substring(9);
- USE_PCFS_OVER_SATA.value = "1";
- }
- if (args[i + 1].StartsWith("sdio"))
- {
- // If the Host Bridge does not support this option, remove it
- // This option was implemented with HB 3.2.4.4
- CAFEX_ERROR hostcheckversion_ret = hostcheckversion();
- if(hostcheckversion_ret != CAFEX_ERROR.OK)
- return hostcheckversion_ret;
- // 3024004 is the computed flat version of 3.2.4.4.
- // Yes, this is a bad way to compute the flat version.
- if (compute_flat_version(CAFERUN_HOSTBRIDGE_VERSION.value) < 3024004)
- {
- BRIDGE_PARAMETERS.RemoveFromVar("-sdio", ' ');
- BRIDGE_PARAMETERS_WITH_E.RemoveFromVar("-sdio", ' ');
- }
- }
- }
- ++i;
- break;
- }
- case "-c":
- {
- DEBUGGER.value = "cattoucan";
- break;
- }
- case "-f":
- {
- CAFESTOP_ONLY_IF_FSEMUL.value = "1";
- break;
- }
- case "-s":
- {
- CAFERUN_OPTION_SOFT_LAUNCH.value = "1";
- break;
- }
- case "-r":
- {
- CAFERUN_OPTION_SOFT_RESTART.value = "1";
- break;
- }
- case "-F":
- {
- CAFE_RUN_FORCERESTART.value = "1";
- break;
- }
- case "-t":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- if ((args[i + 1].Length == 18 && args[i + 1].StartsWith("0x")) || args[i + 1].Length == 16)
- {
- CAFERUN_OPTION_MLC_EMU_LAUNCH.value = "1";
- CAFERUN_OPTION_MLC_EMU_TITLEID.value = (args[i + 1].Length == 16) ? "0x" + args[i + 1] : args[i + 1];
- }
- else
- {
- Console.WriteLine("Title ID has incorrect length.");
- Console.WriteLine("A correct ID is 18 characters plus 0x in the beginning or 16 without 0x.");
- Console.WriteLine("Ex: 0x1234567812345678 or 1234567812345678");
- return CAFEX_ERROR.RUN_BAD_TITLE_ID;
- }
- ++i;
- break;
- }
- case "-l":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- if (!args[i + 1].EndsWith(".rpl"))
- {
- // CafeX addToVar does not use space as delimiter for the list, so there is no need to replace spaces with "|".
- RPL_DIRS.AddToVar(args[i + 1], DEFAULT_DELIMITER);
- }
- else
- {
- // CafeX addToVar does not use space as delimiter for the list, so there is no need to replace spaces with "|".
- RPL_FILES.AddToVar(args[i + 1], DEFAULT_DELIMITER);
- }
- ++i;
- break;
- }
- case "-h":
- {
- run_usage();
- return CAFEX_ERROR.OK;
- }
- case "-H":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- if (args[i + 1] == "disable")
- {
- HEARTBEAT_DISABLE.value = "0x00020000";
- }
- else if (args[i + 1] == "enable")
- {
- HEARTBEAT_DISABLE.value = "0";
- }
- else
- {
- run_usage();
- return CAFEX_ERROR.RUN_BAD_H_ARGUMENT;
- }
- ++i;
- break;
- }
- case "-x":
- {
- BRIDGE_PARAMETERS.AddToVar("-sata", ' ');
- break;
- }
- case "-z":
- {
- if (!Directory.Exists(CAFE_DATA_DIR.value))
- {
- Console.WriteLine("Session data directory is missing and needs to be sync'd!");
- Console.WriteLine(" Please re-run without the '-z' option.");
- return CAFEX_ERROR.RUN_NO_CAFE_DATA_DIR;
- }
- CAFERUN_OPTION_NO_DATA_SYNC.value = "1";
- break;
- }
- case "-A":
- {
- Console.WriteLine("*** -A option is deprecated and has no effect. ATFS is now the default file system. ***");
- break;
- }
- case "-D":
- {
- Console.WriteLine("cafex run failed: -D option is deprecated. DVDFS is now unsupported.");
- run_usage();
- return CAFEX_ERROR.RUN_D_OPTION_USED;
- }
- case "-M":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- SYSTEM_MODE.value = args[i + 1];
- ++i;
- break;
- }
- default:
- {
- Console.WriteLine("cafex run failed: invalid option: " + args[i]);
- run_usage();
- return CAFEX_ERROR.RUN_INVALID_OPTION;
- }
- }
- }
- #endregion
- // Wumad override: if "-e sata" was not provided and "-e wumad" was, sata bridge parameters should be added.
- if (!string.IsNullOrEmpty(CAFE_WUMAD.value) &&
- (string.IsNullOrEmpty(BRIDGE_PARAMETERS.value) || !BRIDGE_PARAMETERS.value.Contains("-sata")) &&
- (string.IsNullOrEmpty(BRIDGE_PARAMETERS_WITH_E.value) || !BRIDGE_PARAMETERS_WITH_E.value.Contains("-e sata")))
- {
- BRIDGE_PARAMETERS.AddToVar("-sata", ' ');
- BRIDGE_PARAMETERS_WITH_E.AddToVar("-e sata", ' ');
- }
- // Remove arguments before the .rpx
- string[] new_args = new string[args.Length - rpx_index];
- Array.Copy(args, rpx_index, new_args, 0, new_args.Length);
- args = new_args;
- //if (args.Length == 0)
- //{
- // Console.WriteLine("cafex run failed: No arguments specified.");
- // return CAFEX_ERROR.RUN_NO_ARGUMENTS;
- //}
- string catdev_sdk_ver = SDK_MAJ_VER.value + "." + SDK_MIN_VER.value + "." + SDK_MIC_VER.value;
- string sdk_ver = SDK_VER.value;
- if (catdev_sdk_ver != SDK_VER.value)
- {
- Console.WriteLine("The CAT-DEV SDK version is not the same as the SDK you are running.");
- Console.WriteLine("SDK Version: " + sdk_ver + " CAT-DEV SDK Version: " + catdev_sdk_ver);
- Console.WriteLine("Please run cafeupdate to get in sync.");
- }
- if (PCFS_OVER_SATA_PORT.value == null)
- {
- if (USE_PCFS_OVER_SATA.value == "1")
- {
- PCFS_OVER_SATA_PORT.value = SESSION_PCFS_SATA_PORT.value;
- BRIDGE_PARAMETERS.AddToVar("-pcfsport:" + SESSION_PCFS_SATA_PORT.value, ' ');
- Console.WriteLine("cafex run: using PCFS over SATA on port " + PCFS_OVER_SATA_PORT.value);
- }
- else
- {
- Console.WriteLine("cafex run: not using PCFS over SATA");
- }
- }
- if (PCFS_OVER_SATA_PORT.value != null)
- {
- PCFSSERVER_PARAMETERS.AddToVar("-c " + PCFS_OVER_SATA_PORT.value, ' ');
- }
- else
- {
- Console.WriteLine("cafex run: PCFS_OVER_SATA_PORT is not set.");
- }
- if (PCFSSERVER_PARAMETERS.value != null)
- {
- Console.WriteLine("cafex run: PCFSServer parameters " + PCFSSERVER_PARAMETERS.value);
- }
- if (BRIDGE_PARAMETERS.value == null || !BRIDGE_PARAMETERS.value.Contains("-h"))
- {
- if (BRIDGE_PARAMETERS.value == null || !BRIDGE_PARAMETERS.value.Contains("-em"))
- {
- BRIDGE_PARAMETERS.AddToVar("-em", ' ');
- }
- }
- DISC_EMU_TYPE.value = "hfio";
- if (CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN.value == "yes")
- {
- if (RUN_FROM_HDD_BANK.value != null)
- {
- DISC_EMU_TYPE.value = "hdd";
- Console.WriteLine("cafex run: Will launch HDD bank " + RUN_FROM_HDD_BANK.value);
- }
- else if (!string.IsNullOrEmpty(CAFE_WUMAD.value))
- {
- // wumad emulation started from cafediscrun
- DISC_EMU_TYPE.value = "hdd";
- }
- else if (CAFERUN_OPTION_SOFT_LAUNCH.value == "1")
- {
- ALLOW_DISCRUN_IN_SOFTLAUNCH.value = "1";
- DISC_EMU_TYPE.value = "blockemu";
- BRIDGE_PARAMETERS.AddToVar("-em", ' '); //Tell FSEmul to use block emulation explicitly
- }
- else
- {
- DISC_EMU_TYPE.value = "blockemu";
- if (BRIDGE_PARAMETERS.value == null || !BRIDGE_PARAMETERS.value.Contains("-em"))
- {
- BRIDGE_PARAMETERS.AddToVar("-em", ' ');
- }
- }
- }
- else if (!string.IsNullOrEmpty(CAFE_WUMAD.value))
- {
- // wumad emulation started from caferun
- DISC_EMU_TYPE.value = "hdd";
- }
- else
- {
- // default
- DISC_EMU_TYPE.value = "hfio";
- if (CAFE_BOOT_MODE.value == "NAND")
- {
- if (SYSTEM_MODE.value == "test")
- {
- Console.WriteLine("cafex run failed: Test mode not supported on NAND.");
- return CAFEX_ERROR.RUN_TEST_MODE_WITH_NAND_BOOT;
- }
- Console.WriteLine("cafex run: Will use NAND file system");
- }
- else
- {
- Console.WriteLine("cafex run: Will use PCFS file system emulation");
- }
- if (RUN_FROM_HDD_BANK.value != null)
- {
- Console.WriteLine("cafex run: HDD bank " + RUN_FROM_HDD_BANK.value + " will be attached to odd");
- }
- }
- Console.WriteLine("cafex run: bridge parameters: " + BRIDGE_PARAMETERS.value);
- // Console.WriteLine("cafex run: bridge parameters with -e: " + BRIDGE_PARAMETERS_WITH_E.value);
- long os_version = HexHandler.GetLongNumberFromString(CAFERUN_COLDBOOT_OS_VERSION.value);
- CAFERUN_COLDBOOT_OS_VERSION.value = os_version.ToString("X").PadLeft(16, '0');
- HOSTSTOP_RVAL.value = "0";
- Process[] fsEmulProcesses = Process.GetProcessesByName("FSEmul");
- if (CAFESTOP_ONLY_IF_FSEMUL.value == "0" || (fsEmulProcesses != null && fsEmulProcesses.Length > 0))
- {
- stop(null);
- if (HOSTSTOP_RVAL.value != "0")
- {
- Console.WriteLine("cafex run failed: Please check the device is connected, powered on, and not in use by another host PC.");
- return CAFEX_ERROR.RUN_HOSTSTOP_RVAL_NON_ZERO;
- }
- }
- CAFEX_ERROR ret = hostcheckversion();
- if (ret != CAFEX_ERROR.OK)
- {
- return ret;
- }
- CAFE_SYSLOG_LEVEL.value = (HexHandler.GetNumberFromString(CAFE_SYSLOG_LEVEL.value) & 7).ToString();
- PPC_OS_FLAGS.value = (HexHandler.GetNumberFromString(PPC_OS_FLAGS.value) | HexHandler.GetNumberFromString(HEARTBEAT_DISABLE.value) | HexHandler.GetNumberFromString(DEBUG_FLAGS.value) | (HexHandler.GetNumberFromString(CAFE_SYSLOG_LEVEL.value) << 9)).ToString();
- PPC_APP_FLAGS.value = ((HexHandler.GetNumberFromString(PPC_OS_FLAGS.value) & 0x00000e70) | ((HexHandler.GetNumberFromString(PPC_OS_FLAGS.value) >> 7) & 1) | Convert.ToInt32(((HexHandler.GetNumberFromString(PPC_OS_FLAGS.value) & 0xf) != 0))).ToString();
- SYSTEM_XML.value = CAFE_SLC_DIR.value + "\\sys\\config\\system.xml";
- if (TEMP.value == null)
- {
- Console.WriteLine("cafex run failed: TEMP environment variable is not set.");
- return CAFEX_ERROR.RUN_NO_TEMP_VAR;
- }
- else
- {
- CAFERUN_WORK_DIR.value = TEMP.value + "\\" + SESSION_PATH_PREFIX.value + "caferun";
- }
- create_directory_if_noexist(CAFERUN_WORK_DIR.value);
- if (SESSION_MANAGER.value == "1")
- {
- Console.WriteLine("cafex run: Using CAFE_CONTENT_DIR = " + CAFE_CONTENT_DIR.value);
- if (CAFERUN_OPTION_NO_DATA_SYNC.value == "0" && CAFERUN_OPTION_SOFT_RESTART.value == "0")
- {
- syncsession();
- CAFERUN_OPTION_NO_DATA_SYNC.value = "1";
- }
- }
- if (CAFERUN_OPTION_SOFT_RESTART.value == "0")
- {
- create_directory_if_noexist(CAFE_SLC_DIR.value + "\\sys");
- create_directory_if_noexist(CAFE_MLC_DIR.value);
- if (args.Length != 0 && args[0] != null)
- {
- if (DISC_EMU_TYPE.value == "hdd")
- {
- Console.WriteLine("cafex run: Specified rpx/elf file is used for setting title id from app.xml only");
- }
- CAFE_ELF.value = PathConverter.Windowsify(args[0]);
- CAFE_ELF.value = PathConverter.Root(CAFE_ELF.value);
- if (SESSION_MANAGER.value == "1")
- {
- TMP_SUB_DIR.value = Path.GetFileNameWithoutExtension(args[0]);
- string CAFE_DATA_TMP_DOS = CAFE_DATA_TMP.value + "\\" + TMP_SUB_DIR.value;
- create_directory_if_noexist(CAFE_DATA_TMP_DOS);
- CAFE_ELF_SRC_DIR.value = Path.GetDirectoryName(CAFE_ELF.value);
- if (!string.Equals(CAFE_ELF_SRC_DIR.value, CAFE_DATA_TMP_DOS, StringComparison.InvariantCultureIgnoreCase))
- {
- // Don't sync if we are running from the data/tmp folder as this is most-likely
- // a restart from the Multi debugger. If not, the files are still ok as they were
- // from a previous sync.
- //
- SYNCTOOL_CFG.value = CAFE_ROOT.value + "\\system\\bin\\tool\\synctool.code.xml";
- SYNCTOOL_LOG.value = CAFE_DATA_TMP.value + "\\synctool.log";
- synctool.sync(SYNCTOOL_CFG.value, CAFE_ELF_SRC_DIR.value, CAFE_DATA_TMP_DOS, SYNCTOOL_LOG.value);
- }
- CAFE_ELF.value = CAFE_DATA_TMP.value + "\\" + TMP_SUB_DIR.value + "\\" + Path.GetFileName(args[0]);
- }
- switch (Path.GetExtension(CAFE_ELF.value))
- {
- case ".elf":
- {
- DEBUG_ELF_FILE.value = CAFE_ELF.value;
- string rpx = Path.ChangeExtension(CAFE_ELF.value, "rpx");
- if (File.Exists(rpx))
- {
- CAFE_ELF.value = rpx;
- }
- break;
- }
- case ".rpx":
- {
- if (DEBUG_ELF_FILE.value == null)
- {
- string elf = Path.ChangeExtension(CAFE_ELF.value, "elf");
- if (File.Exists(elf))
- {
- DEBUG_ELF_FILE.value = elf;
- }
- }
- break;
- }
- }
- if (!CAFE_ELF.value.EndsWith(".rpx"))
- {
- Console.WriteLine("cafex run failed: Please provide rpx application as first argument after run_options");
- run_usage();
- return CAFEX_ERROR.RUN_NO_RPX_SPECIFIED;
- }
- if (!File.Exists(CAFE_ELF.value))
- {
- Console.WriteLine("cafex run failed: Cannot find rpx application in " + CAFE_ELF.value);
- return CAFEX_ERROR.RUN_RPX_DOESNT_EXIST;
- }
- CAFE_ELF_DIR.value = Path.GetDirectoryName(CAFE_ELF.value);
- create_directory_if_noexist(CAFE_CONTENT_DIR.value);
- create_directory_if_noexist(CAFE_META_DIR.value);
- create_directory_if_noexist(CAFE_SAVE_DIR.value);
- CAFE_CODE_DIR.value = CAFE_ELF_DIR.value;
- APP_XML_FILE.value = CAFE_CODE_DIR.value + "\\app.xml";
- if (!update_app_xml(APP_XML_FILE.value))
- {
- return CAFEX_ERROR.RUN_UPDATE_APP_XML_FAILED;
- }
- COS_XML_FILE.value = CAFE_CODE_DIR.value + "\\cos.xml";
- if (!update_cos_xml(COS_XML_FILE.value, PPC_APP_FLAGS.value))
- {
- return CAFEX_ERROR.RUN_UPDATE_COS_XML_FAILED;
- }
- META_XML_FILE.value = CAFE_META_DIR.value + "\\meta.xml";
- CAFEX_ERROR update_meta_ret = update_meta_xml(META_XML_FILE.value);
- if (update_meta_ret != CAFEX_ERROR.OK)
- {
- return update_meta_ret;
- }
- if (!update_arglist(COS_XML_FILE.value, CAFE_ELF.value, args))
- {
- return CAFEX_ERROR.RUN_UPDATE_ARGLIST_FAILED;
- }
- update_boot_logos(CAFE_META_DIR.value);
- if (RPL_DIRS.value != null)
- {
- string[] rpl_dirs = RPL_DIRS.value.Split(DEFAULT_DELIMITER);
- foreach (string s in rpl_dirs)
- {
- string dir = PathConverter.Windowsify(s);
- string[] contained_files = Directory.GetFiles(Path.GetDirectoryName(dir), "*.rpl");
- if (contained_files.Length == 0)
- {
- Console.WriteLine("cafex run : WARNING - No files found in directory {0}.", dir);
- }
- else
- {
- foreach (string origin in contained_files)
- {
- string destination = CAFE_CODE_DIR.value + "\\" + Path.GetFileName(origin);
- Console.WriteLine("cafex run: copy {0} to {1}", origin, destination);
- File.Copy(origin, destination, true);
- }
- }
- }
- }
- if (RPL_FILES.value != null)
- {
- string[] rpl_files = RPL_FILES.value.Split(DEFAULT_DELIMITER);
- foreach (string s in rpl_files)
- {
- string file = PathConverter.Windowsify(s);
- if (File.Exists(file))
- {
- string destination = CAFE_CODE_DIR.value + "\\" + Path.GetFileName(s);
- Console.WriteLine("cafex run: copy {0} to {1}", file, destination);
- File.Copy(file, destination, true);
- }
- }
- }
- }
- FileStream previous_info_file = new FileStream(CAFERUN_WORK_DIR.value + "\\" + "previous_launch_info.xml", FileMode.Create);
- StreamWriter writer = new StreamWriter(previous_info_file);
- if (CAFERUN_OPTION_MLC_EMU_LAUNCH.value == "1")
- {
- writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
- writer.WriteLine("<prev type=\"complex\" access=\"777\">");
- writer.WriteLine(" <emu_tid type=\"string\" length=\"512\">" + CAFERUN_OPTION_MLC_EMU_TITLEID.value + "</emu_tid>");
- writer.WriteLine("</prev>");
- writer.Flush();
- writer.Close();
- }
- else
- {
- writer.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
- writer.WriteLine("<prev type=\"complex\" access=\"777\">");
- writer.WriteLine(" <code_dir type=\"string\" length=\"512\">" + CAFE_CODE_DIR.value + "</code_dir>");
- writer.WriteLine(" <disc_emu type=\"string\" length=\"8\">" + DISC_EMU_TYPE.value + "</disc_emu>");
- writer.WriteLine(" <hdd_bank type=\"string\" length=\"8\">" + RUN_FROM_HDD_BANK.value + "</hdd_bank>");
- writer.WriteLine("</prev>");
- writer.Flush();
- writer.Close();
- }
- CAFEX_ERROR updateResult = update_system_xml(SYSTEM_XML.value, PPC_OS_FLAGS.value, SYSTEM_MODE.value, MCP_LAUNCH_HINT.value);
- if (updateResult != CAFEX_ERROR.OK)
- {
- return updateResult;
- }
- }
- else
- {
- if (!File.Exists(SYSTEM_XML.value))
- {
- Console.WriteLine("cafex run failed: Please cafex run an rpx application first");
- return CAFEX_ERROR.RUN_DASH_R_WITH_NO_PREVIOUS_LAUNCH_INFO;
- }
- string prev_info_file = CAFERUN_WORK_DIR.value + "\\" + "previous_launch_info.xml";
- bool mlc_launch = XmlHandler.NodeExists(prev_info_file, "emu_tid");
- if (mlc_launch)
- {
- CAFERUN_OPTION_MLC_EMU_TITLEID.value = XmlHandler.GetNodeValue(prev_info_file, "emu_tid");
- CAFERUN_OPTION_MLC_EMU_LAUNCH.value = "1";
- }
- else
- {
- CAFE_CODE_DIR.value = XmlHandler.GetNodeValue(prev_info_file, "code_dir");
- DISC_EMU_TYPE.value = XmlHandler.GetNodeValue(prev_info_file, "disc_emu");
- RUN_FROM_HDD_BANK.value = XmlHandler.GetNodeValue(prev_info_file, "hdd_bank");
- PREV_CAFE_ARGSTR.value = XmlHandler.GetNodeValue(CAFE_CODE_DIR.value + "\\cos.xml", "argstr");
- CAFE_ELF.value = CAFE_CODE_DIR.value + "\\" + PREV_CAFE_ARGSTR.value.Split(' ')[0];
- CAFERUN_COLDBOOT_OS_VERSION.value = XmlHandler.GetNodeValue(SYSTEM_XML.value, "default_os_id");
- if (DISC_EMU_TYPE.value != "hdd")
- {
- if (!File.Exists(CAFE_ELF.value))
- {
- Console.WriteLine("cafex run failed: Could not find " + CAFE_ELF.value);
- return CAFEX_ERROR.RUN_DASH_R_CANT_FIND_APPLICATION;
- }
- Console.WriteLine("cafex run: Restarting " + CAFE_ELF.value);
- }
- }
- }
- if (CAFE_BOOT_MODE.value == "PCFS")
- {
- string os_directory = CAFE_SLC_DIR.value + "\\sys\\title\\" + CAFERUN_COLDBOOT_OS_VERSION.value.Substring(0,8) + "\\" + CAFERUN_COLDBOOT_OS_VERSION.value.Substring(8,8) + "\\code";
- if (!Directory.Exists(os_directory))
- {
- Console.WriteLine("cafex run failed: Cannot find OS in " + os_directory);
- return CAFEX_ERROR.RUN_CANT_FIND_OS_DIRECTORY;
- }
- string[] files = Directory.GetFiles(os_directory);
- bool found_rpl = false;
- foreach (string s in files)
- {
- if (s.EndsWith(".rpl"))
- {
- found_rpl = true;
- break;
- }
- }
- if (!found_rpl)
- {
- CAFERUN_OS_VERSION_PARTIAL_UNIQUE_ID.value = (HexHandler.GetLongNumberFromString("0x" + CAFERUN_COLDBOOT_OS_VERSION.value) >> 8 & 0xff).ToString();
- int value = HexHandler.GetNumberFromString(CAFERUN_OS_VERSION_PARTIAL_UNIQUE_ID.value);
- if (value >= 192)
- {
- Console.WriteLine("cafex run failed: Please build FDEBUG os version " + CAFERUN_COLDBOOT_OS_VERSION.value);
- }
- else if (value >= 128)
- {
- Console.WriteLine("cafex run failed: Please build DEBUG os version " + CAFERUN_COLDBOOT_OS_VERSION.value);
- Console.WriteLine(" or do not use \"cafex run -b\" to use NDEBUG version");
- }
- else if (value >= 64)
- {
- Console.WriteLine("cafex run failed: Please build NDEBUG os version " + CAFERUN_COLDBOOT_OS_VERSION.value);
- Console.WriteLine(" or use \"cafex run -b\" to use the DEBUG version");
- }
- else
- {
- Console.WriteLine("cafex run failed: Non-standard titleId for os version " + CAFERUN_COLDBOOT_OS_VERSION.value);
- }
- return CAFEX_ERROR.RUN_OS_NOT_PRESENT;
- }
- }
- if (PCFS_SRV_LOG_DIR.value == null)
- {
- PCFS_SRV_LOG_OUTPUT.value = "/dev/null";
- }
- else
- {
- PCFS_LOG_TIMESTAMP.value = DateTime.Now.ToString("HHmmss");
- PCFS_SRV_LOG_OUTPUT.value = PCFS_SRV_LOG_DIR.value + "\\" + SESSION_PATH_PREFIX.value + "pcfs_" + PCFS_LOG_TIMESTAMP.value + ".txt";
- Console.WriteLine("PCFS output logged to " + PCFS_SRV_LOG_OUTPUT.value);
- }
- if (DISC_EMU_TYPE.value == "hfio" ||
- DISC_EMU_TYPE.value == "hdd" ||
- ((!string.IsNullOrEmpty(CAFE_ELF.value)) && CAFE_ELF.value.EndsWith(".rpx")))
- {
- if (DISC_EMU_TYPE.value == "hfio")
- {
- MAPDIR_MLC.value = CAFE_MLC_DIR.value + "/";
- MAPDIR_SLC.value = CAFE_SLC_DIR.value + "/";
- MAPDIR_CODE.value = CAFE_CODE_DIR.value + "/";
- MAPDIR_META.value = CAFE_META_DIR.value + "/";
- MAPDIR_CONTENT.value = CAFE_CONTENT_DIR.value + "/";
- MAPDIR_SAVE.value = CAFE_SAVE_DIR.value + "/";
- PCFS_DIR_MAPPING.value = "-m /%MLC_EMU_DIR/ \"" + MAPDIR_MLC.value + "\"" +
- " -m /%SLC_EMU_DIR/ \"" + MAPDIR_SLC.value + "\"" +
- " -m /%DISC_EMU_DIR/code/ \"" + MAPDIR_CODE.value + "\"" +
- " -m /%DISC_EMU_DIR/meta/ \"" + MAPDIR_META.value + "\"" +
- " -m /%DISC_EMU_DIR/content/ \"" + MAPDIR_CONTENT.value + "\"" +
- " -m /%DISC_EMU_DIR/save/ \"" + MAPDIR_SAVE.value + "\"";
- }
- else
- {
- MAPDIR_MLC.value = CAFE_MLC_DIR.value + "/";
- MAPDIR_SLC.value = CAFE_SLC_DIR.value + "/";
- MAPDIR_SAVE.value = CAFE_SAVE_DIR.value + "/";
- PCFS_DIR_MAPPING.value = "-m /%MLC_EMU_DIR/ \"" + MAPDIR_MLC.value + "\"" +
- " -m /%SLC_EMU_DIR/ \"" + MAPDIR_SLC.value + "\"" +
- " -m /%SAVE_EMU_DIR/ \"" + MAPDIR_SAVE.value + "\"";
- }
- }
- else if (CAFERUN_OPTION_MLC_EMU_LAUNCH.value == "1")
- {
- MAPDIR_MLC.value = CAFE_MLC_DIR.value + "/";
- MAPDIR_SLC.value = CAFE_SLC_DIR.value + "/";
- PCFS_DIR_MAPPING.value = "-m /%MLC_EMU_DIR/ \"" + MAPDIR_MLC.value + "\"" +
- " -m /%SLC_EMU_DIR/ \"" + MAPDIR_SLC.value + "\"";
- }
- else
- {
- MAPDIR_MLC.value = CAFE_MLC_DIR.value + "/";
- MAPDIR_SLC.value = CAFE_SLC_DIR.value + "/";
- PCFS_DIR_MAPPING.value = "-m /%MLC_EMU_DIR/ \"" + MAPDIR_MLC.value + "\"" +
- " -m /%SLC_EMU_DIR/ \"" + MAPDIR_SLC.value + "\"";
- }
- ELF_NEST_OPT.value="";
- ELF_NEST_VALUE.value = "";
- if (ALLOW_DISCRUN_IN_SOFTLAUNCH.value == "1")
- {
- // the DLF will not be used now - but it has to be made now,
- // as this is the point where all input environment variables are set correctly
- // for cafedevrun.sh to run
- bootrun(new List<string>() {"-makedlf"} );
- if (!BRIDGE_PARAMETERS_WITH_E.value.Contains("soft_launch_cafe_elf"))
- {
- if (!string.IsNullOrEmpty(CAFE_ELF.value))
- {
- // we didn't get the ELF name from above. So we must to decide what it is.
- ELF_NEST_OPT.value = "-e";
- ELF_NEST_VALUE.value = "soft_launch_cafe_elf:" + CAFE_ELF.value;
- // Since there is no way to communicate new DLF contents into an existing FSEmul,
- // we need a forceful restart for this case - even though it is softlaunch
- CAFE_RUN_FORCERESTART.value = "1";
- }
- }
- }
- if (CAFERUN_OPTION_SOFT_LAUNCH.value == "1")
- {
- // Need to call monitor to flush any data from previous execution that might
- // be still buffered in the FSEmul. Setting a timeout prevents an early
- // start of a new title while a previous one might be still booting up.
- // This is necessary because the .NET process launches immediately after the
- // previous is finished.
- dkt.FlushOutputBuffer(1);
- if (CAFE_RUN_FORCERESTART.value == "1")
- {
- Console.WriteLine("**** FORCE REBOOT ****");
- List<string> onArguments = new List<string>();
- onArguments.Add("-noprompt");
- if (!string.IsNullOrEmpty(BRIDGE_PARAMETERS_WITH_E.value))
- {
- onArguments.AddRange(BRIDGE_PARAMETERS_WITH_E.value.Split(' '));
- }
- // discrun support variables
- onArguments.Add(ELF_NEST_OPT.value);
- onArguments.Add(ELF_NEST_VALUE.value);
- string[] noprompt_args = onArguments.ToArray();
- string wumadRetrievedTitleId = string.Empty;
- EnvVar.BackUpCurrentEnvironment();
- // Saves user input
- string userProvidedTitleId = CAFERUN_OPTION_MLC_EMU_TITLEID.value.StartsWith("0x") ? CAFERUN_OPTION_MLC_EMU_TITLEID.value.Substring(2).ToLowerInvariant() : CAFERUN_OPTION_MLC_EMU_TITLEID.value.ToLowerInvariant();
- // Then assigns to the variable that will be passed in for verification
- CAFERUN_WUMAD_TITLE_ID.value = userProvidedTitleId;
- on(noprompt_args);
- wumadRetrievedTitleId = CAFERUN_WUMAD_TITLE_ID.value;
- EnvVar.RestoreSavedEnvironment();
- // If a value returned and it's different, should take it.
- if (!string.IsNullOrEmpty(wumadRetrievedTitleId) &&
- !wumadRetrievedTitleId.Equals(userProvidedTitleId))
- {
- // This is the auto-discovery action. Reset the wumad title id.
- CAFERUN_WUMAD_TITLE_ID.value = wumadRetrievedTitleId;
- }
- // Make sure the CAT-DEV is in a state that can take commands.
- Thread.Sleep(Program.COS_READY_DELAY); //trying to get connection through devkit help msg. This prevents a bunch of 'help' messages to be issued.
- CMD_RESULT.value = devkitmsg.help(Program.DEVKIT_HELP_TIMEOUT_SECONDS).ToString();
- }
- // try this three times.
- for (int i = 0; i < 3; ++i)
- {
- #if DEBUG
- Log.WriteLine("Iteration #" + (i+1).ToString() + " of 3");
- #endif
- PCFS_SYNC_DATE.value = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff");
- Console.WriteLine("Launching " + Path.GetFileName(CAFE_ELF.value) + " @ sync date [" + PCFS_SYNC_DATE.value + "]");
- CMD_RESULT.value = PCFSServerSync.sync(PCFS_SYNC_DATE.value, CAFE_ELF.value, PCFS_DIR_MAPPING.value).ToString();
- #if DEBUG
- Log.WriteLine("PCFSServerSync process returned '" + CMD_RESULT.value + "' from execution.");
- #endif
- if (CMD_RESULT.value == "0")
- {
- bool helpMessageSent = false;
- if (CAFERUN_OPTION_SOFT_LAUNCH.value == "1" && CAFE_BOOT_MODE.value == "NAND")
- {
- // Send the help message to find out if the CAT-DEV is can take commands.
- #if DEBUG
- Log.WriteLine("Before softlaunch sleep for '" + Program.COS_READY_DELAY.Seconds.ToString() + "' seconds.");
- #endif
- Thread.Sleep(Program.COS_READY_DELAY); //trying to get connection through devkit help msg. This prevents a bunch of 'help' messages to be issued.
- CMD_RESULT.value = devkitmsg.help(Program.DEVKIT_HELP_TIMEOUT_SECONDS).ToString();
- helpMessageSent = true;
- #if DEBUG
- Log.WriteLine("setting cosflags now.");
- #endif
- CMD_RESULT.value = set_system_xml_cos_flags(PPC_OS_FLAGS.value).ToString();
- }
- if (CMD_RESULT.value == "0")
- {
- if (!helpMessageSent)
- {
- // Send the help message to find out if the CAT-DEV is fully finished booting.
- #if DEBUG
- Log.WriteLine("Before softlaunch sleep for '" + Program.COS_READY_DELAY.Seconds.ToString() + "' seconds.");
- #endif
- Thread.Sleep(Program.COS_READY_DELAY); //trying to get connection through devkit help msg. This prevents a bunch of 'help' messages to be issued.
- CMD_RESULT.value = devkitmsg.help(Program.DEVKIT_HELP_TIMEOUT_SECONDS).ToString();
- }
- #if DEBUG
- Log.WriteLine("trying softlaunch now.");
- #endif
- // discrun support.
- // This is softlaunch, and there is no RPS specified.
- // try to see if we can get it from the user - in case it applies
- if(string.IsNullOrEmpty(DISC_EMU_TID.value))
- {
- if (CAFERUN_OPTION_MLC_EMU_LAUNCH.value == "1")
- {
- DISC_EMU_TID.value = (!string.IsNullOrEmpty(CAFERUN_OPTION_MLC_EMU_TITLEID.value) && CAFERUN_OPTION_MLC_EMU_TITLEID.value.Length == 16) ?
- "0x" + CAFERUN_OPTION_MLC_EMU_TITLEID.value :
- CAFERUN_OPTION_MLC_EMU_TITLEID.value;
- Console.WriteLine("HDD emulation: using command line TID {0}", DISC_EMU_TID.value);
- }
- else if (!string.IsNullOrEmpty(CAFE_WUMAD.value) &&
- !string.IsNullOrEmpty(CAFERUN_WUMAD_TITLE_ID.value))
- {
- // Check if a WUMAD was provided and see if title id is available
- DISC_EMU_TID.value = CAFERUN_WUMAD_TITLE_ID.value;
- Console.WriteLine("HDD WUMAD emulation: using command line TID {0}", DISC_EMU_TID.value);
- }
- }
- // still not set despite our attempts?
- if(string.IsNullOrEmpty(DISC_EMU_TID.value))
- {
- Console.WriteLine("cafex run failed: Unable to determine title ID, and it was not specified in the command line.");
- return CAFEX_ERROR.RUN_DISCRUN_NAND_UNABLE_TO_FIND_APPLICATION;
- }
- // this is to phase in adoption smoothly into autotest,
- // avoiding any changes to tests other than cafediscrun.
- // We may disable this check later.
- if (ALLOW_DISCRUN_IN_SOFTLAUNCH.value == "1")
- {
- CMD_RESULT.value = "0";
- if (!string.IsNullOrEmpty(SYSTEM_MODE.value))
- {
- if (SYSTEM_MODE.value.ToLowerInvariant().Equals("prod"))
- {
- Console.WriteLine("Setting mode to 0");
- devkitmsg.sys_mode_prod();
- }
- else if (SYSTEM_MODE.value.ToLowerInvariant().Equals("dev"))
- {
- Console.WriteLine("Setting mode to 1");
- devkitmsg.sys_mode_dev();
- }
- else if (SYSTEM_MODE.value.ToLowerInvariant().Equals("test"))
- {
- Console.WriteLine("Setting mode to 2");
- devkitmsg.sys_mode_test();
- }
- }
- }
- if (MCP_LAUNCH_HINT.value != null)
- {
- CMD_RESULT.value = devkitmsg.title_softlaunch_with_hint(CAFERUN_COLDBOOT_OS_VERSION.value, DISC_EMU_TID.value, MCP_LAUNCH_HINT.value, SESSION_LAUNCH_CTRL_PORT.value).ToString();
- }
- else
- {
- CMD_RESULT.value = devkitmsg.title_softlaunch(CAFERUN_COLDBOOT_OS_VERSION.value, DISC_EMU_TID.value, SESSION_LAUNCH_CTRL_PORT.value).ToString();
- }
- if (CMD_RESULT.value == "0")
- {
- // Clear the buffer one final time before exiting.
- dkt.FlushOutputBuffer();
- break;
- }
- }
- }
- #if DEBUG
- Log.WriteLine("trying reboot now.");
- #endif
- Console.WriteLine("**** BOOTING CATDEV ****");
- stop(null);
- #if DEBUG
- Log.WriteLine("Before reboot sleep for '" + Program.COS_REBOOT_DELAY.Seconds.ToString() + "' seconds.");
- #endif
- Thread.Sleep(Program.COS_REBOOT_DELAY);
- List<string> onArguments = new List<string>();
- onArguments.Add("-noprompt");
- if (!string.IsNullOrEmpty(BRIDGE_PARAMETERS_WITH_E.value))
- {
- onArguments.AddRange(BRIDGE_PARAMETERS_WITH_E.value.Split(' '));
- }
- // discrun support variables
- onArguments.Add(ELF_NEST_OPT.value);
- onArguments.Add(ELF_NEST_VALUE.value);
- string[] noprompt_args = onArguments.ToArray();
- string wumadRetrievedTitleId = string.Empty;
- EnvVar.BackUpCurrentEnvironment();
- // Saves user input
- string userProvidedTitleId = CAFERUN_OPTION_MLC_EMU_TITLEID.value.StartsWith("0x") ? CAFERUN_OPTION_MLC_EMU_TITLEID.value.Substring(2).ToLowerInvariant() : CAFERUN_OPTION_MLC_EMU_TITLEID.value.ToLowerInvariant();
- // Then assigns to the variable that will be passed in for verification
- CAFERUN_WUMAD_TITLE_ID.value = userProvidedTitleId;
- on(noprompt_args);
- wumadRetrievedTitleId = CAFERUN_WUMAD_TITLE_ID.value;
- EnvVar.RestoreSavedEnvironment();
- // If a value returned and it's different, should take it.
- if (!string.IsNullOrEmpty(wumadRetrievedTitleId) &&
- !wumadRetrievedTitleId.Equals(userProvidedTitleId))
- {
- // This is the auto-discovery action. Reset the wumad title id.
- CAFERUN_WUMAD_TITLE_ID.value = wumadRetrievedTitleId;
- }
- // Send the help message to find out if the CAT-DEV is fully finished booting.
- #if DEBUG
- Log.WriteLine("Before softlaunch sleep for '" + Program.COS_READY_DELAY.Seconds.ToString() + "' seconds.");
- #endif
- Thread.Sleep(Program.COS_READY_DELAY); //15s + 2s trying to get connection through devkit help msg. This prevents a bunch of 'help' messages to be issued.
- CMD_RESULT.value = devkitmsg.help(Program.DEVKIT_HELP_TIMEOUT_SECONDS).ToString();
- }
- }
- else
- {
- PCFS_SYNC_DATE.value = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff");
- Console.WriteLine("Starting PCFSServer.exe @ sync date [" + PCFS_SYNC_DATE.value + "]");
- PCFSServer.Start(PCFSSERVER_PARAMETERS.value, PCFS_DIR_MAPPING.value, PCFS_SRV_LOG_OUTPUT.value);
- Console.WriteLine("PCFSServer has started");
- if (PCFSSERVER_PARAMETERS.value != null)
- {
- Console.WriteLine("Waiting for PCFSServer initialization...");
- PCFSSERVERSYNC_RVAL.value = PCFSServerSync.wait_sync(PCFS_SYNC_DATE.value).ToString();
- if (PCFSSERVERSYNC_RVAL.value != "0")
- {
- Console.WriteLine("PCFSServerSync exited with value " + PCFSSERVERSYNC_RVAL.value);
- return CAFEX_ERROR.RUN_PCFSSERVER_SYNC_FAILED;
- }
- Console.WriteLine("PCFSServer initialization complete!");
- }
- else
- {
- Console.WriteLine("PCFSServer started without synchronization");
- }
- BOOTRUN_ELF_OPT.value = "";
- BOOTRUN_ELF_VALUE.value = "";
- if (!string.IsNullOrEmpty(SOFT_LAUNCH_CAFE_ELF.value))
- {
- BOOTRUN_ELF_OPT.value = "-usedlf";
- BOOTRUN_ELF_VALUE.value = SOFT_LAUNCH_CAFE_ELF.value;
- }
- // Check if this is a wumad execution, so that bootrun can correctly assign the title Id
- if (isWumadExecution)
- {
- if (!string.IsNullOrEmpty(CAFERUN_OPTION_MLC_EMU_TITLEID.value))
- {
- // Saves user input
- string userProvidedTitleId = CAFERUN_OPTION_MLC_EMU_TITLEID.value.StartsWith("0x") ? CAFERUN_OPTION_MLC_EMU_TITLEID.value.Substring(2).ToLowerInvariant() : CAFERUN_OPTION_MLC_EMU_TITLEID.value.ToLowerInvariant();
- // Then assigns to the variable that will be passed in for verification
- CAFERUN_WUMAD_TITLE_ID.value = userProvidedTitleId;
- }
- else
- {
- // Ensure there is no title, so autodiscovery can run
- CAFERUN_WUMAD_TITLE_ID.value = string.Empty;
- }
- }
- CAFEX_ERROR bootrun_ret = bootrun(new List<string>() {BOOTRUN_ELF_OPT.value, BOOTRUN_ELF_VALUE.value});
- if (bootrun_ret != CAFEX_ERROR.OK)
- return bootrun_ret;
- }
- CAFEX_ERROR connect_serial_or_debugger_ret = connect_serial_or_debugger(quiet_mode);
- if (connect_serial_or_debugger_ret != CAFEX_ERROR.OK)
- {
- return connect_serial_or_debugger_ret;
- }
- return CAFEX_ERROR.OK;
- }
- private struct WumadInfo
- {
- public bool titleFound;
- public string titleId;
- public string appXml;
- public string cosXml;
- public string metaXml;
- }
- private static CAFEX_ERROR TryGetWumadInfo(string wumadTempDir, ref WumadInfo info)
- {
- string[] metaFiles = Directory.GetFiles(wumadTempDir, "*metaxml.bin");
- string[] appFiles = Directory.GetFiles(wumadTempDir, "*appxml.bin");
- string[] cosFiles = Directory.GetFiles(wumadTempDir, "*cosxml.bin");
- // User provided title.
- string titleId = string.Empty;
- if (!string.IsNullOrEmpty(CAFERUN_WUMAD_TITLE_ID.value))
- {
- titleId = CAFERUN_WUMAD_TITLE_ID.value.StartsWith("0x") ? CAFERUN_WUMAD_TITLE_ID.value.Substring(2).ToLowerInvariant() : CAFERUN_WUMAD_TITLE_ID.value.ToLowerInvariant();
- }
- info.titleFound = false;
- if (metaFiles.Length == 1)
- {
- // The wumad has only one title
- string singleTitleId = XmlHandler.GetNodeValue(appFiles[0], "title_id");
- if (string.IsNullOrEmpty(titleId) ||
- titleId.Equals("ffffffffffffffff") ||
- titleId.Equals(singleTitleId) )
- {
- // Empty-> auto discovery *OR*
- // Value-> matches user input
- info.titleFound = true;
- info.titleId = singleTitleId;
- info.metaXml = metaFiles[0];
- info.appXml = appFiles[0];
- info.cosXml = cosFiles[0];
- }
- else
- {
- // We need to respect the title give by the user,
- // but provide a warning that it didn't match.
- if (!IsTitleIdReserved(titleId))
- {
- Console.WriteLine("cafex bootrun: WARNING: Unable to find title {0} in the wumad.", titleId);
- }
- return CAFEX_ERROR.RUN_BAD_TITLE_ID;
- }
- }
- else
- {
- // The wumad has multiple files... need to know the title id
- if (string.IsNullOrEmpty(titleId) ||
- titleId.Equals("ffffffffffffffff"))
- {
- Console.WriteLine("cafex bootrun failed: Multiple titles found in wumad. Either RPX or TitleId is required to select the title to run.");
- return CAFEX_ERROR.RUN_TITLE_ID_REQUIRED;
- }
- // If in NAND/softlaunch mode, we shouldn't validate the title id, since
- // the user may really want to launch a title there is not inside the wumad.
- // However, we should alert the user that the title was not found, and also
- // not search for if we already know it is the sysconfigtool title id.
- if (!IsTitleIdReserved(titleId))
- {
- // Only looking if it's not a system/reserved titleid.
- int targetIndex = 0;
- for (targetIndex = 0; targetIndex < appFiles.Length; ++targetIndex)
- {
- string wumadTitle = XmlHandler.GetNodeValue(appFiles[targetIndex], "title_id").ToLowerInvariant();
- Console.WriteLine("cafex run : wumad title {0} found and comparing to {1}.", wumadTitle, titleId);
- if (wumadTitle.Equals(titleId))
- {
- info.titleId = titleId;
- info.titleFound = true;
- break;
- }
- }
- if (!info.titleFound)
- {
- Console.WriteLine("cafex bootrun: WARNING: Unable to find title {0} in the wumad.", titleId);
- return CAFEX_ERROR.RUN_BAD_TITLE_ID;
- }
- info.metaXml = metaFiles[targetIndex];
- info.appXml = appFiles[targetIndex];
- info.cosXml = cosFiles[targetIndex];
- }
- }
- return CAFEX_ERROR.OK;
- }
- private static bool IsTitleIdReserved(string fullTitleInHex)
- {
- // Reserved range:
- //0x00000 Through 0x000FF -> 0 <= TID <= 255
- //0xF7000 Through 0xF7FFF -> 1011712 <= TID <= 1015807
- int badRangeMaxA = HexHandler.GetNumberFromString("0xff");
- int badRangeMinB = HexHandler.GetNumberFromString("0xf7000");
- int badRangeMaxB = HexHandler.GetNumberFromString("0xf7fff");
- if (string.IsNullOrEmpty(fullTitleInHex))
- {
- // Empty title shouldn't be used, so it is reserved!
- return true;
- }
- string titleId = fullTitleInHex.StartsWith("0x") ? fullTitleInHex.Substring(2).ToLowerInvariant() : fullTitleInHex.ToLowerInvariant();
- // Need to get the following digits of the title: 000500001XXXXX00 The five "X" hex values represent the Unique Id.
- string uniqueId = "0x" + titleId.Substring(9, 5);
- int uniqueIdValue = HexHandler.GetNumberFromString(uniqueId);
- if (uniqueIdValue <= badRangeMaxA ||
- (uniqueIdValue >= badRangeMinB && uniqueIdValue <= badRangeMaxB))
- {
- // is reserved
- return true;
- }
- else
- {
- // is not reserved
- return false;
- }
- }
- //Script function: bootrun
- static CAFEX_ERROR bootrun(List<string> args)
- {
- #if DEBUG
- Log.WriteLine("bootrun started.");
- #endif
- int MAKE_DLF_ONLY = 0;
- int USE_DLF_ONLY = 0;
- string ELF_FILENAME = CAFE_ELF.value;
- if (args != null && args.Count > 0)
- {
- // Check parameters
- while (args.Count != 0)
- {
- string OPT = args[0];
- args.RemoveAt(0);
- switch(OPT)
- {
- case "-makedlf":
- // It will make the DLF, but won't use it
- MAKE_DLF_ONLY = 1;
- break;
- case "-usedlf":
- USE_DLF_ONLY = 1;
- if (args.Count > 0)
- {
- ELF_FILENAME = args[0];
- args.RemoveAt(0);
- }
- break;
- }
- }
- }
- CAFERUN_COLDBOOT_OS_VERSION_HI.value = CAFERUN_COLDBOOT_OS_VERSION.value.Substring(0, 8);
- CAFERUN_COLDBOOT_OS_VERSION_LO.value = CAFERUN_COLDBOOT_OS_VERSION.value.Substring(8, 8);
- if (CAFERUN_OPTION_SOFT_LAUNCH.value == "1" && MAKE_DLF_ONLY == 0)
- {
- devkitmsg.title_softlaunch(CAFERUN_COLDBOOT_OS_VERSION.value, DISC_EMU_TID.value, SESSION_LAUNCH_CTRL_PORT.value);
- }
- else
- {
- if (TEMP.value == null)
- {
- Console.WriteLine("cafex run failed: TEMP environment variable is not set.");
- return CAFEX_ERROR.BOOTRUN_NO_TEMP_VAR;
- }
- else
- {
- BOOTRUN_WORK_DIR.value = TEMP.value + "\\" + SESSION_PATH_PREFIX.value + "caferun";
- WUMAD_WORK_DIR.value = TEMP.value + "\\" + SESSION_PATH_PREFIX.value + "makewumaddlf";
- }
- initialize_work_directory(BOOTRUN_WORK_DIR.value);
- FIRMWARE_FILE.value = CAFE_SLC_DIR.value + "\\sys\\title\\" + CAFERUN_COLDBOOT_OS_VERSION_HI.value + "\\" + CAFERUN_COLDBOOT_OS_VERSION_LO.value + "\\code\\fw.img";
- if (CAFE_HARDWARE.value.StartsWith("ev"))
- {
- FIRMWARE_FILE.value = CAFE_SLC_DIR.value + "\\sys\\title\\" + CAFERUN_COLDBOOT_OS_VERSION_HI.value + "\\" + CAFERUN_COLDBOOT_OS_VERSION_LO.value + "\\code\\fw.bu.img";
- }
- if (CAFE_SECURITY.value == "off")
- {
- FIRMWARE_FILE.value = CAFE_SLC_DIR.value + "\\sys\\title\\" + CAFERUN_COLDBOOT_OS_VERSION_HI.value + "\\" + CAFERUN_COLDBOOT_OS_VERSION_LO.value + "\\code\\fw.bu.img";
- }
- else
- {
- FIRMWARE_FILE.value = CAFE_SLC_DIR.value + "\\sys\\title\\" + CAFERUN_COLDBOOT_OS_VERSION_HI.value + "\\" + CAFERUN_COLDBOOT_OS_VERSION_LO.value + "\\code\\fw.img";
- }
- BOOT_DLF_FILE.value = BOOTRUN_WORK_DIR.value + "\\ppc_boot.dlf";
- CAFEX_ERROR boot1file_ret = make_boot1_system_file(BOOTRUN_WORK_DIR.value + "\\ppc.bsf");
- if (boot1file_ret != CAFEX_ERROR.OK)
- {
- return boot1file_ret;
- }
- string diskid = BOOTRUN_WORK_DIR.value + "\\diskid.bin";
- File.Copy(CAFE_ROOT.value + "\\system\\bin\\" + TOOLCHAIN.value + "\\" + PLATFORM.value + "\\boot\\diskid.bin", diskid, true);
- File.SetAttributes(diskid, FileAttributes.Normal);
- CAFEX_ERROR bootdlf_ret = make_boot_dlf(diskid + "," + BOOTRUN_WORK_DIR.value + "\\ppc.bsf," + FIRMWARE_FILE.value, BOOT_DLF_FILE.value);
- if (bootdlf_ret != CAFEX_ERROR.OK)
- {
- return bootdlf_ret;
- }
- if (DISC_EMU_TYPE.value == "blockemu")
- {
- if (!string.IsNullOrEmpty(ELF_FILENAME) &&
- ELF_FILENAME.EndsWith(".rpx"))
- {
- if (USE_DLF_ONLY == 0)
- {
- CAFEX_ERROR run_ret = devrun(ELF_FILENAME, null, null, null);
- if (run_ret != CAFEX_ERROR.OK)
- {
- return run_ret;
- }
- }
- if (MAKE_DLF_ONLY == 0)
- {
- hostrun(BOOT_DLF_FILE.value + " " + Path.ChangeExtension(ELF_FILENAME, ".dlf"));
- }
- }
- }
- else // HFIO case & HDD case & WUMAD case
- {
- if (!string.IsNullOrEmpty(CAFE_WUMAD.value))
- {
- // WUMAD case
- // Create the DLF from a WUMAD file.
- string wumadTempName = null;
- string wumadTempDir = null;
- string wumadDlfName = null;
- if (CAFE_WUMAD.value.ToLower().EndsWith("wumad"))
- {
- // A WUMAD file was passed instead of a directory.
- Console.WriteLine("Creating DLF from WUMAD file...");
- wumadTempName = Path.GetFileNameWithoutExtension(CAFE_WUMAD.value);
- wumadTempDir = Path.Combine(WUMAD_WORK_DIR.value, wumadTempName);
- wumadDlfName = Path.Combine(wumadTempDir, wumadTempName + ".dlf");
- }
- else
- {
- // A directory was passed in.
- wumadTempName = null;
- wumadTempDir = CAFE_WUMAD.value;
- wumadDlfName = Path.Combine(WUMAD_WORK_DIR.value, "extractedWumad.dlf");
- }
- if (wumadTempName != null)
- {
- wumadTempName = CAFE_WUMAD.value;
- }
- Console.WriteLine("wumadName = " + wumadTempName);
- Console.WriteLine("wumadDir = " + wumadTempDir);
- Console.WriteLine("wumadDlf = " + wumadDlfName);
- CAFEX_ERROR wumad_dlf_ret = make_wumad_dlf(wumadTempName, wumadTempDir, wumadDlfName);
- if (wumad_dlf_ret != CAFEX_ERROR.OK)
- {
- return wumad_dlf_ret;
- }
- WumadInfo info = new WumadInfo();
- CAFEX_ERROR wumadInfoResult = TryGetWumadInfo(wumadTempDir, ref info);
- // If a title id is required because there are more than one in the wumad
- // and none was provided, should stop here.
- if (wumadInfoResult == CAFEX_ERROR.RUN_TITLE_ID_REQUIRED)
- {
- return wumadInfoResult;
- }
- // We always need to set the titleId, if the function
- // returned one. This allows the data to be available upstream
- // in a sequence of calls involving softlaunch.
- if (info.titleFound)
- {
- CAFERUN_WUMAD_TITLE_ID.value = info.titleId;
- }
- else
- {
- CAFERUN_WUMAD_TITLE_ID.value = string.Empty;
- }
- // If no RPX was provided, the xmls not been updated.
- // This is a valid assumption because the code in caferun
- // sets all the xmls besed on an RPX provide prior to call
- // bootrun
- if (string.IsNullOrEmpty(ELF_FILENAME) &&
- info.titleFound)
- {
- string contentMetaXml = CAFE_META_DIR.value + "\\meta.xml";
- file_copy_retry(info.metaXml, contentMetaXml, true, 3);
- // Get the title-id, version, app_type, etc from the WUMAD files
- string title_id = XmlHandler.GetNodeValue(info.appXml, "title_id");
- string title_version = XmlHandler.GetNodeValue(info.appXml, "title_version");
- string os_version = XmlHandler.GetNodeValue(info.appXml, "os_version");
- string app_type = XmlHandler.GetNodeValue(info.appXml, "app_type");
- string app_group_id = XmlHandler.GetNodeValue(info.appXml, "group_id");
- // Save config to meta.xml
- XmlHandler.UpdateNodeValue(contentMetaXml, "title_id", title_id);
- XmlHandler.UpdateNodeValue(contentMetaXml, "group_id", app_group_id);
- XmlHandler.UpdateNodeValue(contentMetaXml, "title_version", title_version);
- // Save config to system.xml
- XmlHandler.UpdateNodeValue(SYSTEM_XML.value, "default_title_id", title_id);
- XmlHandler.UpdateNodeValue(SYSTEM_XML.value, "default_app_type", app_type);
- XmlHandler.UpdateNodeValue(SYSTEM_XML.value, "default_os_id", os_version);
- }
- // Starts the emulation
- if (MAKE_DLF_ONLY == 0)
- {
- hostrun(BOOT_DLF_FILE.value + " " + wumadDlfName);
- }
- }
- else
- {
- // HFIO and HDD cases
- if (MAKE_DLF_ONLY == 0)
- {
- hostrun(BOOT_DLF_FILE.value);
- }
- }
- }
- }
- return CAFEX_ERROR.OK;
- }
- //Script function: cafedevrun
- static CAFEX_ERROR devrun(string elf, string MAKE_PATCH, string CAFEMAKEDLF_OPTION, string KIOSK_DEFAULT_DDF)
- {
- #if DEBUG
- Log.WriteLine("devrun started.");
- #endif
- APP_TITLE_ID.value = "0000000000000000";
- APP_GROUP_ID.value = "00000000";
- APP_TITLE_VERSION.value = "0000";
- if (elf == null)
- {
- Console.WriteLine("cafex cafedevrun failed: image file required!");
- return CAFEX_ERROR.CAFEDEVRUN_NO_IMAGE_FILE;
- }
- CAFEDEVRUN_FILE.value = elf;
- CAFEDEVRUN_EXT.value = Path.GetExtension(elf).Remove(0, 1);
- CAFEDEVRUN_NAME.value = Path.GetDirectoryName(elf) + "\\" + Path.GetFileNameWithoutExtension(elf);
- CAFEDEVRUN_FILENAME.value = Path.GetFileNameWithoutExtension(elf);
- CAFEDEVRUN_DIR.value = Path.GetDirectoryName(elf);
- string GAME_TYPE = null;
- if (MAKE_PATCH != null && MAKE_PATCH == "1")
- {
- GAME_TYPE = "GP";
- }
- else
- {
- GAME_TYPE = "GM";
- }
- // Check temporary directory
- CAFEDEVRUN_WORK_DIR.value = CAFEDEVRUN_NAME.value + "_tmp";
- create_directory_if_noexist(CAFEDEVRUN_WORK_DIR.value);
- if (INCLUDE_SYSTEM_DIR.value == null)
- {
- INCLUDE_SYSTEM_DIR.value = "0";
- }
- CAFE_BASEFILE_PATH.value = CAFE_ROOT.value + "\\system\\bin\\tool\\mastering\\resources";
- if (string.IsNullOrEmpty(KIOSK_DEFAULT_DDF))
- {
- DEFAULT_DDF.value = CAFE_BASEFILE_PATH.value + "\\default.ddf";
- }
- else
- {
- Console.WriteLine("Change default ddf -> " + KIOSK_DEFAULT_DDF);
- DEFAULT_DDF.value = KIOSK_DEFAULT_DDF;
- }
- COMMON_DDF_FILE.value = CAFEDEVRUN_WORK_DIR.value + "\\common.ddf";
- string custom_ddf = Path.ChangeExtension(elf, ".ddf");
- // Use individual ddf file if exists
- if (File.Exists(custom_ddf))
- {
- INDIVIDUAL_DDF_FILE.value = custom_ddf;
- // TODO: Need to replace the game type in the custo_ddf file and save it.
- }
- else
- {
- INDIVIDUAL_DDF_FILE.value = "";
- }
- APP_XML_FILE.value = CAFEDEVRUN_DIR.value + "\\app.xml";
- if (!File.Exists(APP_XML_FILE.value))
- {
- Console.WriteLine("cafex cafedevrun failed: Cannot find " + APP_XML_FILE.value);
- return CAFEX_ERROR.CAFEDEVRUN_CANT_FIND_APP_XML;
- }
- extract_info_from_app_xml(APP_XML_FILE.value);
- FileStream fs = new FileStream(COMMON_DDF_FILE.value, FileMode.Create);
- StreamWriter sw = new StreamWriter(fs);
- sw.WriteLine(";");
- sw.WriteLine("; " + CAFEDEVRUN_NAME.value + "." + CAFEDEVRUN_EXT.value);
- sw.WriteLine(";");
- sw.WriteLine("[Input]");
- sw.WriteLine("DiscHeaderBaseFileName=\"" + CAFE_BASEFILE_PATH.value + "\\discheader_base.bin\"");
- sw.WriteLine("VolumeHeaderBaseFileName=\"" + CAFE_BASEFILE_PATH.value + "\\volheader_base.bin\"");
- sw.WriteLine("[Output]");
- sw.WriteLine("LayoutFileName=\"" + CAFEDEVRUN_NAME.value + ".dlf\"");
- sw.WriteLine("OutputDirectory=\"" + CAFEDEVRUN_DIR.value + "\"");
- sw.WriteLine("AppName=\"" + CAFEDEVRUN_FILENAME.value + "\"");
- sw.WriteLine("Mode=WU");
- sw.WriteLine("[DiscID]");
- sw.WriteLine("GameType=" + GAME_TYPE);
- sw.WriteLine("TitleId=0x" + APP_TITLE_ID.value);
- sw.WriteLine("GroupId=0x" + APP_GROUP_ID.value);
- sw.WriteLine("DiskNumber=0");
- sw.WriteLine("GameVersion=" + (HexHandler.GetNumberFromString("0x" + APP_TITLE_VERSION.value) / 16).ToString());
- sw.WriteLine("[SectionParam]");
- sw.WriteLine("\"CONTENT\"=0x" + APP_TITLE_ID.value + ",0x" + APP_GROUP_ID.value + ",0x02");
- sw.WriteLine("[PathList]");
- sw.WriteLine("CODE_DIR_RPX=\"code\", \"$(CAFE_CODE_DIR)\\" + CAFEDEVRUN_FILENAME.value + ".rpx\"");
- if (INCLUDE_SYSTEM_DIR.value == "1")
- {
- sw.WriteLine("[PathList]");
- sw.WriteLine("SYSTEM_DIR=\"sys\", \"$(CAFE_SYSTEM_DIR)\"");
- }
- sw.Flush();
- sw.Close();
- int cafemakedlf_ret = cafemakedlf.make(DEFAULT_DDF.value, COMMON_DDF_FILE.value, INDIVIDUAL_DDF_FILE.value, CAFEMAKEDLF_OPTION);
- if (cafemakedlf_ret != 0)
- {
- return CAFEX_ERROR.CAFEDEVRUN_CAFEMAKEDLF_FAILED;
- }
- fs = new FileStream(CAFEDEVRUN_NAME.value + ".dlf", FileMode.Append);
- sw = new StreamWriter(fs);
- sw.WriteLine("0x00000005D3A00000,\"\"");
- sw.Flush();
- sw.Close();
- return CAFEX_ERROR.OK;
- }
- //Script function: hostrun
- static void hostrun(string arguments)
- {
- #if DEBUG
- Log.WriteLine("hostrun started. Arguments:" + arguments);
- #endif
- getbridgetype();
- FSEMUL_PARAMS.value = null;
- if (BRIDGE_TYPE.value == "Toucan")
- {
- BRIDGE_INSTALL_PATH.value = SDIO_BRIDGE_TOOLS.value;
- if (CAFE_HARDWARE.value.StartsWith("ev"))
- {
- FSEMUL_PARAMS.value = "-m";
- }
- }
- else
- {
- BRIDGE_INSTALL_PATH.value = MION_BRIDGE_TOOLS.value;
- }
- if (BRIDGE_TYPE.value == "Mion")
- {
- if (BRIDGE_PARAMETERS.value == null)
- {
- FSEMUL_PARAMS.value = "-em -ip " + BRIDGE_CURRENT_IP_ADDRESS.value;
- }
- else
- {
- FSEMUL_PARAMS.value = BRIDGE_PARAMETERS.value + " -ip " + BRIDGE_CURRENT_IP_ADDRESS.value;
- }
- }
- // Need to figure out what the difference between these two options is in the scripts, and if it is possible to replicate here.
- if (CAFE_DETACH_FSEMUL.value == null || CAFE_DETACH_FSEMUL.value != "0")
- {
- FSEmul.start(arguments, FSEMUL_PARAMS.value);
- }
- else
- {
- FSEmul.start(arguments, FSEMUL_PARAMS.value);
- }
- }
- //Script function: cafediscrun
- static CAFEX_ERROR discrun(string[] args)
- {
- #if DEBUG
- Log.WriteLine("disrun started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN.value = "yes";
- return run(args);
- }
- //Script function: cafeon
- //Script function: cafeon
- static CAFEX_ERROR on(string[] args)
- {
- #if DEBUG
- Log.WriteLine("on started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- List<string> argList = new List<string>();
- CAFEON_DISABLE_BGD.value = "0";
- CAFEON_NOBGD_META.value = "";
- BRIDGE_PARAMETERS_WITH_E.value = "";
- CAFE_RUN_DEBUG.value = "";
- CAFEON_OPTION_NO_DATA_SYNC.value = CAFERUN_OPTION_NO_DATA_SYNC.value;
- if (CAFEON_OPTION_NO_DATA_SYNC.value == null)
- {
- CAFEON_OPTION_NO_DATA_SYNC.value = "0";
- }
- if (CAFE_RUN_RUNNING.value == null)
- {
- CAFE_RUN_RUNNING.value = "0";
- }
- if (CAFE_RUN_RUNNING.value != "0")
- {
- Console.WriteLine("****cafex on: RECURSIVE CALL TO cafex on EXITING***");
- return CAFEX_ERROR.ON_RECURSIVE_CALL;
- }
- CAFE_RUN_RUNNING.value = "1";
- if (args != null && args.Length > 0)
- {
- for (int i = 0; i < args.Length; ++i)
- {
- if (args[i] == "-noprompt")
- {
- CATTOUCAN_TERM.value = "source -p -q /vol/content";
- }
- else if (args[i] == "-d")
- {
- CAFE_RUN_DEBUG.value = args[i] + " " + args[i + 1];
- ++i;
- }
- else if (args[i] == "-e")
- {
- BRIDGE_PARAMETERS_WITH_E.AddToVar(args[i] + " " + args[i + 1], ' ');
- ++i;
- }
- else if (args[i] == "-nobgd")
- {
- CAFEON_DISABLE_BGD.value = "1";
- }
- else if (args[i] == "-nosync")
- {
- if (string.IsNullOrEmpty(CAFE_DATA_DIR.value) ||
- !Directory.Exists(CAFE_DATA_DIR.value))
- {
- Console.WriteLine("Session data directory is missing and needs to be sync'd!");
- Console.WriteLine(" Please re-run without the '-nosync' option.");
- return CAFEX_ERROR.ON_DATA_DIR_MISSING;
- }
- CAFEON_OPTION_NO_DATA_SYNC.value = "1";
- }
- else
- {
- // This is an argument that needs to be passed down
- argList.Add(args[i]);
- }
- }
- }
- if (CAFEON_DISABLE_BGD.value == "1")
- {
- if (!string.IsNullOrEmpty(CAFE_META_DIR.value) &&
- Directory.Exists(CAFE_META_DIR.value))
- {
- CAFEON_NOBGD_META.value = TEMP.value + "\\" + SESSION_PATH_PREFIX.value + "tmp_meta";
- Console.WriteLine("Disabling background daemons in tmp dir " + CAFEON_NOBGD_META.value);
- DirectoryInfo originMetaDiretory = new DirectoryInfo(CAFE_META_DIR.value);
- FileSystemInfo[] filesToCopy = originMetaDiretory.GetFileSystemInfos();
- if (filesToCopy.Length > 0)
- {
- create_directory_if_noexist(CAFEON_NOBGD_META.value);
- string[] meta_files = Directory.GetFiles(CAFE_META_DIR.value);
- foreach (FileSystemInfo file in filesToCopy)
- {
- string fileName = file.FullName;
- string destinationFileName = CAFEON_NOBGD_META.value + "\\" + Path.GetFileName(fileName);
- file_copy_retry(fileName, destinationFileName, true, 3);
- }
- XmlHandler.UpdateNodeValue(CAFEON_NOBGD_META.value + "\\meta.xml", "bg_daemon_enable", "0");
- CAFE_META_DIR.value = CAFEON_NOBGD_META.value;
- }
- }
- }
- OS_VERSION_LO.value = XmlHandler.GetNodeValue(CAFE_ROOT.value + "\\data\\mlc\\sys\\title\\00050010\\1f700500\\code\\app.xml", "os_version").Substring(8, 6);
- string total_arglist_with_qs = StringCombiner.MakeDelimitedString(argList.ToArray(), ' ').Replace(' ', '?').Replace("-c?", "-c ").Replace("?-c", " -c");
- if (OS_VERSION_LO.value == null)
- {
- Console.WriteLine("cafex on error: unable to locate System Config Tool app.xml or file is corrupt");
- }
- else
- {
- if (CAFEON_OPTION_NO_DATA_SYNC.value == "0")
- {
- syncsession();
- }
- XmlHandler.UpdateNodeValue(CAFE_DATA_DIR.value + "\\mlc\\sys\\title\\00050010\\1f700500\\code\\cos.xml", "argstr", "system_config_tool.rpx " + total_arglist_with_qs);
- // Keep the current command stored, so when run is called it knows it has last been called by 'on'
- string currentCommand = command;
- command = "on";
- string OS_string = string.Empty;
- if (OS_VERSION_LO.value == "100040")
- {
- // NDEBUG OS
- OS_string = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\app\\system_config_tool\\base\\NDEBUG\\system_config_tool.rpx";
- }
- else if (OS_VERSION_LO.value == "100080")
- {
- // DEBUG OS
- OS_string = "-b" + DEFAULT_DELIMITER + CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\app\\system_config_tool\\base\\DEBUG\\system_config_tool.rpx";
- }
- string run_args = (!string.IsNullOrEmpty(CAFE_RUN_DEBUG.value) ? CAFE_RUN_DEBUG.value.Replace(' ', DEFAULT_DELIMITER) : string.Empty) +
- DEFAULT_DELIMITER + (!string.IsNullOrEmpty(BRIDGE_PARAMETERS_WITH_E.value) ? BRIDGE_PARAMETERS_WITH_E.value.Replace(' ', DEFAULT_DELIMITER) : string.Empty) +
- DEFAULT_DELIMITER + "-e" + DEFAULT_DELIMITER + "mcp:launch_hint:hfiomlc" + DEFAULT_DELIMITER + "-z" + DEFAULT_DELIMITER +
- "-t" + DEFAULT_DELIMITER + "0x" + SYSCONFIGTOOL_TITLE_ID + DEFAULT_DELIMITER + OS_string;
- if (argList != null)
- {
- run_args += DEFAULT_DELIMITER + StringCombiner.MakeDelimitedString(argList.ToArray(), DEFAULT_DELIMITER);
- }
- run(run_args.Split(new char[] { DEFAULT_DELIMITER }, StringSplitOptions.RemoveEmptyEntries));
- // Return the current command
- command = currentCommand;
- XmlHandler.UpdateNodeValue(CAFE_DATA_DIR.value + "\\mlc\\sys\\title\\00050010\\1f700500\\code\\cos.xml", "argstr", "system_config_tool.rpx");
- }
- return CAFEX_ERROR.OK;
- }
- //Script function: cafeupdate
- static CAFEX_ERROR update(string[] args)
- {
- #if DEBUG
- Log.WriteLine("update started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- CAFEUPDATE_USE_SYSTEM_UPDATER.value = "0";
- CAFEUPDATE_TITLE.value = "";
- CAFEUPDATE_PACKAGE_DEFAULT.value = "/vol/storage_hfiomlc01/sys/update/pcfs";
- CAFEUPDATE_PACKAGE.value = CAFEUPDATE_PACKAGE_DEFAULT.value;
- for (int i = 0; i < args.Length; ++i)
- {
- switch (args[i])
- {
- case "-u":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFEUPDATE_PACKAGE.value = args[i + 1];
- ++i;
- break;
- }
- case "-s":
- {
- CAFEUPDATE_USE_SYSTEM_UPDATER.value = "1";
- break;
- }
- case "-t":
- {
- if (!ArgumentChecks.IsArgumentValidSetting(args, i + 1))
- {
- run_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFEUPDATE_TITLE.value = args[i + 1];
- ++i;
- break;
- }
- case "-h":
- {
- update_usage();
- return CAFEX_ERROR.OK;
- }
- default:
- {
- Console.WriteLine("cafex update failed: Invalid argument");
- return CAFEX_ERROR.UPDATE_INVALID_OPTION;
- }
- }
- }
- string catdev_sdk_ver = SDK_MAJ_VER.value + "." + SDK_MIN_VER.value + "." + SDK_MIC_VER.value;
- string sdk_ver = SDK_VER.value;
- if (catdev_sdk_ver != SDK_VER.value)
- {
- if (mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 3 -s " + sdk_ver.Substring(0, 1)) != sdk_ver.Substring(0, 1))
- Console.WriteLine("cafex unable to set the SDK Major version." + sdk_ver.Substring(0, 1));
- if (mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 4 -s " + sdk_ver.Substring(2, 2).Replace(".", "")) != sdk_ver.Substring(2, 2).Replace(".", ""))
- Console.WriteLine("cafex unable to set the SDK Minor version." + sdk_ver.Substring(2, 2).Replace(".", "") + sdk_ver);
- if (mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 5 -s " + sdk_ver.Substring(sdk_ver.IndexOf('.', 3)).Replace(".", "")) != sdk_ver.Substring(sdk_ver.IndexOf('.', 3)).Replace(".", ""))
- Console.WriteLine("cafex unable to set the SDK Micro version." + sdk_ver.Substring(sdk_ver.IndexOf('.', 3)).Replace(".", ""));
- }
- if (CAFE_BOOT_MODE.value == "NAND")
- {
- Console.WriteLine("Sourcing script setbootmode NAND...");
- return setbootmode(new string[] { "NAND" });
- }
- else
- {
- if (CAFE_HARDWARE.value.StartsWith("ev") || CAFE_SECURITY.value == "off")
- {
- Console.WriteLine("Sorry, bringup boot1 update not supported yet");
- return CAFEX_ERROR.UPDATE_BRINGUP_BOOT1_UPDATE;
- }
- if (CAFEUPDATE_TITLE.value != null)
- {
- Console.WriteLine("Installing title " + CAFEUPDATE_TITLE.value + " using System Config Tool...");
- CAFEX_ERROR on_ret = on(new string[] { "-c", "install " + CAFEUPDATE_TITLE.value, "-c", "exit" });
- if (on_ret != CAFEX_ERROR.OK)
- return on_ret;
- }
- else
- {
- if (CAFEUPDATE_PACKAGE.value == CAFEUPDATE_PACKAGE_DEFAULT.value)
- {
- Console.WriteLine("Performing system update using System Config Tool...");
- }
- else
- {
- Console.WriteLine("Performing system update using System Config Tool from " + CAFEUPDATE_PACKAGE.value + "...");
- }
- if (CAFEUPDATE_USE_SYSTEM_UPDATER.value == "1")
- {
- Console.WriteLine("Using system updater...");
- CAFEX_ERROR on_ret = on(new string[] { "-c", "update_launch " + CAFEUPDATE_PACKAGE.value });
- if (on_ret != CAFEX_ERROR.OK)
- return on_ret;
- }
- else
- {
- CAFEX_ERROR on_ret = on(new string[] { "-c", "update " + CAFEUPDATE_PACKAGE.value, "-c", "exit" });
- if (on_ret != CAFEX_ERROR.OK)
- return on_ret;
- }
- }
- }
- return CAFEX_ERROR.OK;
- }
- //Script function: setbootmode
- static CAFEX_ERROR setbootmode(string[] args)
- {
- #if DEBUG
- Log.WriteLine("setbootmode started.");
- string argString = null;
- if (args != null)
- {
- foreach (string arg in args)
- {
- argString += arg + " ";
- }
- }
- Log.WriteLine("Arguments=" + argString);
- #endif
- if (!ArgumentChecks.ArgumentExists(args, 0))
- {
- setbootmode_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- CAFEX_ERROR returnValue = CAFEX_ERROR.SETBOOTMODE_FAILED;
- int reflash = 1;
- string target = string.Empty;
- if (args[0] == "-noreflash")
- {
- reflash = 0;
- if (!ArgumentChecks.IsArgumentValidSetting(args, 1))
- {
- setbootmode_usage();
- return CAFEX_ERROR.BAD_ARGUMENT;
- }
- target = args[1];
- }
- else
- {
- target = args[0];
- }
- string status_str = "FAIL";
- switch (target)
- {
- case "PCFS":
- {
- Console.WriteLine("Executing cafex nand2pcfs...");
- int ret = nand2pcfs();
- if (ret == 0)
- {
- CAFE_BOOT_MODE.value = "PCFS";
- Console.WriteLine("CAFE_BOOT_MODE=" + CAFE_BOOT_MODE.value);
- status_str = "PASS";
- returnValue = CAFEX_ERROR.OK;
- }
- break;
- }
- case "NAND":
- {
- Console.WriteLine("Executing cafex pcfs2nand...");
- int ret = pcfs2nand(reflash);
- if (ret == 0)
- {
- CAFE_BOOT_MODE.value = "NAND";
- Console.WriteLine("CAFE_BOOT_MODE=" + CAFE_BOOT_MODE.value);
- status_str = "PASS";
- returnValue = CAFEX_ERROR.OK;
- }
- break;
- }
- default:
- {
- Console.WriteLine("cafex setbootmode error: Invalid boot mode");
- status_str = "BAD MODE";
- setbootmode_usage();
- returnValue = CAFEX_ERROR.SETBOOTMODE_BAD_MODE;
- break;
- }
- }
- Console.WriteLine("cafex setbootmode: " + status_str);
- return returnValue;
- }
- //Script function: cafe_nand2pcfs
- static int nand2pcfs()
- {
- #if DEBUG
- Log.WriteLine("nand2pcfs started.");
- #endif
- // Initialization
- SCRIPT_EXE_TIMESTAMP.value = DateTime.Now.ToString("MMMdd_yyyy_HHmmss");
- LOGDIR.value = CAFE_ROOT.value + "\\" + SESSION_PATH_PREFIX.value + "cafe_nand2pcfs\\" + SCRIPT_EXE_TIMESTAMP.value;
- Console.WriteLine("cafe_nand2pcfs");
- Console.WriteLine("log directory is " + LOGDIR.value);
- create_directory_if_noexist(LOGDIR.value);
- File.Delete(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log");
- CAFESTOP_STATUS.value = "0";
- _CCRSYSCFG1.value = "";
- if (initialize_serial_port_and_directory("cafestop") != 0)
- return 1;
- //cafestop
- Console.WriteLine("Executing cafex stop...");
- FileStream fs = new FileStream(LOGDIR.value + "\\cafestop0.txt", FileMode.Create);
- TextWriter old_out = Console.Out;
- TextWriter old_err = Console.Error;
- StreamWriter sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- stop(null);
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafestop0_mion.log");
- }
- if (CAFESTOP_STATUS.value != "0")
- {
- Console.WriteLine("cafex nand2pcfs: cafestop failure.");
- return 1;
- }
- //cafeon
- CAFEX_ERROR hostcheckversion_ret = hostcheckversion();
- if (hostcheckversion_ret != CAFEX_ERROR.OK)
- {
- Console.WriteLine("cafex nand2pcfs: failed running hostcheckversion.");
- return 1;
- }
- int hb_ver_flat = compute_flat_version(CAFERUN_HOSTBRIDGE_VERSION.value);
- Console.WriteLine("Executing cafex on...");
- fs = new FileStream(LOGDIR.value + "\\cafeon.txt", FileMode.Create);
- old_out = Console.Out;
- old_err = Console.Error;
- sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- //quiet_mode = true; // This breaks setbootmode in NAND/softlaunch
- Console.WriteLine("at on command");
- if (hb_ver_flat < compute_flat_version("3.2.4.1"))
- {
- on(null);
- }
- else
- {
- on(new string[] { "-e", "nomodecheck" });
- }
- Console.WriteLine("after on command");
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafeon_mion.log");
- }
- if (monitor_for_output("-k", "source -p -q /vol/content/", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for cafeon success message.");
- return 1;
- }
- //recover command
- Console.WriteLine("Executing devkitmsg recover -v...");
- devkitmsg.recover();
- if (monitor_for_output("-K", "WUD_BCMFWCheck", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for devkitmsg recover success message.");
- return 1;
- }
- //update to PCFS
- Console.WriteLine("Executing devkitmsg 'update /vol/storage_hfiomlc01/sys/update/pcfs' -v...");
- devkitmsg.update_pcfs();
- if (monitor_for_output("-k", "Update Done, err 0", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for devkitmsg 1st update success message.");
- return 1;
- }
- // Set the CAT-DEV mode inside mion...
- if (mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 2 -s 2") != "2")
- {
- Console.WriteLine("cafex unable to set mode using mionps.");
- return 1;
- }
- //clr_usrdata command
- Console.WriteLine("Executing devkitmsg clr_usrdata -v...");
- devkitmsg.clr_usrdata();
- if (monitor_for_output("-k", "Done, err 0", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for devkitmsg clr_usrdata success message.");
- return 1;
- }
- //cafestop
- Console.WriteLine("Executing cafex stop...");
- fs = new FileStream(LOGDIR.value + "\\cafestop1.txt", FileMode.Create);
- old_out = Console.Out;
- old_err = Console.Error;
- sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- stop(null);
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafestop1_mion.log");
- }
- if (CAFESTOP_STATUS.value != "0")
- {
- Console.WriteLine("cafex nand2pcfs: cafestop failure.");
- return 1;
- }
- //success!
- Console.WriteLine("Removing log directory " + LOGDIR.value + "...");
- Directory.Delete(LOGDIR.value, true);
- Console.WriteLine("cafex nand2pcfs complete. Exiting with code 0");
- return 0;
- }
- //Script function: cafe_pcfs2nand
- static int pcfs2nand(int reflash)
- {
- #if DEBUG
- Log.WriteLine("pcfs2nand started.");
- #endif
- // Initialization
- SCRIPT_EXE_TIMESTAMP.value = DateTime.Now.ToString("MMMdd_yyyy_HHmmss");
- LOGDIR.value = CAFE_ROOT.value + "\\" + SESSION_PATH_PREFIX.value + "cafe_pcfs2nand\\" + SCRIPT_EXE_TIMESTAMP.value;
- Console.WriteLine("cafe_pcfs2nand");
- Console.WriteLine("log directory is " + LOGDIR.value);
- create_directory_if_noexist(LOGDIR.value);
- File.Delete(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log");
- CAFESTOP_STATUS.value = "0";
- _CCRSYSCFG1.value = "";
- if (initialize_serial_port_and_directory("cafestop") != 0)
- return 1;
- //cafestop
- Console.WriteLine("Executing cafex stop...");
- FileStream fs = new FileStream(LOGDIR.value + "\\cafestop0.txt", FileMode.Create);
- TextWriter old_out = Console.Out;
- TextWriter old_err = Console.Error;
- StreamWriter sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- stop(null);
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafestop0_mion.log");
- }
- if (CAFESTOP_STATUS.value != "0")
- {
- Console.WriteLine("cafex nand2pcfs: cafestop failure.");
- return 1;
- }
- //cafeon
- CAFEX_ERROR hostcheckversion_ret = hostcheckversion();
- if (hostcheckversion_ret != CAFEX_ERROR.OK)
- {
- Console.WriteLine("cafex nand2pcfs: failed running hostcheckversion.");
- return 1;
- }
- int hb_ver_flat = compute_flat_version(CAFERUN_HOSTBRIDGE_VERSION.value);
- Console.WriteLine("Executing cafex on...");
- fs = new FileStream(LOGDIR.value + "\\cafeon.txt", FileMode.Create);
- old_out = Console.Out;
- old_err = Console.Error;
- sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- //quiet_mode = true; // This breaks setbootmode in NAND/softlaunch
- Console.WriteLine("at on command");
- if (hb_ver_flat < compute_flat_version("3.2.4.1"))
- {
- on(null);
- }
- else
- {
- on(new string[] { "-e", "nomodecheck" });
- }
- Console.WriteLine("after on command");
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafeon_mion.log");
- }
- if (monitor_for_output("-k", "source -p -q /vol/content/", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for cafeon success message.");
- return 1;
- }
- bool was_pcfs_boot = false;
- fs = new FileStream(LOGDIR.value + "\\monitor_1.txt", FileMode.Open, FileAccess.Read);
- StreamReader sr = new StreamReader(fs);
- string contents = sr.ReadToEnd();
- sr.Close();
- if (contents.Contains("BOOT1: Loaded firmware image from SDIO."))
- {
- was_pcfs_boot = true;
- }
- //recover command
- Console.WriteLine("Executing devkitmsg recover -v...");
- devkitmsg.recover();
- if (monitor_for_output("-K", "WUD_BCMFWCheck", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex nand2pcfs: monitor failed waiting for devkitmsg recover success message.");
- return 1;
- }
- // if last boot was NAND, first update BOOT1 to PCFS
- if (was_pcfs_boot == false)
- {
- Console.WriteLine("cafex pcfs2nand: NAND boot detected, BOOT1 will be updated before updating to NAND");
- Console.WriteLine("Executing devkitmsg 'update /vol/storage_hfiomlc01/sys/update/pcfs' -v...");
- devkitmsg.update_pcfs();
- if (monitor_for_output("-k", "Update Done, err 0", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex pcfs2nand: monitor failed waiting for devkitmsg 1st update success message.");
- return 1;
- }
- }
- else
- {
- Console.WriteLine("cafe_pcfs2nand: PCFS boot detected, no BOOT1 update needed");
- }
- //update command
- if (reflash == 1)
- {
- Console.WriteLine("Executing devkitmsg 'reflash /vol/storage_hfiomlc01/sys/update/nand' -v...");
- devkitmsg.update_reflash();
- if (monitor_for_output("-k", "MCP: System update was successful", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex pcfs2nand: monitor failed waiting for devkitmsg reflash success message.");
- return 1;
- }
- }
- else
- {
- Console.WriteLine("Executing devkitmsg 'update /vol/storage_hfiomlc01/sys/update/nand' -v...");
- devkitmsg.update_nand();
- if (monitor_for_output("-k", "Update Done, err 0", MONITOR_DEFAULT_TIMEOUT.value, LOGDIR.value, null, true) != 0)
- {
- Console.WriteLine("cafex pcfs2nand: monitor failed waiting for devkitmsg update success message.");
- return 1;
- }
- }
- // Set the CAT-DEV mode inside mion...
- if (mionps.Run(BRIDGE_CURRENT_IP_ADDRESS.value + " 2 -s 1") != "1")
- {
- Console.WriteLine("cafex unable to set mode using mionps.");
- return 1;
- }
- // set default boot mode to development
- devkitmsg.sys_mode_dev();
- //cafestop
- Console.WriteLine("Executing cafex stop...");
- fs = new FileStream(LOGDIR.value + "\\cafestop1.txt", FileMode.Create);
- old_out = Console.Out;
- old_err = Console.Error;
- sw = new StreamWriter(fs);
- Console.SetOut(sw);
- Console.SetError(sw);
- stop(null);
- Console.SetOut(old_out);
- Console.SetError(old_err);
- sw.Flush();
- sw.Close();
- if (File.Exists(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log"))
- {
- File.Move(TMP.value + "\\" + SESSION_PATH_PREFIX.value + "cafestop_mion.log", LOGDIR.value + "\\cafestop1_mion.log");
- }
- if (CAFESTOP_STATUS.value != "0")
- {
- Console.WriteLine("cafex nand2pcfs: cafestop failure.");
- return 1;
- }
- //success!
- Console.WriteLine("Removing log directory " + LOGDIR.value + "...");
- Directory.Delete(LOGDIR.value, true);
- Console.WriteLine("cafex nand2pcfs complete. Exiting with code 0");
- return 0;
- }
- //Script function: hostcheckversion
- static CAFEX_ERROR hostcheckversion()
- {
- #if DEBUG
- Log.WriteLine("hostcheckversion started.");
- #endif
- getbridgetype();
- string min_fw_ver = string.Empty;
- string min_sw_ver = string.Empty;
- if (BRIDGE_TYPE.value == "Mion")
- {
- min_fw_ver = "0.0.13.88";
- min_sw_ver = "3.2.2.8";
- }
- else
- {
- min_sw_ver = "2.9.1.5";
- min_fw_ver = "2.8.0.13";
- }
- if (SDIO_BRIDGE_TOOLS.value == null)
- {
- if (MION_BRIDGE_TOOLS.value == null)
- {
- Console.WriteLine("cafex run failed: Please install at least HostBridgeSetup_" + min_sw_ver + ".exe and restart cafex_env.bat");
- return CAFEX_ERROR.HOSTCHECKVERSION_NO_HOSTBRIDGE;
- }
- }
- string fw_ver = string.Empty;
- string sw_ver = string.Empty;
- if (BRIDGE_TYPE.value == "Mion")
- {
- FSEmul.FW_SW_Version(BRIDGE_CURRENT_IP_ADDRESS.value, out fw_ver, out sw_ver);
- }
- else
- {
- FSEmul.FW_SW_Version(null, out fw_ver, out sw_ver);
- }
- if (fw_ver == string.Empty || sw_ver == string.Empty)
- {
- Console.WriteLine("cafex run failed: Cannot check Host Bridge version. Please cafex stop and try again.");
- return CAFEX_ERROR.HOSTCHECKVERSION_FSEMUL_FAILED;
- }
- CAFERUN_HOSTBRIDGE_VERSION.value = sw_ver;
- CAFERUN_FW_VERSION.value = fw_ver;
- int fw_flat = compute_flat_version(fw_ver);
- int sw_flat = compute_flat_version(sw_ver);
- int min_fw_flat = compute_flat_version(min_fw_ver);
- int min_sw_flat = compute_flat_version(min_sw_ver);
- if (sw_flat < min_sw_flat || fw_flat < min_fw_flat)
- {
- Console.WriteLine("cafex run failed: Please install at least HostBridgeSetup_" + min_sw_ver + ".exe and restart cafex_env.bat");
- Console.WriteLine(" Current software version is " + sw_ver + " (need " + min_sw_ver + ")");
- Console.WriteLine(" Current firmware version is " + fw_ver + " (need " + min_fw_ver + ")");
- return CAFEX_ERROR.HOSTCHECKVERSION_OLD_VERSIONS;
- }
- return CAFEX_ERROR.OK;
- }
- //Script function: syncsession
- static void syncsession()
- {
- #if DEBUG
- Log.WriteLine("syncsession started.");
- #endif
- if (SESSION_MANAGER.value == "1")
- {
- stop(null);
- SYNCTOOL_SRC.value = CAFE_ROOT.value + "\\data";
- SYNCTOOL_DEST.value = CAFE_DATA_DIR.value;
- SYNCTOOL_CFG.value = CAFE_ROOT.value + "\\system\\bin\\tool\\synctool.data.xml";
- SYNCTOOL_LOG.value = CAFE_ROOT.value + "\\" + SESSION_PATH_PREFIX.value + "sync.log";
- Console.WriteLine("Synchronizing " + SYNCTOOL_SRC.value + " ===> " + SYNCTOOL_DEST.value + "...");
- SYNCTOOL_RVAL.value = synctool.sync(SYNCTOOL_CFG.value, SYNCTOOL_SRC.value, SYNCTOOL_DEST.value, SYNCTOOL_LOG.value).ToString();
- if (SYNCTOOL_RVAL.value != "0")
- {
- Console.WriteLine(" Session data sync FAILED with exit code " + SYNCTOOL_RVAL.value + "!");
- Console.WriteLine(" See " + SYNCTOOL_LOG.value + " for details.");
- }
- else
- {
- Console.WriteLine(" Session data sync log at " + SYNCTOOL_LOG.value);
- }
- }
- }
- #endregion
- #region SCRIPT HELPERS
- static void initialize_work_directory(string directory)
- {
- #if DEBUG
- Log.WriteLine("initialize_work_diretory started.");
- #endif
- if (!Directory.Exists(directory))
- {
- Directory.CreateDirectory(directory);
- }
- File.Delete(directory + "\\diskid.bin");
- File.Delete(directory + "\\ppc.bsf");
- File.Delete(directory + "\\ppc_boot.dlf");
- }
- static CAFEX_ERROR make_boot1_system_file(string bsf_file)
- {
- #if DEBUG
- Log.WriteLine("make_boot1_system_file started.");
- #endif
- string flags = "0";
- string firmware_filename = Path.GetFileName(FIRMWARE_FILE.value);
- if (firmware_filename.StartsWith("fw"))
- {
- flags = "0x80000000";
- }
- if (makebsf.make(QUIET.value, bsf_file, flags) != 0)
- {
- Console.WriteLine("cafex bootrun failed: Cannot generate bsf file.");
- return CAFEX_ERROR.BOOTRUN_MAKEBSF_FAILED;
- }
- return CAFEX_ERROR.OK;
- }
- static CAFEX_ERROR make_boot_dlf(string file_list, string output_dlf_file)
- {
- #if DEBUG
- Log.WriteLine("make_boot_dlf started.");
- #endif
- string commandResult = string.Empty;
- if (makedlf.make(QUIET.value, file_list, output_dlf_file, out commandResult) != 0)
- {
- Console.WriteLine("cafex bootrun failed: Cannot generate dlf file.");
- Console.WriteLine("Command output: " + commandResult);
- return CAFEX_ERROR.BOOTRUN_MAKEDLF_FAILED;
- }
- return CAFEX_ERROR.OK;
- }
- static CAFEX_ERROR make_wumad_dlf(string wumadFile, string extractionFolder, string output_dlf_file)
- {
- #if DEBUG
- Log.WriteLine("make_wumad_dlf started. Arguments: wumadFile=" + wumadFile + ", extractionFolder=" + extractionFolder + ", output_dlf_file=" + output_dlf_file);
- #endif
- if (makewumaddlf.make(wumadFile, extractionFolder, output_dlf_file) != 0)
- {
- Console.WriteLine("cafex bootrun failed: Cannot generate dlf file from WUMAD.");
- return CAFEX_ERROR.BOOTRUN_MAKEDLF_FAILED;
- }
- return CAFEX_ERROR.OK;
- }
- static void extract_info_from_app_xml(string app_xml_file)
- {
- #if DEBUG
- Log.WriteLine("extract_info_from_app_xml started.");
- #endif
- APP_TITLE_ID.value = XmlHandler.GetNodeValue(app_xml_file, "title_id");
- APP_GROUP_ID.value = XmlHandler.GetNodeValue(app_xml_file, "group_id");
- APP_TITLE_VERSION.value = XmlHandler.GetNodeValue(app_xml_file, "title_version");
- Console.WriteLine("App Title ID : " + APP_TITLE_ID.value);
- Console.WriteLine("App Group ID : " + APP_GROUP_ID.value);
- Console.WriteLine("App Title Version : " + APP_TITLE_VERSION.value);
- }
- static CAFEX_ERROR connect_serial_or_debugger(bool quiet_mode)
- {
- #if DEBUG
- Log.WriteLine("connect_serial_or_debugger started. quiet_mode=" + quiet_mode.ToString() + ", DEBUGGER=" + DEBUGGER.value);
- #endif
- switch (DEBUGGER.value)
- {
- case "multi":
- {
- break;
- }
- case "gdb":
- case "gdbtui":
- {
- break;
- }
- case "cattoucan":
- {
- cattoucan.start(quiet_mode, QUIET.value, SESSION_DEBUG_OUT_PORT.value);
- return CAFEX_ERROR.OK;
- }
- case "none":
- {
- if (CONSOLE.value != "toucan")
- {
- CAFE_DEBUG_PORT.value = "toucan";
- }
- return CAFEX_ERROR.OK;
- }
- default:
- {
- Console.WriteLine("cafex run failed: " + DEBUGGER.value + " unsupported debugger.");
- return CAFEX_ERROR.RUN_BAD_DEBUGGER;
- }
- }
- if (CAFE_DEBUG_PORT.value == "toucan")
- {
- PORT.value = "localhost:" + SESSION_DEBUG_OUT_PORT.value;
- }
- else
- {
- Console.WriteLine("cafex run failed: Unknown debugger port " + CAFE_DEBUG_PORT.value);
- return CAFEX_ERROR.RUN_BAD_DEBUGGER_PORT;
- }
- if (DEBUGGER.value == "multi")
- {
- #if DEBUG
- Log.WriteLine("DEBUGGER = multi");
- #endif
- MULTIELF.value = "";
- if (DEBUG_ELF_FILE.value != null)
- {
- MULTIELF.value = DEBUG_ELF_FILE.value;
- }
- CATTOUCAN_STATUS.value = cattoucan.start(quiet_mode, QUIET.value, PORT.value).ToString();
- if (MULTI_CONNECT.value == null)
- {
- MULTI_CONNECT.value = "\"-connect=cafeserv -iphost localhost -ipport " + SESSION_DEBUG_CONTROL_PORT.value + " -console_ipport " + SESSION_DEBUG_OUT_PORT.value + " -auto_first\"";
- }
- #if DEBUG
- Log.WriteLine("MULTI_CONNECT before calling multi = " + MULTI_CONNECT.value);
- Log.WriteLine("CATTOUCAN_STATUS.value = " + CATTOUCAN_STATUS.value);
- Log.WriteLine("CAFE_LAUNCH_DEBUG.value = " + CAFE_LAUNCH_DEBUG.value);
- #endif
- if (CATTOUCAN_STATUS.value == "42")
- {
- if (CAFE_LAUNCH_DEBUG.value == "1")
- {
- multi.start(MULTI_CONNECT.value, CAFE_MULTI_INIT.value, MULTIELF.value);
- }
- else
- {
- Console.WriteLine("Ready to connect from multi");
- Console.WriteLine(GHS_ROOT.value + "\\multi.exe -cmd prepare_target " + MULTI_CONNECT.value + " " + CAFE_MULTI_INIT.value + " " + MULTIELF.value);
- }
- if (CMDOUTPUT.value == "1")
- {
- #if DEBUG
- Log.WriteLine("CMDOUTPUT = 1 -> calling cattoucan.start...");
- #endif
- cattoucan.start(quiet_mode, QUIET.value, PORT.value);
- }
- }
- }
- else
- {
- Console.WriteLine("cafex run error: Only Multi debugger supported");
- return CAFEX_ERROR.RUN_NON_MULTI_DEBUGGER;
- }
- #if DEBUG
- Log.WriteLine("connect_serial_or_debugger completed.");
- #endif
- return CAFEX_ERROR.OK;
- }
- static int initialize_serial_port_and_directory(string stop_cmd)
- {
- #if DEBUG
- Log.WriteLine("initialize_serial_port_and_directory started.");
- #endif
- if (stop_cmd == null)
- {
- Console.WriteLine("\"Usage: Initialize_serial_port_and_directory stop_cmd\", where stop_cmd is cafestop or a bash function call.");
- return 1;
- }
- create_directory_if_noexist(LOGDIR.value);
- if (stop_cmd == "cafestop")
- {
- stop(null);
- }
- //trap
- if (CAFE_CONSOLE.value == "cattoucan")
- {
- //trap
- CAFE_CONSOLE.value = "toucan";
- }
- if (CAFE_CONSOLE.value == "cmdtoucan")
- {
- //trap
- CAFE_CONSOLE.value = "toucan";
- }
- if (CAFE_CONSOLE.value == "catwaikiki")
- {
- //trap
- CAFE_CONSOLE.value = "waikiki";
- }
- #if DEBUG
- Log.WriteLine("CAFE_CONSOLE=" + CAFE_CONSOLE.value);
- #endif
- if (COMPORTS_SUPPORT.value == "-c")
- {
- int init_flag = 0;
- INITIALIZED_COMPORTS.value = "";
- for (int COMPORT = 1; COMPORT <= 20; ++COMPORT)
- {
- if (cmd.mode(COMPORT) == 0)
- {
- Console.WriteLine("Initialized COM" + COMPORT);
- init_flag = 1;
- INITIALIZED_COMPORTS.AddToVar("COM" + COMPORT + " ", ' ');
- }
- }
- if (init_flag == 0 && CAFE_CONSOLE.value != "toucan")
- {
- Console.WriteLine("ERROR: no serial port is available.");
- Console.WriteLine("Please close other softwares using serial port,");
- Console.WriteLine("such as HyperTerminal.");
- Console.WriteLine();
- Console.WriteLine("This automated test script cannot share the serial port");
- Console.WriteLine("with other softwares.");
- return 1;
- }
- }
- return 0;
- }
- static int monitor_for_output(string str_opt, string test_str, string timeout, string log_dir, string file_name, bool printToScreen)
- {
- #if DEBUG
- Log.WriteLine("monitor_for_output started.");
- #endif
- create_directory_if_noexist(log_dir);
- if (MONITOR_FOR_OUTPUT_CALLS.value == null)
- {
- MONITOR_FOR_OUTPUT_CALLS.value = "0";
- }
- MONITOR_FOR_OUTPUT_CALLS.value = (HexHandler.GetNumberFromString(MONITOR_FOR_OUTPUT_CALLS.value) + 1).ToString();
- string call_no = MONITOR_FOR_OUTPUT_CALLS.value;
- string mon_rc_file = log_dir + "\\monitor_return_code" + call_no + ".txt";
- if (file_name == null)
- {
- file_name = "monitor_" + call_no + ".txt";
- }
- string log_file = log_dir + "\\" + file_name;
- // Write to the log file all the output and print to the screen, if printToScreen is true.
- FileStream fs = new FileStream(log_file, FileMode.Create);
- StreamWriter sw = new StreamWriter(fs);
- DataReceivedEventHandler callback = (sender, e) =>
- {
- if (e != null && e.Data != null && sw != null)
- {
- string outputData = e.Data;
- if (printToScreen)
- {
- Console.WriteLine(outputData);
- }
- try
- {
- sw.WriteLine(outputData);
- sw.Flush();
- }
- catch (IOException)
- { }
- catch (ObjectDisposedException)
- { }
- }
- };
- int retVal = monitor_for_output_redirectionCallback(str_opt, test_str, timeout, callback);
- sw.Close();
- fs = new FileStream(mon_rc_file, FileMode.Create);
- sw = new StreamWriter(fs);
- sw.WriteLine(retVal);
- sw.Flush();
- sw.Close();
- return retVal;
- }
- static int monitor_for_output_redirectionCallback(string str_opt, string test_str, string timeout, DataReceivedEventHandler callback)
- {
- #if DEBUG
- Log.WriteLine("monitor_for_output_redirectionCallback started.");
- #endif
- string ret = monitor.start_redirectionCallback(str_opt, test_str, timeout, callback).ToString();
- int return_val = evaluate_monitor_return_value(ret);
- if (return_val == 0)
- {
- Console.WriteLine("monitor returned PASS");
- }
- else
- {
- return return_val;
- }
- return 0;
- }
- static int evaluate_monitor_return_value(string mon_rval)
- {
- #if DEBUG
- Log.WriteLine("evaluate_monitor_return_value started.");
- #endif
- int return_val = 1;
- string status_str = string.Empty;
- if (mon_rval == MON_RESULT_PASS.value)
- {
- return_val = 0;
- }
- else if (mon_rval == MON_RESULT_TIMEOUT.value)
- {
- status_str = "TIMEOUT";
- }
- else if (mon_rval == MON_RESULT_UNDEF.value)
- {
- status_str = "UNDEF";
- }
- else if (mon_rval == MON_RESULT_MANUAL.value)
- {
- status_str = "MANUAL";
- }
- else if (mon_rval == MON_RESULT_NOLOG.value)
- {
- status_str = "NOLOG";
- }
- else if (mon_rval == MON_RESULT_FAIL.value)
- {
- status_str = "FAIL";
- }
- else if (mon_rval == MON_RESULT_EXPECTED_TERM.value)
- {
- status_str = "EXPECTED_TERM";
- }
- else if (mon_rval == MON_RESULT_EXEC_WIN_APP.value)
- {
- status_str = "EXEC_WIN_APP";
- }
- else if (mon_rval == MON_RESULT_NOPPC.value)
- {
- status_str = "NOPPC";
- }
- else if (mon_rval == MON_RESULT_BOOT1.value)
- {
- status_str = "BOOT1";
- }
- else if (mon_rval == MON_RESULT_RESTART.value)
- {
- status_str = "RESTART";
- }
- else if (mon_rval == MON_RESULT_TEST_AS_RPL.value)
- {
- status_str = "TEST_AS_RPL";
- }
- else if (mon_rval == MON_RESULT_END_OF_RPL_LOADER.value)
- {
- status_str = "END_OF_RPL_LOADER";
- }
- else if (mon_rval == MON_RESULT_BRIDGE_COLLISION.value)
- {
- status_str = "BRIDGE_COLLISION";
- }
- else if (mon_rval == MON_RESULT_TEST_DBG_OUT.value)
- {
- status_str = "TEST_DBG_OUT";
- }
- else if (mon_rval == MON_RESULT_BRIDGE_OFF.value)
- {
- status_str = "BRIDGE_OFF";
- }
- else if (mon_rval == MON_RESULT_ERROR.value)
- {
- status_str = "ERROR";
- }
- else if (mon_rval == MON_RESULT_FATAL_ERROR.value)
- {
- status_str = "FATAL_ERROR";
- }
- else if (mon_rval == MON_RESULT_MISSING.value)
- {
- status_str = "MISSING";
- }
- else if (mon_rval == MON_RESULT_ABORTED.value)
- {
- status_str = "ABORTED";
- }
- else
- {
- status_str = mon_rval.ToString();
- }
- if (return_val != 0)
- {
- Console.WriteLine("monitor returned " + status_str);
- return return_val;
- }
- return 0;
- }
- static bool check_xml_version(string file_dest, string file_default, string file_option)
- {
- #if DEBUG
- Log.WriteLine("check_xml_version started.");
- #endif
- if (!File.Exists(file_dest))
- {
- Console.WriteLine("cafex run: Copying default config file to " + file_dest);
- if (!File.Exists(file_default))
- {
- Console.WriteLine("cafex run failed: Cannot find default config file " + file_default);
- return false;
- }
- create_directory_if_noexist(Path.GetDirectoryName(file_dest));
- File.Copy(file_default, file_dest, true);
- File.SetAttributes(file_dest, FileAttributes.Normal);
- }
- else
- {
- string ver_default = XmlHandler.GetNodeValue(file_default, "version");
- string ver_dest = XmlHandler.GetNodeValue(file_dest, "version");
- #if DEBUG
- Log.WriteLine("file_dest: " + file_dest + ", ver_default: " + ver_default + " - ver_dest: " + ver_dest);
- #endif
- if (ver_dest == null || ver_default == null)
- {
- Console.WriteLine("cafex run failed: Cannot get xml version numbers");
- return false;
- }
- if (ver_dest != ver_default)
- {
- if (file_option == "copy_default_if_mismatch")
- {
- Console.WriteLine("cafex run: Config file version mismatch detected: " + ver_dest + " vs. required " + ver_default);
- Console.WriteLine(" Copying default config file to " + file_dest);
- if (!File.Exists(file_default))
- {
- Console.WriteLine("cafex run failed: Cannot find default config file " + file_default);
- return false;
- }
- create_directory_if_noexist(Path.GetDirectoryName(file_dest));
- File.Copy(file_default, file_dest, true);
- File.SetAttributes(file_dest, FileAttributes.Normal);
- }
- else
- {
- Console.WriteLine("cafex run failed: Please update or delete config file: " + file_dest);
- Console.WriteLine(" Version number mismatch: " + ver_dest + " vs. required " + ver_default);
- return false;
- }
- }
- }
- return true;
- }
- static string args_to_bar_sep_list(string[] input)
- {
- return StringCombiner.MakeDelimitedString(input, '|');
- }
- static bool exit_if_specials(string[] arglist)
- {
- #if DEBUG
- Log.WriteLine("exit_if_specials started.");
- #endif
- foreach (string s in arglist)
- {
- if (s.Contains("?") || s.Contains("+") || s.Contains("<") || s.Contains(">") || s.Contains("|"))
- {
- Console.WriteLine("cafex run failed: Unable to parse special character (?+<>|) in arg list.");
- Console.WriteLine(" arglist: " + s);
- return false;
- }
- }
- return true;
- }
- static bool update_arglist(string file_dest, string cafe_elf, string[] arglist)
- {
- #if DEBUG
- Log.WriteLine("update_arglist started.");
- #endif
- string[] arglist_without_rpx = new string[arglist.Length - 1];
- Array.Copy(arglist, 1, arglist_without_rpx, 0, arglist_without_rpx.Length);
- bool exit_if_specials_ret = exit_if_specials(arglist_without_rpx);
- if (!exit_if_specials_ret)
- {
- return false;
- }
- string args_trailing_with_bars = args_to_bar_sep_list(arglist_without_rpx);
- if (DASH_A_ARGS.value == null)
- {
- ARGS_WITH_BARS.value = args_trailing_with_bars;
- }
- else
- {
- ARGS_WITH_BARS.value = DASH_A_ARGS.value.Replace(',', '|');
- if (args_trailing_with_bars != string.Empty)
- {
- ARGS_WITH_BARS.value = ARGS_WITH_BARS.value + "|" + args_trailing_with_bars;
- }
- }
- string args_with_bars_no_quotes = string.Empty;
- //if (ARGS_WITH_BARS.value != null)
- //{
- // args_with_bars_no_quotes = ARGS_WITH_BARS.value.Replace("\"", "\\\"");
- //}
- //else
- //{
- // args_with_bars_no_quotes = ARGS_WITH_BARS.value;
- //}
- args_with_bars_no_quotes = ARGS_WITH_BARS.value;
- string total_arglist = Path.GetFileName(cafe_elf);
- if (args_with_bars_no_quotes != string.Empty)
- {
- total_arglist += "|" + args_with_bars_no_quotes;
- }
- string total_arglist_with_qs = total_arglist.Replace(' ', '?');
- total_arglist_with_qs = total_arglist_with_qs.Replace('|', ' ');
- XmlHandler.UpdateNodeValue(file_dest, "argstr", total_arglist_with_qs);
- return true;
- }
- static CAFEX_ERROR update_system_xml(string file_dest, string cmd_flags, string system_mode, string sys_xml_mcp_launch_hint)
- {
- #if DEBUG
- Log.WriteLine("update_system_xml started.");
- #endif
- string sys_default_xml = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\boot\\system_default.xml";
- if (!check_xml_version(file_dest, sys_default_xml, "copy_default_if_mismatch"))
- {
- return CAFEX_ERROR.UNEXPECTED;
- }
- string old_system_mode_num = XmlHandler.GetNodeValue(file_dest, "dev_mode");
- string[] system_mode_name_table = new string[4];
- system_mode_name_table[0] = "PROD";
- system_mode_name_table[1] = "DEV";
- system_mode_name_table[2] = "TEST";
- system_mode_name_table[3] = "Unknown";
- if (old_system_mode_num != "0" && old_system_mode_num != "1" && old_system_mode_num != "2")
- {
- old_system_mode_num = "3";
- }
- string new_system_mode_num = "3";
- if (system_mode == "dev")
- {
- new_system_mode_num = "1";
- }
- else if (system_mode == "test")
- {
- new_system_mode_num = "2";
- }
- else
- {
- if (system_mode == "prod")
- {
- Console.WriteLine("cafex run Warning: Changing to PROD mode is not supported.");
- Console.WriteLine(" Please specify '-M dev' or '-M test'.");
- }
- else if (system_mode != null)
- {
- Console.WriteLine("cafex run Warning: Invalid system mode is specified.");
- }
- if (old_system_mode_num != "3")
- {
- new_system_mode_num = old_system_mode_num;
- }
- else
- {
- new_system_mode_num = "1";
- Console.WriteLine("cafex run: System mode is broken. Fixing it to DEV");
- }
- }
- if (CAFE_BOOT_MODE.value == "PCFS")
- {
- if (new_system_mode_num != old_system_mode_num)
- {
- Console.WriteLine("cafex run: Changing system mode " + system_mode_name_table[HexHandler.GetNumberFromString(old_system_mode_num)] + " to " + system_mode_name_table[HexHandler.GetNumberFromString(new_system_mode_num)]);
- XmlHandler.UpdateNodeValue(file_dest, "dev_mode", new_system_mode_num);
- }
- else
- {
- Console.WriteLine("cafex run: Current system mode is " + system_mode_name_table[HexHandler.GetNumberFromString(new_system_mode_num)]);
- }
- }
- if (CAFERUN_OPTION_MLC_EMU_LAUNCH.value == "1")
- {
- string mlc_emu_tid_hi = CAFERUN_OPTION_MLC_EMU_TITLEID.value.Substring(2, 8);
- string mlc_emu_tid_lo = CAFERUN_OPTION_MLC_EMU_TITLEID.value.Substring(10, 8);
- string mlc_emu_title_dir = string.Empty;
- if (mlc_emu_tid_hi == "00050010")
- {
- mlc_emu_title_dir = CAFE_MLC_DIR.value + "\\sys\\title\\" + mlc_emu_tid_hi + "\\" + mlc_emu_tid_lo;
- }
- else
- {
- mlc_emu_title_dir = CAFE_MLC_DIR.value + "\\usr\\title\\" + mlc_emu_tid_hi + "\\" + mlc_emu_tid_lo;
- }
- if (File.Exists(mlc_emu_title_dir + "\\code\\app.xml"))
- {
- string mlc_emu_os_version = XmlHandler.GetNodeValue(mlc_emu_title_dir + "\\code\\app.xml", "os_version");
- CAFERUN_COLDBOOT_OS_VERSION.value = String.Format("{0:x16}", mlc_emu_os_version);
- }
- else
- {
- if (DISC_EMU_TYPE.value != "hdd" && ALLOW_DISCRUN_IN_SOFTLAUNCH.value == "0")
- {
- Console.WriteLine("cafex run failed: Cannot find title 0x" + mlc_emu_tid_hi + mlc_emu_tid_lo + " on MLC emulation");
- Console.WriteLine(" Please cafeinstall before using -t option");
- return CAFEX_ERROR.RUN_TITLE_ID_NOT_FOUND_IN_MLC;
- }
- }
- XmlHandler.UpdateNodeValue(file_dest, "default_title_id", mlc_emu_tid_hi + mlc_emu_tid_lo);
- }
- else
- {
- if (APP_XML_FILE.value != null)
- {
- DISC_EMU_TID.value = XmlHandler.GetNodeValue(APP_XML_FILE.value, "title_id");
- XmlHandler.UpdateNodeValue(file_dest, "default_title_id", DISC_EMU_TID.value);
- }
- else
- {
- if (DISC_EMU_TYPE.value == "hdd" && string.IsNullOrEmpty(CAFE_WUMAD.value))
- {
- Console.WriteLine();
- Console.WriteLine("-------");
- Console.WriteLine("cafex run WARNING: Title ID is not specified.");
- Console.WriteLine(" Use -t option to specify Title ID of application on HDD.");
- Console.WriteLine(" Title ID of previously launched app will be used at this time,");
- Console.WriteLine(" but launch may fail if it was different from that of application on HDD.");
- Console.WriteLine("-------");
- Console.WriteLine();
- }
- }
- }
- if (APP_XML_FILE.value != null)
- {
- string disc_emu_app_type = XmlHandler.GetNodeValue(APP_XML_FILE.value, "app_type");
- XmlHandler.UpdateNodeValue(file_dest, "default_app_type", disc_emu_app_type);
- }
- XmlHandler.UpdateNodeValue(file_dest, "cmdFlags", cmd_flags);
- XmlHandler.UpdateNodeValue(file_dest, "default_os_id", CAFERUN_COLDBOOT_OS_VERSION.value);
- if (sys_xml_mcp_launch_hint != null)
- {
- bool node_exists = XmlHandler.NodeExists(file_dest, "default_device_type");
- if (!node_exists)
- {
- XmlHandler.AddNode(file_dest, "default_device_type", sys_xml_mcp_launch_hint, new string[4] { "type", "string", "length", "16" });
- }
- else
- {
- XmlHandler.UpdateNodeValue(file_dest, "default_device_type", sys_xml_mcp_launch_hint);
- }
- }
- else
- {
- XmlHandler.RemoveNode(file_dest, "default_device_type");
- }
- return CAFEX_ERROR.OK;
- }
- static int set_system_xml_cos_flags(string ppc_os_flags)
- {
- #if DEBUG
- Log.WriteLine("setting cos_flags:" + ppc_os_flags);
- #endif
- int ret = devkitmsg.CosFlags(ppc_os_flags);
- if (ret != 0)
- {
- Console.WriteLine("devkitmsg \"cos_flags " + ppc_os_flags + "\" - failed result = " + ret);
- }
- return ret;
- }
- static bool update_app_xml(string file_dest)
- {
- #if DEBUG
- Log.WriteLine("update_app_xml started.");
- #endif
- string app_default_xml = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\boot\\app_default.xml";
- if (!check_xml_version(file_dest, app_default_xml, "copy_default_if_mismatch"))
- {
- return false;
- }
- XmlHandler.UpdateNodeValue(file_dest, "os_version", CAFERUN_COLDBOOT_OS_VERSION.value);
- return true;
- }
- static bool update_cos_xml(string file_dest, string cmd_flags)
- {
- #if DEBUG
- Log.WriteLine("update_cos_xml started.");
- #endif
- string cos_default_xml = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\boot\\cos_default.xml";
- if (!check_xml_version(file_dest, cos_default_xml, "copy_default_if_mismatch"))
- {
- return false;
- }
- if (XmlHandler.GetNodeValue(file_dest, "cmdFlags") == "0")
- {
- XmlHandler.UpdateNodeValue(file_dest, "cmdFlags", cmd_flags);
- }
- return true;
- }
- static CAFEX_ERROR update_meta_xml(string file_dest)
- {
- #if DEBUG
- Log.WriteLine("update_meta_xml started on file = " + file_dest);
- #endif
- string meta_default_xml = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\boot\\meta_default.xml";
- string own_meta_xml = CAFE_CODE_DIR.value + "\\..\\meta\\meta.xml";
- if (CAFERUN_OPTION_MLC_EMU_LAUNCH.value == "0")
- {
- if (File.Exists(own_meta_xml))
- {
- string abs_own_meta_xml = Path.GetFullPath(own_meta_xml);
- string abs_file_dest = Path.GetFullPath(file_dest);
- if (abs_own_meta_xml != abs_file_dest)
- {
- Console.Write("Copy " + own_meta_xml + " to " + file_dest);
- File.Copy(own_meta_xml, file_dest, true);
- File.SetAttributes(file_dest, FileAttributes.Normal);
- }
- }
- else
- {
- CAFEX_ERROR ret = check_title_id(file_dest, meta_default_xml, APP_XML_FILE.value);
- if (ret != CAFEX_ERROR.OK)
- {
- return ret;
- }
- }
- if (!check_xml_version(file_dest, meta_default_xml, "copy_default_if_mismatch"))
- {
- return CAFEX_ERROR.RUN_UPDATE_META_XML_FAILED;
- }
- XmlHandler.UpdateNodeValue(file_dest, "os_version", CAFERUN_COLDBOOT_OS_VERSION.value);
- Console.WriteLine("Updating title id, group id, title version and app type in " + file_dest + ", based on " + APP_XML_FILE.value + "...");
- // get titleId from disc emulation's app.xml
- DISC_EMU_TID.value = XmlHandler.GetNodeValue(APP_XML_FILE.value, "title_id");
- XmlHandler.UpdateNodeValue(file_dest, "title_id", DISC_EMU_TID.value);
- // get group Id from disc emulation's app.xml
- string disc_emu_gid = XmlHandler.GetNodeValue(APP_XML_FILE.value, "group_id");
- XmlHandler.UpdateNodeValue(file_dest, "group_id", disc_emu_gid);
- // get title version from disc emulation's app.xml
- string disc_emu_titlever_hex = XmlHandler.GetNodeValue(APP_XML_FILE.value, "title_version").Trim();
- if (!disc_emu_titlever_hex.StartsWith("0x"))
- {
- disc_emu_titlever_hex = "0x" + disc_emu_titlever_hex;
- }
- int disc_emu_titlever_decimal = HexHandler.GetNumberFromString(disc_emu_titlever_hex);
- // insert system default_title_id
- XmlHandler.UpdateNodeValue(file_dest, "title_version", disc_emu_titlever_decimal.ToString("X5"));
- }
- return CAFEX_ERROR.OK;
- }
- static void update_boot_logos(string file_dest)
- {
- #if DEBUG
- Log.WriteLine("update_boot_logos started.");
- #endif
- string boot_movie_h264 = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\meta\\bootMovie.h264";
- string boot_logo_tex_tga = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\meta\\bootLogoTex.tga";
- string icon_tex_tga = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\meta\\iconTex.tga";
- string boot_tv_tga = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\meta\\bootTvTex.tga";
- string boot_drc_tga = CAFE_ROOT.value + "\\system\\bin\\ghs\\cafe\\meta\\bootDrcTex.tga";
- string dest_boot_movie_h264 = file_dest + "\\bootMovie.h264";
- string dest_boot_logo_tex_tga = file_dest + "\\bootLogoTex.tga";
- string dest_icon_tex_tga = file_dest + "\\iconTex.tga";
- string dest_boot_tv_tga = file_dest + "\\bootTvTex.tga";
- string dest_boot_drc_tga = file_dest + "\\bootDrcTex.tga";
- // Copy boot_movie logo_text only if ghs\cafe\meta has a newer timestamp.
- // This replaces the "cp -u" from the BASH script.
- bool copyRequired = false;
- if (!File.Exists(dest_boot_movie_h264))
- {
- // Should copy because it does not exist
- copyRequired = true;
- }
- else
- {
- // Check the timestamps
- if (file_timestamp_compare(boot_movie_h264, dest_boot_movie_h264) > 0)
- {
- copyRequired = true;
- }
- }
- if (copyRequired)
- {
- file_copy_retry(boot_movie_h264, dest_boot_movie_h264, true, 1);
- File.SetAttributes(dest_boot_movie_h264, FileAttributes.Normal);
- }
- // Copy logo_text only if ghs\cafe\meta has a newer timestamp
- copyRequired = false;
- if (!File.Exists(dest_boot_logo_tex_tga))
- {
- // Should copy because it does not exist
- copyRequired = true;
- }
- else
- {
- // Check the timestamps
- if (file_timestamp_compare(boot_logo_tex_tga, dest_boot_logo_tex_tga) > 0)
- {
- copyRequired = true;
- }
- }
- if (copyRequired)
- {
- file_copy_retry(boot_logo_tex_tga, dest_boot_logo_tex_tga, true, 1);
- File.SetAttributes(dest_boot_logo_tex_tga, FileAttributes.Normal);
- }
- // Applicaion Boot Textures should be copy if files do not exist
- if (!File.Exists(dest_icon_tex_tga))
- {
- file_copy_retry(icon_tex_tga, dest_icon_tex_tga, true, 1);
- File.SetAttributes(dest_icon_tex_tga, FileAttributes.Normal);
- }
- if (!File.Exists(dest_boot_tv_tga))
- {
- file_copy_retry(boot_tv_tga, dest_boot_tv_tga, true, 1);
- File.SetAttributes(dest_boot_tv_tga, FileAttributes.Normal);
- }
- if (!File.Exists(dest_boot_drc_tga))
- {
- file_copy_retry(boot_drc_tga, dest_boot_drc_tga, true, 1);
- File.SetAttributes(dest_boot_drc_tga, FileAttributes.Normal);
- }
- }
- static void create_directory_if_noexist(string directory)
- {
- #if DEBUG
- Log.WriteLine("create_directory_if_noexist started.");
- #endif
- if (!Directory.Exists(directory))
- {
- Directory.CreateDirectory(directory);
- }
- }
- static int compute_flat_version(string version)
- {
- #if DEBUG
- Log.WriteLine("compute_flat_version started.");
- #endif
- string[] numbers = version.Split('.');
- int ret = 0;
- ret = Convert.ToInt32(numbers[0]) * 1000000 + Convert.ToInt32(numbers[1]) * 10000 + Convert.ToInt32(numbers[2]) * 1000 + Convert.ToInt32(numbers[3]);
- return ret;
- }
- static CAFEX_ERROR check_title_id(string file_dest, string file_default, string file_app)
- {
- #if DEBUG
- Log.WriteLine("check_title_id started. file_dest=" + file_dest + ",file_default=" + file_default + ",file_app=" + file_app);
- #endif
- if (!File.Exists(file_dest))
- {
- Console.WriteLine("cafex run: Copying default config file to " + file_dest);
- if (!File.Exists(file_default))
- {
- Console.WriteLine("cafex run failed: Cannot find default config file " + file_default);
- return CAFEX_ERROR.RUN_CHECKTITLEID_FAILED;
- }
- File.Copy(file_default, file_dest, true);
- File.SetAttributes(file_default, FileAttributes.Normal);
- }
- else
- {
- string titleid_dest = XmlHandler.GetNodeValue(file_dest, "title_id");
- string titleid_app = XmlHandler.GetNodeValue(file_app, "title_id");
- if (titleid_dest == string.Empty || titleid_app == string.Empty)
- {
- Console.WriteLine("cafex run failed: Cannot get title id");
- return CAFEX_ERROR.RUN_CHECKTITLEID_FAILED;
- }
- if (titleid_dest != titleid_app)
- {
- Console.WriteLine("cafex run: Config file title id mismatch detected: " + titleid_dest + " vs. required " + titleid_app);
- Console.WriteLine(" Copying default config file to " + file_dest);
- if (!File.Exists(file_default))
- {
- Console.WriteLine("cafex run failed: Cannot find default config file " + file_default);
- return CAFEX_ERROR.RUN_CHECKTITLEID_FAILED;
- }
- File.Copy(file_default, file_dest, true);
- File.SetAttributes(file_default, FileAttributes.Normal);
- }
- }
- return CAFEX_ERROR.OK;
- }
- /// <summary>
- /// Compares timestamsp between two files.
- /// </summary>
- /// <param name="file1">The first file for comparison.</param>
- /// <param name="file2">The second file for comparison.</param>
- /// <returns>0 if timestamps are the same, negative if first file is older than the second, and positive if first is newer than the second.</returns>
- static int file_timestamp_compare(string file1, string file2)
- {
- if (!File.Exists(file1))
- {
- throw new ArgumentException("file1 = " + file1);
- }
- if (!File.Exists(file2))
- {
- throw new ArgumentException("file2 = " + file2);
- }
- DateTime file1Time = File.GetLastWriteTime(file1);
- DateTime file2Time = File.GetLastWriteTime(file2);
- return DateTime.Compare(file1Time, file2Time);
- }
- /// <summary>
- /// Tries to copy a file from source to destination, and if it fails and attempts is greater than one,
- /// it will wait for 1s and retry.
- /// </summary>
- /// <param name="sourceFileName">Source file.</param>
- /// <param name="destFileName">Destination file.</param>
- /// <param name="overwrite">Overwrite if destination exists.</param>
- /// <param name="attempts">Number of attempts</param>
- static void file_copy_retry(string sourceFileName, string destFileName, bool overwrite, uint attempts)
- {
- try
- {
- File.Copy(sourceFileName, destFileName, overwrite);
- }
- catch (IOException)
- {
- if (attempts > 1)
- {
- --attempts;
- // Wait a second
- Thread.Sleep(Program.RETRY_TIMESPAN);
- // Retry
- file_copy_retry(sourceFileName, destFileName, overwrite, attempts);
- }
- else
- {
- // Re-throw if no attempts
- throw;
- }
- }
- }
- #endregion
- #region HELP
- static void run_usage()
- {
- string caller;
- if (CAFERUN_OPTION_CALLED_FROM_CAFEDISCRUN.value == "yes")
- {
- caller = "discrun";
- }
- else
- {
- caller = "run";
- }
- Console.WriteLine("Usage: cafex " + caller + " [options] <app>.rpx \"[arg1]\" \"[arg2]\" ... \"[argN]\"");
- Console.WriteLine();
- Console.WriteLine("options:");
- Console.WriteLine(" -a a,b... : arguments (comma delimited)");
- Console.WriteLine(" -b : use DEBUG OS version");
- Console.WriteLine(" -u : use FDEBUG OS version");
- Console.WriteLine(" -l <path> : user RPL directory or file to gather for RPX");
- Console.WriteLine();
- Console.WriteLine(" -d multi : launch multi (GHS UI) on elf file");
- Console.WriteLine(" -i : stop debugger in the initialization code");
- Console.WriteLine(" -j : stop debugger in the pre-initialization code");
- Console.WriteLine(" -R : do not stop in debugger until OSDebug or OSDebugStr call");
- Console.WriteLine(" -p <n> : indicate process to debug (defaults to game process)");
- Console.WriteLine(" -g <n> : 32-bit flag to pass along to PPC COS");
- Console.WriteLine(" -w <n> : 32-bit flag to pass along to PPC COS.");
- Console.WriteLine(" -k <file> : path to elf file for debugger");
- Console.WriteLine(" -x : Enable AHCI/SATA disk access. Deprecated - will soon become default.");
- Console.WriteLine(" -r : restart last application");
- Console.WriteLine(" -s : use soft launch to run");
- Console.WriteLine(" -F : force restart (stop and then boot hw)");
- Console.WriteLine(" -t <tid> : title launch from mlc emulation (tid is hex that starts with 0x)");
- Console.WriteLine(" -e <op> : pass op through to FSEmul or MCP (e.g.: -e sata -> FSEmul -sata)");
- Console.WriteLine();
- Console.WriteLine(" -v <n> : set COS verbose level (0=off 7 == MAX)");
- Console.WriteLine(" -q : do not display OS warning or informational messages.");
- Console.WriteLine(" -z : suppress mirroring the data to the session data directory.");
- Console.WriteLine();
- Console.WriteLine(" -h : (help) display options");
- }
- static void update_usage()
- {
- Console.WriteLine("Usage: cafex update [-q] [-h]");
- Console.WriteLine();
- Console.WriteLine("options:");
- Console.WriteLine(" -h : (help) display options");
- Console.WriteLine(" -u <package> : path to update package (from System Config Tool's perspective)");
- Console.WriteLine(" -s : use system updater (update package should contain system updater)");
- Console.WriteLine(" -t <dir> : patch to single title (from System Config Tool's perspective)");
- }
- static void stop_usage()
- {
- Console.WriteLine("Usage: cafex stop [-hostonly] [-makemine] [-h]");
- Console.WriteLine();
- Console.WriteLine("options:");
- Console.WriteLine(" -h : (help) display options.");
- Console.WriteLine(" -hostonly : stops the host applications that control the bridge, keeping the bridge on.");
- Console.WriteLine(" -makemine : forces assigning the bridge to this host.");
- }
- static void setbootmode_usage()
- {
- Console.WriteLine("Usage: cafex setbootmode [-noreflash] [PCFS|NAND]");
- Console.WriteLine();
- Console.WriteLine("options:");
- Console.WriteLine(" -noreflash : when this parameter is used to set the boot");
- Console.WriteLine(" as NAND, it will only reflash the Bridge if it's");
- Console.WriteLine(" in PCFS. If already in NAND, it won't reflash.");
- Console.WriteLine(" PCFS : sets the Bridge to boot using PCFS.");
- Console.WriteLine(" NAND : sets the Bridge to boot from internal NAND.");
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement