aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
+}