diff --git a/AK/Singleton.h b/AK/Singleton.h index a736d3471f0..353102a83bd 100644 --- a/AK/Singleton.h +++ b/AK/Singleton.h @@ -10,7 +10,7 @@ #include #include #ifdef KERNEL -# include +# include # include #endif diff --git a/AK/Weakable.h b/AK/Weakable.h index 47acb062880..f093af8a2a2 100644 --- a/AK/Weakable.h +++ b/AK/Weakable.h @@ -12,7 +12,7 @@ #include "RefPtr.h" #include "StdLibExtras.h" #ifdef KERNEL -# include +# include # include #endif diff --git a/Kernel/Arch/Processor.h b/Kernel/Arch/Processor.h new file mode 100644 index 00000000000..804cb1da089 --- /dev/null +++ b/Kernel/Arch/Processor.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018-2021, James Mintram + * Copyright (c) 2018-2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +namespace Memory { +class PageDirectory; +} + +struct ProcessorMessageEntry; +struct DeferredCallEntry; + +enum class ProcessorSpecificDataID { + MemoryManager, + __Count, +}; +struct ProcessorMessage { + using CallbackFunction = Function; + + enum Type { + FlushTlb, + Callback, + }; + Type type; + Atomic refs; + union { + ProcessorMessage* next; // only valid while in the pool + alignas(CallbackFunction) u8 callback_storage[sizeof(CallbackFunction)]; + struct { + Memory::PageDirectory const* page_directory; + u8* ptr; + size_t page_count; + } flush_tlb; + }; + + volatile bool async; + + ProcessorMessageEntry* per_proc_entries; + + CallbackFunction& callback_value() + { + return *bit_cast(&callback_storage); + } + + void invoke_callback() + { + VERIFY(type == Type::Callback); + callback_value()(); + } +}; + +struct ProcessorMessageEntry { + ProcessorMessageEntry* next; + ProcessorMessage* msg; +}; + +struct DeferredCallEntry { + using HandlerFunction = Function; + + DeferredCallEntry* next; + alignas(HandlerFunction) u8 handler_storage[sizeof(HandlerFunction)]; + bool was_allocated; + + HandlerFunction& handler_value() + { + return *bit_cast(&handler_storage); + } + + void invoke_handler() + { + handler_value()(); + } +}; + +} + +#if ARCH(X86_64) || ARCH(I386) +# include +#elif ARCH(AARCH64) +# include +#else +# error "Unknown architecture" +#endif + +namespace Kernel { +template +class ProcessorSpecific { +public: + static void initialize() + { + Processor::current().set_specific(T::processor_specific_data_id(), new T); + } + static T& get() + { + return *Processor::current().get_specific(); + } +}; +} diff --git a/Kernel/Arch/aarch64/Processor.h b/Kernel/Arch/aarch64/Processor.h new file mode 100644 index 00000000000..89143a35f82 --- /dev/null +++ b/Kernel/Arch/aarch64/Processor.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018-2021, James Mintram + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +namespace Kernel { + +class Thread; + +//FIXME This needs to go behind some sort of platform abstraction +// it is used between Thread and Processor. +struct [[gnu::aligned(16)]] FPUState +{ + u8 buffer[512]; +}; + +class Processor { +public: + void set_specific(ProcessorSpecificDataID /*specific_id*/, void* /*ptr*/) { } + template + T* get_specific() { return 0; } + + ALWAYS_INLINE static void pause() { } + ALWAYS_INLINE static void wait_check() { } + + ALWAYS_INLINE static bool is_initialized() + { + return false; + } + + ALWAYS_INLINE static u32 current_id() + { + return 0; + } + + ALWAYS_INLINE static Thread* current_thread() + { + return 0; + } + + ALWAYS_INLINE static FlatPtr current_in_irq() + { + return 0; + } + + ALWAYS_INLINE static void enter_critical() { } + ALWAYS_INLINE static void leave_critical() { } + ALWAYS_INLINE static u32 in_critical() + { + return 0; + } + + ALWAYS_INLINE static Processor& current() { return *((Processor*)0); } + + static void deferred_call_queue(Function /* callback */) { } +}; + +} diff --git a/Kernel/Arch/x86/Processor.h b/Kernel/Arch/x86/Processor.h index a1b6bf97e2a..719aa4ebcbc 100644 --- a/Kernel/Arch/x86/Processor.h +++ b/Kernel/Arch/x86/Processor.h @@ -21,13 +21,9 @@ namespace Kernel { class ProcessorInfo; +struct ProcessorMessage; struct ProcessorMessageEntry; -enum class ProcessorSpecificDataID { - MemoryManager, - __Count, -}; - #if ARCH(X86_64) # define MSR_FS_BASE 0xc0000100 # define MSR_GS_BASE 0xc0000101 @@ -44,64 +40,6 @@ struct [[gnu::aligned(16)]] FPUState u8 buffer[512]; }; -struct ProcessorMessage { - using CallbackFunction = Function; - - enum Type { - FlushTlb, - Callback, - }; - Type type; - Atomic refs; - union { - ProcessorMessage* next; // only valid while in the pool - alignas(CallbackFunction) u8 callback_storage[sizeof(CallbackFunction)]; - struct { - Memory::PageDirectory const* page_directory; - u8* ptr; - size_t page_count; - } flush_tlb; - }; - - volatile bool async; - - ProcessorMessageEntry* per_proc_entries; - - CallbackFunction& callback_value() - { - return *bit_cast(&callback_storage); - } - - void invoke_callback() - { - VERIFY(type == Type::Callback); - callback_value()(); - } -}; - -struct ProcessorMessageEntry { - ProcessorMessageEntry* next; - ProcessorMessage* msg; -}; - -struct DeferredCallEntry { - using HandlerFunction = Function; - - DeferredCallEntry* next; - alignas(HandlerFunction) u8 handler_storage[sizeof(HandlerFunction)]; - bool was_allocated; - - HandlerFunction& handler_value() - { - return *bit_cast(&handler_storage); - } - - void invoke_handler() - { - handler_value()(); - } -}; - class Processor; // Note: We only support 64 processors at most at the moment, // so allocate 64 slots of inline capacity in the container. @@ -441,17 +379,4 @@ public: static StringView platform_string(); }; -template -class ProcessorSpecific { -public: - static void initialize() - { - Processor::current().set_specific(T::processor_specific_data_id(), new T); - } - static T& get() - { - return *Processor::current().get_specific(); - } -}; - } diff --git a/Kernel/Arch/x86/ScopedCritical.h b/Kernel/Arch/x86/ScopedCritical.h index 3c754901440..5abf896b3f8 100644 --- a/Kernel/Arch/x86/ScopedCritical.h +++ b/Kernel/Arch/x86/ScopedCritical.h @@ -8,7 +8,7 @@ #include -#include +#include namespace Kernel { diff --git a/Kernel/Arch/x86/common/ASM_wrapper.cpp b/Kernel/Arch/x86/common/ASM_wrapper.cpp index 49f33dd3e8e..e19f9dc5d35 100644 --- a/Kernel/Arch/x86/common/ASM_wrapper.cpp +++ b/Kernel/Arch/x86/common/ASM_wrapper.cpp @@ -6,8 +6,8 @@ #include +#include #include -#include #include namespace Kernel { diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index 5a4ae7c71fd..2dc3d6f200c 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -21,8 +21,8 @@ #include +#include #include -#include #include #include #include diff --git a/Kernel/Arch/x86/common/Processor.cpp b/Kernel/Arch/x86/common/Processor.cpp index 4d819a6f809..34d36f3f5ad 100644 --- a/Kernel/Arch/x86/common/Processor.cpp +++ b/Kernel/Arch/x86/common/Processor.cpp @@ -15,18 +15,18 @@ #include #include +#include #include +#include #include #include -#include #include #include #include #include -#include -#include #include +#include namespace Kernel { diff --git a/Kernel/Arch/x86/common/ProcessorInfo.cpp b/Kernel/Arch/x86/common/ProcessorInfo.cpp index 3cb24ba64e0..9fbea93ad73 100644 --- a/Kernel/Arch/x86/common/ProcessorInfo.cpp +++ b/Kernel/Arch/x86/common/ProcessorInfo.cpp @@ -6,8 +6,8 @@ #include #include +#include #include -#include #include namespace Kernel { diff --git a/Kernel/Arch/x86/common/SafeMem.cpp b/Kernel/Arch/x86/common/SafeMem.cpp index d7100c31d7c..01e405a01da 100644 --- a/Kernel/Arch/x86/common/SafeMem.cpp +++ b/Kernel/Arch/x86/common/SafeMem.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include #include diff --git a/Kernel/Arch/x86/common/TrapFrame.cpp b/Kernel/Arch/x86/common/TrapFrame.cpp index b591c2513fd..9e3054c6787 100644 --- a/Kernel/Arch/x86/common/TrapFrame.cpp +++ b/Kernel/Arch/x86/common/TrapFrame.cpp @@ -4,9 +4,9 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include -#include +#include namespace Kernel { diff --git a/Kernel/Arch/x86/i386/Processor.cpp b/Kernel/Arch/x86/i386/Processor.cpp index 7fcb0aa3ea8..71186f360b3 100644 --- a/Kernel/Arch/x86/i386/Processor.cpp +++ b/Kernel/Arch/x86/i386/Processor.cpp @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include diff --git a/Kernel/Arch/x86/x86_64/Processor.cpp b/Kernel/Arch/x86/x86_64/Processor.cpp index 3c77a0e7966..38b998581af 100644 --- a/Kernel/Arch/x86/x86_64/Processor.cpp +++ b/Kernel/Arch/x86/x86_64/Processor.cpp @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include diff --git a/Kernel/AtomicEdgeAction.h b/Kernel/AtomicEdgeAction.h index 6626b8e00a4..c80adcaa1da 100644 --- a/Kernel/AtomicEdgeAction.h +++ b/Kernel/AtomicEdgeAction.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/Bus/PCI/Access.cpp b/Kernel/Bus/PCI/Access.cpp index 83d438e7727..6900478c01d 100644 --- a/Kernel/Bus/PCI/Access.cpp +++ b/Kernel/Bus/PCI/Access.cpp @@ -8,13 +8,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include namespace Kernel::PCI { diff --git a/Kernel/Bus/USB/USBHub.cpp b/Kernel/Bus/USB/USBHub.cpp index 335e582f9b4..a486b710b32 100644 --- a/Kernel/Bus/USB/USBHub.cpp +++ b/Kernel/Bus/USB/USBHub.cpp @@ -4,13 +4,13 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include #include #include #include -#include namespace Kernel::USB { diff --git a/Kernel/FileSystem/InodeMetadata.h b/Kernel/FileSystem/InodeMetadata.h index 407d941a831..ba61a762348 100644 --- a/Kernel/FileSystem/InodeMetadata.h +++ b/Kernel/FileSystem/InodeMetadata.h @@ -9,8 +9,8 @@ #include #include #include -#include #include +#include namespace Kernel { diff --git a/Kernel/Library/ThreadSafeNonnullRefPtr.h b/Kernel/Library/ThreadSafeNonnullRefPtr.h index 523fdbec421..9cd44d4a040 100644 --- a/Kernel/Library/ThreadSafeNonnullRefPtr.h +++ b/Kernel/Library/ThreadSafeNonnullRefPtr.h @@ -12,7 +12,7 @@ #include #include #ifdef KERNEL -# include +# include # include #endif diff --git a/Kernel/Library/ThreadSafeRefPtr.h b/Kernel/Library/ThreadSafeRefPtr.h index 03b7d2e11e9..2adf13ed33d 100644 --- a/Kernel/Library/ThreadSafeRefPtr.h +++ b/Kernel/Library/ThreadSafeRefPtr.h @@ -15,7 +15,7 @@ #include #ifdef KERNEL # include -# include +# include # include #endif diff --git a/Kernel/Locking/Spinlock.h b/Kernel/Locking/Spinlock.h index 81b6d5ae660..7e8f83708af 100644 --- a/Kernel/Locking/Spinlock.h +++ b/Kernel/Locking/Spinlock.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include namespace Kernel { diff --git a/Kernel/Panic.cpp b/Kernel/Panic.cpp index 5f25385f0e9..b4fe667425f 100644 --- a/Kernel/Panic.cpp +++ b/Kernel/Panic.cpp @@ -5,8 +5,8 @@ */ #include +#include #include -#include #include #include #include diff --git a/Kernel/Random.cpp b/Kernel/Random.cpp index 2933e9d595b..18892459911 100644 --- a/Kernel/Random.cpp +++ b/Kernel/Random.cpp @@ -6,7 +6,7 @@ */ #include -#include +#include #include #include #include diff --git a/Kernel/UBSanitizer.cpp b/Kernel/UBSanitizer.cpp index 0bb39b306d4..571b495d8c8 100644 --- a/Kernel/UBSanitizer.cpp +++ b/Kernel/UBSanitizer.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include using namespace Kernel; diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 1ea58ec7d2c..0de7d195e2d 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include