summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Hilman <khilman@baylibre.com>2018-11-19 11:29:12 -0800
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2018-11-22 15:22:56 +0000
commitb820f82dac96ccb4b223a55488d9ffb9e1177358 (patch)
treefe71ae4baea0ffbe41f513467488676544402817
parent8a0cd7c69c5df85924f3f065d0ef0f71d490e599 (diff)
meta-agl-bsp: ptest-runner: v2.2 and LAVA support
Upgrade ptest-runner to v2.2 (first 6 patches), and add the WIP support for LAVA signal (patch 7). From branch: https://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/log/?h=timo/lava-ptest-runner2 Commit: https://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/commit/?h=timo/lava-ptest-runner2&id=11b29ce444610a07067a89b38e9e85c2162bbf67 Change-Id: Ic4ee5e3a9ab796fe7ccd1810b31e582370f99a25 Signed-off-by: Kevin Hilman <khilman@baylibre.com>
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0001-utils.c-Prefer-monotonic-clock-to-calculate-elapsed-.patch72
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0002-Makefile-libcheck-now-requires-to-link-subunit.patch29
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0003-Add-support-to-avoid-load-run-twice-a-run_ptest-scri.patch137
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0004-README.md-Update-to-my-current-email.patch29
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0005-main.c-Use-realpath-to-get-the-actual-directory-of-p.patch42
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0006-main.c-Add-option-e-to-exclude-certain-tests-for-exe.patch123
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch144
-rw-r--r--meta-agl-bsp/recipes-support/ptest-runner/ptest-runner_2.1.bbappend4
8 files changed, 580 insertions, 0 deletions
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0001-utils.c-Prefer-monotonic-clock-to-calculate-elapsed-.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0001-utils.c-Prefer-monotonic-clock-to-calculate-elapsed-.patch
new file mode 100644
index 000000000..6ca593be5
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0001-utils.c-Prefer-monotonic-clock-to-calculate-elapsed-.patch
@@ -0,0 +1,72 @@
+From 41b7f4814d39c1930b1fcf0be2e247a73546fb80 Mon Sep 17 00:00:00 2001
+From: Jeffrey Pautler <jeffrey.pautler@ni.com>
+Date: Tue, 31 Oct 2017 14:38:39 -0500
+Subject: [PATCH 1/7] utils.c: Prefer monotonic clock to calculate elapsed time
+
+The current implementation uses the system clock to calculate how long
+a ptest has been running with no output. If a ptest changes the system
+clock as part of the test, that can cause the current implementation
+to falsely trigger a timeout or miss an actual timeout. It is
+preferrable to use a monotonic clock for calculating elapsed time in
+order to avoid these issues.
+
+This change tries to use the monotonic clock first and falls back to
+the realtime clock if the monotonic clock is not supported.
+
+Signed-off-by: Jeffrey Pautler <jeffrey.pautler@ni.com>
+---
+ utils.c | 24 +++++++++++++++++-------
+ 1 file changed, 17 insertions(+), 7 deletions(-)
+
+diff --git a/utils.c b/utils.c
+index 6d653887e9e4..933ecedf57e8 100644
+--- a/utils.c
++++ b/utils.c
+@@ -257,7 +257,8 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
+ int timeout, int *fds, FILE **fps)
+ {
+ struct pollfd pfds[2];
+- time_t sentinel;
++ struct timespec sentinel;
++ clockid_t clock = CLOCK_MONOTONIC;
+ int r;
+
+ int timeouted = 0;
+@@ -269,7 +270,11 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
+ pfds[1].fd = fds[1];
+ pfds[1].events = POLLIN;
+
+- sentinel = time(NULL);
++ if (clock_gettime(clock, &sentinel) == -1) {
++ clock = CLOCK_REALTIME;
++ clock_gettime(clock, &sentinel);
++ }
++
+ while (1) {
+ waitflags = WNOHANG;
+
+@@ -288,11 +293,16 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
+ fwrite(buf, n, 1, fps[1]);
+ }
+
+- sentinel = time(NULL);
+- } else if (timeout >= 0 && ((time(NULL) - sentinel) > timeout)) {
+- timeouted = 1;
+- kill(pid, SIGKILL);
+- waitflags = 0;
++ clock_gettime(clock, &sentinel);
++ } else if (timeout >= 0) {
++ struct timespec time;
++
++ clock_gettime(clock, &time);
++ if ((time.tv_sec - sentinel.tv_sec) > timeout) {
++ timeouted = 1;
++ kill(pid, SIGKILL);
++ waitflags = 0;
++ }
+ }
+
+ if (waitpid(pid, &status, waitflags) == pid)
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0002-Makefile-libcheck-now-requires-to-link-subunit.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0002-Makefile-libcheck-now-requires-to-link-subunit.patch
new file mode 100644
index 000000000..4ada99422
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0002-Makefile-libcheck-now-requires-to-link-subunit.patch
@@ -0,0 +1,29 @@
+From 4f6d6c5e3f2f181e3cc380a76e635e7c34d3c5d1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linaro.org>
+Date: Thu, 7 Dec 2017 17:42:44 -0600
+Subject: [PATCH 2/7] Makefile: libcheck now requires to link subunit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Aníbal Limón <anibal.limon@linaro.org>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 434b89f34688..1bde7beff9d1 100644
+--- a/Makefile
++++ b/Makefile
+@@ -22,7 +22,7 @@ TEST_SOURCES=tests/main.c tests/ptest_list.c tests/utils.c $(BASE_SOURCES)
+ TEST_OBJECTS=$(TEST_SOURCES:.c=.o)
+ TEST_EXECUTABLE=ptest-runner-test
+ TEST_LDFLAGS=-lm -lrt -lpthread
+-TEST_LIBSTATIC=-lcheck
++TEST_LIBSTATIC=-lcheck -lsubunit
+
+ TEST_DATA=$(shell echo `pwd`/tests/data)
+
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0003-Add-support-to-avoid-load-run-twice-a-run_ptest-scri.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0003-Add-support-to-avoid-load-run-twice-a-run_ptest-scri.patch
new file mode 100644
index 000000000..47957333d
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0003-Add-support-to-avoid-load-run-twice-a-run_ptest-scri.patch
@@ -0,0 +1,137 @@
+From 0e566f65fa31eaa5208d4a17413c7a4aad7eade5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linaro.org>
+Date: Thu, 7 Dec 2017 17:42:45 -0600
+Subject: [PATCH 3/7] Add support to avoid load/run twice a run_ptest script
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+In some ptest packages exists symlink in the ptest directory causing
+to load/run twice the same ptest,
+
+For example in perl5:
+
+/usr/lib/perl -> /usr/lib/perl5
+
+Signed-off-by: Aníbal Limón <anibal.limon@linaro.org>
+---
+ ptest_list.c | 40 ++++++++++++++++++++++++++++++++++++++++
+ ptest_list.h | 3 +++
+ tests/data/python3 | 1 +
+ tests/utils.c | 1 +
+ utils.c | 6 ++++++
+ 5 files changed, 51 insertions(+)
+ create mode 120000 tests/data/python3
+
+diff --git a/ptest_list.c b/ptest_list.c
+index 2e1aa305752d..3e393d5fabe2 100644
+--- a/ptest_list.c
++++ b/ptest_list.c
+@@ -110,6 +110,46 @@ ptest_list_search(struct ptest_list *head, char *ptest)
+ return q;
+ }
+
++
++struct ptest_list *
++ptest_list_search_by_file(struct ptest_list *head, char *run_ptest, struct stat st_buf)
++{
++ struct ptest_list *q = NULL;
++ struct ptest_list *p;
++ struct stat st_buf_p;
++
++ VALIDATE_PTR_RNULL(head);
++ VALIDATE_PTR_RNULL(run_ptest);
++
++ for (p = head; p != NULL; p = p->next) {
++ if (p->ptest == NULL)
++ continue;
++
++ if (stat(p->run_ptest, &st_buf_p) == -1)
++ continue;
++
++ if (strcmp(p->run_ptest, run_ptest) == 0) {
++ q = p;
++ break;
++ }
++
++ /* *
++ * In some ptest packages exists symlink in the ptest directory
++ * causing to load/run twice the same ptest,
++ *
++ * For example in perl5:
++ * /usr/lib/perl -> /usr/lib/perl5
++ * */
++ if (st_buf.st_dev == st_buf_p.st_dev &&
++ st_buf.st_ino == st_buf_p.st_ino) {
++ q = p;
++ break;
++ }
++ }
++
++ return q;
++}
++
+ struct ptest_list *
+ ptest_list_add(struct ptest_list *head, char *ptest, char *run_ptest)
+ {
+diff --git a/ptest_list.h b/ptest_list.h
+index 8b394853c25b..03d75390a51d 100644
+--- a/ptest_list.h
++++ b/ptest_list.h
+@@ -28,6 +28,8 @@
+ #define PTEST_LIST_ITERATE_START(head, p) for (p = head->next; p != NULL; p = p->next) {
+ #define PTEST_LIST_ITERATE_END }
+
++#include <sys/stat.h>
++
+ struct ptest_list {
+ char *ptest;
+ char *run_ptest;
+@@ -42,6 +44,7 @@ extern int ptest_list_free_all(struct ptest_list *);
+
+ extern int ptest_list_length(struct ptest_list *);
+ extern struct ptest_list *ptest_list_search(struct ptest_list *, char *);
++extern struct ptest_list *ptest_list_search_by_file(struct ptest_list *, char *, struct stat);
+ extern struct ptest_list *ptest_list_add(struct ptest_list *, char *, char *);
+ extern struct ptest_list *ptest_list_remove(struct ptest_list *, char *, int);
+
+diff --git a/tests/data/python3 b/tests/data/python3
+new file mode 120000
+index 000000000000..d8654aa0e2f2
+--- /dev/null
++++ b/tests/data/python3
+@@ -0,0 +1 @@
++python
+\ No newline at end of file
+diff --git a/tests/utils.c b/tests/utils.c
+index ecf3e8af9a81..cf093793c4f2 100644
+--- a/tests/utils.c
++++ b/tests/utils.c
+@@ -48,6 +48,7 @@ static int ptests_found_length = 6;
+ static char *ptests_not_found[] = {
+ "busybox",
+ "perl",
++ "python3",
+ NULL,
+ };
+
+diff --git a/utils.c b/utils.c
+index 933ecedf57e8..ed2eff7900c1 100644
+--- a/utils.c
++++ b/utils.c
+@@ -143,6 +143,12 @@ get_available_ptests(const char *dir)
+ continue;
+ }
+
++ if (ptest_list_search_by_file(head, run_ptest, st_buf)) {
++ free(run_ptest);
++ free(d_name);
++ continue;
++ }
++
+ struct ptest_list *p = ptest_list_add(head,
+ d_name, run_ptest);
+ CHECK_ALLOCATION(p, sizeof(struct ptest_list *), 0);
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0004-README.md-Update-to-my-current-email.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0004-README.md-Update-to-my-current-email.patch
new file mode 100644
index 000000000..dbfe648cf
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0004-README.md-Update-to-my-current-email.patch
@@ -0,0 +1,29 @@
+From 16413d71cc06b02a6d859c35a017cc49b88283f7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linaro.org>
+Date: Thu, 7 Dec 2017 17:42:46 -0600
+Subject: [PATCH 4/7] README.md: Update to my current email
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Aníbal Limón <anibal.limon@linaro.org>
+---
+ README.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/README.md b/README.md
+index fedab04b7f00..22b36a4b7bed 100644
+--- a/README.md
++++ b/README.md
+@@ -50,7 +50,7 @@ $ mtrace ./ptest-runner $(MALLOC_TRACE)
+
+ For contribute please send a patch with subject prefix "[ptest-runner]" to
+ yocto@yoctoproject.org and cc the current maintainer that is Aníbal Limón
+-<anibal.limon@linux.intel.com>.
++<anibal.limon@linaro.org>.
+
+ ## Links
+
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0005-main.c-Use-realpath-to-get-the-actual-directory-of-p.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0005-main.c-Use-realpath-to-get-the-actual-directory-of-p.patch
new file mode 100644
index 000000000..cb9e20a32
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0005-main.c-Use-realpath-to-get-the-actual-directory-of-p.patch
@@ -0,0 +1,42 @@
+From 5bd94a93c89978c5e729db86b86b49919cd3b523 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linaro.org>
+Date: Wed, 25 Apr 2018 12:05:29 -0500
+Subject: [PATCH 5/7] main.c: Use realpath to get the actual directory of
+ ptests
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Fix usage of relative paths in -d argument.
+
+$ ./ptest-runner -d ./tests/data
+
+Signed-off-by: Aníbal Limón <anibal.limon@linaro.org>
+---
+ main.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/main.c b/main.c
+index 505829cdad58..593aff1a1956 100644
+--- a/main.c
++++ b/main.c
+@@ -19,6 +19,7 @@
+ * Aníbal Limón <anibal.limon@intel.com>
+ */
+
++#include <limits.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <stdlib.h>
+@@ -70,7 +71,7 @@ main(int argc, char *argv[])
+ switch (opt) {
+ case 'd':
+ free(opts.directory);
+- opts.directory = strdup(optarg);
++ opts.directory = realpath(optarg, NULL);
+ CHECK_ALLOCATION(opts.directory, 1, 1);
+ break;
+ case 'l':
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0006-main.c-Add-option-e-to-exclude-certain-tests-for-exe.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0006-main.c-Add-option-e-to-exclude-certain-tests-for-exe.patch
new file mode 100644
index 000000000..7a4de868c
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0006-main.c-Add-option-e-to-exclude-certain-tests-for-exe.patch
@@ -0,0 +1,123 @@
+From 49956f65bb53ea2a2c1b394e5e59ffdfcdcc490f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= <anibal.limon@linaro.org>
+Date: Wed, 25 Apr 2018 11:55:03 -0500
+Subject: [PATCH 6/7] main.c: Add option (-e) to exclude certain tests for
+ execution
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+You can specify a set of ptests to be excluded, it will not fail
+if some ptest excluded isn't found in the list of execution.
+
+$ ./ptest-runner -e "hang glibc" -d tests/data
+
+Signed-off-by: Aníbal Limón <anibal.limon@linaro.org>
+---
+ main.c | 38 +++++++++++++++++++++++++++++++++++---
+ utils.h | 1 +
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+diff --git a/main.c b/main.c
+index 593aff1a1956..83600b7d1b31 100644
+--- a/main.c
++++ b/main.c
+@@ -19,6 +19,7 @@
+ * Aníbal Limón <anibal.limon@intel.com>
+ */
+
++#include <ctype.h>
+ #include <limits.h>
+ #include <unistd.h>
+ #include <string.h>
+@@ -42,8 +43,8 @@
+ static inline void
+ print_usage(FILE *stream, char *progname)
+ {
+- fprintf(stream, "Usage: %s [-d directory] [-l list] [-t timeout] [-x xml-filename]"
+- " [-h] [ptest1 ptest2 ...]\n", progname);
++ fprintf(stream, "Usage: %s [-d directory] [-e exclude] [-l list] [-t timeout]"
++ " [-x xml-filename] [-h] [ptest1 ptest2 ...]\n", progname);
+ }
+
+ int
+@@ -53,6 +54,8 @@ main(int argc, char *argv[])
+ int ptest_num = 0;
+ int i;
+ int rc;
++ int ptest_exclude_num = 0;
++ char *c, *tok;
+
+ #ifdef MEMCHECK
+ mtrace();
+@@ -62,18 +65,44 @@ main(int argc, char *argv[])
+ struct ptest_options opts;
+
+ opts.directory = strdup(DEFAULT_DIRECTORY);
++ opts.exclude = NULL;
+ opts.list = 0;
+ opts.timeout = DEFAULT_TIMEOUT;
+ opts.ptests = NULL;
+ opts.xml_filename = NULL;
+
+- while ((opt = getopt(argc, argv, "d:lt:x:h")) != -1) {
++ while ((opt = getopt(argc, argv, "d:e:lt:x:h")) != -1) {
+ switch (opt) {
+ case 'd':
+ free(opts.directory);
+ opts.directory = realpath(optarg, NULL);
+ CHECK_ALLOCATION(opts.directory, 1, 1);
+ break;
++ case 'e':
++ c = optarg;
++ ptest_exclude_num = 1;
++
++ while (*c) {
++ if (isspace(*c))
++ ptest_exclude_num++;
++ c++;
++ }
++
++
++ opts.exclude = malloc(ptest_exclude_num * sizeof(char));
++ CHECK_ALLOCATION(opts.exclude, 1, 1);
++
++ i = 0;
++ tok = strtok_r(optarg, " ", &c);
++ opts.exclude[i] = strdup(tok);
++ CHECK_ALLOCATION(opts.exclude[i], 1, 1);
++ i++;
++ while ((tok = strtok_r(NULL, " ", &c)) != NULL) {
++ opts.exclude[i] = strdup(tok);
++ CHECK_ALLOCATION(opts.exclude[i], 1, 1);
++ i++;
++ }
++ break;
+ case 'l':
+ opts.list = 1;
+ break;
+@@ -134,6 +163,9 @@ main(int argc, char *argv[])
+ ptest_list_free_all(head);
+ }
+
++ for (i = 0; i < ptest_exclude_num; i++)
++ ptest_list_remove(run, opts.exclude[i], 1);
++
+ rc = run_ptests(run, opts, argv[0], stdout, stderr);
+
+ ptest_list_free_all(run);
+diff --git a/utils.h b/utils.h
+index 8fa20a8bf621..ee85163ddfff 100644
+--- a/utils.h
++++ b/utils.h
+@@ -32,6 +32,7 @@
+
+ struct ptest_options {
+ char *directory;
++ char **exclude;
+ int list;
+ int timeout;
+ char **ptests;
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch
new file mode 100644
index 000000000..28c9c09bf
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner/0007-WIP-Initial-LAVA-support.patch
@@ -0,0 +1,144 @@
+From 11b29ce444610a07067a89b38e9e85c2162bbf67 Mon Sep 17 00:00:00 2001
+From: Tim Orling <timothy.t.orling@linux.intel.com>
+Date: Mon, 15 Oct 2018 18:30:42 -0700
+Subject: [PATCH 7/7] [WIP] Initial LAVA support
+
+Linaro Automated Validation Architecture (LAVA) launches a test suite
+on the target but thereafter only observes stdout.
+
+LAVA knows that a test case has started or ended based on signals
+emitted to stdout:
+(setup)
+<LAVA_SIGNAL_STARTTC test_case_name>
+(teardown)
+<LAVA_SIGNAL_ENDTC test_case_name>
+<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=test_case_name RESULT=pass|fail \
+ [[ MEASUREMENT=numeric_measurement ][ UNITS=units_string]]>
+
+It is valid to have a measurement without units, but not units without a measurement.
+
+Signed-off-by: Tim Orling <timothy.t.orling@linux.intel.com>
+---
+ flags.h | 10 ++++++++++
+ main.c | 9 ++++++++-
+ utils.c | 15 +++++++++++++++
+ utils.h | 2 +-
+ 4 files changed, 34 insertions(+), 2 deletions(-)
+ create mode 100644 flags.h
+
+diff --git a/flags.h b/flags.h
+new file mode 100644
+index 000000000000..0dac2234e0b4
+--- /dev/null
++++ b/flags.h
+@@ -0,0 +1,10 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++
++/* Flag bit definitions */
++
++#ifndef __FLAGS_H__
++#define __FLAGS_H__
++
++#define LAVA_SIGNAL_ENABLE (0x0001)
++
++#endif /* __FLAGS_H__ */
+diff --git a/main.c b/main.c
+index 83600b7d1b31..92ced6926c3d 100644
+--- a/main.c
++++ b/main.c
+@@ -36,6 +36,7 @@
+ #endif
+
+ #include "utils.h"
++#include "flags.h"
+
+ #define DEFAULT_DIRECTORY "/usr/lib"
+ #define DEFAULT_TIMEOUT 300
+@@ -70,8 +71,9 @@ main(int argc, char *argv[])
+ opts.timeout = DEFAULT_TIMEOUT;
+ opts.ptests = NULL;
+ opts.xml_filename = NULL;
++ opts.flags = 0;
+
+- while ((opt = getopt(argc, argv, "d:e:lt:x:h")) != -1) {
++ while ((opt = getopt(argc, argv, "d:e:lt:x:Lh")) != -1) {
+ switch (opt) {
+ case 'd':
+ free(opts.directory);
+@@ -118,6 +120,11 @@ main(int argc, char *argv[])
+ opts.xml_filename = strdup(optarg);
+ CHECK_ALLOCATION(opts.xml_filename, 1, 1);
+ break;
++ case 'L':
++ // set LAVA signal mode
++ opts.flags |= LAVA_SIGNAL_ENABLE;
++ fprintf(stdout, "LAVA_SIGNAL_ENABLE == %d\n", opts.flags);
++ break;
+ default:
+ print_usage(stdout, argv[0]);
+ exit(1);
+diff --git a/utils.c b/utils.c
+index ed2eff7900c1..0fd1da6aec92 100644
+--- a/utils.c
++++ b/utils.c
+@@ -39,6 +39,7 @@
+
+ #include "ptest_list.h"
+ #include "utils.h"
++#include "flags.h"
+
+ #define GET_STIME_BUF_SIZE 1024
+ #define WAIT_CHILD_POLL_TIMEOUT_MS 200
+@@ -358,6 +359,7 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+ fprintf(fp, "START: %s\n", progname);
+ PTEST_LIST_ITERATE_START(head, p);
+ char *ptest_dir = strdup(p->run_ptest);
++ char *ptest = strdup(p->ptest);
+ if (ptest_dir == NULL) {
+ rc = -1;
+ break;
+@@ -376,6 +378,11 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+ int fds[2]; fds[0] = pipefd_stdout[0]; fds[1] = pipefd_stderr[0];
+ FILE *fps[2]; fps[0] = fp; fps[1] = fp_stderr;
+
++ char result[5]; // pass\0, fail\0, skip\0
++
++ if (opts.flags & LAVA_SIGNAL_ENABLE) {
++ fprintf(stdout, "<LAVA_SIGNAL_STARTTC %s>\n", ptest);
++ }
+ fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE));
+ fprintf(fp, "BEGIN: %s\n", ptest_dir);
+
+@@ -389,6 +396,14 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
+
+ fprintf(fp, "END: %s\n", ptest_dir);
+ fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE));
++ if (opts.flags & LAVA_SIGNAL_ENABLE) {
++ if (status)
++ sprintf(result, "fail");
++ else
++ sprintf(result, "pass");
++ fprintf(stdout, "<LAVA_SIGNAL_ENDTC %s>\n", ptest);
++ fprintf(stdout, "<LAVA_SIGNAL_TESTCASE TEST_CASE_ID=%s RESULT=%s>\n", ptest, result);
++ }
+ }
+ PTEST_LIST_ITERATE_END;
+ fprintf(fp, "STOP: %s\n", progname);
+diff --git a/utils.h b/utils.h
+index ee85163ddfff..06d4c100d151 100644
+--- a/utils.h
++++ b/utils.h
+@@ -37,9 +37,9 @@ struct ptest_options {
+ int timeout;
+ char **ptests;
+ char *xml_filename;
++ unsigned int flags;
+ };
+
+-
+ extern void check_allocation1(void *, size_t, char *, int, int);
+ extern struct ptest_list *get_available_ptests(const char *);
+ extern int print_ptests(struct ptest_list *, FILE *);
+--
+2.11.0
+
diff --git a/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner_2.1.bbappend b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner_2.1.bbappend
new file mode 100644
index 000000000..000ab3d53
--- /dev/null
+++ b/meta-agl-bsp/recipes-support/ptest-runner/ptest-runner_2.1.bbappend
@@ -0,0 +1,4 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+SRC_URI += "file://0004-README.md-Update-to-my-current-email.patch file://0001-utils.c-Prefer-monotonic-clock-to-calculate-elapsed-.patch file://0002-Makefile-libcheck-now-requires-to-link-subunit.patch file://0003-Add-support-to-avoid-load-run-twice-a-run_ptest-scri.patch file://0005-main.c-Use-realpath-to-get-the-actual-directory-of-p.patch file://0006-main.c-Add-option-e-to-exclude-certain-tests-for-exe.patch file://0007-WIP-Initial-LAVA-support.patch"
+