summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstefan <stefan@s00.xyz>2023-04-21 21:56:45 -0400
committerstefan <stefan@s00.xyz>2023-04-21 21:56:45 -0400
commit386ad4f82955d389ae347bc50f7efca5edb9d9a8 (patch)
treec18143b0a593e80145f003707a4eb29fa25d0f33
parenteff82c45c589b42061344039d5f2efc8ad7c52df (diff)
downloadsv-386ad4f82955d389ae347bc50f7efca5edb9d9a8.tar.gz
actually got libfdt working
-rw-r--r--compile_flags.txt6
-rw-r--r--include/libfdt_env.h2
-rw-r--r--include/limits.h152
-rw-r--r--include/stdbool.h8
-rw-r--r--include/string.h5
-rw-r--r--lib/libc/Makefile2
-rw-r--r--lib/libc/string/strchr.c3
-rw-r--r--lib/libc/string/strlen.c19
-rw-r--r--lib/libfdt/Makefile2
-rw-r--r--lib/libfdt/fdt.c1
-rw-r--r--sys/Makefile3
-rw-r--r--sys/dev/dev_init.c22
-rw-r--r--sys/include/dev.h8
-rw-r--r--sys/sys/init.c4
-rw-r--r--sys/sys/printf.c4
15 files changed, 234 insertions, 7 deletions
diff --git a/compile_flags.txt b/compile_flags.txt
new file mode 100644
index 0000000..1e9444f
--- /dev/null
+++ b/compile_flags.txt
@@ -0,0 +1,6 @@
+-Iinclude/
+-Isys/include/
+-nostdlib
+-nostdinc
+-ffreestanding
+-mcmodel=medany
diff --git a/include/libfdt_env.h b/include/libfdt_env.h
index 73b6d40..f99b2ff 100644
--- a/include/libfdt_env.h
+++ b/include/libfdt_env.h
@@ -10,7 +10,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
-#include <stdlib.h>
+//#include <stdlib.h>
#include <string.h>
#include <limits.h>
diff --git a/include/limits.h b/include/limits.h
new file mode 100644
index 0000000..9fe83f4
--- /dev/null
+++ b/include/limits.h
@@ -0,0 +1,152 @@
+#ifndef _LIMITS_H
+#define _LIMITS_H
+
+/* Support signed or unsigned plain-char */
+
+#if '\xff' > 0
+#define CHAR_MIN 0
+#define CHAR_MAX 255
+#else
+#define CHAR_MIN (-128)
+#define CHAR_MAX 127
+#endif
+
+/* Some universal constants... */
+
+#define CHAR_BIT 8
+#define SCHAR_MIN (-128)
+#define SCHAR_MAX 127
+#define UCHAR_MAX 255
+#define SHRT_MIN (-1-0x7fff)
+#define SHRT_MAX 0x7fff
+#define USHRT_MAX 0xffff
+#define INT_MIN (-1-0x7fffffff)
+#define INT_MAX 0x7fffffff
+#define UINT_MAX 0xffffffffU
+#define LONG_MIN (-LONG_MAX-1)
+#define ULONG_MAX (2UL*LONG_MAX+1)
+#define LLONG_MIN (-LLONG_MAX-1)
+#define ULLONG_MAX (2ULL*LLONG_MAX+1)
+
+#define MB_LEN_MAX 4
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#define PIPE_BUF 4096
+#define FILESIZEBITS 64
+#define NAME_MAX 255
+#define PATH_MAX 4096
+#define NGROUPS_MAX 32
+#define ARG_MAX 131072
+#define IOV_MAX 1024
+#define SYMLOOP_MAX 40
+#define WORD_BIT 32
+#define SSIZE_MAX LONG_MAX
+#define TZNAME_MAX 6
+#define TTY_NAME_MAX 32
+#define HOST_NAME_MAX 255
+
+/* Implementation choices... */
+
+#define PTHREAD_KEYS_MAX 128
+#define PTHREAD_STACK_MIN 2048
+#define PTHREAD_DESTRUCTOR_ITERATIONS 4
+#define SEM_VALUE_MAX 0x7fffffff
+#define SEM_NSEMS_MAX 256
+#define DELAYTIMER_MAX 0x7fffffff
+#define MQ_PRIO_MAX 32768
+#define LOGIN_NAME_MAX 256
+
+/* Arbitrary numbers... */
+
+#define BC_BASE_MAX 99
+#define BC_DIM_MAX 2048
+#define BC_SCALE_MAX 99
+#define BC_STRING_MAX 1000
+#define CHARCLASS_NAME_MAX 14
+#define COLL_WEIGHTS_MAX 2
+#define EXPR_NEST_MAX 32
+#define LINE_MAX 4096
+#define RE_DUP_MAX 255
+
+#define NL_ARGMAX 9
+#define NL_MSGMAX 32767
+#define NL_SETMAX 255
+#define NL_TEXTMAX 2048
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+
+#ifdef PAGESIZE
+#define PAGE_SIZE PAGESIZE
+#endif
+#define NZERO 20
+#define NL_LANGMAX 32
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+
+#define NL_NMAX 16
+
+#endif
+
+/* POSIX/SUS requirements follow. These numbers come directly
+ * from SUS and have nothing to do with the host system. */
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SS_REPL_MAX 4
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 128
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TRACE_EVENT_NAME_MAX 30
+#define _POSIX_TRACE_NAME_MAX 8
+#define _POSIX_TRACE_SYS_MAX 8
+#define _POSIX_TRACE_USER_EVENT_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
+
+#define _XOPEN_IOV_MAX 16
+#define _XOPEN_NAME_MAX 255
+#define _XOPEN_PATH_MAX 1024
+
+#endif
diff --git a/include/stdbool.h b/include/stdbool.h
new file mode 100644
index 0000000..af0fbec
--- /dev/null
+++ b/include/stdbool.h
@@ -0,0 +1,8 @@
+#ifndef _STDBOOL_H
+#define _STDBOOL_H
+
+#define true 1
+#define false 0
+#define bool _Bool
+
+#endif /* _STDBOOL_H */
diff --git a/include/string.h b/include/string.h
index 5e06af7..b09d2cb 100644
--- a/include/string.h
+++ b/include/string.h
@@ -13,7 +13,6 @@ void *memchr(const void *, int, size_t);
char *strchr(const char *, int);
char *strrchr(const char*, int);
-//size_t strlen(const char *);
-#define strlen(s) __builtin_strlen(s)
-#define strnlen(s, n) __builtin_strnlen(s, n)
+size_t strlen(const char *);
+size_t strnlen(const char *, size_t);
#endif /* _STRING_H */
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index b2aea30..ab68ab0 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -13,6 +13,8 @@ SRC=\
string/memset.c \
string/memcmp.c \
string/memchr.c \
+ string/strlen.c \
+ string/strchr.c
${BUILDDIR}/libc.a: ${SRC}
diff --git a/lib/libc/string/strchr.c b/lib/libc/string/strchr.c
index 09b4d43..f8b3339 100644
--- a/lib/libc/string/strchr.c
+++ b/lib/libc/string/strchr.c
@@ -2,9 +2,8 @@
char *strchr(const char *s, int c) {
do {
- if ((char)c == *s) {
+ if ((char)c == *s)
return (char*)s;
- }
} while (*s++ != '\0');
return NULL;
}
diff --git a/lib/libc/string/strlen.c b/lib/libc/string/strlen.c
new file mode 100644
index 0000000..a1a73b6
--- /dev/null
+++ b/lib/libc/string/strlen.c
@@ -0,0 +1,19 @@
+#include <string.h>
+
+size_t
+strlen(const char *s)
+{
+ int n;
+ for (n = 0; s[n]; n++)
+ ;
+ return n;
+}
+
+size_t
+strnlen(const char *s, size_t max)
+{
+ int n;
+ for (n = 0; s[n] && n < max; n++)
+ ;
+ return n;
+}
diff --git a/lib/libfdt/Makefile b/lib/libfdt/Makefile
index b9c7223..a3de4b6 100644
--- a/lib/libfdt/Makefile
+++ b/lib/libfdt/Makefile
@@ -13,7 +13,7 @@ SRC=fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \
${BUILDDIR}/libfdt.a: ${SRC}
mkdir -p ${BUILDDIR}
- cd ${BUILDDIR} && ${CROSS_COMPILE}gcc -c ${CFLAGS} -nostdlib ${SRC:%=../../%}
+ cd ${BUILDDIR} && ${CROSS_COMPILE}gcc -c ${CFLAGS} -L ../libc/${BUILDDIR} -l:libc.a -nostdlib -nostdinc -I../../include/ ${SRC:%=../../%}
cd ${BUILDDIR} && ${CROSS_COMPILE}ar -rcs ${@:T} ${SRC:T:%.c=%.o}
diff --git a/lib/libfdt/fdt.c b/lib/libfdt/fdt.c
index 20c6415..96955c7 100644
--- a/lib/libfdt/fdt.c
+++ b/lib/libfdt/fdt.c
@@ -9,6 +9,7 @@
#include <libfdt.h>
#include "libfdt_internal.h"
+#include <string.h>
/*
* Minimal sanity check for a read-only tree. fdt_ro_probe_() checks
diff --git a/sys/Makefile b/sys/Makefile
index 385cf7a..970809f 100644
--- a/sys/Makefile
+++ b/sys/Makefile
@@ -13,6 +13,7 @@ SRC=\
sys/printf.c\
sys/mm/kalloc.c\
sys/smp/spinlock.c\
+ dev/dev_init.c\
${BUILDDIR}/kernel.elf: ${SRC}
@@ -28,6 +29,8 @@ ${BUILDDIR}/kernel.elf: ${SRC}
-I ./include\
${CFLAGS} -T sys/kernel.lds ${LDFLAGS}\
-L../lib/libc/${BUILDDIR}/\
+ -L../lib/libfdt/${BUILDDIR}/\
+ -l:libfdt.a\
-l:libc.a\
-o $@
diff --git a/sys/dev/dev_init.c b/sys/dev/dev_init.c
new file mode 100644
index 0000000..fc70853
--- /dev/null
+++ b/sys/dev/dev_init.c
@@ -0,0 +1,22 @@
+#include <dev.h>
+#include <libfdt.h>
+#include <sbi.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+void
+dev_init(struct fdt_header *fdt)
+{
+ if (fdt_check_header(fdt) == 0)
+ printf("[dev_init] valid fdt at %p\n", fdt);
+ else
+ printf("[dev_init] error: fdt_check_header()\n");
+
+ int offset = fdt_next_node(fdt, offset, 0);
+ do {
+ printf("[dev_init] found %s\n", fdt_get_name(fdt, offset, NULL));
+ offset = fdt_next_node(fdt, offset, 0);
+ } while (offset != -FDT_ERR_NOTFOUND);
+}
+
diff --git a/sys/include/dev.h b/sys/include/dev.h
new file mode 100644
index 0000000..b8bfef8
--- /dev/null
+++ b/sys/include/dev.h
@@ -0,0 +1,8 @@
+#ifndef _DEV_H
+#define _DEV_H
+
+#include <libfdt.h>
+
+void dev_init(struct fdt_header* fdt);
+
+#endif /* _DEV_H */
diff --git a/sys/sys/init.c b/sys/sys/init.c
index b21ac84..48aeb97 100644
--- a/sys/sys/init.c
+++ b/sys/sys/init.c
@@ -1,4 +1,6 @@
+#include <dev.h>
#include <libfdt.h>
+#include <string.h>
#include <kalloc.h>
#include <spinlock.h>
#include <stdio.h>
@@ -23,6 +25,8 @@ init(unsigned long hartid, struct fdt_header *fdt)
printf_init();
printf("done!\n");
+ dev_init(fdt);
+
printf("bringing up other harts...\n");
for (int i = 0; i < NPROC; ++i) {
if (i == hartid) {
diff --git a/sys/sys/printf.c b/sys/sys/printf.c
index e8cc468..bff20bf 100644
--- a/sys/sys/printf.c
+++ b/sys/sys/printf.c
@@ -56,6 +56,7 @@ printptr(uint64_t x)
putchar(digits[x >> (sizeof(int64_t) * 8 - 4)]);
}
+/* literally zero overflow checking (i am the best programmer of all time) */
void
printf(const char *fmt, ...)
{
@@ -90,6 +91,9 @@ printf(const char *fmt, ...)
case '%':
putchar('%');
break;
+ case 's':
+ puts(va_arg(ap, const char *));
+ break;
}
}
release(&mutex);