diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py new file mode 100644 index 0000000..eb964ec --- /dev/null +++ b/.ycm_extra_conf.py @@ -0,0 +1,147 @@ +# Generated by YCM Generator at 2019-09-16 12:39:32.163870 + +# This file is NOT licensed under the GPLv3, which is the license for the rest +# of YouCompleteMe. +# +# Here's the license text for this file: +# +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or +# distribute this software, either in source code form or as a compiled +# binary, for any purpose, commercial or non-commercial, and by any +# means. +# +# In jurisdictions that recognize copyright laws, the author or authors +# of this software dedicate any and all copyright interest in the +# software to the public domain. We make this dedication for the benefit +# of the public at large and to the detriment of our heirs and +# successors. We intend this dedication to be an overt act of +# relinquishment in perpetuity of all present and future rights to this +# software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to + +import os +import ycm_core + +flags = [ + '-x', + 'c', + '-DARCH_AMD64', + '-I.', + '-Iinclude', + '-Wall', + '-Werror', + '-Wextra', + '-Wno-unused-parameter', + '-Wpedantic', + '-m64', + '-nostdlib', +] + + +# Set this to the absolute path to the folder (NOT the file!) containing the +# compile_commands.json file to use that instead of 'flags'. See here for +# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html +# +# You can get CMake to generate this file for you by adding: +# set( CMAKE_EXPORT_COMPILE_COMMANDS 1 ) +# to your CMakeLists.txt file. +# +# Most projects will NOT need to set this to anything; you can just change the +# 'flags' list of compilation flags. Notice that YCM itself uses that approach. +compilation_database_folder = '' + +if os.path.exists( compilation_database_folder ): + database = ycm_core.CompilationDatabase( compilation_database_folder ) +else: + database = None + +SOURCE_EXTENSIONS = [ '.C', '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] + +def DirectoryOfThisScript(): + return os.path.dirname( os.path.abspath( __file__ ) ) + + +def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): + if not working_directory: + return list( flags ) + new_flags = [] + make_next_absolute = False + path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] + for flag in flags: + new_flag = flag + + if make_next_absolute: + make_next_absolute = False + if not flag.startswith( '/' ): + new_flag = os.path.join( working_directory, flag ) + + for path_flag in path_flags: + if flag == path_flag: + make_next_absolute = True + break + + if flag.startswith( path_flag ): + path = flag[ len( path_flag ): ] + new_flag = path_flag + os.path.join( working_directory, path ) + break + + if new_flag: + new_flags.append( new_flag ) + return new_flags + + +def IsHeaderFile( filename ): + extension = os.path.splitext( filename )[ 1 ] + return extension in [ '.H', '.h', '.hxx', '.hpp', '.hh' ] + + +def GetCompilationInfoForFile( filename ): + # The compilation_commands.json file generated by CMake does not have entries + # for header files. So we do our best by asking the db for flags for a + # corresponding source file, if any. If one exists, the flags for that file + # should be good enough. + if IsHeaderFile( filename ): + basename = os.path.splitext( filename )[ 0 ] + for extension in SOURCE_EXTENSIONS: + replacement_file = basename + extension + if os.path.exists( replacement_file ): + compilation_info = database.GetCompilationInfoForFile( + replacement_file ) + if compilation_info.compiler_flags_: + return compilation_info + return None + return database.GetCompilationInfoForFile( filename ) + + +def FlagsForFile( filename, **kwargs ): + if database: + # Bear in mind that compilation_info.compiler_flags_ does NOT return a + # python list, but a "list-like" StringVec object + compilation_info = GetCompilationInfoForFile( filename ) + if not compilation_info: + return None + + final_flags = MakeRelativePathsInFlagsAbsolute( + compilation_info.compiler_flags_, + compilation_info.compiler_working_dir_ ) + + else: + relative_to = DirectoryOfThisScript() + final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) + + return { + 'flags': final_flags, + 'do_cache': True + } + diff --git a/conf/make/amd64.mk b/conf/make/amd64.mk index 8ba7f25..fea007d 100644 --- a/conf/make/amd64.mk +++ b/conf/make/amd64.mk @@ -19,7 +19,7 @@ kernel_OBJS=$(O)/arch/amd64/entry.o \ $(OBJS) kernel_LINKER=$(S)/arch/amd64/link.ld kernel_LDFLAGS=-nostdlib -T$(kernel_LINKER) -kernel_CFLAGS=-ffreestanding -I$(S) $(DEFINES) $(CFLAGS) -mcmodel=large +kernel_CFLAGS=-ffreestanding -I. $(DEFINES) $(CFLAGS) -mcmodel=large -m64 DIRS+=$(O)/arch/amd64/mm \ $(O)/arch/amd64/hw # add .inc includes for asm @@ -44,7 +44,7 @@ loader_OBJS+=$(O)/arch/amd64/loader/boot.o \ $(O)/arch/amd64/loader/loader.o \ $(O)/arch/amd64/loader/util.o loader_LINKER=$(S)/arch/amd64/loader/link.ld -loader_CFLAGS=-ffreestanding -nostdlib -I$(S) -m32 +loader_CFLAGS=-ffreestanding -nostdlib -I. -Iinclude -m32 loader_LDFLAGS=-nostdlib -melf_i386 -T$(loader_LINKER) $(O)/loader.elf: $(loader_OBJS) $(loader_LINKER) diff --git a/conf/make/none.mk b/conf/make/none.mk index d06b937..b60b4d9 100644 --- a/conf/make/none.mk +++ b/conf/make/none.mk @@ -4,7 +4,8 @@ CFLAGS+=-Wall \ -Wextra \ -Werror \ -Wpedantic \ - -Wno-unused-parameter + -Wno-unused-parameter \ + -Iinclude DIRS+=$(O)/sys OBJS+=$(O)/sys/mem.o \ diff --git a/src/arch/amd64/hw/gdt.h b/include/arch/amd64/hw/gdt.h similarity index 100% rename from src/arch/amd64/hw/gdt.h rename to include/arch/amd64/hw/gdt.h diff --git a/src/arch/amd64/hw/int_macros.inc b/include/arch/amd64/hw/int_macros.inc similarity index 100% rename from src/arch/amd64/hw/int_macros.inc rename to include/arch/amd64/hw/int_macros.inc diff --git a/src/arch/amd64/hw/ints.h b/include/arch/amd64/hw/ints.h similarity index 100% rename from src/arch/amd64/hw/ints.h rename to include/arch/amd64/hw/ints.h diff --git a/src/arch/amd64/hw/io.h b/include/arch/amd64/hw/io.h similarity index 100% rename from src/arch/amd64/hw/io.h rename to include/arch/amd64/hw/io.h diff --git a/src/arch/amd64/hw/pic8259.h b/include/arch/amd64/hw/pic8259.h similarity index 100% rename from src/arch/amd64/hw/pic8259.h rename to include/arch/amd64/hw/pic8259.h diff --git a/src/arch/amd64/hw/rs232.h b/include/arch/amd64/hw/rs232.h similarity index 100% rename from src/arch/amd64/hw/rs232.h rename to include/arch/amd64/hw/rs232.h diff --git a/src/arch/amd64/loader/elf.h b/include/arch/amd64/loader/elf.h similarity index 100% rename from src/arch/amd64/loader/elf.h rename to include/arch/amd64/loader/elf.h diff --git a/src/arch/amd64/loader/multiboot.h b/include/arch/amd64/loader/multiboot.h similarity index 100% rename from src/arch/amd64/loader/multiboot.h rename to include/arch/amd64/loader/multiboot.h diff --git a/src/arch/amd64/loader/util.h b/include/arch/amd64/loader/util.h similarity index 100% rename from src/arch/amd64/loader/util.h rename to include/arch/amd64/loader/util.h diff --git a/src/arch/amd64/mm.h b/include/arch/amd64/mm.h similarity index 97% rename from src/arch/amd64/mm.h rename to include/arch/amd64/mm.h index fec9c39..549ee9a 100644 --- a/src/arch/amd64/mm.h +++ b/include/arch/amd64/mm.h @@ -1,4 +1,5 @@ #pragma once +#include /// The place where the kernel pages are virtually mapped to #define KERNEL_VIRT_BASE 0xFFFFFF0000000000 diff --git a/src/arch/amd64/mm/pool.h b/include/arch/amd64/mm/pool.h similarity index 100% rename from src/arch/amd64/mm/pool.h rename to include/arch/amd64/mm/pool.h diff --git a/src/arch/amd64/hw/regs.h b/include/arch/amd64/regs.h similarity index 100% rename from src/arch/amd64/hw/regs.h rename to include/arch/amd64/regs.h diff --git a/src/sys/attr.h b/include/sys/attr.h similarity index 100% rename from src/sys/attr.h rename to include/sys/attr.h diff --git a/src/sys/debug.h b/include/sys/debug.h similarity index 100% rename from src/sys/debug.h rename to include/sys/debug.h diff --git a/src/sys/mem.h b/include/sys/mem.h similarity index 100% rename from src/sys/mem.h rename to include/sys/mem.h diff --git a/src/sys/mm.h b/include/sys/mm.h similarity index 100% rename from src/sys/mm.h rename to include/sys/mm.h diff --git a/src/sys/panic.h b/include/sys/panic.h similarity index 100% rename from src/sys/panic.h rename to include/sys/panic.h diff --git a/src/sys/string.h b/include/sys/string.h similarity index 100% rename from src/sys/string.h rename to include/sys/string.h diff --git a/src/arch/amd64/hw/exc.c b/src/arch/amd64/hw/exc.c index 81ef992..909a764 100644 --- a/src/arch/amd64/hw/exc.c +++ b/src/arch/amd64/hw/exc.c @@ -1,6 +1,6 @@ -#include "ints.h" +#include "arch/amd64/hw/ints.h" +#include "arch/amd64/regs.h" #include "sys/debug.h" -#include "regs.h" int amd64_err_num; diff --git a/src/arch/amd64/hw/gdt.c b/src/arch/amd64/hw/gdt.c index 625c175..7d4f4eb 100644 --- a/src/arch/amd64/hw/gdt.c +++ b/src/arch/amd64/hw/gdt.c @@ -1,4 +1,4 @@ -#include "gdt.h" +#include "arch/amd64/hw/gdt.h" extern void amd64_reload_segs(void); diff --git a/src/arch/amd64/hw/idt.c b/src/arch/amd64/hw/idt.c index e44566d..cd39668 100644 --- a/src/arch/amd64/hw/idt.c +++ b/src/arch/amd64/hw/idt.c @@ -1,5 +1,5 @@ -#include "ints.h" -#include "pic8259.h" +#include "arch/amd64/hw/ints.h" +#include "arch/amd64/hw/pic8259.h" #include "sys/mem.h" #include #include diff --git a/src/arch/amd64/hw/ints.S b/src/arch/amd64/hw/ints.S index adadd4e..b44ca6b 100644 --- a/src/arch/amd64/hw/ints.S +++ b/src/arch/amd64/hw/ints.S @@ -1,4 +1,4 @@ -#include "int_macros.inc" +#include "arch/amd64/hw/int_macros.inc" .section .text .extern amd64_err_num diff --git a/src/arch/amd64/hw/irq0.S b/src/arch/amd64/hw/irq0.S index f29954f..6cd4a4a 100644 --- a/src/arch/amd64/hw/irq0.S +++ b/src/arch/amd64/hw/irq0.S @@ -1,4 +1,4 @@ -#include "int_macros.inc" +#include "arch/amd64/hw/int_macros.inc" .section .text .global amd64_irq_0 diff --git a/src/arch/amd64/hw/irqs.S b/src/arch/amd64/hw/irqs.S index 5e819b2..7f6f39d 100644 --- a/src/arch/amd64/hw/irqs.S +++ b/src/arch/amd64/hw/irqs.S @@ -1,4 +1,4 @@ -#include "int_macros.inc" +#include "arch/amd64/hw/int_macros.inc" .section .text .extern panicf diff --git a/src/arch/amd64/hw/pic8259.c b/src/arch/amd64/hw/pic8259.c index a431d94..fa39d44 100644 --- a/src/arch/amd64/hw/pic8259.c +++ b/src/arch/amd64/hw/pic8259.c @@ -1,5 +1,5 @@ -#include "pic8259.h" -#include "io.h" +#include "arch/amd64/hw/pic8259.h" +#include "arch/amd64/hw/io.h" #define PIC_MCMD 0x20 #define PIC_MDAT 0x21 diff --git a/src/arch/amd64/hw/regs.c b/src/arch/amd64/hw/regs.c index ec41a13..5ec6c2e 100644 --- a/src/arch/amd64/hw/regs.c +++ b/src/arch/amd64/hw/regs.c @@ -1,4 +1,4 @@ -#include "regs.h" +#include "arch/amd64/regs.h" #include "sys/debug.h" void amd64_ctx_dump(int level, const amd64_ctx_regs_t *regs) { diff --git a/src/arch/amd64/hw/rs232.c b/src/arch/amd64/hw/rs232.c index c929e25..6182788 100644 --- a/src/arch/amd64/hw/rs232.c +++ b/src/arch/amd64/hw/rs232.c @@ -1,5 +1,5 @@ -#include "rs232.h" -#include "io.h" +#include "arch/amd64/hw/rs232.h" +#include "arch/amd64/hw/io.h" void rs232_init(uint16_t port) { // Do nothing yet diff --git a/src/arch/amd64/loader/loader.c b/src/arch/amd64/loader/loader.c index 38b1a7e..dbb39b5 100644 --- a/src/arch/amd64/loader/loader.c +++ b/src/arch/amd64/loader/loader.c @@ -1,5 +1,5 @@ -#include "multiboot.h" -#include "util.h" +#include "arch/amd64/loader/multiboot.h" +#include "arch/amd64/loader/util.h" #include "elf.h" #define KERNEL_VIRT_BASE 0xFFFFFF0000000000 diff --git a/src/arch/amd64/loader/util.c b/src/arch/amd64/loader/util.c index 0ec6a0f..49a4e21 100644 --- a/src/arch/amd64/loader/util.c +++ b/src/arch/amd64/loader/util.c @@ -1,4 +1,4 @@ -#include "util.h" +#include "arch/amd64/loader/util.h" void *memset(void *blk, int v, size_t sz) { for (size_t i = 0; i < sz; ++i) { diff --git a/src/arch/amd64/mm/map.c b/src/arch/amd64/mm/map.c index 44d31ef..a3f88ab 100644 --- a/src/arch/amd64/mm/map.c +++ b/src/arch/amd64/mm/map.c @@ -2,7 +2,7 @@ #include "sys/debug.h" #include "sys/panic.h" #include "sys/mem.h" -#include "pool.h" +#include "arch/amd64/mm/pool.h" static int amd64_mm_map_single(mm_space_t pml4, uintptr_t virt_addr, uintptr_t phys, uint32_t flags) { size_t pml4i = (virt_addr >> 39) & 0x1FF; diff --git a/src/arch/amd64/mm/mm.c b/src/arch/amd64/mm/mm.c index b414e57..ce332c3 100644 --- a/src/arch/amd64/mm/mm.c +++ b/src/arch/amd64/mm/mm.c @@ -1,7 +1,7 @@ #include "sys/mem.h" #include "sys/debug.h" #include "sys/mm.h" -#include "pool.h" +#include "arch/amd64/mm/pool.h" mm_space_t mm_kernel; diff --git a/src/arch/amd64/mm/pool.c b/src/arch/amd64/mm/pool.c index 584bd30..adb47c4 100644 --- a/src/arch/amd64/mm/pool.c +++ b/src/arch/amd64/mm/pool.c @@ -1,7 +1,7 @@ -#include "pool.h" +#include "arch/amd64/mm/pool.h" +#include "arch/amd64/mm.h" #include "sys/debug.h" #include "sys/mem.h" -#include "../mm.h" static struct { uint64_t track[512]; diff --git a/src/sys/debug.c b/src/sys/debug.c index 298c8b2..cb0bc21 100644 --- a/src/sys/debug.c +++ b/src/sys/debug.c @@ -1,4 +1,4 @@ -#include "debug.h" +#include "sys/debug.h" #include "string.h" #include #include "sys/attr.h" diff --git a/src/sys/mem.c b/src/sys/mem.c index fe6dad0..4338ac5 100644 --- a/src/sys/mem.c +++ b/src/sys/mem.c @@ -1,4 +1,4 @@ -#include "mem.h" +#include "sys/mem.h" void *memset(void *blk, int v, size_t sz) { for (size_t i = 0; i < sz; ++i) { diff --git a/src/sys/panic.c b/src/sys/panic.c index f7c76dd..df06d81 100644 --- a/src/sys/panic.c +++ b/src/sys/panic.c @@ -1,5 +1,5 @@ -#include "panic.h" -#include "debug.h" +#include "sys/panic.h" +#include "sys/debug.h" void panicf(const char *fmt, ...) { va_list args;