1#!/usr/bin/env bash 2 3############################################################################### 4# 5# Copyright (C) 2009-2013 Nintendo. All rights reserved. 6# 7# These coded instructions, statements, and computer programs contain 8# proprietary information of Nintendo of America Inc. and/or Nintendo 9# Company Ltd., and are protected by Federal copyright law. They may 10# not be disclosed to third parties or copied or duplicated in any form, 11# in whole or in part, without the prior written consent of Nintendo. 12# 13############################################################################### 14 15############################################################################### 16# Default value 17############################################################################### 18 19# Relies on caferun's variables 20# CAFE_ROOT 21# QUIET 22# CAFERUN_OPTION_SOFT_LAUNCH 23# CAFERUN_OPTION_SOFT_RESTART 24# CAFERUN_COLDBOOT_OS_VERSION 25# CAFE_ELF 26# DISC_EMU_TYPE 27# DISC_EMU_TID 28 29 30# script-wide vars, not exported 31MAKE_DLF_ONLY=0 32USE_DLF_ONLY=0 33ELF_FILENAME= 34 35 36############################################################################### 37# initialize_work_directory 38############################################################################### 39initialize_work_directory() 40{ 41 # setup work directory 42 43 local dir="$1" 44 if [ ! -d "$dir" ] 45 then 46 mkdir -m 0777 -p "$dir" 47 fi 48 49 # Delete any file created by bootrun 50 51 # Files created by bootrun 52 rm -f "$dir"/diskid.bin \ 53 "$dir"/ppc.bsf \ 54 "$dir"/ppc_boot.dlf 55} 56 57############################################################################### 58# make_boot1_system_file 59############################################################################### 60 61make_boot1_system_file() 62{ 63 local bsf_file="$1" 64 local flags=0 65 66 # If loading CAFE-IOS (not SRAM-IOS, not boot1writer), load PPC PKG in MCP 67 FIRMWARE_FILENAME=`basename "$FIRMWARE_FILE"` 68 if [ "${FIRMWARE_FILENAME:0:2}" == "fw" ] 69 then 70 flags=0x80000000 71 fi 72 73 makebsf.exe $QUIET -i 0x20008000 -j 0x20008800 -o "$bsf_file" -f "$flags" 74 if [ $? != 0 ] 75 then 76 echo "bootrun failed: Cannot generate bsf file." 77 exit 30 78 fi 79} 80 81 82############################################################################### 83# make_boot_dlf 84############################################################################### 85# 86# offset in disk Disk layout 87# 0x0 +-----------------+ 88# | disk id | 89# 0x20 +-----------------+ 90# | reserved region | 91# 0x80000 +-----------------+ 92# | BSF (new) | 93# 0x90000 +-----------------+ 94# | Firmware | 95# : : 96make_boot_dlf() 97{ 98 local file_list="$1" 99 local output_dlf_file="$2" 100 101 makedlf.exe $QUIET -p "$file_list" -l 0x0,0x80000,0x90000 -o "$output_dlf_file" 102 if [ $? != 0 ] 103 then 104 echo "bootrun failed: Cannot generate dlf file." 105 exit 31 106 fi 107} 108 109############################################################################### 110# make_wumad_dlf 111############################################################################### 112# 113make_wumad_dlf() 114{ 115 local wumadFile="$1" 116 local extractionFolder="$2" 117 local output_dlf_file= 118 if [ $# -eq 3 ] 119 then 120 output_dlf_file="$3" 121 fi 122 123 local MAKEWUMADDLF="$CAFE_ROOT/system/bin/tool/mastering/makewumaddlf.exe" 124 125 "$MAKEWUMADDLF" "$wumadFile" "$extractionFolder" "$output_dlf_file" 126 if [ $? != 0 ] 127 then 128 echo "bootrun failed: Cannot generate dlf file from WUMAD." 129 exit 31 130 fi 131} 132 133############################################################################### 134# main 135############################################################################### 136 137set -e # stop the script when any command returns an error (non-zero). 138 139 140 141# by default 142ELF_FILENAME="$CAFE_ELF" 143 144if [ "$1" == "-makedlf" ] 145then 146 # will make a DLF, but won't use it 147 MAKE_DLF_ONLY=1 148elif [ "$1" == "-usedlf" ] 149then 150 # will use a DLF made by a previous -makedlf invocation 151 USE_DLF_ONLY=1 152 ELF_FILENAME="$2" 153fi 154 155 156CAFERUN_COLDBOOT_OS_VERSION_HI=${CAFERUN_COLDBOOT_OS_VERSION:0:8} 157CAFERUN_COLDBOOT_OS_VERSION_LO=${CAFERUN_COLDBOOT_OS_VERSION:8:8} 158 159#if [ "$CAFE_BOOT_MODE" == "NAND" -a "$CAFERUN_OPTION_SOFT_LAUNCH" -eq 1 ] 160#then 161# if [ ${CAFE_DETACH_FSEMUL:-0} != 0 ] 162# then 163# "$MION_BRIDGE_TOOLS/FSEmul.exe" $BRIDGE_PARAMETERS -ip $BRIDGE_CURRENT_IP_ADDRESS -em < /dev/null &> /dev/null & 164# else 165# "$MION_BRIDGE_TOOLS/FSEmul.exe" $BRIDGE_PARAMETERS -ip $BRIDGE_CURRENT_IP_ADDRESS -em < /dev/null & 166# fi 167if [ "$CAFERUN_OPTION_SOFT_LAUNCH" -eq 1 -a "$MAKE_DLF_ONLY" -eq 0 ] 168then 169 if [ "$CAFERUN_OPTION_FAST_RELAUNCH" -eq 1 ] 170 then 171 COSDEBUG_TID_HI=${DISC_EMU_TID:0:8} 172 COSDEBUG_TID_LO=${DISC_EMU_TID:8:8} 173 174 # extract the cos arguments 175 local COS_ARGS=`sed -n 's|\(<argstr.*>\)\(.*\)\(</argstr.*>\)|\1|p' "$CAFE_CODE_DIR"/cos.xml` 176 177 cosdebug.sh cos launchex 0x$COSDEBUG_TID_HI 0x$COSDEBUG_TID_LO $COS_ARGS 178 else 179 devkitmsg "title_softlaunch $CAFERUN_COLDBOOT_OS_VERSION $DISC_EMU_TID" -v -p $SESSION_LAUNCH_CTRL_PORT 180 fi 181else 182 # Find a temporary directory 183 if [ -z "$CAFE_TEMP" ] 184 then 185 #BOOTRUN_WORK_DIR=`cygpath -m "$CYGWIN_PATH/tmp/${SESSION_PATH_PREFIX}caferun"` 186 #WUMAD_WORK_DIR=`cygpath -m "$CYGWIN_PATH/tmp/${SESSION_PATH_PREFIX}makewumaddlf"` 187 echo "CAFE_TEMP environment variable is not set." 188 exit -13 189 else 190 BOOTRUN_WORK_DIR=`cygpath -m "$CAFE_TEMP/${SESSION_PATH_PREFIX}caferun"` 191 WUMAD_WORK_DIR=`cygpath -m "$CAFE_TEMP/${SESSION_PATH_PREFIX}makewumaddlf"` 192 fi 193 initialize_work_directory "$BOOTRUN_WORK_DIR" 194 195 FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.img" 196 197 # other hardware defaults 198 if [ "${CAFE_HARDWARE:0:2}" == "ev" ] 199 then 200 FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.bu.img" 201 fi 202 203 # overrides 204 if [ "$CAFE_SECURITY" = "off" ] 205 then 206 FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.bu.img" 207 else 208 FIRMWARE_FILE="$CAFE_SLC_DIR/sys/title/$CAFERUN_COLDBOOT_OS_VERSION_HI/$CAFERUN_COLDBOOT_OS_VERSION_LO/code/fw.img" 209 fi 210 211 # recovery image requested 212 if [ "$BOOTRUN_USE_RECOVERY_IMAGE" = "1" ] 213 then 214 FIRMWARE_FILE="$CAFE_ROOT/system/bin/$TOOLCHAIN/$PLATFORM/boot/recovery.img" 215 fi 216 217 BOOT_DLF_FILE="$BOOTRUN_WORK_DIR/ppc_boot.dlf" 218 219 # create bsf_file 220 make_boot1_system_file "$BOOTRUN_WORK_DIR/ppc.bsf" 221 # create dlf_file 222 diskid="$BOOTRUN_WORK_DIR/diskid.bin" 223 install -Dp "$CAFE_ROOT/system/bin/$TOOLCHAIN/$PLATFORM/boot/diskid.bin" "$diskid" 224 OUT_FILE=`cygpath -m "$FIRMWARE_FILE"` 225 make_boot_dlf "$diskid,$BOOTRUN_WORK_DIR/ppc.bsf","$OUT_FILE" "$BOOT_DLF_FILE" 226 227 # prepare to serve from PC <-> Host Bridge 228 if [ "$DISC_EMU_TYPE" == "blockemu" ] 229 then 230 if [ "${ELF_FILENAME:(-4)}" == ".rpx" ] 231 then 232 if [ $USE_DLF_ONLY -eq 0 ] 233 then 234 source cafedevrun.sh "`cygpath -w \"$ELF_FILENAME\"`" 235 fi 236 237 if [ $MAKE_DLF_ONLY -eq 0 ] 238 then 239 source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" "`cygpath -w "${ELF_FILENAME%.rpx}.dlf"`" 240 fi 241 fi 242 else # HFIO case & HDD case & WUMAD case 243 if [ -n "$CAFE_WUMAD" ] 244 then 245 # WUMAD case 246 MAKE_WUMAD_DLF_ARGUMENTS= 247 if [ "${CAFE_WUMAD:(-6)}" == ".wumad" ] 248 then 249 # A WUMAD file was passed instead of a directory. 250 echo "Creating DLF from WUMAD file..." 251 wumadTempName=`basename $CAFE_WUMAD .wumad` 252 wumadTempDir="`cygpath -w "$WUMAD_WORK_DIR/$wumadTempName"`" 253 wumadDlfName="`cygpath -w "$wumadTempDir/$wumadTempName.dlf"`" 254 MAKE_WUMAD_DLF_ARGUMENTS="$CAFE_WUMAD $wumadTempDir $wumadDlfName" 255 else 256 # A directory was passed in. 257 echo "Creating DLF from WUMAD extracted directory..." 258 wumadTempName="" 259 wumadTempDir=$CAFE_WUMAD 260 wumadDlfName="`cygpath -w "$WUMAD_WORK_DIR/extractedWumad.dlf"`" 261 MAKE_WUMAD_DLF_ARGUMENTS="$CAFE_WUMAD $wumadDlfName" 262 fi 263 264 echo "wumadName =" $wumadTempName 265 echo "wumadDir =" $wumadTempDir 266 echo "wumadDlf =" $wumadDlfName 267 268 make_wumad_dlf $MAKE_WUMAD_DLF_ARGUMENTS 269 270 # Starts the emulation 271 echo "Calling hostrun: source hostrun " `cygpath -w "$BOOT_DLF_FILE"` $wumadDlfName 272 if [ $MAKE_DLF_ONLY -eq 0 ] 273 then 274 source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" "$wumadDlfName" 275 fi 276 else 277 # HFIO and HDD cases 278 if [ $MAKE_DLF_ONLY -eq 0 ] 279 then 280 source hostrun "`cygpath -w "$BOOT_DLF_FILE"`" 281 fi 282 fi 283 fi 284fi 285