#!/usr/bin/env bash ############################################################################### # # Copyright (C) 2009-2013 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. # ############################################################################### ############################################################################### # Default value ############################################################################### # Relies on caferun's variables # CAFE_ROOT # QUIET # CAFERUN_OPTION_SOFT_LAUNCH # CAFERUN_OPTION_SOFT_RESTART # CAFERUN_COLDBOOT_OS_VERSION # CAFE_ELF # DISC_EMU_TYPE # DISC_EMU_TID # script-wide vars, not exported MAKE_DLF_ONLY=0 USE_DLF_ONLY=0 ELF_FILENAME= ############################################################################### # initialize_work_directory ############################################################################### initialize_work_directory() { # setup work directory local dir="$1" if [ ! -d "$dir" ] then mkdir -m 0777 -p "$dir" fi # Delete any file created by bootrun # Files created by bootrun rm -f "$dir"/diskid.bin \ "$dir"/ppc.bsf \ "$dir"/ppc_boot.dlf } ############################################################################### # make_boot1_system_file ############################################################################### make_boot1_system_file() { local bsf_file="$1" local flags=0 # If loading CAFE-IOS (not SRAM-IOS, not boot1writer), load PPC PKG in MCP FIRMWARE_FILENAME=`basename "$FIRMWARE_FILE"` if [ "${FIRMWARE_FILENAME:0:2}" == "fw" ] then flags=0x80000000 fi makebsf.exe $QUIET -i 0x20008000 -j 0x20008800 -o "$bsf_file" -f "$flags" if [ $? != 0 ] then echo "bootrun failed: Cannot generate bsf file." exit 30 fi } ############################################################################### # make_boot_dlf ############################################################################### # # offset in disk Disk layout # 0x0 +-----------------+ # | disk id | # 0x20 +-----------------+ # | reserved region | # 0x80000 +-----------------+ # | BSF (new) | # 0x90000 +-----------------+ # | Firmware | # : : make_boot_dlf() { local file_list="$1" local output_dlf_file="$2" makedlf.exe $QUIET -p "$file_list" -l 0x0,0x80000,0x90000 -o "$output_dlf_file" if [ $? != 0 ] then echo "bootrun failed: Cannot generate dlf file." exit 31 fi } ############################################################################### # make_wumad_dlf ############################################################################### # make_wumad_dlf() { local wumadFile="$1" local extractionFolder="$2" local output_dlf_file= if [ $# -eq 3 ] then output_dlf_file="$3" fi local MAKEWUMADDLF="$CAFE_ROOT/system/bin/tool/mastering/makewumaddlf.exe" "$MAKEWUMADDLF" "$wumadFile" "$extractionFolder" "$output_dlf_file" if [ $? != 0 ] then echo "bootrun failed: Cannot generate dlf file from WUMAD." exit 31 fi } ############################################################################### # main ############################################################################### set -e # stop the script when any command returns an error (non-zero). # by default ELF_FILENAME="$CAFE_ELF" if [ "$1" == "-makedlf" ] then # will make a DLF, but won't use it MAKE_DLF_ONLY=1 elif [ "$1" == "-usedlf" ] then # will use a DLF made by a previous -makedlf invocation USE_DLF_ONLY=1 ELF_FILENAME="$2" fi CAFERUN_COLDBOOT_OS_VERSION_HI=${CAFERUN_COLDBOOT_OS_VERSION:0:8} CAFERUN_COLDBOOT_OS_VERSION_LO=${CAFERUN_COLDBOOT_OS_VERSION:8:8} #if [ "$CAFE_BOOT_MODE" == "NAND" -a "$CAFERUN_OPTION_SOFT_LAUNCH" -eq 1 ] #then # if [ ${CAFE_DETACH_FSEMUL:-0} != 0 ] # then # "$MION_BRIDGE_TOOLS/FSEmul.exe" $BRIDGE_PARAMETERS -ip $BRIDGE_CURRENT_IP_ADDRESS -em < /dev/null &> /dev/null & # else # "$MION_BRIDGE_TOOLS/FSEmul.exe" $BRIDGE_PARAMETERS -ip $BRIDGE_CURRENT_IP_ADDRESS -em < /dev/null & # fi if [ "$CAFERUN_OPTION_SOFT_LAUNCH" -eq 1 -a "$MAKE_DLF_ONLY" -eq 0 ] then if [ "$CAFERUN_OPTION_FAST_RELAUNCH" -eq 1 ] then COSDEBUG_TID_HI=${DISC_EMU_TID:0:8} COSDEBUG_TID_LO=${DISC_EMU_TID:8:8} # extract the cos arguments local COS_ARGS=`sed -n 's|\(\)\(.*\)\(\)|\1|p' "$CAFE_CODE_DIR"/cos.xml` cosdebug.sh cos launchex 0x$COSDEBUG_TID_HI 0x$COSDEBUG_TID_LO $COS_ARGS else devkitmsg "title_softlaunch $CAFERUN_COLDBOOT_OS_VERSION $DISC_EMU_TID" -v -p $SESSION_LAUNCH_CTRL_PORT fi else # Find a temporary directory if [ -z "$CAFE_TEMP" ] then #BOOTRUN_WORK_DIR=`cygpath -m "$CYGWIN_PATH/tmp/${SESSION_PATH_PREFIX}caferun"` #WUMAD_WORK_DIR=`cygpath -m "$CYGWIN_PATH/tmp/${SESSION_PATH_PREFIX}makewumaddlf"` echo "CAFE_TEMP environment variable is not set." exit -13 else BOOTRUN_WORK_DIR=`cygpath -m "$CAFE_TEMP/${SESSION_PATH_PREFIX}caferun"` WUMAD_WORK_DIR=`cygpath -m "$CAFE_TEMP/${SESSION_PATH_PREFIX}makewumaddlf"` fi initialize_work_directory "$BOOTRUN_WORK_DIR" FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.img" # other hardware defaults if [ "${CAFE_HARDWARE:0:2}" == "ev" ] then FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.bu.img" fi # overrides if [ "$CAFE_SECURITY" = "off" ] then FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.bu.img" else FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.img" fi # recovery image requested if [ "$BOOTRUN_USE_RECOVERY_IMAGE" = "1" ] then FIRMWARE_FILE="$CAFE_ROOT/system/bin/$TOOLCHAIN/$PLATFORM/boot/recovery.img" fi BOOT_DLF_FILE="$BOOTRUN_WORK_DIR/ppc_boot.dlf" # create bsf_file make_boot1_system_file "$BOOTRUN_WORK_DIR/ppc.bsf" # create dlf_file diskid="$BOOTRUN_WORK_DIR/diskid.bin" install -Dp "$CAFE_ROOT/system/bin/$TOOLCHAIN/$PLATFORM/boot/diskid.bin" "$diskid" OUT_FILE=`cygpath -m "$FIRMWARE_FILE"` make_boot_dlf "$diskid,$BOOTRUN_WORK_DIR/ppc.bsf","$OUT_FILE" "$BOOT_DLF_FILE" # prepare to serve from PC <-> Host Bridge if [ "$DISC_EMU_TYPE" == "blockemu" ] then if [ "${ELF_FILENAME:(-4)}" == ".rpx" ] then if [ $USE_DLF_ONLY -eq 0 ] then source cafedevrun.sh "`cygpath -w \"$ELF_FILENAME\"`" fi if [ $MAKE_DLF_ONLY -eq 0 ] then source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" "`cygpath -w "${ELF_FILENAME%.rpx}.dlf"`" fi fi else # HFIO case & HDD case & WUMAD case if [ -n "$CAFE_WUMAD" ] then # WUMAD case MAKE_WUMAD_DLF_ARGUMENTS= if [ "${CAFE_WUMAD:(-6)}" == ".wumad" ] then # A WUMAD file was passed instead of a directory. echo "Creating DLF from WUMAD file..." wumadTempName=`basename $CAFE_WUMAD .wumad` wumadTempDir="`cygpath -w "$WUMAD_WORK_DIR/$wumadTempName"`" wumadDlfName="`cygpath -w "$wumadTempDir/$wumadTempName.dlf"`" MAKE_WUMAD_DLF_ARGUMENTS="$CAFE_WUMAD $wumadTempDir $wumadDlfName" else # A directory was passed in. echo "Creating DLF from WUMAD extracted directory..." wumadTempName="" wumadTempDir=$CAFE_WUMAD wumadDlfName="`cygpath -w "$WUMAD_WORK_DIR/extractedWumad.dlf"`" MAKE_WUMAD_DLF_ARGUMENTS="$CAFE_WUMAD $wumadDlfName" fi echo "wumadName =" $wumadTempName echo "wumadDir =" $wumadTempDir echo "wumadDlf =" $wumadDlfName make_wumad_dlf $MAKE_WUMAD_DLF_ARGUMENTS # Starts the emulation echo "Calling hostrun: source hostrun " `cygpath -w "$BOOT_DLF_FILE"` $wumadDlfName if [ $MAKE_DLF_ONLY -eq 0 ] then source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" "$wumadDlfName" fi else # HFIO and HDD cases if [ $MAKE_DLF_ONLY -eq 0 ] then source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" fi fi fi fi