diff --git a/.gitignore b/.gitignore index 98adcf0..7c2848f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ mittos.iso sysroot/ +external/ *.d *.o diff --git a/Makefile b/Makefile index 45dd8b3..e50dde4 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ KERNELMAKE := TARGET=${TARGET} $(MAKE) -C src/kernel DIST := $(BUILDROOT)/mittos.iso SYSROOT := $(BUILDROOT)/sysroot -SYS_ITEMS := $(SYSROOT)/kernel +SYS_ITEMS := $(SYSROOT)/kernel $(SYSROOT)/usr/lib/libc.a all: $(SYSROOT)/kernel @@ -17,11 +17,14 @@ $(DIST): $(SYS_ITEMS) $(BUILDROOT)/toolchain/setup-grub.sh grub-mkrescue -o $@ $(SYSROOT) -$(SYSROOT)/kernel: FORCE +$(SYSROOT)/kernel: $(SYSROOT)/usr/lib/libc.a FORCE ifeq ($(shell make -sqC src/kernel || echo 1), 1) $(KERNELMAKE) install endif +$(SYSROOT)/usr/lib/libc.a: + toolchain/build-musl.sh + .PHONY: all dist sysroot FORCE clean: diff --git a/src/kernel/Makefile b/src/kernel/Makefile index 436ad19..4ae17d1 100644 --- a/src/kernel/Makefile +++ b/src/kernel/Makefile @@ -11,10 +11,11 @@ CFLAGS := -Wall -Wextra -pedantic -ffreestanding -mcmodel=large CFLAGS += -ggdb -O0 ASFLAGS += -ggdb CPPFLAGS += -I include -LDFLAGS := -n -nostdlib -lgcc -T Link.ld +LDFLAGS := -n -T Link.ld +LDLIBS := -nostdlib -lgcc -L/opt/sysroot/usr/lib -lc kernel: $(OBJ) - $(LINK.c) $^ -o $@ + $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ %.o: %.S.py python3 $^ | $(COMPILE.S) $(DEPFLAGS) -x assembler-with-cpp - -o $@ diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 594502f..50ba9eb 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -5,6 +5,7 @@ #include #include #include +#include struct kernel_boot_data_st kernel_boot_data; @@ -26,6 +27,10 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) debug_info("Boot complete\n"); + debug_info("Mallocing\n"); + uint64_t a = malloc(100); + debug_info("Malloced %x\n", a); + PANIC("End of kernel function!"); debug_info("Broke out of panic"); diff --git a/src/kernel/lib/musl-glue.c b/src/kernel/lib/musl-glue.c new file mode 100644 index 0000000..2c15a9a --- /dev/null +++ b/src/kernel/lib/musl-glue.c @@ -0,0 +1,50 @@ +#include + +long syscall0(long num) +{ + long retval = 0; + PANIC("Unknown syscall: %d()\n", num); + return retval; +} + +extern long syscall1(long num, long a1) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x)\n", num, a1); + return retval; +} + +extern long syscall2(long num, long a1, long a2) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x, %x)\n", num, a1, a2); + return retval; +} + +extern long syscall3(long num, long a1, long a2, long a3) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x, %x, %x)\n", num, a1, a2, a3); + return retval; +} + +extern long syscall4(long num, long a1, long a2, long a3, long a4) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x, %x, %x, %x)\n", num, a1, a2, a3, a4); + return retval; +} + +extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5); + return retval; +} + +extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long a6) +{ + long retval = 0; + PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5, a6); + return retval; +} \ No newline at end of file diff --git a/src/patch-musl/arch/x86_64/syscall_arch.h b/src/patch-musl/arch/x86_64/syscall_arch.h new file mode 100644 index 0000000..3605b25 --- /dev/null +++ b/src/patch-musl/arch/x86_64/syscall_arch.h @@ -0,0 +1,47 @@ +#define __SYSCALL_LL_E(x) (x) +#define __SYSCALL_LL_O(x) (x) + +extern long syscall0(long); +extern long syscall1(long, long); +extern long syscall2(long, long, long); +extern long syscall3(long, long, long, long); +extern long syscall4(long, long, long, long, long); +extern long syscall5(long, long, long, long, long, long); +extern long syscall6(long, long, long, long, long, long, long); + +static __inline long __syscall0(long n) +{ + return syscall0(n); +} +static __inline long __syscall1(long n, long a1) +{ + return syscall1(n, a1); +} +static __inline long __syscall2(long n, long a1, long a2) +{ + return syscall2(n, a1, a2); +} +static __inline long __syscall3(long n, long a1, long a2, long a3) +{ + return syscall3(n, a1, a2, a3); +} +static __inline long __syscall4(long n, long a1, long a2, long a3, long a4) +{ + return syscall4(n, a1, a2, a3, a4); +} +static __inline long __syscall5(long n, long a1, long a2, long a3, long a4, long a5) +{ + return syscall5(n, a1, a2, a3, a4, a5); +} +static __inline long __syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) +{ + return syscall6(n, a1, a2, a3, a4, a5, a6); +} + +#define VDSO_USEFUL +#define VDSO_CGT_SYM "__vdso_clock_gettime" +#define VDSO_CGT_VER "LINUX_2.6" +#define VDSO_GETCPU_SYM "__vdso_getcpu" +#define VDSO_GETCPU_VER "LINUX_2.6" + +#define IPC_64 0 \ No newline at end of file diff --git a/toolchain/build-musl.sh b/toolchain/build-musl.sh new file mode 100755 index 0000000..81bd73b --- /dev/null +++ b/toolchain/build-musl.sh @@ -0,0 +1,26 @@ +#!/bin/sh -e + +target=x86_64-elf +SYSROOT=/opt/sysroot + +# Pull or update musl libc +mkdir -p /opt/external && cd /opt/external +[ -d musl ] || git clone --depth=1 git://git.musl-libc.org/musl +cd musl +git reset --hard +git pull + +[ -d /opt/src/patch-musl ] && rsync -a /opt/src/patch-musl/ /opt/external/musl/ + +mkdir -p /opt/external/build-musl && cd /opt/external/build-musl +rm -r * +../musl/configure \ + --target=${target} \ + --prefix=${SYSROOT}/usr \ + --disable-shared \ + --enable-debug \ + CFLAGS="-O0 -mcmodel=large" + +make +make install-headers +make install \ No newline at end of file diff --git a/toolchain/build-toolchain.sh b/toolchain/build-toolchain.sh index 2481f9e..d794c54 100755 --- a/toolchain/build-toolchain.sh +++ b/toolchain/build-toolchain.sh @@ -5,14 +5,31 @@ apk add gmp-dev mpfr-dev mpc1-dev apk add make apk add grub-bios xorriso -apk add python3 +apk add python3 git rsync rm -rf /var/cache/apk/* target=x86_64-elf +SYSROOT=/opt/sysroot binutils=binutils-2.37 gcc=gcc-11.2.0 +mkdir -p /opt/external +cd /opt/external +[ -d musl ] || git clone --depth=1 git://git.musl-libc.org/musl +cd musl +git reset --hard +git pull + +cat > config.mak << EOF +ARCH=x86_64 +prefix=${SYSROOT}/usr +includedir=\$(prefix)/include +EOF + +make install-headers + +# Build binutils cd /opt wget http://ftp.gnu.org/gnu/binutils/${binutils}.tar.gz tar -xf ${binutils}.tar.gz @@ -21,11 +38,12 @@ mkdir binutils-build && cd binutils-build --target=${target} \ --disable-nls \ --disable-werror \ - --with-sysroot \ + --with-sysroot=${SYSROOT} make -j 4 make install +# Build gcc and libgcc cd /opt wget http://ftp.gnu.org/gnu/gcc/${gcc}/${gcc}.tar.gz tar -xf ${gcc}.tar.gz @@ -34,7 +52,7 @@ mkdir gcc-build && cd gcc-build --target=${target} \ --disable-nls \ --enable-languages=c \ - --without-headers \ + --with-sysroot=${SYSROOT} make all-gcc all-target-libgcc -j 4 make install-gcc install-target-libgcc