diff --git a/CMakeLists.txt b/CMakeLists.txt index 27dc1713fb2..42d83548de2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -289,7 +289,7 @@ add_link_options(LINKER:-z,text) if("${SERENITY_ARCH}" STREQUAL "i686") add_compile_options(-march=i686) -else() +elseif("${SERENITY_ARCH}" STREQUAL "x86_64") add_compile_options(-march=x86-64) endif() diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 9a50ede5971..65d46afd2b5 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -5,7 +5,9 @@ else() add_compile_options(-Os) endif() -if ("${SERENITY_ARCH}" STREQUAL "i686") +if ("${SERENITY_ARCH}" STREQUAL "aarch64") + set(KERNEL_ARCH aarch64) +elseif ("${SERENITY_ARCH}" STREQUAL "i686") set(KERNEL_ARCH i386) elseif("${SERENITY_ARCH}" STREQUAL "x86_64") set(KERNEL_ARCH x86_64) @@ -283,24 +285,26 @@ set(KERNEL_SOURCES kprintf.cpp ) -set(KERNEL_SOURCES - ${KERNEL_SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/ASM_wrapper.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Boot/ap_setup.S - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/InterruptEntry.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Processor.cpp -) +if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64") + set(KERNEL_SOURCES + ${KERNEL_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/ASM_wrapper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Boot/ap_setup.S + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/InterruptEntry.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/${KERNEL_ARCH}/Processor.cpp + ) -set(KERNEL_SOURCES - ${KERNEL_SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ASM_wrapper.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPU.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Interrupts.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Processor.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ProcessorInfo.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/SafeMem.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/TrapFrame.cpp -) + set(KERNEL_SOURCES + ${KERNEL_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ASM_wrapper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPU.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Interrupts.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Processor.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ProcessorInfo.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/SafeMem.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/TrapFrame.cpp + ) +endif() set(AK_SOURCES ../AK/FlyString.cpp @@ -351,7 +355,11 @@ set(SOURCES set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option -Wvla -Wnull-dereference") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -ffreestanding -fbuiltin") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-80387 -mno-mmx -mno-sse -mno-sse2") + +if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-80387 -mno-mmx -mno-sse -mno-sse2") +endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-asynchronous-unwind-tables") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") @@ -508,5 +516,7 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kernel.map" DESTINATION res) serenity_install_headers(Kernel) serenity_install_sources(Kernel) -add_subdirectory(Prekernel) +if (NOT "${SERENITY_ARCH}" STREQUAL "aarch64") + add_subdirectory(Prekernel) +endif() add_subdirectory(Modules) diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index baa0829862c..1e4e3ad7641 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -8,7 +8,10 @@ file(GLOB ELF_SOURCES "../Libraries/LibELF/*.cpp") file(GLOB LIBC_SOURCES1 "../Libraries/LibC/*.cpp") file(GLOB LIBC_SOURCES2 "../Libraries/LibC/*/*.cpp") -if ("${SERENITY_ARCH}" STREQUAL "i686") +if ("${SERENITY_ARCH}" STREQUAL "aarch64") + file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/aarch64/*.S") + set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/aarch64/entry.S ../Libraries/LibELF/Arch/aarch64/plt_trampoline.S) +elseif ("${SERENITY_ARCH}" STREQUAL "i686") file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/i386/*.S") set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/entry.S ../Libraries/LibELF/Arch/i386/plt_trampoline.S) elseif ("${SERENITY_ARCH}" STREQUAL "x86_64") diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index 1022ec944c0..5ad420f047f 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -67,7 +67,12 @@ set(LIBC_SOURCES file(GLOB AK_SOURCES CONFIGURE_DEPENDS "../../../AK/*.cpp") file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp") -if ("${SERENITY_ARCH}" STREQUAL "i686") +if ("${SERENITY_ARCH}" STREQUAL "aarch64") + set(ASM_SOURCES "arch/aarch64/setjmp.S") + set(ELF_SOURCES ${ELF_SOURCES} ../LibELF/Arch/aarch64/entry.S ../LibELF/Arch/aarch64/plt_trampoline.S) + set(CRTI_SOURCE "arch/aarch64/crti.S") + set(CRTN_SOURCE "arch/aarch64/crtn.S") +elseif ("${SERENITY_ARCH}" STREQUAL "i686") set(ASM_SOURCES "arch/i386/setjmp.S") set(ELF_SOURCES ${ELF_SOURCES} ../LibELF/Arch/i386/entry.S ../LibELF/Arch/i386/plt_trampoline.S) set(CRTI_SOURCE "arch/i386/crti.S") diff --git a/Userland/Libraries/LibC/arch/aarch64/crti.S b/Userland/Libraries/LibC/arch/aarch64/crti.S new file mode 100644 index 00000000000..660ba90bf68 --- /dev/null +++ b/Userland/Libraries/LibC/arch/aarch64/crti.S @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.section .init, "ax", @progbits +.p2align 2 +.global _init +.type _init, @function +_init: + # FIXME: Possibly incomplete. + ret + +.section .fini, "ax", @progbits +.p2align 4 +.global _fini +.type _fini, @function +_fini: + # FIXME: Possibly incomplete. + ret diff --git a/Userland/Libraries/LibC/arch/aarch64/crtn.S b/Userland/Libraries/LibC/arch/aarch64/crtn.S new file mode 100644 index 00000000000..aea4d4d1338 --- /dev/null +++ b/Userland/Libraries/LibC/arch/aarch64/crtn.S @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.section .init, "ax", @progbits + # FIXME: Possibly incomplete. + ret + +.section .fini, "ax", @progbits + # FIXME: Possibly incomplete. + ret diff --git a/Userland/Libraries/LibC/arch/aarch64/setjmp.S b/Userland/Libraries/LibC/arch/aarch64/setjmp.S new file mode 100644 index 00000000000..6ae11c41512 --- /dev/null +++ b/Userland/Libraries/LibC/arch/aarch64/setjmp.S @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.global setjmp +setjmp: + # FIXME: Possibly incomplete. + ret + +.global longjmp +longjmp: + # FIXME: Possibly incomplete. + ret diff --git a/Userland/Libraries/LibELF/Arch/aarch64/entry.S b/Userland/Libraries/LibELF/Arch/aarch64/entry.S new file mode 100644 index 00000000000..2e9620e4980 --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/aarch64/entry.S @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.globl _invoke_entry +.hidden _invoke_entry +.type _invoke_entry,@function +_invoke_entry: # (argc, argv, envp, entry) + # FIXME: Possibly incomplete. + ret diff --git a/Userland/Libraries/LibELF/Arch/aarch64/plt_trampoline.S b/Userland/Libraries/LibELF/Arch/aarch64/plt_trampoline.S new file mode 100644 index 00000000000..016266f2c8f --- /dev/null +++ b/Userland/Libraries/LibELF/Arch/aarch64/plt_trampoline.S @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2021, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +.p2align 4 +.globl _plt_trampoline +.hidden _plt_trampoline +.type _plt_trampoline,@function +_plt_trampoline: # (object, relocation_index) + # FIXME: Possibly incomplete. + ret