diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-04-20 23:13:11 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-04-20 23:13:11 +0200 |
| commit | 155971914073bedfa585a0be4d14a40bd23e3b8f (patch) | |
| tree | f39af19dc2f1b7f33cac33eff07001b2e791f7db /Private/DriverKit | |
| parent | 7013c094668be2204b1245496236f0cf6afa07c2 (diff) | |
MHR-9: Driver toolkit, initial commit.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/DriverKit')
| -rw-r--r-- | Private/DriverKit/KernelDev.c | 31 | ||||
| -rw-r--r-- | Private/DriverKit/KernelDev.h | 28 | ||||
| -rw-r--r-- | Private/DriverKit/KernelDispatchCall.s | 13 | ||||
| -rw-r--r-- | Private/DriverKit/KernelPrint.c | 23 | ||||
| -rw-r--r-- | Private/DriverKit/KernelPrint.h | 33 | ||||
| -rw-r--r-- | Private/DriverKit/KernelStd.c | 24 | ||||
| -rw-r--r-- | Private/DriverKit/KernelStd.h | 22 | ||||
| -rw-r--r-- | Private/DriverKit/KernelString.c | 19 | ||||
| -rw-r--r-- | Private/DriverKit/KernelString.h | 13 |
9 files changed, 169 insertions, 37 deletions
diff --git a/Private/DriverKit/KernelDev.c b/Private/DriverKit/KernelDev.c new file mode 100644 index 00000000..e8c041af --- /dev/null +++ b/Private/DriverKit/KernelDev.c @@ -0,0 +1,31 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Text I/O. + +------------------------------------------- */ + +#include <DriverKit/KernelDev.h> + +/// @brief Open a new binary device from path. +DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath) { + if (!devicePath) return NIL; + + return kernelCall("OpenBinaryDevice", 1, devicePath); +} + +/// @brief Open a new character device from path. +DK_EXTERN kernelDeviceRef kernelOpenCharDevice(const char* devicePath) { + if (!devicePath) return NIL; + + return kernelCall("OpenCharDevice", 1, devicePath); +} + +/// @brief Close any device. +/// @param device valid device. +DK_EXTERN void kernelCloseDevice(kernelDeviceRef device) { + if (!device) return; + + kernelCall("CloseDevice", 1, device); +} diff --git a/Private/DriverKit/KernelDev.h b/Private/DriverKit/KernelDev.h new file mode 100644 index 00000000..daa60a7c --- /dev/null +++ b/Private/DriverKit/KernelDev.h @@ -0,0 +1,28 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Devices. + +------------------------------------------- */ + +#pragma once + +#include <DriverKit/KernelStd.h> + +typedef struct _kernelDevice { + int32_t(*read)(); // read from device. + int32_t(*write)(); // write to device. + struct _kernelDevice* (*open)(const char* path); // open device. + void (*close)(struct _kernelDevice* dev); // close device. +} kernelDevice,* kernelDeviceRef; + +/// @brief Open a new binary device from path. +DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath); + +/// @brief Open a new character device from path. +DK_EXTERN kernelDeviceRef kernelOpenCharDevice(const char* devicePath); + +/// @brief Close any device. +/// @param device valid device. +DK_EXTERN void kernelCloseDevice(kernelDeviceRef device); diff --git a/Private/DriverKit/KernelDispatchCall.s b/Private/DriverKit/KernelDispatchCall.s new file mode 100644 index 00000000..2919f6ec --- /dev/null +++ b/Private/DriverKit/KernelDispatchCall.s @@ -0,0 +1,13 @@ +.globl __kernelDispatchCall + +.section .text + +#ifdef __x86_64__ + +/* Really simple function, takes our va-list, + and brings it to the trap handler in the kernel. */ +__kernelDispatchCall: + int $0x33 + ret + +#endif diff --git a/Private/DriverKit/KernelPrint.c b/Private/DriverKit/KernelPrint.c index 32e20f4f..5ca09ccf 100644 --- a/Private/DriverKit/KernelPrint.c +++ b/Private/DriverKit/KernelPrint.c @@ -6,14 +6,23 @@ ------------------------------------------- */ -#include "DriverKit/KernelPrint.h" +#include <DriverKit/KernelPrint.h> -#ifdef __x86_64__ -static void kernelPrintCharAMD64(const char ch) { - __asm__ volatile("outb %%al, %1" : : "a"(ch), "Nd"(0x3F8) : "memory"); +DK_EXTERN void kernelPrintChar(const char ch) { + kernelCall("WriteCharacter", 1, ch); } -#endif // if __x86_64__ -DK_EXTERN void kernelPrintChar(const char ch) { - kernelPrintChar(ch); +/// @brief print string to UART. +/// @param message UART to transmit. +DK_EXTERN void kernelPrintStr(const char* message) { + if (!message) return; + if (*message == 0) return; + + size_t index = 0; + size_t len = kernelStringLength(message); + + while (index < len) { + kernelPrintChar(message[index]); + ++index; + } } diff --git a/Private/DriverKit/KernelPrint.h b/Private/DriverKit/KernelPrint.h index 7e25e304..36e55442 100644 --- a/Private/DriverKit/KernelPrint.h +++ b/Private/DriverKit/KernelPrint.h @@ -8,38 +8,11 @@ #pragma once -#if defined(__cplusplus) -#define DK_EXTERN extern "C" -#else -#define DK_EXTERN extern -#endif // defined(__cplusplus) - -#include <stdint.h> -#include <stddef.h> +#include <DriverKit/KernelString.h> /// @brief print character into UART. DK_EXTERN void kernelPrintChar(const char ch); -static inline size_t kernelStringLength(const char* str) { - size_t index = 0; - - while (str[index] != 0) { - ++index; - } - - return index; -} - /// @brief print string to UART. -static inline void kernelPrintStr(const char* message) { - if (!message) return; - if (*message == 0) return; - - size_t index = 0; - size_t len = kernelStringLength(message); - - while (index < len) { - kernelPrintChar(message[index]); - ++index; - } -} +/// @param message UART to transmit. +DK_EXTERN void kernelPrintStr(const char* message); diff --git a/Private/DriverKit/KernelStd.c b/Private/DriverKit/KernelStd.c new file mode 100644 index 00000000..494ac0bc --- /dev/null +++ b/Private/DriverKit/KernelStd.c @@ -0,0 +1,24 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Definitions. + +------------------------------------------- */ + +#include <DriverKit/KernelStd.h> +#include <stdarg.h> + +DK_EXTERN __attribute__((naked)) void __kernelDispatchCall(int32_t cnt, ...); + +DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...) { + if (!kernelRpcName || cnt == 0) return NIL; + + va_list arg; + va_start(arg, cnt); + + __kernelDispatchCall(cnt, arg); + + va_end(arg); + +} diff --git a/Private/DriverKit/KernelStd.h b/Private/DriverKit/KernelStd.h new file mode 100644 index 00000000..3344630e --- /dev/null +++ b/Private/DriverKit/KernelStd.h @@ -0,0 +1,22 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Definitions. + +------------------------------------------- */ + +#pragma once + +#if defined(__cplusplus) +#define DK_EXTERN extern "C" +#define NIL nullptr +#else +#define DK_EXTERN extern +#define NIL NULL +#endif // defined(__cplusplus) + +#include <stdint.h> +#include <stddef.h> + +DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...); diff --git a/Private/DriverKit/KernelString.c b/Private/DriverKit/KernelString.c new file mode 100644 index 00000000..7c129dd4 --- /dev/null +++ b/Private/DriverKit/KernelString.c @@ -0,0 +1,19 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Strings. + +------------------------------------------- */ + +#include <DriverKit/KernelString.h> + +DK_EXTERN size_t kernelStringLength(const char* str) { + size_t index = 0; + + while (str[index] != 0) { + ++index; + } + + return index; +} diff --git a/Private/DriverKit/KernelString.h b/Private/DriverKit/KernelString.h new file mode 100644 index 00000000..d1b8ac93 --- /dev/null +++ b/Private/DriverKit/KernelString.h @@ -0,0 +1,13 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + Purpose: Kernel Strings. + +------------------------------------------- */ + +#pragma once + +#include <DriverKit/KernelStd.h> + +DK_EXTERN size_t kernelStringLength(const char* str); |
