From 712b95c9d7c8442c10e72a9a2db9fc4575174bb2 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Fri, 2 Feb 2024 00:01:48 +0100 Subject: [PATCH] Moved stdlib to a seperate folder and added some more headers that are required for compiling libgcc (no implementation yet). --- targets/_any/SConscript | 6 +-- .../_any/include/os/resources/lat9-08.psf.hpp | 11 +++++ targets/_any/include/stdio.h | 35 -------------- targets/_any/src/os/resources/lat9-08.psf.s | 13 +++++ targets/_any/stdlib/SConscript | 13 +++++ targets/_any/{ => stdlib}/include/assert.h | 0 .../_any/{ => stdlib}/include/detail/common.h | 2 + targets/_any/stdlib/include/errno.h | 7 +++ targets/_any/{ => stdlib}/include/math.h | 0 targets/_any/stdlib/include/stdint.h | 9 ++++ targets/_any/stdlib/include/stdio.h | 47 +++++++++++++++++++ targets/_any/{ => stdlib}/include/stdlib.h | 7 +++ targets/_any/{ => stdlib}/include/string.h | 4 ++ targets/_any/stdlib/include/sys/types.h | 9 ++++ targets/_any/stdlib/include/time.h | 7 +++ targets/_any/stdlib/include/unistd.h | 22 +++++++++ .../{src/cstdlib => stdlib/src}/assert.cpp | 0 .../{src/cstdlib => stdlib/src}/stdio.cpp | 0 .../{src/cstdlib => stdlib/src}/stdlib.cpp | 0 .../{src/cstdlib => stdlib/src}/string.cpp | 0 targets/x86_64/SConscript | 2 +- targets/x86_64/src/kernel/startup.cpp | 2 +- 22 files changed, 154 insertions(+), 42 deletions(-) create mode 100644 targets/_any/include/os/resources/lat9-08.psf.hpp delete mode 100644 targets/_any/include/stdio.h create mode 100644 targets/_any/src/os/resources/lat9-08.psf.s create mode 100644 targets/_any/stdlib/SConscript rename targets/_any/{ => stdlib}/include/assert.h (100%) rename targets/_any/{ => stdlib}/include/detail/common.h (90%) create mode 100644 targets/_any/stdlib/include/errno.h rename targets/_any/{ => stdlib}/include/math.h (100%) create mode 100644 targets/_any/stdlib/include/stdint.h create mode 100644 targets/_any/stdlib/include/stdio.h rename targets/_any/{ => stdlib}/include/stdlib.h (55%) rename targets/_any/{ => stdlib}/include/string.h (68%) create mode 100644 targets/_any/stdlib/include/sys/types.h create mode 100644 targets/_any/stdlib/include/time.h create mode 100644 targets/_any/stdlib/include/unistd.h rename targets/_any/{src/cstdlib => stdlib/src}/assert.cpp (100%) rename targets/_any/{src/cstdlib => stdlib/src}/stdio.cpp (100%) rename targets/_any/{src/cstdlib => stdlib/src}/stdlib.cpp (100%) rename targets/_any/{src/cstdlib => stdlib/src}/string.cpp (100%) diff --git a/targets/_any/SConscript b/targets/_any/SConscript index 6ed97df..73ab27a 100644 --- a/targets/_any/SConscript +++ b/targets/_any/SConscript @@ -4,15 +4,11 @@ any_target_sources = Split(''' src/app/main.cpp src/libs/psf.cpp - - src/cstdlib/assert.cpp - src/cstdlib/stdio.cpp - src/cstdlib/stdlib.cpp - src/cstdlib/string.cpp ''') env.Append(KERNEL_SOURCES = [env.File(f) for f in any_target_sources]) env = SConscript('kernel/SConscript', exports = 'env') +env = SConscript('stdlib/SConscript', exports = 'env') Return('env') \ No newline at end of file diff --git a/targets/_any/include/os/resources/lat9-08.psf.hpp b/targets/_any/include/os/resources/lat9-08.psf.hpp new file mode 100644 index 0000000..eaf9de2 --- /dev/null +++ b/targets/_any/include/os/resources/lat9-08.psf.hpp @@ -0,0 +1,11 @@ + +#pragma once + +#include + +extern "C" +{ +extern const uint8_t LAT9_08[]; +extern const unsigned LAT9_08_SIZE; +} + diff --git a/targets/_any/include/stdio.h b/targets/_any/include/stdio.h deleted file mode 100644 index b26a9a8..0000000 --- a/targets/_any/include/stdio.h +++ /dev/null @@ -1,35 +0,0 @@ - -#pragma once - -#if !defined(BAD_APPLE_OS_STDIO_H_INCLUDED) -#define BAD_APPLE_OS_STDIO_H_INCLUDED - -#include -#include -#include "./detail/common.h" - -#define stdin __stdin - -BA_EXTERN_C_BEGIN - -typedef struct __file FILE; - -extern FILE* __stdin; - -static int EOF = -1; - -int putchar(int chr) BA_CXX_NOEXCEPT; -int puts(const char* str) BA_CXX_NOEXCEPT; -int printf(const char* format, ...) BA_CXX_NOEXCEPT __attribute__((format(printf, 1, 2))); -int vprintf(const char* format, va_list vlist) BA_CXX_NOEXCEPT; -int snprintf(char* buffer, size_t bufferSize, const char* format, ...) BA_CXX_NOEXCEPT __attribute__((format(printf, 3, 4))); -int vsnprintf(char* buffer, size_t bufferSize, const char* format, va_list vlist) BA_CXX_NOEXCEPT; - -int fgetc(FILE* stream) BA_CXX_NOEXCEPT; -char* fgets(char* buffer, int count, FILE* stream) BA_CXX_NOEXCEPT; -inline int getc(FILE* stream) BA_CXX_NOEXCEPT { return fgetc(stream); } -inline int getchar() BA_CXX_NOEXCEPT { return fgetc(stdin); } - -BA_EXTERN_C_END - -#endif // !defined(BAD_APPLE_OS_STDIO_H_INCLUDED) diff --git a/targets/_any/src/os/resources/lat9-08.psf.s b/targets/_any/src/os/resources/lat9-08.psf.s new file mode 100644 index 0000000..9a64660 --- /dev/null +++ b/targets/_any/src/os/resources/lat9-08.psf.s @@ -0,0 +1,13 @@ + + .section .rodata + .global LAT9_08 + .type LAT9_08 @object + + .section .rodata + .global LAT9_08_SIZE + .type LAT9_08_SIZE @object +LAT9_08: + .incbin "/home/mewin/Documents/projects/C++/bad_apple_os/targets/_any/src/os/resources/lat9-08.psf" +LAT9_08_END: +LAT9_08_SIZE: + .int LAT9_08_END - LAT9_08 diff --git a/targets/_any/stdlib/SConscript b/targets/_any/stdlib/SConscript new file mode 100644 index 0000000..a21c3bd --- /dev/null +++ b/targets/_any/stdlib/SConscript @@ -0,0 +1,13 @@ + +Import('env') + +stdlib_sources = Split(''' + src/assert.cpp + src/stdio.cpp + src/stdlib.cpp + src/string.cpp +''') + +env.Append(KERNEL_SOURCES = [env.File(f) for f in stdlib_sources]) + +Return('env') diff --git a/targets/_any/include/assert.h b/targets/_any/stdlib/include/assert.h similarity index 100% rename from targets/_any/include/assert.h rename to targets/_any/stdlib/include/assert.h diff --git a/targets/_any/include/detail/common.h b/targets/_any/stdlib/include/detail/common.h similarity index 90% rename from targets/_any/include/detail/common.h rename to targets/_any/stdlib/include/detail/common.h index 29c7a84..283dd83 100644 --- a/targets/_any/include/detail/common.h +++ b/targets/_any/stdlib/include/detail/common.h @@ -10,12 +10,14 @@ #define BA_CXX_NOEXCEPT noexcept #define BA_EXTERN_C_BEGIN extern "C" { #define BA_EXTERN_C_END } +#define BA_C_RESTRICT #else #define BA_CXX_NODISCARD #define BA_CXX_NORETURN #define BA_CXX_NOEXCEPT #define BA_EXTERN_C_BEGIN #define BA_EXTERN_C_END +#define BA_C_RESTRICT restrict #endif #endif // !defined(BAD_APPLE_OS_DETAIL_ATTRIBUTES_H_INCLUDED) diff --git a/targets/_any/stdlib/include/errno.h b/targets/_any/stdlib/include/errno.h new file mode 100644 index 0000000..b101cca --- /dev/null +++ b/targets/_any/stdlib/include/errno.h @@ -0,0 +1,7 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_ERRNO_H_INCLUDED) +#define BAD_APPLE_OS_ERRNO_H_INCLUDED + +#endif // !defined(BAD_APPLE_OS_ERRNO_H_INCLUDED) diff --git a/targets/_any/include/math.h b/targets/_any/stdlib/include/math.h similarity index 100% rename from targets/_any/include/math.h rename to targets/_any/stdlib/include/math.h diff --git a/targets/_any/stdlib/include/stdint.h b/targets/_any/stdlib/include/stdint.h new file mode 100644 index 0000000..82130c9 --- /dev/null +++ b/targets/_any/stdlib/include/stdint.h @@ -0,0 +1,9 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_STDINT_H_INCLUDED) +#define BAD_APPLE_OS_STDINT_H_INCLUDED + +#include "stdint-gcc.h" // TODO? + +#endif // !defined(BAD_APPLE_OS_STDINT_H_INCLUDED) diff --git a/targets/_any/stdlib/include/stdio.h b/targets/_any/stdlib/include/stdio.h new file mode 100644 index 0000000..75e1dc1 --- /dev/null +++ b/targets/_any/stdlib/include/stdio.h @@ -0,0 +1,47 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_STDIO_H_INCLUDED) +#define BAD_APPLE_OS_STDIO_H_INCLUDED + +#include +#include +#include "./detail/common.h" + +#define stdin __stdin + +BA_EXTERN_C_BEGIN + +typedef struct __file FILE; + +extern FILE* __stdin; + +static int EOF = -1; + +int putchar(int chr) BA_CXX_NOEXCEPT; +int puts(const char* str) BA_CXX_NOEXCEPT; +int printf(const char* BA_C_RESTRICT format, ...) BA_CXX_NOEXCEPT __attribute__((format(printf, 1, 2))); +int vprintf(const char* BA_C_RESTRICT format, va_list vlist) BA_CXX_NOEXCEPT; +int sprintf(char* BA_C_RESTRICT buffer, const char* BA_C_RESTRICT format, ...) BA_CXX_NOEXCEPT; +int snprintf(char* BA_C_RESTRICT buffer, size_t bufferSize, const char* BA_C_RESTRICT format, ...) BA_CXX_NOEXCEPT __attribute__((format(printf, 3, 4))); +int vsnprintf(char* BA_C_RESTRICT buffer, size_t bufferSize, const char* BA_C_RESTRICT format, va_list vlist) BA_CXX_NOEXCEPT; + +int fclose(FILE* stream) BA_CXX_NOEXCEPT; +int fflush(FILE* stream) BA_CXX_NOEXCEPT; +int fgetc(FILE* stream) BA_CXX_NOEXCEPT; +FILE* fopen(const char* BA_C_RESTRICT filename, const char* BA_C_RESTRICT mode) BA_CXX_NOEXCEPT; +char* fgets(char* buffer, int count, FILE* stream) BA_CXX_NOEXCEPT; +int fprintf(FILE* BA_C_RESTRICT stream, const char* BA_C_RESTRICT format, ...) BA_CXX_NOEXCEPT __attribute__((format(printf, 2, 3))); +size_t fread(void* BA_C_RESTRICT buffer, size_t size, size_t count, FILE* BA_C_RESTRICT stream) BA_CXX_NOEXCEPT; +int fseek(FILE* stream, long offset, int origin) BA_CXX_NOEXCEPT; +long ftell(FILE* stream) BA_CXX_NOEXCEPT; +size_t fwrite(const void* BA_C_RESTRICT buffer, size_t size, size_t count, FILE* BA_C_RESTRICT stream) BA_CXX_NOEXCEPT; +void setbuf(FILE* BA_C_RESTRICT stream, char* BA_C_RESTRICT buffer) BA_CXX_NOEXCEPT; +int vfprintf(FILE* BA_C_RESTRICT stream, const char* BA_C_RESTRICT format, va_list vlist) BA_CXX_NOEXCEPT; + +inline int getc(FILE* stream) BA_CXX_NOEXCEPT { return fgetc(stream); } +inline int getchar() BA_CXX_NOEXCEPT { return fgetc(stdin); } + +BA_EXTERN_C_END + +#endif // !defined(BAD_APPLE_OS_STDIO_H_INCLUDED) diff --git a/targets/_any/include/stdlib.h b/targets/_any/stdlib/include/stdlib.h similarity index 55% rename from targets/_any/include/stdlib.h rename to targets/_any/stdlib/include/stdlib.h index ba0418a..fd8008b 100644 --- a/targets/_any/include/stdlib.h +++ b/targets/_any/stdlib/include/stdlib.h @@ -10,6 +10,13 @@ BA_EXTERN_C_BEGIN BA_CXX_NORETURN void abort(); +int atexit(void (*func)()) BA_CXX_NOEXCEPT; +BA_CXX_NODISCARD char* getenv(const char* name) BA_CXX_NOEXCEPT; + +BA_CXX_NODISCARD int abs(int n) BA_CXX_NOEXCEPT; +BA_CXX_NODISCARD int atoi(const char* str) BA_CXX_NOEXCEPT; + +BA_CXX_NODISCARD void* calloc(size_t num, size_t size) BA_CXX_NOEXCEPT; BA_CXX_NODISCARD void* malloc(size_t size) BA_CXX_NOEXCEPT; void free(void* ptr) BA_CXX_NOEXCEPT; diff --git a/targets/_any/include/string.h b/targets/_any/stdlib/include/string.h similarity index 68% rename from targets/_any/include/string.h rename to targets/_any/stdlib/include/string.h index e01cd4e..bde040d 100644 --- a/targets/_any/include/string.h +++ b/targets/_any/stdlib/include/string.h @@ -14,6 +14,10 @@ BA_CXX_NODISCARD int memcmp(const void* lhs, const void* rhs, size_t count) BA_C void* memcpy(void* dest, const void* src, size_t count) BA_CXX_NOEXCEPT; void* memmove(void* dest, const void* src, size_t count) BA_CXX_NOEXCEPT; void* memset(void* dest, int value, size_t count) BA_CXX_NOEXCEPT; + +BA_CXX_NODISCARD char* strcat(char* BA_C_RESTRICT dest, const char* BA_C_RESTRICT src) BA_CXX_NOEXCEPT; +BA_CXX_NODISCARD char* strchr(const char* str, int ch) BA_CXX_NOEXCEPT; +BA_CXX_NODISCARD char* strcpy(char* BA_C_RESTRICT dest, const char* BA_C_RESTRICT src) BA_CXX_NOEXCEPT; BA_CXX_NODISCARD size_t strlen(const char* str) BA_CXX_NOEXCEPT; BA_EXTERN_C_END diff --git a/targets/_any/stdlib/include/sys/types.h b/targets/_any/stdlib/include/sys/types.h new file mode 100644 index 0000000..f182a2e --- /dev/null +++ b/targets/_any/stdlib/include/sys/types.h @@ -0,0 +1,9 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_SYS_TYPES_H_INCLUDED) +#define BAD_APPLE_OS_SYS_TYPES_H_INCLUDED + +typedef int pid_t; + +#endif // !defined(BAD_APPLE_OS_SYS_TYPES_H_INCLUDED) diff --git a/targets/_any/stdlib/include/time.h b/targets/_any/stdlib/include/time.h new file mode 100644 index 0000000..376ab0e --- /dev/null +++ b/targets/_any/stdlib/include/time.h @@ -0,0 +1,7 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_TIME_H_INCLUDED) +#define BAD_APPLE_OS_TIME_H_INCLUDED + +#endif // !defined(BAD_APPLE_OS_TIME_H_INCLUDED) diff --git a/targets/_any/stdlib/include/unistd.h b/targets/_any/stdlib/include/unistd.h new file mode 100644 index 0000000..c30a1ed --- /dev/null +++ b/targets/_any/stdlib/include/unistd.h @@ -0,0 +1,22 @@ + +#pragma once + +#if !defined(BAD_APPLE_OS_UNISTD_H_INCLUDED) +#define BAD_APPLE_OS_UNISTD_H_INCLUDED + +#include +#include + +#include "./detail/common.h" + +BA_EXTERN_C_BEGIN + +pid_t fork() BA_CXX_NOEXCEPT; +int execv(const char* pathname, char* const argv[]) BA_CXX_NOEXCEPT; +int execve(const char* pathname, char* const argv[], char* const envp[]) BA_CXX_NOEXCEPT; +int execvp(const char* file, char* const argv[]) BA_CXX_NOEXCEPT; +pid_t getpid() BA_CXX_NOEXCEPT; + +BA_EXTERN_C_END + +#endif // !defined(BAD_APPLE_OS_UNISTD_H_INCLUDED) diff --git a/targets/_any/src/cstdlib/assert.cpp b/targets/_any/stdlib/src/assert.cpp similarity index 100% rename from targets/_any/src/cstdlib/assert.cpp rename to targets/_any/stdlib/src/assert.cpp diff --git a/targets/_any/src/cstdlib/stdio.cpp b/targets/_any/stdlib/src/stdio.cpp similarity index 100% rename from targets/_any/src/cstdlib/stdio.cpp rename to targets/_any/stdlib/src/stdio.cpp diff --git a/targets/_any/src/cstdlib/stdlib.cpp b/targets/_any/stdlib/src/stdlib.cpp similarity index 100% rename from targets/_any/src/cstdlib/stdlib.cpp rename to targets/_any/stdlib/src/stdlib.cpp diff --git a/targets/_any/src/cstdlib/string.cpp b/targets/_any/stdlib/src/string.cpp similarity index 100% rename from targets/_any/src/cstdlib/string.cpp rename to targets/_any/stdlib/src/string.cpp diff --git a/targets/x86_64/SConscript b/targets/x86_64/SConscript index 3fb9c42..59bc395 100644 --- a/targets/x86_64/SConscript +++ b/targets/x86_64/SConscript @@ -11,7 +11,7 @@ kernel_env.Append(CFLAGS = ['-ffreestanding']) kernel_env.Append(CPPDEFINES = ['__baos_kernel_source__=1']) kernel_env.Append(CXXFLAGS = ['-ffreestanding', '-fno-exceptions', '-fno-rtti', '-std=c++20']) kernel_env.Append(LINKFLAGS = ['-T', kernel_env.File('linker.ld').abspath, '-ffreestanding', '-nostdlib', '-mcmodel=large', '-mno-red-zone', '-mno-mmx', '-mno-sse', '-mno-sse2']) -kernel_env.Append(CPPPATH = ['#targets/_any/include', '#bastl/include', 'include', '/usr/include/efi', '#targets/_any/kernel/include']) +kernel_env.Append(CPPPATH = ['#targets/_any/include', '#bastl/include', 'include', '/usr/include/efi', '#targets/_any/kernel/include', '#targets/_any/stdlib/include']) def get_crt_object(name: str) -> str: import subprocess diff --git a/targets/x86_64/src/kernel/startup.cpp b/targets/x86_64/src/kernel/startup.cpp index 7b6e3ae..1d71d60 100644 --- a/targets/x86_64/src/kernel/startup.cpp +++ b/targets/x86_64/src/kernel/startup.cpp @@ -213,7 +213,7 @@ void kernel_main() for (const MemoryRange& range : ranges) { - // std::printf("Start: 0x%lX, Pages: %ld, Type: %s\n", range.pageBase << 12, range.numPages, memoryTypeName(range.type)); + std::printf("Start: 0x%lX, Pages: %ld, Type: %s\n", range.pageBase << 12, range.numPages, memoryTypeName(range.type)); } if (!picsInited)