commit 41f18fe7658b8531fb90aff953130edb13cd52d6
parent 23d9f6e3e69626b32799f28f116f0cf9b3edd0ba
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 8 Nov 2018 11:39:17 +0000
[libk] Separate k functions from libc
Change-Id: I171eb7e175d0202aab7fe1efd5c31d319d55e544
Diffstat:
6 files changed, 121 insertions(+), 122 deletions(-)
diff --git a/arch/amd64/Makefile b/arch/amd64/Makefile
@@ -6,7 +6,7 @@ ROMOBJS = crt-$(SYS).o arch.o rom.o $(DEBUGLANG) $(SRCDIR)/romfw/builtin.o
RAMOBJS = crt-$(SYS).o arch.o rom.o $(DEBUGLANG) $(SRCDIR)/ramfw/builtin.o
TARGET = $(BINDIR)/romfw.elf $(BINDIR)/ramfw.elf
-LIBS = -lhdl -lrmu -lc
+LIBS = -lhdl -lrmu -lk -lc
LIBDEP = $(LIBDIR)/libhdl.a $(LIBDIR)/librmu.a $(LIBDIR)/libc.a
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
@@ -21,7 +21,7 @@ RAMOBJS = ram-crt-$(SYS).o \
$(SRCDIR)/ramfw/builtin.o \
TARGET = $(BINDIR)/romfw.bin $(BINDIR)/ramfw.bin
-LIBS = -lhdl -lrmu -lc
+LIBS = -lhdl -lrmu -lk -lc
LIBDEP = $(LIBDIR)/libhdl.a $(LIBDIR)/librmu.a $(LIBDIR)/libc.a
all: $(TARGET)
diff --git a/src/Makefile b/src/Makefile
@@ -2,7 +2,7 @@
PROJECTDIR=..
include $(PROJECTDIR)/scripts/rules.mk
-LIBS = libc librmu libtypes libhdl
+LIBS = libk libc librmu libtypes libhdl
IMGS = ramfw romfw
DIRS = $(LIBS) $(IMGS) debuglang
OBJS = rmc.o ecstr.o
diff --git a/src/libc/stdio/Makefile b/src/libc/stdio/Makefile
@@ -28,7 +28,6 @@ OBJS = __getc.o\
gets.o\
perror.o\
printf.o\
- printk.o\
putc.o\
putchar.o\
puts.o\
diff --git a/src/libc/stdio/printk.c b/src/libc/stdio/printk.c
@@ -1,118 +0,0 @@
-
-#include <stdarg.h>
-#include <stddef.h>
-
-#include "../syscall.h"
-
-static void
-putch(int c)
-{
- char ch = c;
- _write(1, &ch, 1);
-}
-
-static void
-printn(long long n, int base, int sign)
-{
- int first, d;
- unsigned long long div;
- const static char digits[] = "0123456789ABCDEF";
-
- switch (base) {
- case 8:
- div = 01000000000000000000000u;
- break;
- case 10:
- div = 10000000000000000000u;
- break;
- case 16:
- div = 0x1000000000000000u;
- break;
- }
-
- if (sign && n < 0) {
- n = -n;
- putch('-');
- }
-
- for (first = 1; div > 0; div /= base) {
- d = n / div;
- if (d == 0 && first && div != 1)
- continue;
- n -= d * div;
- putch(digits[d]);
- first = 0;
- }
-}
-
-static long long
-getnum(va_list *va, int size)
-{
- switch (size) {
- case 0:
- return va_arg(*va, int);
- case 1:
- return va_arg(*va, long);
- case 2:
- return va_arg(*va, long long);
- case 3:
- default:
- return (long long) va_arg(*va, void *);
- }
-}
-
-void
-printk(const char * restrict fmt, ...)
-{
- char c;
- va_list va;
- int base, sign, size;
- char *s;
-
- va_start(va, fmt);
- while (( c = *fmt++) != '\0') {
- if (c != '%') {
- putch(c);
- continue;
- }
-
- sign = 0;
- size = 0;
-flags:
- switch (c = *fmt++) {
- case 'l':
- size++;
- goto flags;
- case 'o':
- base = 8;
- goto print_number;
- case 'd':
- sign = 1;
- case 'u':
- base = 10;
- goto print_number;
- case 'p':
- size = 3;
- case 'X':
- case 'x':
- base = 16;
- print_number:
- printn(getnum(&va, size), base, sign);
- break;
- case 's':
- for (s = va_arg(va, char *); *s; s++)
- putch(*s);
- break;
- case 'c':
- c = va_arg(va, int);
- case '%':
- putch(c);
- break;
- case '\0':
- goto out_loop;
- }
- }
-
-out_loop:
- va_end(va);
-}
diff --git a/src/libk/printk.c b/src/libk/printk.c
@@ -0,0 +1,118 @@
+
+#include <stdarg.h>
+#include <stddef.h>
+
+#include "../libc/syscall.h"
+
+static void
+putch(int c)
+{
+ char ch = c;
+ _write(1, &ch, 1);
+}
+
+static void
+printn(long long n, int base, int sign)
+{
+ int first, d;
+ unsigned long long div;
+ const static char digits[] = "0123456789ABCDEF";
+
+ switch (base) {
+ case 8:
+ div = 01000000000000000000000u;
+ break;
+ case 10:
+ div = 10000000000000000000u;
+ break;
+ case 16:
+ div = 0x1000000000000000u;
+ break;
+ }
+
+ if (sign && n < 0) {
+ n = -n;
+ putch('-');
+ }
+
+ for (first = 1; div > 0; div /= base) {
+ d = n / div;
+ if (d == 0 && first && div != 1)
+ continue;
+ n -= d * div;
+ putch(digits[d]);
+ first = 0;
+ }
+}
+
+static long long
+getnum(va_list *va, int size)
+{
+ switch (size) {
+ case 0:
+ return va_arg(*va, int);
+ case 1:
+ return va_arg(*va, long);
+ case 2:
+ return va_arg(*va, long long);
+ case 3:
+ default:
+ return (long long) va_arg(*va, void *);
+ }
+}
+
+void
+printk(const char * restrict fmt, ...)
+{
+ char c;
+ va_list va;
+ int base, sign, size;
+ char *s;
+
+ va_start(va, fmt);
+ while (( c = *fmt++) != '\0') {
+ if (c != '%') {
+ putch(c);
+ continue;
+ }
+
+ sign = 0;
+ size = 0;
+flags:
+ switch (c = *fmt++) {
+ case 'l':
+ size++;
+ goto flags;
+ case 'o':
+ base = 8;
+ goto print_number;
+ case 'd':
+ sign = 1;
+ case 'u':
+ base = 10;
+ goto print_number;
+ case 'p':
+ size = 3;
+ case 'X':
+ case 'x':
+ base = 16;
+ print_number:
+ printn(getnum(&va, size), base, sign);
+ break;
+ case 's':
+ for (s = va_arg(va, char *); *s; s++)
+ putch(*s);
+ break;
+ case 'c':
+ c = va_arg(va, int);
+ case '%':
+ putch(c);
+ break;
+ case '\0':
+ goto out_loop;
+ }
+ }
+
+out_loop:
+ va_end(va);
+}