diff --git a/README.md b/README.md index 3074820..c2ab965 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Popcorn uses the `waf` build tool, which is included in the repo. The other requirements are: * python (to run waf) -* gcc +* clang * nasm After cloning, run `waf configure`. Then you can run `waf build` to build the diff --git a/src/boot/wscript b/src/boot/wscript index ca550bb..8661198 100644 --- a/src/boot/wscript +++ b/src/boot/wscript @@ -11,7 +11,7 @@ def configure(ctx): 'EFI_DEBUG=0', 'EFI_DEBUG_CLEAR_MEMORY=0', ]) - ctx.env.append_value('CFLAGS_EFI', ['-fPIC', '-fshort-wchar', '-Wa,--no-warn']) + ctx.env.append_value('CFLAGS_EFI', ['-fPIC', '-fshort-wchar']) ctx.env.append_value('LINKFLAGS_EFI', [ '-shared', '-T', lds_path, diff --git a/src/kernel/cpprt.cpp b/src/kernel/cpprt.cpp index a67495d..ca4e3e7 100644 --- a/src/kernel/cpprt.cpp +++ b/src/kernel/cpprt.cpp @@ -1,3 +1,37 @@ +#include "kutil/assert.h" + +using __exit_func = void (*)(void *); + extern "C" { - void __cxa_pure_virtual() { while(1); } + void *__dso_handle __attribute__ ((__weak__)); + int __cxa_atexit(__exit_func, void *, void *); + void __cxa_pure_virtual(); +} + + +struct __exit_func_entry +{ + __exit_func func; + void *obj; + void *dso; +}; + +static int __num_exit_funcs = 0; +static const int __max_exit_funcs = 64; +__exit_func_entry __exit_funcs[__max_exit_funcs]; + +int +__cxa_atexit(__exit_func f, void *o, void *dso) +{ + int i = __num_exit_funcs++; + if (i >= __max_exit_funcs) return -1; + __exit_funcs[i].func = f; + __exit_funcs[i].obj = o; + __exit_funcs[i].dso = dso; + return 0; +} + +void __cxa_pure_virtual() +{ + kassert(0, "Pure virtual function call"); } diff --git a/src/kernel/kalloc.cpp b/src/kernel/kalloc.cpp index af23047..0203cc5 100644 --- a/src/kernel/kalloc.cpp +++ b/src/kernel/kalloc.cpp @@ -2,9 +2,10 @@ kutil::memory_manager g_kernel_memory_manager; -void * kalloc(size_t length) { return g_kernel_memory_manager.allocate(length); } -void kfree(void *p) { g_kernel_memory_manager.free(p); } -void * operator new (size_t n) { return g_kernel_memory_manager.allocate(n); } -void * operator new[] (size_t n) { return g_kernel_memory_manager.allocate(n); } -void operator delete (void *p) { return g_kernel_memory_manager.free(p); } -void operator delete[] (void *p){ return g_kernel_memory_manager.free(p); } +void * kalloc(size_t length) { return g_kernel_memory_manager.allocate(length); } +void kfree(void *p) { g_kernel_memory_manager.free(p); } + +void * operator new (size_t n) { return g_kernel_memory_manager.allocate(n); } +void * operator new[] (size_t n) { return g_kernel_memory_manager.allocate(n); } +void operator delete (void *p) noexcept { return g_kernel_memory_manager.free(p); } +void operator delete[] (void *p) noexcept { return g_kernel_memory_manager.free(p); } diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 375cda5..40266a7 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -23,8 +23,7 @@ extern "C" { void *__bss_start, *__bss_end; } -extern [[noreturn]] void -__kernel_assert(const char *file, unsigned line, const char *message); +extern void __kernel_assert(const char *, unsigned, const char *); void init_console(const popcorn_data *header) @@ -55,7 +54,7 @@ init_console(const popcorn_data *header) log::enable(logs::memory, log::level::debug); } -void do_error_3() { int x = 1 / 0; } +void do_error_3() { volatile int x = 1; volatile int y = 0; volatile int z = x / y; } void do_error_2() { do_error_3(); } void do_error_1() { do_error_2(); } diff --git a/src/kernel/memory_bootstrap.cpp b/src/kernel/memory_bootstrap.cpp index 7c3297f..c9c0fbf 100644 --- a/src/kernel/memory_bootstrap.cpp +++ b/src/kernel/memory_bootstrap.cpp @@ -357,7 +357,7 @@ find_efi_free_aligned_pages(const void *memory_map, size_t map_length, size_t de static unsigned check_needs_page_ident(page_table *table, unsigned index, page_table **free_pages) { - if (table->entries[index] & 0x1 == 1) return 0; + if ((table->entries[index] & 0x1) == 1) return 0; kassert(*free_pages, "check_needs_page_ident needed to allocate but had no free pages"); @@ -404,6 +404,7 @@ page_in_ident( } kassert(0, "Ran to end of page_in_ident"); + return 0; // Cannot reach } void diff --git a/src/kernel/page_manager.cpp b/src/kernel/page_manager.cpp index 469f762..491d5ef 100644 --- a/src/kernel/page_manager.cpp +++ b/src/kernel/page_manager.cpp @@ -263,6 +263,7 @@ page_manager::get_block() return block; } else { kassert(0, "NYI: page_manager::get_block() needed to allocate."); + return nullptr; } } @@ -431,7 +432,7 @@ page_manager::unmap_pages(addr_t address, size_t count) void page_manager::check_needs_page(page_table *table, unsigned index) { - if (table->entries[index] & 0x1 == 1) return; + if ((table->entries[index] & 0x1) == 1) return; page_table *new_table = get_table_page(); for (int i=0; i<512; ++i) new_table->entries[i] = 0; @@ -527,7 +528,7 @@ page_table::dump(int level, uint64_t offset) uint64_t ent = entries[i]; if (ent == 0) continue; - if (ent & 0x1 == 0) { + if ((ent & 0x1) == 0) { log::info(logs::memory, " %3d: %lx NOT PRESENT", i, ent); continue; } diff --git a/src/modules/kutil/assert.h b/src/modules/kutil/assert.h index 5c78d62..a70f665 100644 --- a/src/modules/kutil/assert.h +++ b/src/modules/kutil/assert.h @@ -15,4 +15,4 @@ extern assert_callback __kernel_assert_p; } // namespace kutil -#define kassert(stmt, message) if(!(stmt)) { ::kutil::__kernel_assert_p(__FILE__, __LINE__, (message)); } else {} +#define kassert(stmt, message) do { if(!(stmt)) { ::kutil::__kernel_assert_p(__FILE__, __LINE__, (message)); }} while(0); diff --git a/wscript b/wscript index 2abc3a9..1dc5be8 100644 --- a/wscript +++ b/wscript @@ -9,7 +9,7 @@ class TestContext(BuildContext): def options(opt): - opt.load("nasm gcc g++") + opt.load("nasm clang clang++") opt.add_option( '--arch', @@ -36,7 +36,7 @@ def configure(ctx): ctx.find_program("ld", var="LINK_CC") ctx.env.LINK_CXX = ctx.env.LINK_CC - ctx.load("nasm gcc g++") + ctx.load("nasm clang clang++") ctx.find_program("objcopy", var="objcopy") ctx.find_program("objdump", var="objdump") ctx.find_program("mcopy", var="mcopy") @@ -158,7 +158,7 @@ def configure(ctx): ## from waflib.ConfigSet import ConfigSet ctx.setenv('tests', env=ConfigSet()) - ctx.load("g++") + ctx.load("clang++") ctx.env.append_value('INCLUDES', [ join(ctx.path.abspath(), "src", "include"),