aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Forissier <jerome@forissier.org>2020-07-21 10:54:53 +0200
committerJérôme Forissier <jerome@forissier.org>2020-08-06 11:10:44 +0200
commit405a5072d8bd25c18fd151d97e452d6863786f03 (patch)
treed4d4edf3df3d9f4804d1feaffbb798a87224da25
parentf35d131b0a82cca736f9670528a1e948f783852d (diff)
libutils: add simplified fputc(), fputs(), fwrite(), write()
Preparing for C++ support in TAs. Adds a few <stdio.h> functions to libutils: fputc() fputs() fwrite() write() The proposed implementations are limited in the sense that they only accept writing to stdout or stderr. The output goes directly to the secure console and no difference is made between stdout and stderr. Signed-off-by: Jerome Forissier <jerome@forissier.org> Acked-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
-rw-r--r--lib/libutils/isoc/fp.c16
-rw-r--r--lib/libutils/isoc/fputc.c15
-rw-r--r--lib/libutils/isoc/fputs.c17
-rw-r--r--lib/libutils/isoc/fwrite.c22
-rw-r--r--lib/libutils/isoc/include/stdio.h16
-rw-r--r--lib/libutils/isoc/include/unistd.h3
-rw-r--r--lib/libutils/isoc/sub.mk8
-rw-r--r--lib/libutils/isoc/write.c16
8 files changed, 113 insertions, 0 deletions
diff --git a/lib/libutils/isoc/fp.c b/lib/libutils/isoc/fp.c
new file mode 100644
index 00000000..ee7445bf
--- /dev/null
+++ b/lib/libutils/isoc/fp.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, Huawei Technologies Co., Ltd
+ */
+
+#include <stdio.h>
+
+struct _FILE {
+ char dummy;
+};
+
+static struct _FILE _fake_stdout;
+static struct _FILE _fake_stderr;
+
+FILE *stdout = &_fake_stdout;
+FILE *stderr = &_fake_stderr;
diff --git a/lib/libutils/isoc/fputc.c b/lib/libutils/isoc/fputc.c
new file mode 100644
index 00000000..3f154d75
--- /dev/null
+++ b/lib/libutils/isoc/fputc.c
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, Huawei Technologies Co., Ltd
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int fputc(int c, FILE *stream)
+{
+ if (stream != stdout && stream != stderr)
+ abort();
+
+ return putchar(c);
+}
diff --git a/lib/libutils/isoc/fputs.c b/lib/libutils/isoc/fputs.c
new file mode 100644
index 00000000..1c9cd873
--- /dev/null
+++ b/lib/libutils/isoc/fputs.c
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, Huawei Technologies Co., Ltd
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <trace.h>
+
+int fputs(const char *s, FILE *stream)
+{
+ if (stream != stdout && stream != stderr)
+ abort();
+
+ trace_ext_puts(s);
+ return 0;
+}
diff --git a/lib/libutils/isoc/fwrite.c b/lib/libutils/isoc/fwrite.c
new file mode 100644
index 00000000..0e8fee9f
--- /dev/null
+++ b/lib/libutils/isoc/fwrite.c
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, Huawei Technologies Co., Ltd
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+ int fd = 0;
+
+ if (stream == stdout)
+ fd = 1;
+ else if (stream == stderr)
+ fd = 2;
+ else
+ abort();
+
+ return write(fd, ptr, size * nmemb);
+}
diff --git a/lib/libutils/isoc/include/stdio.h b/lib/libutils/isoc/include/stdio.h
index ec545207..cc2ddf08 100644
--- a/lib/libutils/isoc/include/stdio.h
+++ b/lib/libutils/isoc/include/stdio.h
@@ -24,4 +24,20 @@ int vsnprintf (char *str, size_t size, const char *fmt, va_list ap)
int puts(const char *str);
int putchar(int c);
+#ifndef __KERNEL__
+
+extern FILE *stdout;
+extern FILE *stderr;
+
+/*
+ * The functions below send their output synchronously to the secure console.
+ * They treat stdout and stderr the same, and will abort if stream is not one or
+ * the other.
+ */
+
+int fputc(int c, FILE *stream);
+int fputs(const char *s, FILE *stream);
+size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
+#endif
+
#endif /*STDIO_H*/
diff --git a/lib/libutils/isoc/include/unistd.h b/lib/libutils/isoc/include/unistd.h
index de10cba3..9c27f0a4 100644
--- a/lib/libutils/isoc/include/unistd.h
+++ b/lib/libutils/isoc/include/unistd.h
@@ -11,4 +11,7 @@
#define __ssize_t_defined
typedef intptr_t ssize_t;
+/* @fd must be 1 or 2. Writes to the secure console. */
+ssize_t write(int fd, const void *buf, size_t count);
+
#endif
diff --git a/lib/libutils/isoc/sub.mk b/lib/libutils/isoc/sub.mk
index 3811b916..e47836bf 100644
--- a/lib/libutils/isoc/sub.mk
+++ b/lib/libutils/isoc/sub.mk
@@ -28,5 +28,13 @@ srcs-y += isprint.c
srcs-y += ispunct.c
srcs-y += toupper.c
+ifneq (,$(filter ta_%,$(sm)))
+srcs-y += fp.c
+srcs-y += fputc.c
+srcs-y += fputs.c
+srcs-y += fwrite.c
+srcs-y += write.c
+endif
+
subdirs-y += newlib
subdirs-$(arch_arm) += arch/$(ARCH)
diff --git a/lib/libutils/isoc/write.c b/lib/libutils/isoc/write.c
new file mode 100644
index 00000000..987de950
--- /dev/null
+++ b/lib/libutils/isoc/write.c
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: BSD-2-Clause
+/*
+ * Copyright (c) 2020, Huawei Technologies Co., Ltd
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+ssize_t write(int fd, const void *buf, size_t count)
+{
+ if (fd != 1 && fd != 2)
+ abort();
+
+ return printf("%*s", (int)count, (char *)buf);
+}