regression: add case 1041 for fTPM

Add regression case 1041 to test if the system has a fTPM TA and if so
check that it has been probed.

Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Etienne Carriere <etienne.carriere@foss.st.com>
diff --git a/host/xtest/ftpm_ta.h b/host/xtest/ftpm_ta.h
new file mode 100644
index 0000000..1cb6be2
--- /dev/null
+++ b/host/xtest/ftpm_ta.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+/*
+ * Copyright (c) 2024 Linaro Limited
+ *
+ * The copyright in this software is being made available under the BSD License,
+ * included below. This software may be subject to other third party and
+ * contributor rights, including patent rights, and no such rights are granted
+ * under this license.
+ *
+ * Copyright (c) 2018 Microsoft Corporation
+ *
+ * All rights reserved.
+ *
+ * BSD License
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FTPM_TA_H
+#define FTPM_TA_H
+
+/* This UUID is generated with uuidgen */
+#define TA_FTPM_UUID { 0xBC50D971, 0xD4C9, 0x42C4, \
+	{0x82, 0xCB, 0x34, 0x3F, 0xB7, 0xF3, 0x78, 0x96}}
+
+/* The TAFs ID implemented in this TA */
+#define TA_FTPM_SUBMIT_COMMAND  (0)
+#define TA_FTPM_EMULATE_PPI     (1)
+
+#endif /*FTPM_TA_H*/
diff --git a/host/xtest/regression_1000.c b/host/xtest/regression_1000.c
index 9981d01..dc30b1e 100644
--- a/host/xtest/regression_1000.c
+++ b/host/xtest/regression_1000.c
@@ -24,6 +24,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <ta_arm_bti.h>
 #include <ta_concurrent.h>
@@ -41,6 +42,7 @@
 #include <utee_defines.h>
 #include <util.h>
 
+#include "ftpm_ta.h"
 #include "xtest_helpers.h"
 #include "xtest_test.h"
 #include "xtest_uuid_helpers.h"
@@ -3361,3 +3363,32 @@
 }
 ADBG_CASE_DEFINE(regression, 1040, xtest_tee_test_1040,
 		 "Test panic in concurrent open/invoke/close session");
+
+static void xtest_tee_test_1041(ADBG_Case_t *c)
+{
+	const char fname[] = "/dev/tpm0";
+	TEE_Result res = TEEC_SUCCESS;
+	TEEC_Session sess = { };
+	uint32_t ret_orig = 0;
+	struct stat sb = { };
+
+	res = xtest_teec_open_session(&sess, &(const TEEC_UUID)TA_FTPM_UUID,
+				      NULL, &ret_orig);
+	if (res == TEEC_ERROR_ITEM_NOT_FOUND) {
+		Do_ADBG_Log("skip test, fTPM TA not present");
+		return;
+	}
+	if (res != TEEC_ERROR_BUSY && ADBG_EXPECT_TEEC_SUCCESS(c, res))
+		TEEC_CloseSession(&sess);
+
+	if (!ADBG_EXPECT_COMPARE_SIGNED(c, stat(fname, &sb), ==, 0)) {
+		Do_ADBG_Log("stat(\"%s\"): %s", fname, strerror(errno));
+		if (res != TEEC_ERROR_BUSY)
+			Do_ADBG_Log("Perhaps fTPM hasn't finished probing");
+		return;
+	}
+
+	if (!ADBG_EXPECT_TRUE(c, S_ISCHR(sb.st_mode)))
+		Do_ADBG_Log("Expected \"%s\" to be a character device", fname);
+}
+ADBG_CASE_DEFINE(regression, 1041, xtest_tee_test_1041, "Test fTPM sanity");