mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:47:35 +00:00
Kernel: Add per platform Processor.h headers
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.
This commit is contained in:
parent
23676bee1f
commit
545ce5b595
25 changed files with 199 additions and 101 deletions
|
@ -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<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.
|
||||
|
@ -441,17 +379,4 @@ public:
|
|||
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>();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue