summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorPalmer Dabbelt <palmer@dabbelt.com>2017-11-21 10:22:24 -0800
committerPalmer Dabbelt <palmer@dabbelt.com>2017-11-21 10:53:42 -0800
commit0f23aeed142a47c74ce4e636bce5260f2d294d2f (patch)
treec79dd76d79770cd47fee875be8301cc9db741c08 /bsp
parent2f8c6978139ed7f7fd88f88a836dde12aa333961 (diff)
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.
Diffstat (limited to 'bsp')
-rw-r--r--bsp/libwrap/libwrap.mk3
-rw-r--r--bsp/libwrap/sys/puts.c26
2 files changed, 28 insertions, 1 deletions
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;
+}