From 386ad4f82955d389ae347bc50f7efca5edb9d9a8 Mon Sep 17 00:00:00 2001 From: stefan Date: Fri, 21 Apr 2023 21:56:45 -0400 Subject: actually got libfdt working --- compile_flags.txt | 6 ++ include/libfdt_env.h | 2 +- include/limits.h | 152 +++++++++++++++++++++++++++++++++++++++++++++++ include/stdbool.h | 8 +++ include/string.h | 5 +- lib/libc/Makefile | 2 + lib/libc/string/strchr.c | 3 +- lib/libc/string/strlen.c | 19 ++++++ lib/libfdt/Makefile | 2 +- lib/libfdt/fdt.c | 1 + sys/Makefile | 3 + sys/dev/dev_init.c | 22 +++++++ sys/include/dev.h | 8 +++ sys/sys/init.c | 4 ++ sys/sys/printf.c | 4 ++ 15 files changed, 234 insertions(+), 7 deletions(-) create mode 100644 compile_flags.txt create mode 100644 include/limits.h create mode 100644 include/stdbool.h create mode 100644 lib/libc/string/strlen.c create mode 100644 sys/dev/dev_init.c create mode 100644 sys/include/dev.h 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 #include #include -#include +//#include #include #include 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 + +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 #include "libfdt_internal.h" +#include /* * 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 +#include +#include +#include +#include +#include + +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 + +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 #include +#include #include #include #include @@ -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); -- cgit v1.2.3