From nobody Tue May 7 18:03:43 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1510214165734986.5828167399919; Wed, 8 Nov 2017 23:56:05 -0800 (PST) Received: from localhost ([::1]:35639 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eChgy-0004JS-Qg for importer@patchew.org; Thu, 09 Nov 2017 02:56:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57036) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eChdr-0002W5-14 for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eChdp-0000W9-Ca for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:51 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:55979) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eChdp-0000Vi-2w for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:49 -0500 Received: by mail-wm0-x242.google.com with SMTP id b189so757844wmd.4 for ; Wed, 08 Nov 2017 23:52:48 -0800 (PST) Received: from cloudburst.twiddle.net (93-45-2-58.ip99.fastwebnet.it. [93.45.2.58]) by smtp.gmail.com with ESMTPSA id g65sm2856109wmf.5.2017.11.08.23.52.46 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 08 Nov 2017 23:52:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bfAQ2yQr6PvXFnkTZcTggGt9Hq3L4y7mdonLePtVO7c=; b=EpZZtnrzlTEXPU1lav+IFBZNwoASQJdiYONL4OFZgkRQzAi0uM3P3g5MBhekcVeHe9 HFPzimh9bD/8Q5018AjaOrkzukyKplVUIAuYh5HAQVmqX1oH1XUsMM//sZzl10Aa/q4x VsDGOUpfJZqN285KTfzRL5/GHL2G+lGjbyFPI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bfAQ2yQr6PvXFnkTZcTggGt9Hq3L4y7mdonLePtVO7c=; b=WhXtjYWYkh9DQ8ZapBg6UENPDq1x6RONin6NnRuBSCMJnUmM9xBn/ovbesXMjVx5aP nqXZWFEjCDfTs4lSQLj0E92B5yKGAboKJ6S+GZ67PIb3qNhZdiay5AEoeffCHb/jeOCh 8uLsIWwQNzI+KRIC1XHZo0/DpaVf/eMc2GLbtS1VvCTEa/1unZ+GlG2jPFG7qOTcpHHu zO6svao7rsyJ/M9zARRQpOVD+4S65g6eo1fREshuoPRbBLTqx/7mCFwbJdGAIw7VX5mb 8tehDimD5O58/bcyf6943LYCuhNmmtv7K1U2xM/y3m/djX3p/7dq/WXwKpMJHi5USr+l Qf3w== X-Gm-Message-State: AJaThX5scXtNvu3d0bKsGyeS42X91x1bqCFVJOhLgtN13zUFnydYPT74 YJI/BrzQEzra0O/wMCH7rdB0uIFmyeg= X-Google-Smtp-Source: AGs4zMYdmLTCmltddoGJRAuAGzntk/LobFZz9QgeQuBqxbKbRinWsGMG6080wPvDoHxyyrr/ct/rxg== X-Received: by 10.28.147.84 with SMTP id v81mr2228263wmd.102.1510213967678; Wed, 08 Nov 2017 23:52:47 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 9 Nov 2017 08:52:42 +0100 Message-Id: <20171109075243.4794-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171109075243.4794-1-richard.henderson@linaro.org> References: <20171109075243.4794-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PULL 1/2] disas: Dump insn bytes along with capstone disassembly X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This feature is present for some targets in the bfd disassembler(s). Implement it generically for all capstone users. Suggested-by: Peter Maydell Signed-off-by: Richard Henderson --- include/disas/bfd.h | 2 ++ disas.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++---= ---- target/arm/cpu.c | 6 ++++ target/i386/cpu.c | 2 ++ 4 files changed, 94 insertions(+), 12 deletions(-) diff --git a/include/disas/bfd.h b/include/disas/bfd.h index 1f88c9e9d5..46c7ec3376 100644 --- a/include/disas/bfd.h +++ b/include/disas/bfd.h @@ -374,6 +374,8 @@ typedef struct disassemble_info { /* Options for Capstone disassembly. */ int cap_arch; int cap_mode; + int cap_insn_unit; + int cap_insn_split; =20 } disassemble_info; =20 diff --git a/disas.c b/disas.c index 92b389d25f..d4ad1089ef 100644 --- a/disas.c +++ b/disas.c @@ -220,6 +220,77 @@ static cs_err cap_disas_start(disassemble_info *info, = csh *handle) return CS_ERR_OK; } =20 +static void cap_dump_insn_units(disassemble_info *info, cs_insn *insn, + int i, int n) +{ + fprintf_function print =3D info->fprintf_func; + FILE *stream =3D info->stream; + + switch (info->cap_insn_unit) { + case 4: + if (info->endian =3D=3D BFD_ENDIAN_BIG) { + for (; i < n; i +=3D 4) { + print(stream, " %08x", ldl_be_p(insn->bytes + i)); + + } + } else { + for (; i < n; i +=3D 4) { + print(stream, " %08x", ldl_le_p(insn->bytes + i)); + } + } + break; + + case 2: + if (info->endian =3D=3D BFD_ENDIAN_BIG) { + for (; i < n; i +=3D 2) { + print(stream, " %04x", lduw_be_p(insn->bytes + i)); + } + } else { + for (; i < n; i +=3D 2) { + print(stream, " %04x", lduw_le_p(insn->bytes + i)); + } + } + break; + + default: + for (; i < n; i++) { + print(stream, " %02x", insn->bytes[i]); + } + break; + } +} + +static void cap_dump_insn(disassemble_info *info, cs_insn *insn) +{ + fprintf_function print =3D info->fprintf_func; + int i, n, split; + + print(info->stream, "0x%08" PRIx64 ": ", insn->address); + + n =3D insn->size; + split =3D info->cap_insn_split; + + /* Dump the first SPLIT bytes of the instruction. */ + cap_dump_insn_units(info, insn, 0, MIN(n, split)); + + /* Add padding up to SPLIT so that mnemonics line up. */ + if (n < split) { + int width =3D (split - n) / info->cap_insn_unit; + width *=3D (2 * info->cap_insn_unit + 1); + print(info->stream, "%*s", width, ""); + } + + /* Print the actual instruction. */ + print(info->stream, " %-8s %s\n", insn->mnemonic, insn->op_str); + + /* Dump any remaining part of the insn on subsequent lines. */ + for (i =3D split; i < n; i +=3D split) { + print(info->stream, "0x%08" PRIx64 ": ", insn->address + i); + cap_dump_insn_units(info, insn, i, MIN(n, i + split)); + print(info->stream, "\n"); + } +} + /* Disassemble SIZE bytes at PC for the target. */ static bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t s= ize) { @@ -242,10 +313,7 @@ static bool cap_disas_target(disassemble_info *info, u= int64_t pc, size_t size) size -=3D tsize; =20 while (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) { - (*info->fprintf_func)(info->stream, - "0x%08" PRIx64 ": %-12s %s\n", - insn->address, insn->mnemonic, - insn->op_str); + cap_dump_insn(info, insn); } =20 /* If the target memory is not consumed, go back for more... */ @@ -290,10 +358,7 @@ static bool cap_disas_host(disassemble_info *info, voi= d *code, size_t size) pc =3D (uintptr_t)code; =20 while (cs_disasm_iter(handle, &cbuf, &size, &pc, insn)) { - (*info->fprintf_func)(info->stream, - "0x%08" PRIx64 ": %-12s %s\n", - insn->address, insn->mnemonic, - insn->op_str); + cap_dump_insn(info, insn); } if (size !=3D 0) { (*info->fprintf_func)(info->stream, @@ -337,10 +402,7 @@ static bool cap_disas_monitor(disassemble_info *info, = uint64_t pc, int count) csize +=3D tsize; =20 if (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) { - (*info->fprintf_func)(info->stream, - "0x%08" PRIx64 ": %-12s %s\n", - insn->address, insn->mnemonic, - insn->op_str); + cap_dump_insn(info, insn); if (--count <=3D 0) { break; } @@ -376,6 +438,8 @@ void target_disas(FILE *out, CPUState *cpu, target_ulon= g code, s.info.print_address_func =3D generic_print_address; s.info.cap_arch =3D -1; s.info.cap_mode =3D 0; + s.info.cap_insn_unit =3D 4; + s.info.cap_insn_split =3D 4; =20 #ifdef TARGET_WORDS_BIGENDIAN s.info.endian =3D BFD_ENDIAN_BIG; @@ -427,6 +491,8 @@ void disas(FILE *out, void *code, unsigned long size) s.info.buffer_length =3D size; s.info.cap_arch =3D -1; s.info.cap_mode =3D 0; + s.info.cap_insn_unit =3D 4; + s.info.cap_insn_split =3D 4; =20 #ifdef HOST_WORDS_BIGENDIAN s.info.endian =3D BFD_ENDIAN_BIG; @@ -440,11 +506,15 @@ void disas(FILE *out, void *code, unsigned long size) print_insn =3D print_insn_i386; s.info.cap_arch =3D CS_ARCH_X86; s.info.cap_mode =3D CS_MODE_32; + s.info.cap_insn_unit =3D 1; + s.info.cap_insn_split =3D 8; #elif defined(__x86_64__) s.info.mach =3D bfd_mach_x86_64; print_insn =3D print_insn_i386; s.info.cap_arch =3D CS_ARCH_X86; s.info.cap_mode =3D CS_MODE_64; + s.info.cap_insn_unit =3D 1; + s.info.cap_insn_split =3D 8; #elif defined(_ARCH_PPC) s.info.disassembler_options =3D (char *)"any"; print_insn =3D print_insn_ppc; @@ -537,6 +607,8 @@ void monitor_disas(Monitor *mon, CPUState *cpu, s.info.buffer_vma =3D pc; s.info.cap_arch =3D -1; s.info.cap_mode =3D 0; + s.info.cap_insn_unit =3D 4; + s.info.cap_insn_split =3D 4; =20 #ifdef TARGET_WORDS_BIGENDIAN s.info.endian =3D BFD_ENDIAN_BIG; diff --git a/target/arm/cpu.c b/target/arm/cpu.c index 47c8b2a85c..7f7a3d1e32 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -489,13 +489,19 @@ static void arm_disas_set_info(CPUState *cpu, disasse= mble_info *info) info->print_insn =3D print_insn_arm_a64; #endif info->cap_arch =3D CS_ARCH_ARM64; + info->cap_insn_unit =3D 4; + info->cap_insn_split =3D 4; } else { int cap_mode; if (env->thumb) { info->print_insn =3D print_insn_thumb1; + info->cap_insn_unit =3D 2; + info->cap_insn_split =3D 4; cap_mode =3D CS_MODE_THUMB; } else { info->print_insn =3D print_insn_arm; + info->cap_insn_unit =3D 4; + info->cap_insn_split =3D 4; cap_mode =3D CS_MODE_ARM; } if (arm_feature(env, ARM_FEATURE_V8)) { diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 6f21a5e518..1edcf29e27 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -4109,6 +4109,8 @@ static void x86_disas_set_info(CPUState *cs, disassem= ble_info *info) info->cap_mode =3D (env->hflags & HF_CS64_MASK ? CS_MODE_64 : env->hflags & HF_CS32_MASK ? CS_MODE_32 : CS_MODE_16); + info->cap_insn_unit =3D 1; + info->cap_insn_split =3D 8; } =20 static Property x86_cpu_properties[] =3D { --=20 2.13.6 From nobody Tue May 7 18:03:43 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1510214072310512.6837091754539; Wed, 8 Nov 2017 23:54:32 -0800 (PST) Received: from localhost ([::1]:35630 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eChfB-000379-7q for importer@patchew.org; Thu, 09 Nov 2017 02:54:13 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57046) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eChdr-0002W6-J7 for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eChdq-0000Wf-Dj for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:51 -0500 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:43330) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eChdq-0000WH-6H for qemu-devel@nongnu.org; Thu, 09 Nov 2017 02:52:50 -0500 Received: by mail-wr0-x243.google.com with SMTP id 4so4734779wrt.0 for ; Wed, 08 Nov 2017 23:52:50 -0800 (PST) Received: from cloudburst.twiddle.net (93-45-2-58.ip99.fastwebnet.it. [93.45.2.58]) by smtp.gmail.com with ESMTPSA id g65sm2856109wmf.5.2017.11.08.23.52.47 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 08 Nov 2017 23:52:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=34bOoYZwlwrp8LOq9HUYhJTqmVUllOkk8ByM2DkTtX0=; b=IS7dYYtC7q7ZwjxAr9xKEE2FffR1TC9r0JIK4OYKsASwdIqBZmAS5GtZU/Q+6e4e83 pB1jdsXarSpUFzwf1X1MHOUtsfv87NYOLKPZNWnqGqGtuwi+OG6Jv2kAbeBqN5kvEApP flYyd0iEFGRN80ZS+oC+PM9xD4Z2fOKaiiH4w= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=34bOoYZwlwrp8LOq9HUYhJTqmVUllOkk8ByM2DkTtX0=; b=AKsypOoAzTHQRxlr/EnUfyotE4eOnWrJnWR2Yp+Ew9PkRvwmVifoOMOa34ATA6dUyU +88aB/wzYeAqboBCYsGWZvDU0qROKOb0doKRnk+vauRJzm53Y7v0zaRnl9iiAepQsWlZ 8we5xakDg+GvmukedfDVatHw2pxaWsv+S370bJgxr0+wwUtsusyZHEBBuKe8YTajna5v VZ4Z933IVzEM9s5WWUCktppg5DcBOfmlAtBs5NWrN6RIaaJzhYcW5vq9KkLzjW2T83pG xzi+sr0Hp9NffU/uNsr92XlKR4pnM75WIFUeuezPeCbtOqATj+5IHePPCFRJIK+PcAm2 yJtg== X-Gm-Message-State: AJaThX6DeHCCS/LbJqYJh4J20q2kZ4tlc5hXQ1eVWkpyyEAyxE1tAyJr tyDbtlASckaHXxnavNSe+DpjM9GgBtM= X-Google-Smtp-Source: ABhQp+TWj6MQAFH9Deezl0VZKBKZi0dA4wRRDshGyd/nIfCihgX/Xq8mAz61oxgum7NXoJ/cGcCG6g== X-Received: by 10.223.134.106 with SMTP id 39mr2459469wrw.134.1510213968853; Wed, 08 Nov 2017 23:52:48 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 9 Nov 2017 08:52:43 +0100 Message-Id: <20171109075243.4794-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171109075243.4794-1-richard.henderson@linaro.org> References: <20171109075243.4794-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::243 Subject: [Qemu-devel] [PULL 2/2] Makefile: Capstone: Add support for cross compile ranlib X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, Alistair Francis Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Alistair Francis When cross compiling QEMU for Windows we need to specify the cross version of ranlib to avoid build errors when building capstone. This patch ensures we use the same cross prefix on ranlib as other toolchain components. - Fedora23 mingw - RHEL-7.2 with mingw packages from epel: LINK qemu-img.exe build-win64/capstone/capstone.lib: error adding symbols: Archive has no index; run ranlib to add one collect2: error: ld returned 1 exit status $ x86_64-w64-mingw32-ar --version GNU ar (GNU Binutils) 2.25 Tested-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Daniel P. Berrange Suggested-by: Peter Maydell Message-Id: Signed-off-by: Alistair Francis Signed-off-by: Richard Henderson --- Makefile | 2 +- configure | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0496c5057a..814f6820d9 100644 --- a/Makefile +++ b/Makefile @@ -405,7 +405,7 @@ CAP_CFLAGS +=3D -DCAPSTONE_HAS_POWERPC CAP_CFLAGS +=3D -DCAPSTONE_HAS_X86 =20 subdir-capstone: .git-submodule-status - $(call quiet-command,$(MAKE) -C $(SRC_PATH)/capstone CAPSTONE_SHARED=3Dno= BUILDDIR=3D"$(BUILD_DIR)/capstone" CC=3D"$(CC)" AR=3D"$(AR)" LD=3D"$(LD)" = CFLAGS=3D"$(CAP_CFLAGS)" $(SUBDIR_MAKEFLAGS) $(BUILD_DIR)/capstone/$(LIBCAP= STONE)) + $(call quiet-command,$(MAKE) -C $(SRC_PATH)/capstone CAPSTONE_SHARED=3Dno= BUILDDIR=3D"$(BUILD_DIR)/capstone" CC=3D"$(CC)" AR=3D"$(AR)" LD=3D"$(LD)" = RANLIB=3D"$(RANLIB)" CFLAGS=3D"$(CAP_CFLAGS)" $(SUBDIR_MAKEFLAGS) $(BUILD_D= IR)/capstone/$(LIBCAPSTONE)) =20 $(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) \ $(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY)) diff --git a/configure b/configure index a6055c0710..0e856bbc04 100755 --- a/configure +++ b/configure @@ -482,6 +482,7 @@ ccas=3D"${CCAS-$cc}" cpp=3D"${CPP-$cc -E}" objcopy=3D"${OBJCOPY-${cross_prefix}objcopy}" ld=3D"${LD-${cross_prefix}ld}" +ranlib=3D"${RANLIB-${cross_prefix}ranlib}" nm=3D"${NM-${cross_prefix}nm}" strip=3D"${STRIP-${cross_prefix}strip}" windres=3D"${WINDRES-${cross_prefix}windres}" @@ -6288,6 +6289,7 @@ echo "CCAS=3D$ccas" >> $config_host_mak echo "CPP=3D$cpp" >> $config_host_mak echo "OBJCOPY=3D$objcopy" >> $config_host_mak echo "LD=3D$ld" >> $config_host_mak +echo "RANLIB=3D$ranlib" >> $config_host_mak echo "NM=3D$nm" >> $config_host_mak echo "WINDRES=3D$windres" >> $config_host_mak echo "CFLAGS=3D$CFLAGS" >> $config_host_mak @@ -6782,6 +6784,7 @@ for rom in seabios vgabios ; do echo "OBJCOPY=3Dobjcopy" >> $config_mak echo "IASL=3D$iasl" >> $config_mak echo "LD=3D$ld" >> $config_mak + echo "RANLIB=3D$ranlib" >> $config_mak done =20 # set up tests data directory --=20 2.13.6