1*62c56f98SSadaf Ebrahimi#!/bin/sh 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi# Measure memory usage of a minimal client using a small configuration 4*62c56f98SSadaf Ebrahimi# Currently hardwired to ccm-psk and suite-b, may be expanded later 5*62c56f98SSadaf Ebrahimi# 6*62c56f98SSadaf Ebrahimi# Use different build options for measuring executable size and memory usage, 7*62c56f98SSadaf Ebrahimi# since for memory we want debug information. 8*62c56f98SSadaf Ebrahimi# 9*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 10*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimiset -eu 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf EbrahimiCONFIG_H='include/mbedtls/mbedtls_config.h' 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf EbrahimiCLIENT='mini_client' 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf EbrahimiCFLAGS_EXEC='-fno-asynchronous-unwind-tables -Wl,--gc-section -ffunction-sections -fdata-sections' 19*62c56f98SSadaf EbrahimiCFLAGS_MEM=-g3 20*62c56f98SSadaf Ebrahimi 21*62c56f98SSadaf Ebrahimiif [ -r $CONFIG_H ]; then :; else 22*62c56f98SSadaf Ebrahimi echo "$CONFIG_H not found" >&2 23*62c56f98SSadaf Ebrahimi exit 1 24*62c56f98SSadaf Ebrahimifi 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimiif grep -i cmake Makefile >/dev/null; then 27*62c56f98SSadaf Ebrahimi echo "Not compatible with CMake" >&2 28*62c56f98SSadaf Ebrahimi exit 1 29*62c56f98SSadaf Ebrahimifi 30*62c56f98SSadaf Ebrahimi 31*62c56f98SSadaf Ebrahimiif [ $( uname ) != Linux ]; then 32*62c56f98SSadaf Ebrahimi echo "Only work on Linux" >&2 33*62c56f98SSadaf Ebrahimi exit 1 34*62c56f98SSadaf Ebrahimifi 35*62c56f98SSadaf Ebrahimi 36*62c56f98SSadaf Ebrahimiif git status | grep -F $CONFIG_H >/dev/null 2>&1; then 37*62c56f98SSadaf Ebrahimi echo "mbedtls_config.h not clean" >&2 38*62c56f98SSadaf Ebrahimi exit 1 39*62c56f98SSadaf Ebrahimifi 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi# make measurements with one configuration 42*62c56f98SSadaf Ebrahimi# usage: do_config <name> <unset-list> <server-args> 43*62c56f98SSadaf Ebrahimido_config() 44*62c56f98SSadaf Ebrahimi{ 45*62c56f98SSadaf Ebrahimi NAME=$1 46*62c56f98SSadaf Ebrahimi UNSET_LIST=$2 47*62c56f98SSadaf Ebrahimi SERVER_ARGS=$3 48*62c56f98SSadaf Ebrahimi 49*62c56f98SSadaf Ebrahimi echo "" 50*62c56f98SSadaf Ebrahimi echo "config-$NAME:" 51*62c56f98SSadaf Ebrahimi cp configs/config-$NAME.h $CONFIG_H 52*62c56f98SSadaf Ebrahimi scripts/config.py unset MBEDTLS_SSL_SRV_C 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi for FLAG in $UNSET_LIST; do 55*62c56f98SSadaf Ebrahimi scripts/config.py unset $FLAG 56*62c56f98SSadaf Ebrahimi done 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi grep -F SSL_MAX_CONTENT_LEN $CONFIG_H || echo 'SSL_MAX_CONTENT_LEN=16384' 59*62c56f98SSadaf Ebrahimi 60*62c56f98SSadaf Ebrahimi printf " Executable size... " 61*62c56f98SSadaf Ebrahimi 62*62c56f98SSadaf Ebrahimi make clean 63*62c56f98SSadaf Ebrahimi CFLAGS=$CFLAGS_EXEC make OFLAGS=-Os lib >/dev/null 2>&1 64*62c56f98SSadaf Ebrahimi cd programs 65*62c56f98SSadaf Ebrahimi CFLAGS=$CFLAGS_EXEC make OFLAGS=-Os ssl/$CLIENT >/dev/null 66*62c56f98SSadaf Ebrahimi strip ssl/$CLIENT 67*62c56f98SSadaf Ebrahimi stat -c '%s' ssl/$CLIENT 68*62c56f98SSadaf Ebrahimi cd .. 69*62c56f98SSadaf Ebrahimi 70*62c56f98SSadaf Ebrahimi printf " Peak ram usage... " 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimi make clean 73*62c56f98SSadaf Ebrahimi CFLAGS=$CFLAGS_MEM make OFLAGS=-Os lib >/dev/null 2>&1 74*62c56f98SSadaf Ebrahimi cd programs 75*62c56f98SSadaf Ebrahimi CFLAGS=$CFLAGS_MEM make OFLAGS=-Os ssl/$CLIENT >/dev/null 76*62c56f98SSadaf Ebrahimi cd .. 77*62c56f98SSadaf Ebrahimi 78*62c56f98SSadaf Ebrahimi ./ssl_server2 $SERVER_ARGS >/dev/null & 79*62c56f98SSadaf Ebrahimi SRV_PID=$! 80*62c56f98SSadaf Ebrahimi sleep 1; 81*62c56f98SSadaf Ebrahimi 82*62c56f98SSadaf Ebrahimi if valgrind --tool=massif --stacks=yes programs/ssl/$CLIENT >/dev/null 2>&1 83*62c56f98SSadaf Ebrahimi then 84*62c56f98SSadaf Ebrahimi FAILED=0 85*62c56f98SSadaf Ebrahimi else 86*62c56f98SSadaf Ebrahimi echo "client failed" >&2 87*62c56f98SSadaf Ebrahimi FAILED=1 88*62c56f98SSadaf Ebrahimi fi 89*62c56f98SSadaf Ebrahimi 90*62c56f98SSadaf Ebrahimi kill $SRV_PID 91*62c56f98SSadaf Ebrahimi wait $SRV_PID 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi scripts/massif_max.pl massif.out.* 94*62c56f98SSadaf Ebrahimi mv massif.out.* massif-$NAME.$$ 95*62c56f98SSadaf Ebrahimi} 96*62c56f98SSadaf Ebrahimi 97*62c56f98SSadaf Ebrahimi# preparation 98*62c56f98SSadaf Ebrahimi 99*62c56f98SSadaf EbrahimiCONFIG_BAK=${CONFIG_H}.bak 100*62c56f98SSadaf Ebrahimicp $CONFIG_H $CONFIG_BAK 101*62c56f98SSadaf Ebrahimi 102*62c56f98SSadaf Ebrahimirm -f massif.out.* 103*62c56f98SSadaf Ebrahimi 104*62c56f98SSadaf Ebrahimiprintf "building server... " 105*62c56f98SSadaf Ebrahimi 106*62c56f98SSadaf Ebrahimimake clean 107*62c56f98SSadaf Ebrahimimake lib >/dev/null 2>&1 108*62c56f98SSadaf Ebrahimi(cd programs && make ssl/ssl_server2) >/dev/null 109*62c56f98SSadaf Ebrahimicp programs/ssl/ssl_server2 . 110*62c56f98SSadaf Ebrahimi 111*62c56f98SSadaf Ebrahimiecho "done" 112*62c56f98SSadaf Ebrahimi 113*62c56f98SSadaf Ebrahimi# actual measurements 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimido_config "ccm-psk-tls1_2" \ 116*62c56f98SSadaf Ebrahimi "" \ 117*62c56f98SSadaf Ebrahimi "psk=000102030405060708090A0B0C0D0E0F" 118*62c56f98SSadaf Ebrahimi 119*62c56f98SSadaf Ebrahimido_config "suite-b" \ 120*62c56f98SSadaf Ebrahimi "MBEDTLS_BASE64_C MBEDTLS_PEM_PARSE_C" \ 121*62c56f98SSadaf Ebrahimi "" 122*62c56f98SSadaf Ebrahimi 123*62c56f98SSadaf Ebrahimi# cleanup 124*62c56f98SSadaf Ebrahimi 125*62c56f98SSadaf Ebrahimimv $CONFIG_BAK $CONFIG_H 126*62c56f98SSadaf Ebrahimimake clean 127*62c56f98SSadaf Ebrahimirm ssl_server2 128*62c56f98SSadaf Ebrahimi 129*62c56f98SSadaf Ebrahimiexit $FAILED 130