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