summaryrefslogtreecommitdiffhomepage
path: root/DDK
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-07-03 18:20:35 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-07-03 18:20:35 +0200
commita7c741c93cb0a53aea686eb2f342f2464bc12c14 (patch)
tree5e90743873451c7f1bc6313d2fb210c470af2cd1 /DDK
parent8c8822fff78f9ff9cd640271da9b3634c4c2f97f (diff)
COMMIT-07-03-2024-MHR-36
IMP: DDK specification and implementation done. - Kernel calls I/O support for DDK. - System calls I/O support for DDK. - Add Allocation routines for DDK. - Add Helloconf driver. - One generic device. IMPRV: - GPU driver is now C++ based. - Fixed icon path inside makefiles. Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'DDK')
-rw-r--r--DDK/KernelCall.c22
-rw-r--r--DDK/KernelDev.c15
-rw-r--r--DDK/KernelDev.h13
-rw-r--r--DDK/KernelDispatchCall.S6
-rw-r--r--DDK/KernelPrint.c6
-rw-r--r--DDK/KernelPrint.h2
-rw-r--r--DDK/KernelStd.h26
-rw-r--r--DDK/KernelStdCxx.cc22
-rw-r--r--DDK/KernelString.c7
-rw-r--r--DDK/KernelString.h5
-rw-r--r--DDK/ReadMe.txt6
11 files changed, 82 insertions, 48 deletions
diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c
index 7dc5761c..88343abd 100644
--- a/DDK/KernelCall.c
+++ b/DDK/KernelCall.c
@@ -12,15 +12,25 @@
/// @brief this is an internal call, do not use it.
DK_EXTERN __attribute__((naked)) void* __kernelDispatchCall(const char* name, int32_t cnt, void* data, size_t sz);
-/// @brief Execute a function on the kernel.
-/// @param kernelRpcName the name of the function.
-/// @param cnt number of arguments.
-/// @param
-/// @return
+/// @brief Call kernel (interrupt 0x33)
+/// @param kernelRpcName
+/// @param cnt number of elements in **dat**
+/// @param dat data ptr
+/// @param sz sz of whole data ptr.
+/// @return result of call
DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* data, size_t sz)
{
if (!kernelRpcName || cnt == 0)
- return NIL;
+ return nil;
return __kernelDispatchCall(kernelRpcName, cnt, data, sz);
}
+
+
+/// @brief add system call.
+/// @param slot system call slot
+/// @param slotFn, syscall slot.
+DK_EXTERN void kernelAddSyscall(const int slot, void(*slotFn)(void* a0))
+{
+ kernelCall("AddSyscall", slot, slotFn, 0);
+} \ No newline at end of file
diff --git a/DDK/KernelDev.c b/DDK/KernelDev.c
index 6a6aac99..ff67fbe9 100644
--- a/DDK/KernelDev.c
+++ b/DDK/KernelDev.c
@@ -10,21 +10,12 @@
#include <DDK/KernelString.h>
/// @brief Open a new binary device from path.
-DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath)
+DK_EXTERN kernelDeviceRef kernelOpenDevice(const char* devicePath)
{
if (!devicePath)
- return NIL;
+ return nil;
- return kernelCall("OpenBinaryDevice", 1, devicePath, kernelStringLength(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, kernelStringLength(devicePath));
+ return kernelCall("OpenDevice", 1, (void*)devicePath, kernelStringLength(devicePath));
}
/// @brief Close any device.
diff --git a/DDK/KernelDev.h b/DDK/KernelDev.h
index 79fd8f76..e4dfad2f 100644
--- a/DDK/KernelDev.h
+++ b/DDK/KernelDev.h
@@ -16,17 +16,16 @@ struct _kernelDevice;
typedef struct _kernelDevice
{
char name[255]; // the device name. Could be /./DEVICE_NAME/
- int32_t (*read)(); // read from device.
- int32_t (*write)(); // write to device.
+ void* (*read)(void* arg, int len); // read from device.
+ void (*write)(void* arg, int len);
+ void (*wait)(void); // 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 Open a new device from path.
+/// @param devicePath the device's path.
+DK_EXTERN kernelDeviceRef kernelOpenDevice(const char* devicePath);
/// @brief Close any device.
/// @param device valid device.
diff --git a/DDK/KernelDispatchCall.S b/DDK/KernelDispatchCall.S
index 64b6663e..68423ab5 100644
--- a/DDK/KernelDispatchCall.S
+++ b/DDK/KernelDispatchCall.S
@@ -1,17 +1,17 @@
.globl __kernelDispatchCall
-.section .text
+.text
/* Really simple function, takes our va-list,
and brings it to the trap handler in the kernel. */
-#ifdef __x86_64__
+#ifdef __DDK_AMD64__
__kernelDispatchCall:
int $0x33
ret
-#elif defined(__powerpc64__)
+#elif defined(__DDK_POWER64__)
__kernelDispatchCall:
/* There is no specific interrupt request id for a system call in POWER. */
diff --git a/DDK/KernelPrint.c b/DDK/KernelPrint.c
index 77f70280..2d39a09d 100644
--- a/DDK/KernelPrint.c
+++ b/DDK/KernelPrint.c
@@ -10,7 +10,11 @@
DK_EXTERN void kernelPrintChar(const char ch)
{
- kernelCall("WriteCharacter", 1, ch, 1);
+ char assembled[2] = { 0 };
+ assembled[0] = ch;
+ assembled[1] = 0;
+
+ kernelCall("WriteCharacter", 1, assembled, 1);
}
/// @brief print string to UART.
diff --git a/DDK/KernelPrint.h b/DDK/KernelPrint.h
index a26d49c4..5e4b2541 100644
--- a/DDK/KernelPrint.h
+++ b/DDK/KernelPrint.h
@@ -14,5 +14,5 @@
DK_EXTERN void kernelPrintChar(const char ch);
/// @brief print string to UART.
-/// @param message UART to transmit.
+/// @param message string to transmit to UART.
DK_EXTERN void kernelPrintStr(const char* message);
diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h
index 0486479c..e4279af4 100644
--- a/DDK/KernelStd.h
+++ b/DDK/KernelStd.h
@@ -10,10 +10,10 @@
#if defined(__cplusplus)
#define DK_EXTERN extern "C"
-#define NIL nullptr
+#define nil nullptr
#else
#define DK_EXTERN extern
-#define NIL NULL
+#define nil NULL
#endif // defined(__cplusplus)
#include <stdint.h>
@@ -21,8 +21,22 @@
/// @brief Call kernel (interrupt 0x33)
/// @param kernelRpcName
-/// @param cnt
-/// @param dat
-/// @param sz
-/// @return
+/// @param cnt number of elements in **dat**
+/// @param dat data ptr
+/// @param sz sz of whole data ptr.
+/// @return result of call
DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* dat, size_t sz);
+
+/// @brief add system call.
+/// @param slot system call slot
+/// @param slotFn, syscall slot.
+DK_EXTERN void kernelAddSyscall(const int slot, void(*slotFn)(void* a0));
+
+/// @brief allocate ptr.
+/// @param sz size of ptr.
+/// @return the pointer allocated or **nil**.
+DK_EXTERN void* kernelAlloc(size_t sz);
+
+/// @brief allocate ptr.
+/// @param pointer to free
+DK_EXTERN void kernelFree(void*);
diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc
index cdca85dc..9da38371 100644
--- a/DDK/KernelStdCxx.cc
+++ b/DDK/KernelStdCxx.cc
@@ -8,17 +8,29 @@
#include <DDK/KernelStd.h>
-void* operator new(size_t sz) {
+void* operator new(size_t sz)
+{
+ return kernelAlloc(sz);
+}
+
+void operator delete(void* ptr) noexcept
+{
+ kernelFree(ptr);
+}
+
+DK_EXTERN void* kernelAlloc(size_t sz)
+{
if (!sz) ++sz;
- auto ptr = kernelCall("NewKernelHeap", 1, &sz, sizeof(size_t));
- kernelCall("ProtectKernelHeap", 1, ptr, sz);
+ auto ptr = kernelCall("NewHeap", 1, &sz, sizeof(size_t));
+ kernelCall("ProtectHeap", 1, ptr, sz);
return ptr;
}
-void operator delete(void* ptr) noexcept {
+DK_EXTERN void kernelFree(void* ptr)
+{
if (!ptr) return;
- kernelCall("DeleteKernelHeap", 1, ptr, 0);
+ kernelCall("DeleteHeap", 1, ptr, 0);
}
diff --git a/DDK/KernelString.c b/DDK/KernelString.c
index 65403389..64116399 100644
--- a/DDK/KernelString.c
+++ b/DDK/KernelString.c
@@ -8,11 +8,14 @@
#include <DDK/KernelString.h>
-DK_EXTERN size_t kernelStringLength(const char* str)
+DK_EXTERN size_t kernelStringLength(const char* in)
{
+ if (in == nil) return 0;
+ if (*in == 0) return 0;
+
size_t index = 0;
- while (str[index] != 0)
+ while (in[index] != 0)
{
++index;
}
diff --git a/DDK/KernelString.h b/DDK/KernelString.h
index be2a1037..d3608320 100644
--- a/DDK/KernelString.h
+++ b/DDK/KernelString.h
@@ -10,7 +10,8 @@
#include <DDK/KernelStd.h>
-/// @brief DDK equivalent of POSIX's string.h.
+/// @brief DDK equivalent of POSIX's string.h
+/// @file kernelString.h
-DK_EXTERN size_t kernelStringLength(const char* str);
+DK_EXTERN size_t kernelStringLength(const char* in);
DK_EXTERN int kernelStringCopy(char* dst, const char* src, size_t len);
diff --git a/DDK/ReadMe.txt b/DDK/ReadMe.txt
index e33c88ec..61feadea 100644
--- a/DDK/ReadMe.txt
+++ b/DDK/ReadMe.txt
@@ -1,4 +1,4 @@
-== The Driver Kit ==
+=== Device Driver Kit ===
--> A kit used to write user level drivers.
--> Use MPCC to compile the code, it can work on a patched GNU compiler.
+-> A kit used to write kernel HALs.
+-> Use MPCC to compile the code.