meta-phosphor: Add trace-enable service

The trace-enable service turns on a set of Linux trace events based
on a configuration file. The recipe generates the configuration file
from a variable that can be appended across layers.

Signed-off-by: Eddie James <eajames@linux.ibm.com>
Change-Id: I319e21c81b4da10dd08877c2f78cd4698fc94cd7
diff --git a/meta-phosphor/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb b/meta-phosphor/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
index 6d7d76a..648cab3 100644
--- a/meta-phosphor/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
+++ b/meta-phosphor/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bb
@@ -69,6 +69,7 @@
         libgpiod-tools \
         lrzsz \
         rsync \
+        trace-enable \
         "
 
 SUMMARY:${PN}-dbus-monitor = "Support for dbus monitoring"
diff --git a/meta-phosphor/recipes-phosphor/trace-enable/trace-enable.bb b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable.bb
new file mode 100644
index 0000000..37d5a03
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable.bb
@@ -0,0 +1,35 @@
+SUMMARY = "Enable Linux trace events"
+DESCRIPTION = "Enable Linux trace events based on a configuration file"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+RDEPENDS:${PN} = " \
+    ${@d.getVar('PREFERRED_PROVIDER_u-boot-fw-utils', True) or 'u-boot-fw-utils'} \
+    bash \
+"
+
+S = "${WORKDIR}"
+
+SRC_URI += " file://trace-enable"
+
+TRACE_EVENTS = ""
+
+FILES:${PN} += "${sysconfdir}/trace-events.conf"
+FILES:${PN} += "${libexecdir}/trace-enable"
+
+do_install:append() {
+    install -d ${D}${sysconfdir}
+    for event in ${TRACE_EVENTS}
+    do
+        echo ${event} >> ${D}${sysconfdir}/trace-events.conf
+    done
+    echo >> ${D}${sysconfdir}/trace-events.conf
+    chmod 0644 ${D}${sysconfdir}/trace-events.conf
+
+    install -d ${D}${libexecdir}
+    install -m 0755 ${WORKDIR}/trace-enable ${D}${libexecdir}
+}
+
+SYSTEMD_SERVICE:${PN} = "trace-enable.service"
+
+inherit obmc-phosphor-systemd
diff --git a/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable
new file mode 100755
index 0000000..2c02b67
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -eu
+
+events=""
+
+while read -r line
+do
+	if echo "${line}" >> /sys/kernel/debug/tracing/set_event;
+	then
+		if [ -n "${events}" ]
+		then
+			events="${events},${line}"
+		else
+			events="${line}"
+		fi
+	fi
+done < "${1}"
+
+if [ -n "${events}" ]
+then
+	events="trace_events=${events}"
+	fw_setenv trace_args "${events}"
+else
+	fw_setenv trace_args
+fi
diff --git a/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable.service b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable.service
new file mode 100644
index 0000000..fb630c9
--- /dev/null
+++ b/meta-phosphor/recipes-phosphor/trace-enable/trace-enable/trace-enable.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Enable Linux trace events in the boot loader
+RequiresMountsFor=/etc
+
+[Service]
+Type=oneshot
+ExecStart=/usr/libexec/trace-enable /etc/trace-events.conf
+
+[Install]
+WantedBy=multi-user.target