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