runsim
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

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. # Numalink config
  82. setenv route_enable on
  83. setenv network_type xbar # Select [xbar|router]
  84. setenv network_warning 0xff
  85. END
  86. }
  87. # ------------------ create control file entries for linux simulations -------------
  88. create_cf_linux() {
  89. cat <<END >>$CF
  90. # Kernel specific options
  91. setenv mca_on_memory_failure off
  92. setenv LOADPC 0x00100000 # FPROM load address/entry point (8 digits!)
  93. sr g 9 0xe000000000520000 # Kernel entry point
  94. setenv symbol_table vmlinux.sym
  95. load fprom
  96. load vmlinux
  97. # Useful breakpoints to always have set. Add more if desired.
  98. break 0xe000000000505e00 all # dispatch_to_fault_handler
  99. break panic all # stop on panic
  100. break die_if_kernel all # may as well stop
  101. END
  102. }
  103. # ------------------ create control file entries for prom simulations ---------------
  104. create_cf_prom() {
  105. SYM2=""
  106. ADDR="0x80000000ff800000"
  107. [ "$EMBEDDED_LINUX" != "0" ] || SYM2="setenv symbol_table2 vmlinux.sym"
  108. [ "$SIZE" = "8MB" ] || ADDR="0x80000000ffc00000"
  109. cat <<END >>$CF
  110. # PROM specific options
  111. setenv mca_on_memory_failure on
  112. setenv LOADPC 0x80000000ffffffb0
  113. setenv promFile fw.bin
  114. setenv promAddr $ADDR
  115. setenv symbol_table fw.sym
  116. $SYM2
  117. # Useful breakpoints to always have set. Add more if desired.
  118. break Pr_ivt_gexx  all
  119. break Pr_ivt_brk all
  120. break Pr_PROM_Panic_Spin all
  121. break Pr_PROM_Panic all
  122. break Pr_PROM_C_Panic all
  123. break Pr_fled_die all
  124. break Pr_ResetNow all
  125. break Pr_zzzbkpt all
  126. END
  127. }
  128. # ------------------ create control file entries for memory configuration -------------
  129. create_cf_memory() {
  130. cat <<END >>$CF
  131. # CPU/Memory map format:
  132. # setenv nodeN_memory_config 0xBSBSBSBS
  133. # B=banksize (0=unused, 1=64M, 2=128M, .., 5-1G, c=8M, d=16M, e=32M)
  134. # S=bank enable (0=both disable, 3=both enable, 2=bank1 enable, 1=bank0 enable)
  135. #   rightmost digits are for bank 0, the lowest address.
  136. # setenv nodeN_nasid <nasid>
  137. # specifies the NASID for the node. This is used ONLY if booting the kernel.
  138. # On PROM configurations, set to 0 - PROM will change it later.
  139. # setenv nodeN_cpu_config <cpu_mask>
  140. # Set bit number N to 1 to enable cpu N. Ex., a value of 5 enables cpu 0 & 2.
  141. #
  142. # Repeat the above 3 commands for each node.
  143. #
  144. # For kernel, default to 32MB. Although this is not a valid hardware configuration,
  145. # it runs faster on medusa. For PROM, 64MB is smallest allowed value.
  146. setenv node0_cpu_config 0x1 # Enable only cpu 0 on the node
  147. END
  148. if [ $LINUX -eq 1 ] ; then
  149. cat <<END >>$CF
  150. setenv node0_nasid 0 # cnode 0 has NASID 0
  151. setenv node0_memory_config  0xe1 # 32MB
  152. END
  153. else
  154. cat <<END >>$CF
  155. setenv node0_memory_config  0x11 # 64MB
  156. END
  157. fi
  158. }
  159. # -------------------- set links to linux files -------------------------
  160. set_linux_links() {
  161. if [ -d $D/linux/arch ] ; then
  162. D=$D/linux
  163. elif [ -d $D/arch -o -e vmlinux.sym ] ; then
  164. D=$D
  165. else
  166. err "cant determine directory for linux binaries"
  167. fi
  168. rm -rf vmlinux vmlinux.sym fprom
  169. ln -s $D/vmlinux vmlinux
  170. ln -s $D/vmlinux.sym vmlinux.sym
  171. if [ -d $D/arch ] ; then
  172. ln -s $D/arch/ia64/sn/fprom/fprom fprom
  173. else
  174. ln -s $D/fprom fprom
  175. fi
  176. echo "  .. Created links to linux files"
  177. }
  178. # -------------------- set links to prom files -------------------------
  179. set_prom_links() {
  180. if [ -d $D/stand ] ; then
  181. D=$D/stand/arcs/IP37prom/dev
  182. elif [ -d $D/sal ] ; then
  183. D=$D
  184. else
  185. err "cant determine directory for PROM binaries"
  186. fi
  187. SETUP="$D/../../../../.setup"
  188. grep -q '^ *setenv *PROMSIZE *8MB' $SETUP
  189. if [ $? -eq 0 ] ; then
  190. SIZE="8MB"
  191. else
  192. SIZE="4MB"
  193. fi
  194. grep -q '^ *setenv *LAUNCH_VMLINUX' $SETUP
  195. EMBEDDED_LINUX=$?
  196. rm -f fw.bin fw.map fw.sym vmlinux vmlinux.sym fprom
  197. SDIR="SN1IA${SIZE}.O"
  198. BIN="SN1IAip37prom${SIZE}"
  199. ln -s $D/$SDIR/$BIN.bin fw.bin
  200. ln -s $D/$SDIR/$BIN.map fw.map
  201. ln -s $D/$SDIR/$BIN.sym fw.sym
  202. echo "  .. Created links to $SIZE prom files"
  203. if [ $EMBEDDED_LINUX -eq 0 ] ; then
  204. ln -s $D/linux/vmlinux vmlinux
  205. ln -s $D/linux/vmlinux.sym vmlinux.sym
  206. if [ -d linux/arch ] ; then
  207. ln -s $D/linux/arch/ia64/sn/fprom/fprom fprom
  208. else
  209. ln -s $D/linux/fprom fprom
  210. fi
  211. echo "  .. Created links to embedded linux files in prom tree"
  212. fi
  213. }
  214. # --------------- start of shell script --------------------------------
  215. OUT="simout"
  216. FMTMED=0
  217. STEPCNT=0
  218. PROM=0
  219. LINUX=0
  220. NCF="cf"
  221. while getopts "HMX:c:o:pk" c ; do
  222.         case ${c} in
  223.                 H) help;;
  224. M) FMTMED=1;;
  225. X) STEPCNT=${OPTARG};;
  226. c) NCF=${OPTARG};;
  227. k) PROM=0;LINUX=1;;
  228. p) PROM=1;LINUX=0;;
  229. o) OUT=${OPTARG};;
  230.                 ?) exit 1;;
  231.         esac
  232. done
  233. shift `expr ${OPTIND} - 1`
  234. # Check if command is for creating control file and/or links to images.
  235. if [ $PROM -eq 1 -o $LINUX -eq 1 ] ; then
  236. CF=$NCF
  237. [ ! -f $CF ] || err "wont overwrite an existing control file ($CF)"
  238. if [ $# -gt 0 ] ; then
  239. D=$1
  240. [ -d $D ] || err "cannot find directory $D"
  241. [ $PROM -eq 0 ]  || set_prom_links
  242. [ $LINUX -eq 0 ] || set_linux_links
  243. fi
  244. create_cf_header
  245. [ $PROM -eq 0 ]  || create_cf_prom
  246. [ $LINUX -eq 0 ] || create_cf_linux
  247. create_cf_memory
  248. echo "  .. Basic control file created (in $CF). You might want to edit"
  249. echo "     this file (at least, look at it)."
  250. exit 0
  251. fi
  252. # Verify that the control file exists
  253. CF=${1:-$NCF}
  254. [ -f $CF ] || err "No control file exists. For help, type: $0 -H"
  255. # Build the .cf files from the user control file. The .cf file is
  256. # identical except that the actual start & load addresses are inserted
  257. # into the file. In addition, the FPROM commands for configuring memory
  258. # and LIDs are generated. 
  259. rm -f .cf .cf1 .cf2
  260. awk '
  261. function strtonum(n) {
  262.  if (substr(n,1,2) != "0x")
  263.   return int(n)
  264.  n = substr(n,3)
  265.  r=0
  266.  while (length(n) > 0) {
  267.   r = r*16+(index("0123456789abcdef", substr(n,1,1))-1)
  268. n = substr(n,2)
  269.  }
  270.  return r
  271. }
  272. /^#/    {next}
  273. /^$/ {next}
  274. /^setenv *LOADPC/               {loadpc = $3; next}
  275. /^setenv *node._cpu_config/ {n=int(substr($2,5,1)); cpuconf[n] = strtonum($3); print; next}
  276. /^setenv *node._memory_config/ {n=int(substr($2,5,1)); memconf[n] = strtonum($3); print; next}
  277. /^setenv *node._nasid/ {n=int(substr($2,5,1)); nasid[n] = strtonum($3); print; next}
  278. {print}
  279. END {
  280.  # Generate the memmap info that starts at the beginning of
  281.  # the node the kernel was loaded on.
  282.  loadnasid = nasid[0]
  283.  cnode = 0
  284.  for (i=0; i<128; i++) {
  285. if (memconf[i] != "") {
  286. printf "sm 0x%x%08x 0x%x%04x%04xn", 
  287. 2*loadnasid, 8*cnodes+8, memconf[i], cpuconf[i], nasid[i]
  288. cnodes++
  289. cpus += substr("0112122312232334", cpuconf[i]+1,1)
  290. }
  291.  }
  292.  printf "sm 0x%x00000000 0x%x%08xn", 2*loadnasid, cnodes, cpus
  293.  printf "setenv number_of_nodes %dn", cnodes
  294.  # Now set the starting PC for each cpu.
  295.  cnode = 0
  296.  lowcpu=-1
  297.  for (i=0; i<128; i++) {
  298. if (memconf[i] != "") {
  299. printf "setnode %dn", cnode
  300. conf = cpuconf[i]
  301. for (j=0; j<4; j++) {
  302. if (conf != int(conf/2)*2) {
  303.   printf "setcpu %dn", j
  304. if (length(loadpc) == 18)
  305. printf "sr pc %sn", loadpc
  306. else
  307. printf "sr pc 0x%x%sn", 2*loadnasid, substr(loadpc,3)
  308. if (lowcpu == -1)
  309. lowcpu = j
  310. }
  311. conf = int(conf/2)
  312. }
  313. cnode++
  314. }
  315.  }
  316.  printf "setnode 0n"
  317.  printf "setcpu %dn", lowcpu
  318. }
  319. ' <$CF >.cf
  320. # Now build the .cf1 & .cf2 control files.
  321. CF2_LINES="^sm |^break |^run |^si |^quit |^symbols "
  322. egrep  "$CF2_LINES" .cf >.cf2
  323. egrep -v "$CF2_LINES" .cf >.cf1
  324. if [ $STEPCNT -ne 0 ] ; then
  325. echo "s $STEPCNT" >>.cf2
  326. echo "lastpc 1000" >>.cf2
  327. echo "q" >>.cf2
  328. fi
  329. echo "script-on $OUT" >>.cf2
  330. # Now start medusa....
  331. if [ $FMTMED -ne 0 ] ; then
  332. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 |  fmtmedusa
  333. elif [ $STEPCNT -eq 0 ] ; then
  334. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 
  335. else
  336. $MEDUSA -system mpsn1 -c .cf1 -i .cf2 2>&1 
  337. fi