import("//build/security/SIGN_TEMPLATE.gni") kernel_out_path = "base/boot" kernel_c_flags = [ "-std=gnu11", "-ffreestanding", "-Werror", "-Wno-address-of-packed-member", "-fpie", ] kernel_asm_flags = [] kernel_ld_flags = [] if (debug_build) { kernel_c_flags += [ "-DDEBUG_KERNEL" ] } if (kernel_symbols) { kernel_c_flags += [ "-ggdb" ] } if (optimize) { kernel_c_flags += [ "-Os" ] if (host == "llvm") { kernel_c_flags += [ "-flto" ] if (target_arch == "x86_64") { kernel_c_flags += [ "-mllvm", "-code-model=large", ] } } } if (target_arch == "x86" && kernel_preempt) { kernel_c_flags += [ "-DPREEMPT_KERNEL" ] } if (device_type == "desktop") { kernel_c_flags += [ "-DTARGET_DESKTOP" ] } if (device_type == "mobile") { kernel_c_flags += [ "-DTARGET_MOBILE" ] } if (target_arch == "x86") { kernel_c_flags += [ "-mno-80387", "-mno-mmx", "-mno-sse", "-mno-sse2", ] kernel_asm_flags += [ "-w+all", "-Werror", "-f", "elf", ] kernel_ld_flags += [ "--oformat", "elf32-i386", ] } if (target_arch == "x86_64") { kernel_c_flags += [ "-mno-80387", "-mno-mmx", "-mno-sse", "-mno-sse2", "-mno-red-zone", "-fno-omit-frame-pointer", "-mcmodel=large", ] kernel_asm_flags += [ "-w+all", "-Werror", "-f", "elf64", ] if (host == "llvm") { kernel_ld_flags += [ "--oformat", "elf64", ] } } if (target_arch == "arm32") { kernel_c_flags += [ "-fno-builtin", "-march=armv7-a", "-mfpu=neon-vfpv4", "-mfloat-abi=soft", ] kernel_asm_flags += [ "-march=armv7-a", "-mfpu=neon-vfpv4", "-mfloat-abi=softfp", "-mcpu=cortex-a15", ] kernel_ld_flags += [ "-nostdlib" ] if (host == "gnu") { kernel_ld_flags += [ "-nostdinc", "-nodefaultlibs", "-nostartfiles", "-lgcc", ] } if (host == "llvm") { kernel_ld_flags += [ "--oformat", "elf32-littlearm", rebase_path("//toolchains/llvm_runtime/11.1.0/libclang_rt.builtins-arm.a", root_build_dir), ] } } if (target_arch == "arm64") { kernel_c_flags += [ "-fno-builtin", "-mcpu=cortex-a53+nofp+nosimd+nocrypto+nocrc", ] kernel_asm_flags += [ "-mcpu=cortex-a53+nofp+nosimd+nocrypto+nocrc" ] kernel_ld_flags += [ "-nostdlib" ] if (host == "gnu") { kernel_ld_flags += [ "-nostdinc", "-nodefaultlibs", "-nostartfiles", "-lgcc", ] } if (host == "llvm") { kernel_ld_flags += [ "--oformat", "elf64-littlearm", ] } # Qemu virt is used as a test platform. if (target_board == "qemu_virt") { kernel_c_flags += [ "-DTARGET_QEMU_VIRT" ] kernel_asm_flags += [ "-DTARGET_QEMU_VIRT" ] } if (target_board == "apl") { kernel_c_flags += [ "-DTARGET_APL" ] kernel_asm_flags += [ "-DTARGET_APL" ] } # Enabling KASAN only for GCC builds as LLVM has fixed KASAN shadow bases # which are incompatible with xOS layout. if (debug_build && host == "gnu") { kernel_c_flags += [ "-fsanitize=kernel-address", "-DKASAN_ENABLED", ] } } if (target_arch == "riscv64") { kernel_c_flags += [ "-fno-builtin", "-march=rv64ima", "-mabi=lp64", "-mcmodel=medany", ] kernel_asm_flags += [ "-mcmodel=medany", "-march=rv64ima", "-mabi=lp64", ] kernel_ld_flags += [ "-nostdlib" ] if (host == "gnu") { kernel_ld_flags += [ "-nostdinc", "-nodefaultlibs", "-nostartfiles", rebase_path("//toolchains/gcc_runtime/10.2.1/riscv64-libgcc.a", root_build_dir), ] } if (host == "llvm") { kernel_ld_flags += [ "--oformat", "elf64", rebase_path("//toolchains/gcc_runtime/10.2.1/riscv64-libgcc.a", root_build_dir), ] } } config("kernel_flags") { cflags = kernel_c_flags asmflags = kernel_asm_flags ldflags = kernel_ld_flags defines = [ "xOS_kernel" ] } kernel_src = exec_script("get_kernel_files.py", [ rebase_path("//src", root_build_dir), target_arch, ], "list lines") linker_script = rebase_path("//build/kernel/$target_arch/kernel_link.ld", root_build_dir) action("kernel_config") { script = "//build/kernel/gen_config.py" outputs = [ "$root_out_dir/base/boot/kernel.config" ] args = [ rebase_path("$root_out_dir/base/boot/kernel.config", root_build_dir), "$target_arch", "$host", ] } executable("kernel_build") { deps = [ ":kernel_config" ] output_name = "$kernel_out_path/kernel.bin" sources = kernel_src include_dirs = [ "//kernel/include" ] configs = [ ":kernel_flags" ] ldflags = [ # See comment at EXEC_TEMPLATE.gni about elfsign_section.o. # It is required to sign a binary. rebase_path("$root_out_dir/tmp/elfsign_section.o", ""), "-T$linker_script", ] } xOS_signexec("kernel") { binpath = "boot/kernel.bin" } group("kernel") { deps = [ ":kernel_build", ":sign_kernel", ] }