PPC 仿真环境的搭建(2) --- build_ptest

来源:互联网 发布:linux 错误日志 编辑:程序博客网 时间:2024/06/05 16:33

#!/bin/csh -f

# Powered By Michael Kang

set INFO  = "###(info) ${0}"
set ERROR = "###(error) ${0}"

if ($#argv < 2) then
   echo "${ERROR}: Should be ${0} testname -<mlittle|mbig>"
   exit 1
endif

if ("x$argv[2]" == "x-mlittle") then
   set ENDIAN = "-mlittle"
   set LDENDIAN = "-EL"
   echo "${INFO}: Little Endian MODE"
else if ("x$argv[2]" == "x-mbig") then
   set ENDIAN = "-mbig"
   set LDENDIAN = "-EB"
   echo "${INFO}: Big Endian MODE"
else
   echo "${ERROR}: Endian argument must be -mbig or -mlittle"
   exit 1   
endif

set TEST_DIR  = ../tests/$argv[1]/ppc
set LIB_DIR   = ../rte/ppc/lib
set INC_DIR   = ../rte/ppc/inc

set SRC_DIR  = ${TEST_DIR}/src
set WRK_DIR = ${TEST_DIR}/work
set MEM_DIR = ${WRK_DIR}/mem
set LOG_DIR = ${WRK_DIR}/log
set OBJ_DIR = ${WRK_DIR}/obj

## Exit if no .s, .S, or .c files found
set ASM_FILES = `find ${SRC_DIR} -name "*.s" -o -name "*.S"`
set C_FILES = `find ${SRC_DIR} -name "*.c" -print`

if ( ( "${ASM_FILES}" == "" ) && ( "${C_FILES}" == "" ) ) then
    echo "ERROR: No test files or direcory found"
        exit 1
else
        echo "${INFO}: Test files found are"
        echo $ASM_FILES
        echo $C_FILES
endif

##Create the mem, log, work dirs if they don't already exist
if ( ! -d ./mem ) then
    echo "${INFO}: Creating ./mem"
        mkdir -p ./mem
endif

if ( ! -d $MEM_DIR ) then
    echo "${INFO}: Creating $MEM_DIR"
        mkdir -p $MEM_DIR
endif
if ( ! -d $LOG_DIR) then
    echo "${INFO}: Creating $LOG_DIR"
        mkdir -p $LOG_DIR
endif
if ( ! -d $OBJ_DIR) then
    echo "${INFO}: Creating $OBJ_DIR"
        mkdir -p $OBJ_DIR
endif

## compile parameter
set   BOOT_MEM = "./mem/brom64.hex"
set   PROG_MEM = "./mem/asram64.hex"
set   CPP = powerpc-elf-cpp
set   CC = powerpc-elf-gcc
set   AS = powerpc-elf-as
set   LD = powerpc-elf-ld

 

## -ffreestanding 指明了自己实现OS kernel(即启动代码) 用最精简的basic库
set   CCFLAGS = "-mcpu=440 -I. -I${INC_DIR} -ffreestanding $ENDIAN"
set   ASFLAGS = "-m440 -I${INC_DIR} $ENDIAN"
set   CPPFLAGS = "-E -I${INC_DIR}"

set   ASM_ONLY = 1

if ( "${C_FILES}" != "" ) then
    echo "${INFO}: Compile ${C_FILES}"
    set ASM_ONLY = 0
    foreach i ($C_FILES)
      set base_name = "$i:t"
      set base_name = "$base_name:r"
      set obj_name = ${OBJ_DIR}/"${base_name}".o
      ## $CC ${CCFLAGS} -c -O $i -o $obj_name

      ## 同时编译出 C 相对照的 ASM文件

      $CC ${CCFLAGS} -c -O -g -Wa,-adlhn $i -o $obj_name > ${OBJ_DIR}/"${base_name}".s
      if ( $status ) exit 1
    end
endif 

if ( "${ASM_FILES}" != "" ) then
   echo "${INFO}: Compile ${ASM_FILES}"
   foreach i ($ASM_FILES)
       set base_name = "$i:t"
       set base_name = "$base_name:r"
       set cpp_name = ${LOG_DIR}/"${base_name}".cpp
       set obj_name = ${OBJ_DIR}/"${base_name}".o
       set lst_name = ${LOG_DIR}/"${base_name}".lst
       echo "${INFO}: $CPP : $i"
       $CPP ${CPPFLAGS} $i -o ${cpp_name}
       echo "${INFO}: $AS  : ${cpp_name}"
       $AS ${ASFLAGS} ${cpp_name} -o ${obj_name}
       if ( $status ) exit 1
   end
endif

## link mapping file
set LINK_MAP = "$INC_DIR/link.map"           # default linker
if ( -e "$TEST_DIR/src/linker.map" ) then
      set LINK_MAP = "$TEST_DIR/src/link.map"
endif

echo "${INFO}: Using link mapping file ${LINK_MAP}"

set OBJ_FILES = `find ${OBJ_DIR} -name "*.o" -print`

if ( $ASM_ONLY == 1 ) then
   echo "${INFO}: Only assembler files found: runing $LD"
else
   echo "${INFO}: At least one C source file found: running $LD"
endif

 

## 把一定要用的init.o和testcase调入内存,并在库中调用用的到的相应的子例程放入内存。库名为libmkp.a

## 库的前缀一定要为lib,全名为libxxx.a 而xxx就是要-l 指定的参数

$LD -T ${LINK_MAP} $LDENDIAN ${LIB_DIR}/init.o $OBJ_FILES -L${LIB_DIR} -lmkp  -o ${WRK_DIR}/test.exe

if ( $status ) then
   echo "${ERROR}: link of test program failed in $0:$LD"
   exit 1
endif

echo "${INFO}: create the hex images and disassembly"
powerpc-elf-objcopy -O srec ${WRK_DIR}/test.exe ${MEM_DIR}/test.rec
powerpc-elf-objdump -D $LDENDIAN ${WRK_DIR}/test.exe > ${WRK_DIR}/test.dis

##大写的D 生成额外的RODATA等section


if ( $status ) then
   echo "${ERROR}:  dump hex image and disassemble failed in $0"
   exit 1
endif
cp ${WRK_DIR}/test.dis ./mem/

echo "${INFO}: rec dump Done, please refer to ${MEM_DIR}/test.rec"
echo "${INFO}: dis-asm  Done, please refer to ./mem/test.dis"

../rte/ppc/tools/hexFormat.pl ${MEM_DIR}/test