322 lines
6.7 KiB
Bash
322 lines
6.7 KiB
Bash
|
#!/bin/bash
|
||
|
# IBM_PROLOG_BEGIN_TAG
|
||
|
# This is an automatically generated prolog.
|
||
|
#
|
||
|
# $Source: fcp/fcp.sh $
|
||
|
#
|
||
|
# OpenPOWER FFS Project
|
||
|
#
|
||
|
# Contributors Listed Below - COPYRIGHT 2014,2015
|
||
|
# [+] International Business Machines Corp.
|
||
|
#
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||
|
# implied. See the License for the specific language governing
|
||
|
# permissions and limitations under the License.
|
||
|
#
|
||
|
# IBM_PROLOG_END_TAG
|
||
|
#
|
||
|
# File: ffs cmdline test script
|
||
|
# Author: Shaun wetzstein <shaun@us.ibm.com>
|
||
|
# Date: 02/06/13
|
||
|
#
|
||
|
# Todo:
|
||
|
# 1) function to check syntax of each command
|
||
|
|
||
|
CP=cp
|
||
|
RM=rm
|
||
|
FFS=ffs
|
||
|
FCP=fcp
|
||
|
MKDIR=mkdir
|
||
|
GREP=grep
|
||
|
HEAD=head
|
||
|
HEX=hexdump
|
||
|
CRC=crc32
|
||
|
DD=dd
|
||
|
DIFF=diff
|
||
|
CAT=cat
|
||
|
CP=cp
|
||
|
TRUNC=truncate
|
||
|
|
||
|
TARGET=test.nor
|
||
|
COPY=copy.nor
|
||
|
TMP=/tmp/fcp.$$
|
||
|
URANDOM=/dev/urandom
|
||
|
POFFSET="0x00000,0x10000"
|
||
|
|
||
|
FAIL=1
|
||
|
PASS=0
|
||
|
|
||
|
KB=$((1*1024))
|
||
|
MB=$(($KB*1024))
|
||
|
|
||
|
function expect()
|
||
|
{
|
||
|
local expect=${1}
|
||
|
shift
|
||
|
local command=${*}
|
||
|
eval $command
|
||
|
local actual=${?}
|
||
|
|
||
|
if [[ ${expect} -eq ${actual} ]]; then
|
||
|
echo "[PASSED] rc: '${command}' ===> expect=${expect}, actual=${actual}" >&2
|
||
|
else
|
||
|
echo "[FAILED] rc: '${command}' ===> expect=${expect}, actual=${actual}" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function pass()
|
||
|
{
|
||
|
expect ${PASS} ${*}
|
||
|
}
|
||
|
|
||
|
function fail()
|
||
|
{
|
||
|
expect ${FAIL} ${*}
|
||
|
}
|
||
|
|
||
|
function size()
|
||
|
{
|
||
|
local size=$(stat -L -c %s ${2})
|
||
|
if [[ ${1} == ${size} ]]; then
|
||
|
echo "[PASSED] size: '${2}' ===> expect=${1}, actual=${size}"
|
||
|
else
|
||
|
echo "[FAILED] size: '${2}' ===> expect=${1}, actual=${size}"
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function crc()
|
||
|
{
|
||
|
local crc=$(${CRC} ${2})
|
||
|
if [[ ${1} == ${crc} ]]; then
|
||
|
echo "[PASSED] crc: '${2}' ===> expect=${1}, actual=${crc}"
|
||
|
else
|
||
|
echo "[FAILED] crc: '${2}' ===> expect=${1}, actual=${crc}"
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function setup()
|
||
|
{
|
||
|
local target=${TMP}/${TARGET}
|
||
|
local output=${TMP}/${TARGET}.txt
|
||
|
|
||
|
pass ${RM} -rf ${TMP}
|
||
|
pass ${MKDIR} -p ${TMP}
|
||
|
pass ${RM} -f ${target}
|
||
|
|
||
|
pass ${FFS} -t ${target} -s 64M -b 64K -p 0x3F0000 -C
|
||
|
pass ${FFS} -t ${target} -s 64M -b 64K -p 0x7F0000 -C
|
||
|
|
||
|
for ((j=0; j<2; j++)); do
|
||
|
local name="logical${j}"
|
||
|
local base=$((${j}*$MB*4))
|
||
|
|
||
|
pass ${FFS} -t ${target} -n ${name} -g 0 -l -A
|
||
|
pass ${FFS} -t ${target} -n ${name} -L > ${output}
|
||
|
|
||
|
pass ${GREP} ${name} ${output} > /dev/null
|
||
|
pass ${GREP} "l-----" ${output} > /dev/null
|
||
|
|
||
|
for ((i=0; i<4; i++)); do
|
||
|
local full="${name}/entry${i}"
|
||
|
local offset=$((${base}+${i}*$MB))
|
||
|
|
||
|
if [[ ${i} -eq 3 ]]; then
|
||
|
local size=$(($MB-64*${KB}))
|
||
|
else
|
||
|
local size=$MB
|
||
|
fi
|
||
|
|
||
|
pass ${FFS} -t ${target} -o ${offset} -s ${size} \
|
||
|
-g 0 -n ${full} -a ${i} -A
|
||
|
|
||
|
pass ${FFS} -t ${target} -n ${full} -L > ${output}
|
||
|
pass ${GREP} ${full} ${output} > /dev/null
|
||
|
pass ${GREP} "d-----" ${output} > /dev/null
|
||
|
|
||
|
local range=$(printf "%.8x-%.8x" ${offset} \
|
||
|
$((${offset}+${size}-1)))
|
||
|
|
||
|
pass ${GREP} ${range} ${output} > /dev/null
|
||
|
pass ${GREP} $(printf "%x" ${size}) ${output} > \
|
||
|
/dev/null
|
||
|
pass ${RM} -f ${output}
|
||
|
done
|
||
|
done
|
||
|
}
|
||
|
|
||
|
function cleanup()
|
||
|
{
|
||
|
pass ${RM} -rf ${TMP}
|
||
|
}
|
||
|
|
||
|
function erase()
|
||
|
{
|
||
|
local target=${TMP}/${TARGET}
|
||
|
local name="logical"
|
||
|
|
||
|
for ((i=0; i<4; i++)); do
|
||
|
local output=${TMP}/entry${i}.hex
|
||
|
local full=${name}0/entry${i}
|
||
|
|
||
|
pass ${FCP} ${target}:${full} -E ${i}
|
||
|
pass ${FCP} -T ${target}:${full}
|
||
|
pass ${FCP} -R ${target}:${full} - | ${HEX} -C > ${output}
|
||
|
|
||
|
local p=$(printf "%2.2x %2.2x %2.2x %2.2x" $i $i $i $i)
|
||
|
pass ${GREP} \"${p} ${p}\" ${output}
|
||
|
|
||
|
pass ${RM} -f ${output}
|
||
|
done
|
||
|
|
||
|
pass ${FCP} ${target}:${name}0 -E 0x00
|
||
|
pass ${FCP} ${target}:${name}1 -E 0x00
|
||
|
}
|
||
|
|
||
|
function write()
|
||
|
{
|
||
|
local target=${TMP}/${TARGET}
|
||
|
local output=${TMP}/${TARGET}.txt
|
||
|
|
||
|
local name="logical"
|
||
|
local input=${TMP}/write.in
|
||
|
local output=${TMP}/write.out
|
||
|
|
||
|
if [[ -z "${1}" ]]; then
|
||
|
local block=$((64*KB))
|
||
|
else
|
||
|
local block=${1}
|
||
|
fi
|
||
|
|
||
|
for ((i=0; i<4; i++)); do
|
||
|
if [[ ${i} -eq 3 ]]; then
|
||
|
local size=$(($MB-64*${KB}))
|
||
|
else
|
||
|
local size=$MB
|
||
|
fi
|
||
|
|
||
|
local count=$((${size}/$block))
|
||
|
|
||
|
for ((c=1; c<=${count}; c++)); do
|
||
|
pass ${DD} if=${URANDOM} of=${input} bs=${block} \
|
||
|
count=${c} 2> /dev/null
|
||
|
|
||
|
pass ${CRC} ${input} > ${output}
|
||
|
local crc=$(${CAT} ${output})
|
||
|
local full=${name}0/entry${i}
|
||
|
|
||
|
pass ${FCP} ${target}:${full} -E 0x00
|
||
|
pass ${FCP} -W ${input} ${target}:${full}
|
||
|
pass ${FCP} ${target}:${full} -U 0=${crc}
|
||
|
pass ${FCP} ${target}:${full} -R - -f | cat > ${output}
|
||
|
|
||
|
size $((${c}*${block})) ${output}
|
||
|
crc ${crc} ${output}
|
||
|
|
||
|
local crc=$(printf "%x" ${crc})
|
||
|
pass "${FCP} ${target}:${full} -o 0x3F0000 -U 0 | \
|
||
|
${GREP} ${crc}" > /dev/null
|
||
|
pass "${FCP} ${target}:${full} -o 0x7F0000 -U 0 | \
|
||
|
${GREP} ${crc}" > /dev/null
|
||
|
|
||
|
pass ${RM} -f ${input} ${output}
|
||
|
done
|
||
|
done
|
||
|
}
|
||
|
|
||
|
function copy()
|
||
|
{
|
||
|
local src=${TMP}/${TARGET}
|
||
|
local dst=${TMP}/${TARGET}.copy
|
||
|
|
||
|
local input=${TMP}/copy.in
|
||
|
local output=${TMP}/copy.out
|
||
|
|
||
|
if [[ -z "${1}" ]]; then
|
||
|
local block=$((64*KB))
|
||
|
else
|
||
|
local block=${1}
|
||
|
fi
|
||
|
|
||
|
pass ${TRUNC} -s $(stat -L -c %s ${src}) ${dst}
|
||
|
|
||
|
for ((i=0; i<4; i++)); do
|
||
|
if [[ ${i} -eq 3 ]]; then
|
||
|
local size=$(($MB-64*${KB}))
|
||
|
else
|
||
|
local size=$MB
|
||
|
fi
|
||
|
|
||
|
local count=$((${size}/$block))
|
||
|
|
||
|
for ((c=1; c<=${count}; c++)); do
|
||
|
pass ${DD} if=${URANDOM} of=${input} bs=${block} count=${c} 2> /dev/null
|
||
|
local crc=$(${CRC} ${input})
|
||
|
|
||
|
local name="logical0/entry${i}"
|
||
|
|
||
|
pass ${FCP} ${src}:${name} -E 0x00
|
||
|
pass ${FCP} ${input} ${src}:${name} -W
|
||
|
pass ${FCP} ${src}:${name} ${output}.src -f -R
|
||
|
pass ${FCP} ${src}:${name} -U 0 0=${crc}
|
||
|
|
||
|
pass ${FCP} ${src}:${name} ${dst}:${name} -C -v -f
|
||
|
pass ${FCP} ${src}:${name} ${dst}:${name} -M -v
|
||
|
|
||
|
pass ${FCP} ${dst}:${name} ${output}.dst -R -f
|
||
|
size $((${c}*${block})) ${output}.src
|
||
|
size $((${c}*${block})) ${output}.dst
|
||
|
crc ${crc} ${output}.src
|
||
|
crc ${crc} ${output}.dst
|
||
|
pass ${DIFF} ${output}.src ${output}.dst
|
||
|
|
||
|
local crc=$(printf "%x" ${crc})
|
||
|
pass "${FCP} ${dst}:${name} -o 0x3F0000 -U 0 | \
|
||
|
${GREP} ${crc}" > /dev/null
|
||
|
pass "${FCP} ${dst}:${name} -o 0x7F0000 -U 0 | \
|
||
|
${GREP} ${crc}" > /dev/null
|
||
|
|
||
|
pass ${RM} -f ${input}* ${output}*
|
||
|
done
|
||
|
done
|
||
|
|
||
|
pass ${FCP} ${src}":logical0" ${src}":logical1" -C -v # logical mirror
|
||
|
pass ${FCP} ${src}":logical1" ${dst}":logical1" -C -v # logical copy
|
||
|
|
||
|
expect 2 ${DIFF} ${src} ${dst}
|
||
|
}
|
||
|
|
||
|
function main()
|
||
|
{
|
||
|
erase
|
||
|
write $((21*$KB))
|
||
|
write $((64*$KB))
|
||
|
copy $((21*$KB))
|
||
|
copy $((64*$KB))
|
||
|
}
|
||
|
|
||
|
setup
|
||
|
if [[ -z "${1:-}" ]]; then
|
||
|
main
|
||
|
else
|
||
|
case "$1" in
|
||
|
erase ) erase ;;
|
||
|
write ) write ;;
|
||
|
copy ) copy ;;
|
||
|
* ) echo "$1 not implemented"; exit 1 ;;
|
||
|
esac
|
||
|
exit 0;
|
||
|
fi
|
||
|
cleanup
|