runsim
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:11k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #!/bin/sh
  2. # Script for running PROMs and LINUX kernwls on medusa. 
  3. # Type "sim -H" for instructions.
  4. MEDUSA=${MEDUSA:-/home/rickc/official_medusa/medusa}
  5. # ------------------ err -----------------------
  6. err() {
  7. echo "ERROR - $1"
  8. exit 1
  9. }
  10. # ----------------  help ----------------------
  11. help() {
  12. cat <<END
  13. Script for running a PROM or LINUX kernel under medusa.
  14. This script creates a control file, creates links to the appropriate
  15. linux/prom files, and/or calls medusa to make simulation runs.
  16. Usage:  
  17.    Initial setup:
  18.     sim [-c <config_file>] <-p> | <-k>  [<work_dir>]
  19. -p Create PROM control file & links
  20. -k Create LINUX control file & links
  21. -c<cf> Control file name [Default: cf]
  22. <work_dir> Path to directory that contains the linux or PROM files.
  23.     The directory can be any of the following:
  24.        (linux simulations)
  25.         worktree
  26. worktree/linux
  27. any directory with vmlinux, vmlinux.sym & fprom files
  28. (prom simulations)
  29. worktree
  30. worktree/stand/arcs/IP37prom/dev
  31. any directory with fw.bin & fw.sim files
  32.     Simulations:
  33. sim  [-X <n>] [-o <output>] [-M] [<config_file>]
  34. -c<cf> Control file name [Default: cf]
  35. -M Pipe output thru fmtmedusa
  36. -o Output filename (copy of all commands/output) [Default: simout]
  37. -X Specifies number of instructions to execute [Default: 0]
  38. (Used only in auto test mode - not described here)
  39. Examples:
  40. sim -p <promtree> # create control file (cf) & links for prom simulations
  41. sim -k <linuxtree> # create control file (cf) & links for linux simulations
  42. sim -p -c cfprom # create a prom control file (cfprom) only. No links are made.
  43. sim # run medusa using previously created links &
  44. #   control file (cf).
  45. END
  46. exit 1
  47. }
  48. # ----------------------- create control file header --------------------
  49. create_cf_header() {
  50. cat <<END >>$CF
  51. #
  52. # Template for a control file for running linux kernels under medusa. 
  53. # You probably want to make mods here but this is a good starting point.
  54. #
  55. # Preferences
  56. setenv cpu_stepping A
  57. setenv exceptionPrint off
  58. setenv interrupt_messages off
  59. setenv lastPCsize 100000
  60. setenv low_power_mode on
  61. setenv partialIntelChipSet on
  62. setenv printIntelMessages off
  63. setenv prom_write_action halt
  64. setenv prom_write_messages on
  65. setenv step_quantum 100
  66. setenv swizzling on
  67. setenv tsconsole on
  68. setenv uart_echo on
  69. symbols on
  70. # IDE disk params
  71. setenv diskCylinders 611
  72. setenv bootDrive C
  73. setenv diskHeads 16
  74. setenv diskPath idedisk
  75. setenv diskPresent 1
  76. setenv diskSpt 63
  77. # Hardware config
  78. setenv coherency_type nasid
  79. setenv cpu_cache_type default
  80. setenv synergy_cache_type syn_cac_64m_8w
  81. setenv l4_uc_snoop off
  82. # Numalink config
  83. setenv route_enable on
  84. setenv network_type router # Select [xbar|router]
  85. setenv network_warning 0xff
  86. END
  87. }
  88. # ------------------ create control file entries for linux simulations -------------
  89. create_cf_linux() {
  90. cat <<END >>$CF
  91. # Kernel specific options
  92. setenv calias_size 0
  93. setenv mca_on_memory_failure off
  94. setenv LOADPC 0x00100000 # FPROM load address/entry point (8 digits!)
  95. setenv symbol_table vmlinux.sym
  96. load fprom
  97. load vmlinux
  98. # Useful breakpoints to always have set. Add more if desired.
  99. break 0xe000000000505e00 all # dispatch_to_fault_handler
  100. break panic all # stop on panic
  101. break die_if_kernel all # may as well stop
  102. END
  103. }
  104. # ------------------ create control file entries for prom simulations ---------------
  105. create_cf_prom() {
  106. SYM2=""
  107. ADDR="0x80000000ff800000"
  108. [ "$EMBEDDED_LINUX" != "0" ] || SYM2="setenv symbol_table2 vmlinux.sym"
  109. [ "$SIZE" = "8MB" ] || ADDR="0x80000000ffc00000"
  110. cat <<END >>$CF
  111. # PROM specific options
  112. setenv mca_on_memory_failure on
  113. setenv LOADPC 0x80000000ffffffb0
  114. setenv promFile fw.bin
  115. setenv promAddr $ADDR
  116. setenv symbol_table fw.sym
  117. $SYM2
  118. # Useful breakpoints to always have set. Add more if desired.
  119. break ivt_gexx  all
  120. break ivt_brk all
  121. break PROM_Panic_Spin all
  122. break PROM_Panic all
  123. break PROM_C_Panic all
  124. break fled_die all
  125. break ResetNow all
  126. break zzzbkpt all
  127. END
  128. }
  129. # ------------------ create control file entries for memory configuration -------------
  130. create_cf_memory() {
  131. cat <<END >>$CF
  132. # CPU/Memory map format:
  133. # setenv nodeN_memory_config 0xBSBSBSBS
  134. # B=banksize (0=unused, 1=64M, 2=128M, .., 5-1G, c=8M, d=16M, e=32M)
  135. # S=bank enable (0=both disable, 3=both enable, 2=bank1 enable, 1=bank0 enable)
  136. #   rightmost digits are for bank 0, the lowest address.
  137. # setenv nodeN_nasid <nasid>
  138. # specifies the NASID for the node. This is used ONLY if booting the kernel.
  139. # On PROM configurations, set to 0 - PROM will change it later.
  140. # setenv nodeN_cpu_config <cpu_mask>
  141. # Set bit number N to 1 to enable cpu N. Ex., a value of 5 enables cpu 0 & 2.
  142. #
  143. # Repeat the above 3 commands for each node.
  144. #
  145. # For kernel, default to 32MB. Although this is not a valid hardware configuration,
  146. # it runs faster on medusa. For PROM, 64MB is smallest allowed value.
  147. setenv node0_cpu_config 0x1 # Enable only cpu 0 on the node
  148. END
  149. if [ $LINUX -eq 1 ] ; then
  150. cat <<END >>$CF
  151. setenv node0_nasid 0 # cnode 0 has NASID 0
  152. setenv node0_memory_config  0xe1 # 32MB
  153. END
  154. else
  155. cat <<END >>$CF
  156. setenv node0_memory_config  0x31 # 256MB
  157. END
  158. fi
  159. }
  160. # -------------------- set links to linux files -------------------------
  161. set_linux_links() {
  162. if [ -d $D/linux/arch ] ; then
  163. D=$D/linux
  164. elif [ -d $D/arch -o -e vmlinux.sym -o -e $D/vmlinux ] ; then
  165. D=$D
  166. else
  167. err "cant determine directory for linux binaries"
  168. fi
  169. rm -rf vmlinux vmlinux.sym fprom
  170. ln -s $D/vmlinux vmlinux
  171. if [ -f $D/vmlinux.sym ] ; then
  172. ln -s $D/vmlinux.sym vmlinux.sym
  173. elif  [ -f $D/System.map ] ; then
  174. ln -s $D/System.map vmlinux.sym
  175. fi
  176. if [ -d $D/arch ] ; then
  177. ln -s $D/arch/ia64/sn/fprom/fprom fprom
  178. else
  179. ln -s $D/fprom fprom
  180. fi
  181. echo "  .. Created links to linux files"
  182. }
  183. # -------------------- set links to prom files -------------------------
  184. set_prom_links() {
  185. if [ -d $D/stand ] ; then
  186. D=$D/stand/arcs/IP37prom/dev
  187. elif [ -d $D/sal ] ; then
  188. D=$D
  189. else
  190. err "cant determine directory for PROM binaries"
  191. fi
  192. SETUP="/tmp/tmp.$$"
  193. rm -r -f $SETUP
  194. sed 's/export/setenv/' < $D/../../../../.setup | sed 's/=/ /' >$SETUP
  195. egrep -q '^ *setenv *PROMSIZE *8MB|^ *export' $SETUP
  196. if [ $? -eq 0 ] ; then
  197. SIZE="8MB"
  198. else
  199. SIZE="4MB"
  200. fi
  201. grep -q '^ *setenv *LAUNCH_VMLINUX' $SETUP
  202. EMBEDDED_LINUX=$?
  203. PRODUCT=`grep '^ *setenv *PRODUCT' $SETUP | cut -d" " -f3`
  204. rm -f fw.bin fw.map fw.sym vmlinux vmlinux.sym fprom $SETUP
  205. SDIR="${PRODUCT}${SIZE}.O"
  206. BIN="${PRODUCT}ip37prom${SIZE}"
  207. ln -s $D/$SDIR/$BIN.bin fw.bin
  208. ln -s $D/$SDIR/$BIN.map fw.map
  209. ln -s $D/$SDIR/$BIN.sym fw.sym
  210. echo "  .. Created links to $SIZE prom files"
  211. if [ $EMBEDDED_LINUX -eq 0 ] ; then
  212. ln -s $D/linux/vmlinux vmlinux
  213. ln -s $D/linux/vmlinux.sym vmlinux.sym
  214. if [ -d linux/arch ] ; then
  215. ln -s $D/linux/arch/ia64/sn/fprom/fprom fprom
  216. else
  217. ln -s $D/linux/fprom fprom
  218. fi
  219. echo "  .. Created links to embedded linux files in prom tree"
  220. fi
  221. }
  222. # --------------- start of shell script --------------------------------
  223. OUT="simout"
  224. FMTMED=0
  225. STEPCNT=0
  226. PROM=0
  227. LINUX=0
  228. NCF="cf"
  229. while getopts "HMX:c:o:pk" c ; do
  230.         case ${c} in
  231.                 H) help;;
  232. M) FMTMED=1;;
  233. X) STEPCNT=${OPTARG};;
  234. c) NCF=${OPTARG};;
  235. k) PROM=0;LINUX=1;;
  236. p) PROM=1;LINUX=0;;
  237. o) OUT=${OPTARG};;
  238.                 ?) exit 1;;
  239.         esac
  240. done
  241. shift `expr ${OPTIND} - 1`
  242. # Check if command is for creating control file and/or links to images.
  243. if [ $PROM -eq 1 -o $LINUX -eq 1 ] ; then
  244. CF=$NCF
  245. [ ! -f $CF ] || err "wont overwrite an existing control file ($CF)"
  246. if [ $# -gt 0 ] ; then
  247. D=$1
  248. [ -d $D ] || err "cannot find directory $D"
  249. [ $PROM -eq 0 ]  || set_prom_links
  250. [ $LINUX -eq 0 ] || set_linux_links
  251. fi
  252. create_cf_header
  253. [ $PROM -eq 0 ]  || create_cf_prom
  254. [ $LINUX -eq 0 ] || create_cf_linux
  255. [ ! -f ../idedisk ] || ln -s ../idedisk .
  256. create_cf_memory
  257. echo "  .. Basic control file created (in $CF). You might want to edit"
  258. echo "     this file (at least, look at it)."
  259. exit 0
  260. fi
  261. # Verify that the control file exists
  262. CF=${1:-$NCF}
  263. [ -f $CF ] || err "No control file exists. For help, type: $0 -H"
  264. # Build the .cf files from the user control file. The .cf file is
  265. # identical except that the actual start & load addresses are inserted
  266. # into the file. In addition, the FPROM commands for configuring memory
  267. # and LIDs are generated. 
  268. rm -f .cf .cf1 .cf2
  269. awk '
  270. function strtonum(n) {
  271.  if (substr(n,1,2) != "0x")
  272.   return int(n)
  273.  n = substr(n,3)
  274.  r=0
  275.  while (length(n) > 0) {
  276.   r = r*16+(index("0123456789abcdef", substr(n,1,1))-1)
  277. n = substr(n,2)
  278.  }
  279.  return r
  280. }
  281. /^#/    {next}
  282. /^$/ {next}
  283. /^setenv *LOADPC/               {loadpc = $3; next}
  284. /^setenv *node.._cpu_config/ {n=int(substr($2,5,2)); cpuconf[n] = strtonum($3); print; next}
  285. /^setenv *node.._memory_config/ {n=int(substr($2,5,2)); memconf[n] = strtonum($3); print; next}
  286. /^setenv *node.._nasid/ {n=int(substr($2,5,2)); nasid[n] = strtonum($3); print; next}
  287. /^setenv *node._cpu_config/ {n=int(substr($2,5,1)); cpuconf[n] = strtonum($3); print; next}
  288. /^setenv *node._memory_config/ {n=int(substr($2,5,1)); memconf[n] = strtonum($3); print; next}
  289. /^setenv *node._nasid/ {n=int(substr($2,5,1)); nasid[n] = strtonum($3); print; next}
  290. {print}
  291. END {
  292.  # Generate the memmap info that starts at the beginning of
  293.  # the node the kernel was loaded on.
  294.  loadnasid = nasid[0]
  295.  cnode = 0
  296.  for (i=0; i<128; i++) {
  297. if (memconf[i] != "") {
  298. printf "sm 0x%x%08x 0x%x%04x%04xn", 
  299. 2*loadnasid, 8*cnodes+8, memconf[i], cpuconf[i], nasid[i]
  300. cnodes++
  301. cpus += substr("0112122312232334", cpuconf[i]+1,1)
  302. }
  303.  }
  304.  printf "sm 0x%x00000000 0x%x%08xn", 2*loadnasid, cnodes, cpus
  305.  printf "setenv number_of_nodes %dn", cnodes
  306.  # Now set the starting PC for each cpu.
  307.  cnode = 0
  308.  lowcpu=-1
  309.  for (i=0; i<128; i++) {
  310. if (memconf[i] != "") {
  311. printf "setnode %dn", cnode
  312. conf = cpuconf[i]
  313. for (j=0; j<4; j++) {
  314. if (conf != int(conf/2)*2) {
  315.   printf "setcpu %dn", j
  316. if (length(loadpc) == 18)
  317. printf "sr pc %sn", loadpc
  318. else
  319. printf "sr pc 0x%x%sn", 2*loadnasid, substr(loadpc,3)
  320. if (lowcpu == -1)
  321. lowcpu = j
  322. }
  323. conf = int(conf/2)
  324. }
  325. cnode++
  326. }
  327.  }
  328.  printf "setnode 0n"
  329.  printf "setcpu %dn", lowcpu
  330. }
  331. ' <$CF >.cf
  332. # Now build the .cf1 & .cf2 control files.
  333. CF2_LINES="^sm |^break |^run |^si |^quit |^symbols "
  334. egrep  "$CF2_LINES" .cf >.cf2
  335. egrep -v "$CF2_LINES" .cf >.cf1
  336. if [ $STEPCNT -ne 0 ] ; then
  337. echo "s $STEPCNT" >>.cf2
  338. echo "lastpc 1000" >>.cf2
  339. echo "q" >>.cf2
  340. fi
  341. if [ -f vmlinux.sym ] ; then
  342. awk '/ _start$/ {print "sr g 9 0x" $3}' < vmlinux.sym >> .cf2
  343. fi
  344. echo "script-on $OUT" >>.cf2
  345. # Now start medusa....
  346. if [ $FMTMED -ne 0 ] ; then
  347. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 |  fmtmedusa
  348. elif [ $STEPCNT -eq 0 ] ; then
  349. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 
  350. else
  351. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 2>&1 
  352. fi