Skip to content

Commit

Permalink
Kernel: Add per platform Processor.h headers
Browse files Browse the repository at this point in the history
The platform independent Processor.h file includes the shared processor
code and includes the specific platform header file.

All references to the Arch/x86/Processor.h file have been replaced with
a reference to Arch/Processor.h.
  • Loading branch information
jamesmintram authored and linusg committed Oct 14, 2021
1 parent 23676be commit 545ce5b
Show file tree
Hide file tree
Showing 25 changed files with 199 additions and 101 deletions.
2 changes: 1 addition & 1 deletion AK/Singleton.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <AK/Atomic.h>
#include <AK/Noncopyable.h>
#ifdef KERNEL
# include <Kernel/Arch/x86/Processor.h>
# include <Kernel/Arch/Processor.h>
# include <Kernel/Arch/x86/ScopedCritical.h>
#endif

Expand Down
2 changes: 1 addition & 1 deletion AK/Weakable.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "RefPtr.h"
#include "StdLibExtras.h"
#ifdef KERNEL
# include <Kernel/Arch/x86/Processor.h>
# include <Kernel/Arch/Processor.h>
# include <Kernel/Arch/x86/ScopedCritical.h>
#endif

Expand Down
107 changes: 107 additions & 0 deletions Kernel/Arch/Processor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Copyright (c) 2018-2021, James Mintram <[email protected]>
* Copyright (c) 2018-2021, Andreas Kling <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/

#pragma once

#include <AK/Function.h>
#include <Kernel/Arch/x86/ASM_wrapper.h>

namespace Kernel {

namespace Memory {
class PageDirectory;
}

struct ProcessorMessageEntry;
struct DeferredCallEntry;

enum class ProcessorSpecificDataID {
MemoryManager,
__Count,
};
struct ProcessorMessage {
using CallbackFunction = Function<void()>;

enum Type {
FlushTlb,
Callback,
};
Type type;
Atomic<u32> 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<CallbackFunction*>(&callback_storage);
}

void invoke_callback()
{
VERIFY(type == Type::Callback);
callback_value()();
}
};

struct ProcessorMessageEntry {
ProcessorMessageEntry* next;
ProcessorMessage* msg;
};

struct DeferredCallEntry {
using HandlerFunction = Function<void()>;

DeferredCallEntry* next;
alignas(HandlerFunction) u8 handler_storage[sizeof(HandlerFunction)];
bool was_allocated;

HandlerFunction& handler_value()
{
return *bit_cast<HandlerFunction*>(&handler_storage);
}

void invoke_handler()
{
handler_value()();
}
};

}

#if ARCH(X86_64) || ARCH(I386)
# include <Kernel/Arch/x86/Processor.h>
#elif ARCH(AARCH64)
# include <Kernel/Arch/aarch64/Processor.h>
#else
# error "Unknown architecture"
#endif

namespace Kernel {
template<typename T>
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<T>();
}
};
}
66 changes: 66 additions & 0 deletions Kernel/Arch/aarch64/Processor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2018-2021, James Mintram <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/

#pragma once

#include <AK/Array.h>
#include <AK/Concepts.h>
#include <AK/Function.h>
#include <AK/Types.h>

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<typename T>
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<void()> /* callback */) { }
};

}
77 changes: 1 addition & 76 deletions Kernel/Arch/x86/Processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -44,64 +40,6 @@ struct [[gnu::aligned(16)]] FPUState
u8 buffer[512];
};

struct ProcessorMessage {
using CallbackFunction = Function<void()>;

enum Type {
FlushTlb,
Callback,
};
Type type;
Atomic<u32> 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<CallbackFunction*>(&callback_storage);
}

void invoke_callback()
{
VERIFY(type == Type::Callback);
callback_value()();
}
};

struct ProcessorMessageEntry {
ProcessorMessageEntry* next;
ProcessorMessage* msg;
};

struct DeferredCallEntry {
using HandlerFunction = Function<void()>;

DeferredCallEntry* next;
alignas(HandlerFunction) u8 handler_storage[sizeof(HandlerFunction)];
bool was_allocated;

HandlerFunction& handler_value()
{
return *bit_cast<HandlerFunction*>(&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.
Expand Down Expand Up @@ -441,17 +379,4 @@ class Processor {
static StringView platform_string();
};

template<typename T>
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<T>();
}
};

}
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/ScopedCritical.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include <AK/Types.h>

#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/Processor.h>

namespace Kernel {

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/common/ASM_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

#include <AK/Types.h>

#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/ASM_wrapper.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Sections.h>

namespace Kernel {
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/common/Interrupts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@

#include <LibC/mallocdefs.h>

#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/ISRStubs.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/x86/RegisterState.h>
#include <Kernel/Arch/x86/TrapFrame.h>
#include <Kernel/KSyms.h>
Expand Down
6 changes: 3 additions & 3 deletions Kernel/Arch/x86/common/Processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@
#include <Kernel/StdLib.h>
#include <Kernel/Thread.h>

#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/CPUID.h>
#include <Kernel/Arch/x86/InterruptDisabler.h>
#include <Kernel/Arch/x86/Interrupts.h>
#include <Kernel/Arch/x86/MSR.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/x86/ProcessorInfo.h>
#include <Kernel/Arch/x86/SafeMem.h>
#include <Kernel/Arch/x86/ScopedCritical.h>
#include <Kernel/Arch/x86/TrapFrame.h>
#include <Kernel/Arch/x86/InterruptDisabler.h>

#include <Kernel/Memory/ScopedAddressSpaceSwitcher.h>
#include <Kernel/Memory/PageDirectory.h>
#include <Kernel/Memory/ScopedAddressSpaceSwitcher.h>

namespace Kernel {

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/common/ProcessorInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

#include <AK/StringBuilder.h>
#include <AK/Types.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/CPUID.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/x86/ProcessorInfo.h>

namespace Kernel {
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/common/SafeMem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/RegisterState.h>
#include <Kernel/Arch/x86/SafeMem.h>

Expand Down
4 changes: 2 additions & 2 deletions Kernel/Arch/x86/common/TrapFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <Kernel/Arch/x86/TrapFrame.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/InterruptDisabler.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/x86/TrapFrame.h>

namespace Kernel {

Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/i386/Processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

#include <AK/StdLibExtras.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/TrapFrame.h>
#include <Kernel/Process.h>
#include <Kernel/Random.h>
Expand Down
2 changes: 1 addition & 1 deletion Kernel/Arch/x86/x86_64/Processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

#include <AK/StdLibExtras.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86/TrapFrame.h>
#include <Kernel/Panic.h>
#include <Kernel/Process.h>
Expand Down
2 changes: 1 addition & 1 deletion Kernel/AtomicEdgeAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#pragma once

#include <AK/Atomic.h>
#include <Kernel/Arch/x86/Processor.h>
#include <Kernel/Arch/Processor.h>

namespace Kernel {

Expand Down
Loading

0 comments on commit 545ce5b

Please sign in to comment.