Open CI Scripts: Initial Commit

* build_helper: Python script which builds sets
of configurations from a json file input
* checkpatch: Bash scripts helping with running checkpatch
* cppcheck: Bash script helping with running cppcheck
* lava_helper: Python script which generates a lava job
definition and parses the output of a lava dispatcher
* tfm_ci_pylib: Generic Python module for Open CI
* configs: Directory storing reference configurations

Change-Id: Ibda0cbfeb5b004b35fef3c2af4cb5c012f2672b4
Signed-off-by: Galanakis, Minos <minos.galanakis@linaro.org>
diff --git a/cppcheck/arm-cortex-m.cfg b/cppcheck/arm-cortex-m.cfg
new file mode 100644
index 0000000..5da59d6
--- /dev/null
+++ b/cppcheck/arm-cortex-m.cfg
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<!--
+#-------------------------------------------------------------------------------
+# Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+-->
+<def format="2">
+  <!-- Minimum-width integer types -->
+  <podtype name="int_least8_t" sign="s" size="1"/>
+  <podtype name="uint_least8_t" sign="u" size="1"/>
+  <podtype name="int_least16_t" sign="s" size="2"/>
+  <podtype name="uint_least16_t" sign="u" size="2"/>
+  <podtype name="int_least32_t" sign="s" size="4"/>
+  <podtype name="uint_least32_t" sign="u" size="4"/>
+  <podtype name="int_least64_t" sign="s" size="8"/>
+  <podtype name="uint_least64_t" sign="u" size="8"/>
+  <!-- Greatest-width integer types -->
+  <podtype name="intmax_t" sign="s" size="8"/>
+  <podtype name="uintmax_t" sign="u" size="8"/>
+  <!-- inttypes.h -->
+  <podtype name="intptr_t" sign="s" size="4"/>
+  <podtype name="uintptr_t" sign="u" size="4"/>
+  <define name="INT8_MAX" value="0x7f"/>
+  <define name="INT8_MIN" value="(-INT8_MAX - 1)"/>
+  <define name="UINT8_MAX" value="(__CONCAT(INT8_MAX, U) * 2U + 1U)"/>
+  <define name="INT16_MAX" value="0x7fff"/>
+  <define name="INT16_MIN" value="(-INT16_MAX - 1)"/>
+  <define name="UINT16_MAX" value="(__CONCAT(INT16_MAX, U) * 2U + 1U)"/>
+  <define name="INT32_MAX" value="0x7fffffffL"/>
+  <define name="INT32_MIN" value="(-INT32_MAX - 1L)"/>
+  <define name="UINT32_MAX" value="(__CONCAT(INT32_MAX, U) * 2UL + 1UL)"/>
+  <define name="INT64_MAX" value="0x7fffffffffffffffLL"/>
+  <define name="INT64_MIN" value="(-INT64_MAX - 1LL)"/>
+  <define name="UINT64_MAX" value="(__CONCAT(INT64_MAX, U) * 2ULL + 1ULL)"/>
+  <!-- Limits of minimum-width integer types -->
+  <define name="INT_LEAST8_MAX" value="INT8_MAX"/>
+  <define name="INT_LEAST8_MIN" value="INT8_MIN"/>
+  <define name="UINT_LEAST8_MAX" value="UINT8_MAX"/>
+  <define name="INT_LEAST16_MAX" value="INT16_MAX"/>
+  <define name="INT_LEAST16_MIN" value="INT16_MIN"/>
+  <define name="UINT_LEAST16_MAX" value="UINT16_MAX"/>
+  <define name="INT_LEAST32_MAX" value="INT32_MAX"/>
+  <define name="INT_LEAST32_MIN" value="INT32_MIN"/>
+  <define name="UINT_LEAST32_MAX" value="UINT32_MAX"/>
+  <define name="INT_LEAST64_MAX" value="INT64_MAX"/>
+  <define name="INT_LEAST64_MIN" value="INT64_MIN"/>
+  <define name="UINT_LEAST64_MAX" value="UINT64_MAX"/>
+  <!-- Limits of fastest minimum-width integer types -->
+  <define name="INT_FAST8_MAX" value="INT8_MAX"/>
+  <define name="INT_FAST8_MIN" value="INT8_MIN"/>
+  <define name="UINT_FAST8_MAX" value="UINT8_MAX"/>
+  <define name="INT_FAST16_MAX" value="INT16_MAX"/>
+  <define name="INT_FAST16_MIN" value="INT16_MIN"/>
+  <define name="UINT_FAST16_MAX" value="UINT16_MAX"/>
+  <define name="INT_FAST32_MAX" value="INT32_MAX"/>
+  <define name="INT_FAST32_MIN" value="INT32_MIN"/>
+  <define name="UINT_FAST32_MAX" value="UINT32_MAX"/>
+  <define name="INT_FAST64_MAX" value="INT64_MAX"/>
+  <define name="INT_FAST64_MIN" value="INT64_MIN"/>
+  <define name="UINT_FAST64_MAX" value="UINT64_MAX"/>
+  <!-- Limits of integer types capable of holding object pointers -->
+  <define name="INTPTR_MAX" value="INT32_MAX"/>
+  <define name="INTPTR_MIN" value="INT32_MIN"/>
+  <define name="UINTPTR_MAX" value="UINT32_MAX"/>
+  <!-- Limits of greatest-width integer types -->
+  <define name="INTMAX_MAX" value="INT64_MAX"/>
+  <define name="INTMAX_MIN" value="INT64_MIN"/>
+  <define name="UINTMAX_MAX" value="UINT64_MAX"/>
+  <!-- Limits of other integer types -->
+  <define name="PTRDIFF_MAX" value="INT32_MAX"/>
+  <define name="PTRDIFF_MIN" value="INT32_MIN"/>
+  <define name="SIG_ATOMIC_MAX" value="INT8_MAX"/>
+  <define name="SIG_ATOMIC_MIN" value="INT8_MIN"/>
+  <define name="SIZE_MAX" value="(__CONCAT(INT16_MAX, U))"/>
+  <!-- Macros for integer constants -->
+  <define name="INT8_C(value)" value="((int8_t) value)"/>
+  <define name="UINT8_C(value)" value="((uint8_t) __CONCAT(value, U))"/>
+  <define name="INT16_C(value)" value="value"/>
+  <define name="UINT16_C(value)" value="__CONCAT(value, U)"/>
+  <define name="INT32_C(value)" value="__CONCAT(value, L)"/>
+  <define name="UINT32_C(value)" value="__CONCAT(value, UL)"/>
+  <define name="INT64_C(value)" value="__CONCAT(value, LL)"/>
+  <define name="UINT64_C(value)" value="__CONCAT(value, ULL)"/>
+  <define name="INTMAX_C(value)" value="__CONCAT(value, LL)"/>
+  <define name="UINTMAX_C(value)" value="__CONCAT(value, ULL)"/>
+</def>
diff --git a/cppcheck/tfm-suppress-list.txt b/cppcheck/tfm-suppress-list.txt
new file mode 100644
index 0000000..368edb6
--- /dev/null
+++ b/cppcheck/tfm-suppress-list.txt
@@ -0,0 +1,55 @@
+//-------------------------------------------------------------------------------
+// Copyright (c) 2018-2019, Arm Limited and Contributors. All rights reserved.
+//
+// SPDX-License-Identifier: BSD-3-Clause
+//
+//-------------------------------------------------------------------------------
+
+//This file contains suppression rules for CppCheck.
+//C style comments can be used.
+//
+//Each line has three parts separated by ":"
+//<message id>:<file>:<line num>
+//Where:
+//   <message id> is the message id to suppress. This equals to the "id" filed
+//                of the XML message record.
+//   <file>       Is a file name. cppcheck understands the following wildcards:
+//                   * matches any number of any characters
+//                   ? a single character
+//                Note: please use '/' as directory separator.
+//   <line num>   The line number for which the message shall be ignored.
+//
+//Example to convert an XML record to a line in thif file:
+// <error id="invalidPrintfArgType_sint" severity="warning" msg="%d in format string (no. 1) requires &apos;int&apos; but the argument type is &apos;unsigned int&apos;." verbose="%d in format string (no. 1) requires &apos;int&apos; but the argument type is &apos;unsigned int&apos;." cwe="686">
+//       <location file0="C:\work\tf-m\test\framework\test_framework.c" file="C:\work\tf-m\test\framework\test_framework.c" line="150"/>
+// </error>
+// to
+//invalidPrintfArgType_sint:*/tf-m/test/framework/test_framework.c:150
+//
+
+//This rule conflicts the our coding style document.
+variableScope
+
+//CppCheck fails to understand macro definitions in compile_commands.json, which
+//have \ characters escaping the opening and closing ". As a result we get the
+//following false alarms.
+preprocessorErrorDirective:*/mbedtls/platform.h:29
+preprocessorErrorDirective:*/mbedtls/sha256.h:29
+
+//CppCheck ignores macros defined on the command line when using a project file
+//(e.g. compile_commands.json). As a result we ca not set compiler specific
+//macros and need to suppress the following error.
+preprocessorErrorDirective:*/cmsis_compiler.h:320
+
+//While cppcheck states to work fine with missing standard library files, it
+//still reports a lot of errors regarding those.
+//So, ignore these.
+missingIncludeSystem
+
+//Stos cppcheck report errors regarding supression rules. These seem to be
+//buggy.
+unmatchedSuppression
+
+//arm_cmse.h is a special system include, stop complaining about it.
+missingInclude:*/tfm_core.h:11
+missingInclude:*/tfm_secure_api.h:11