mirror of
https://github.com/Fennix-Project/Drivers.git
synced 2025-05-25 22:14:31 +00:00
93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
#include "../../../Kernel/mapi.hpp"
|
|
#include "../../../Kernel/Fex.hpp"
|
|
|
|
extern "C" int ModuleEntry(void *Data);
|
|
int CallbackHandler(KernelCallback *Data);
|
|
int InterruptCallback(CPURegisters *Registers);
|
|
|
|
/* The module is
|
|
* This is a module for Fennix Module Entry Extended Header
|
|
* * * * */
|
|
HEAD(FexFormatType_Module, FexOSType_Fennix, ModuleEntry);
|
|
|
|
/* Ignore the warning about missing field initializers. */
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
|
|
|
/* Extended header which is used to give additional information to the kernel. */
|
|
__attribute__((section(".extended"))) FexExtended ExtendedHeader = {
|
|
.Module = {
|
|
.Name = "Example Module",
|
|
.Type = FexModuleType_Generic,
|
|
.Callback = CallbackHandler,
|
|
.InterruptCallback = InterruptCallback,
|
|
.Bind = {
|
|
.Type = BIND_INTERRUPT,
|
|
.Interrupt = {
|
|
.Vector = {222}, /* IRQ222 */
|
|
}}}};
|
|
|
|
#pragma GCC diagnostic pop
|
|
|
|
/* Global structure that holds the kernel API. */
|
|
KernelAPI KAPI{};
|
|
|
|
/* Macro that prints a message to the kernel debugger. */
|
|
#define print(msg) KAPI.Util.DebugPrint((char *)(msg), KAPI.Info.modUniqueID)
|
|
|
|
/* --------------------------------------------------------------------------------------------------------- */
|
|
|
|
/* Module entry point. This is called at initialization.
|
|
"Data" argument points to the kernel API structure. */
|
|
int ModuleEntry(void *Data)
|
|
{
|
|
/* Check if kernel API is valid */
|
|
if (!Data)
|
|
return INVALID_KERNEL_API;
|
|
|
|
/* Set the global structure to the kernel API. */
|
|
KAPI = *(KernelAPI *)Data;
|
|
|
|
/* Check if kernel API version is valid.
|
|
This is important because the kernel
|
|
API may change in the future. */
|
|
if (KAPI.Version.Major < 0 || KAPI.Version.Minor < 0 || KAPI.Version.Patch < 0)
|
|
return KERNEL_API_VERSION_NOT_SUPPORTED;
|
|
|
|
/* We print "Hello World!" to the kernel debugger. */
|
|
print("Hello World!");
|
|
return OK;
|
|
}
|
|
|
|
/* This is called when the module is bound to an interrupt, process,
|
|
or PCI device or when the kernel wants to send a message to the module. */
|
|
int CallbackHandler(KernelCallback *Data)
|
|
{
|
|
switch (Data->Reason)
|
|
{
|
|
case AcknowledgeReason:
|
|
{
|
|
print("Kernel acknowledged the module.");
|
|
break;
|
|
}
|
|
case StopReason:
|
|
{
|
|
print("Module stopped.");
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
print("Unknown reason.");
|
|
break;
|
|
}
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
/* Interrupt handler. */
|
|
int InterruptCallback(CPURegisters *)
|
|
{
|
|
print("Interrupt received.");
|
|
return OK;
|
|
}
|