From 0f23aeed142a47c74ce4e636bce5260f2d294d2f Mon Sep 17 00:00:00 2001
From: Palmer Dabbelt <palmer@dabbelt.com>
Date: Tue, 21 Nov 2017 10:22:24 -0800
Subject: Implement a smaller puts

The e31's init.c calls puts intsead of printf, which oddly enough is a
lot bigger: since we wrap printf, puts pulls in a lot of newlib.  This
adds a wrapped puts so it's very small.
---
 bsp/libwrap/libwrap.mk |  3 ++-
 bsp/libwrap/sys/puts.c | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 bsp/libwrap/sys/puts.c

diff --git a/bsp/libwrap/libwrap.mk b/bsp/libwrap/libwrap.mk
index 313ed00..ce224ac 100644
--- a/bsp/libwrap/libwrap.mk
+++ b/bsp/libwrap/libwrap.mk
@@ -26,6 +26,7 @@ LIBWRAP_SRCS := \
 	sys/times.c \
 	sys/sbrk.c \
 	sys/_exit.c \
+	sys/puts.c \
 	misc/write_hex.c
 
 LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f))
@@ -34,7 +35,7 @@ LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o)
 LIBWRAP_SYMS := malloc free \
 	open lseek read write fstat stat close link unlink \
 	execve fork getpid kill wait \
-	isatty times sbrk _exit
+	isatty times sbrk _exit puts
 
 LIBWRAP := libwrap.a
 
diff --git a/bsp/libwrap/sys/puts.c b/bsp/libwrap/sys/puts.c
new file mode 100644
index 0000000..f77f1a3
--- /dev/null
+++ b/bsp/libwrap/sys/puts.c
@@ -0,0 +1,26 @@
+/* See LICENSE of license details. */
+
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "platform.h"
+#include "stub.h"
+
+int __wrap_puts(const char *s)
+{
+  while (*s != '\0') {
+    while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
+    UART0_REG(UART_REG_TXFIFO) = *s;
+
+    if (*s == '\n') {
+      while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ;
+      UART0_REG(UART_REG_TXFIFO) = '\r';
+    }
+
+    ++s;
+  }
+
+  return 0;
+}
-- 
cgit v1.2.3