summaryrefslogtreecommitdiffhomepage
path: root/DDK
diff options
context:
space:
mode:
authorAmlal <amlalelmahrouss@icloud.com>2024-07-28 16:11:46 +0000
committerAmlal <amlalelmahrouss@icloud.com>2024-07-28 16:11:46 +0000
commitc4023005e029ae092dad2689564c490580dd5c28 (patch)
tree3080ba07a6b552bf3d7591574cf69b2a3c8fd0fd /DDK
parent8c8822fff78f9ff9cd640271da9b3634c4c2f97f (diff)
parent4db57a2d646b1538783a0675b38bada7a0f903ae (diff)
Merged in MHR-36 (pull request #17)
MHR-36
Diffstat (limited to 'DDK')
-rw-r--r--DDK/DispatchKernelCall.S36
-rw-r--r--DDK/KernelAlloc.c34
-rw-r--r--DDK/KernelCall.c30
-rw-r--r--DDK/KernelCxxRt.cxx29
-rw-r--r--DDK/KernelDev.c19
-rw-r--r--DDK/KernelDev.h19
-rw-r--r--DDK/KernelDispatchCall.S21
-rw-r--r--DDK/KernelPrint.c10
-rw-r--r--DDK/KernelPrint.h6
-rw-r--r--DDK/KernelStd.h51
-rw-r--r--DDK/KernelStdCxx.cc24
-rw-r--r--DDK/KernelString.c13
-rw-r--r--DDK/KernelString.h9
-rw-r--r--DDK/KernelVersion.c21
-rw-r--r--DDK/ReadMe.md9
-rw-r--r--DDK/ReadMe.txt4
-rw-r--r--DDK/compile_flags.txt2
-rw-r--r--DDK/x86_64.make14
18 files changed, 246 insertions, 105 deletions
diff --git a/DDK/DispatchKernelCall.S b/DDK/DispatchKernelCall.S
new file mode 100644
index 00000000..b6ce8004
--- /dev/null
+++ b/DDK/DispatchKernelCall.S
@@ -0,0 +1,36 @@
+/**
+ lang: asm
+ compiler: gnu
+ */
+
+.globl __kernelCallDispatch
+
+.text
+
+/* Really simple function, takes our va-list,
+ and brings it to the trap handler in the kernel. */
+
+#ifdef __DDK_AMD64__
+
+/* args rcx, rdx, r8, r9 */
+__kernelCallDispatch:
+ int $0x33
+ ret
+
+#elif defined(__DDK_POWER64__)
+
+/* args r8, r9, r10, r11 */
+__kernelCallDispatch:
+ /* There is no specific interrupt request id for a system call in POWER. */
+ sc
+ blr
+
+#elif defined(__DDK_ARM64__)
+
+/* args x0, x8, x9, x10, x11 is kept to tell that this is a kernel call */
+__kernelCallDispatch:
+ /* There is no specific interrupt request id for a system call in ARM64 as well. */
+ mov x11, #0x33
+ svc #0
+
+#endif
diff --git a/DDK/KernelAlloc.c b/DDK/KernelAlloc.c
new file mode 100644
index 00000000..1eadd4e2
--- /dev/null
+++ b/DDK/KernelAlloc.c
@@ -0,0 +1,34 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies
+
+ Purpose: DDK allocator.
+
+------------------------------------------- */
+
+#include <DDK/KernelStd.h>
+
+/**
+ \brief Allocates a new heap on the kernel's side.
+ \param sz the size of the heap block.
+ \return the newly allocated pointer.
+*/
+DK_EXTERN void* kernelAlloc(size_t sz)
+{
+ if (!sz) ++sz;
+
+ void* ptr = kernelCall("NewHeap", 1, &sz, sizeof(size_t));
+
+ return ptr;
+}
+
+/**
+ \brief Frees a pointer from the heap.
+ \param ptr the pointer to free.
+*/
+DK_EXTERN void kernelFree(void* ptr)
+{
+ if (!ptr) return;
+
+ kernelCall("DeleteHeap", 1, ptr, 0);
+}
diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c
index 7dc5761c..ffc2ded6 100644
--- a/DDK/KernelCall.c
+++ b/DDK/KernelCall.c
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Definitions.
+ Purpose: DDK kernel call.
------------------------------------------- */
@@ -10,17 +10,27 @@
#include <stdarg.h>
/// @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);
+DK_EXTERN __attribute__((naked)) void* __kernelCallDispatch(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 Interupt kernel
+/// @param kernelRpcName RPC name
+/// @param cnt number of elements in **data** pointer.
+/// @param data data pointer.
+/// @param sz The size of the whole data pointer.
+/// @retval void* kernel call was successful.
+/// @retval nil kernel call failed, call kernelLastError(void)
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);
+ return __kernelCallDispatch(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);
}
diff --git a/DDK/KernelCxxRt.cxx b/DDK/KernelCxxRt.cxx
new file mode 100644
index 00000000..08fab7b9
--- /dev/null
+++ b/DDK/KernelCxxRt.cxx
@@ -0,0 +1,29 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies
+
+ Purpose: DDK C++ runtime.
+
+------------------------------------------- */
+
+#include <DDK/KernelStd.h>
+
+void* operator new(size_t sz)
+{
+ return kernelAlloc(sz);
+}
+
+void operator delete(void* ptr)
+{
+ kernelFree(ptr);
+}
+
+void* operator new[](size_t sz)
+{
+ return kernelAlloc(sz);
+}
+
+void operator delete[](void* ptr)
+{
+ kernelFree(ptr);
+}
diff --git a/DDK/KernelDev.c b/DDK/KernelDev.c
index 6a6aac99..07a64bdd 100644
--- a/DDK/KernelDev.c
+++ b/DDK/KernelDev.c
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Text I/O.
+ Purpose: DDK Text I/O.
------------------------------------------- */
@@ -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..d7c13a13 100644
--- a/DDK/KernelDev.h
+++ b/DDK/KernelDev.h
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Devices.
+ Purpose: DDK Devices.
------------------------------------------- */
@@ -15,18 +15,17 @@ struct _kernelDevice;
/// @brief Kernel Device driver.
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.
+ char name[255]; // the device name. Could be /./DEVICE_NAME/
+ 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
deleted file mode 100644
index 64b6663e..00000000
--- a/DDK/KernelDispatchCall.S
+++ /dev/null
@@ -1,21 +0,0 @@
-.globl __kernelDispatchCall
-
-.section .text
-
-/* Really simple function, takes our va-list,
- and brings it to the trap handler in the kernel. */
-
-#ifdef __x86_64__
-
-__kernelDispatchCall:
- int $0x33
- ret
-
-#elif defined(__powerpc64__)
-
-__kernelDispatchCall:
- /* There is no specific interrupt request id for a system call in POWER. */
- sc
- blr
-
-#endif
diff --git a/DDK/KernelPrint.c b/DDK/KernelPrint.c
index 77f70280..eee90e3c 100644
--- a/DDK/KernelPrint.c
+++ b/DDK/KernelPrint.c
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Text I/O.
+ Purpose: DDK Text I/O.
------------------------------------------- */
@@ -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..25b702e1 100644
--- a/DDK/KernelPrint.h
+++ b/DDK/KernelPrint.h
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Text I/O.
+ Purpose: DDK Text I/O.
------------------------------------------- */
@@ -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..5d8af8cd 100644
--- a/DDK/KernelStd.h
+++ b/DDK/KernelStd.h
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Definitions.
+ Purpose: DDK Definitions.
------------------------------------------- */
@@ -10,19 +10,54 @@
#if defined(__cplusplus)
#define DK_EXTERN extern "C"
-#define NIL nullptr
+#define nil nullptr
+#define DK_FINAL final
#else
#define DK_EXTERN extern
-#define NIL NULL
+#define nil ((void*)0)
+#define DK_FINAL
#endif // defined(__cplusplus)
#include <stdint.h>
#include <stddef.h>
+struct DDK_STATUS_STRUCT;
+
+/// \brief DDK status structure (__at_enable, __at_disable...)
+struct DDK_STATUS_STRUCT DK_FINAL
+{
+ int32_t action_id;
+ int32_t issuer_id;
+ int32_t group_id;
+};
+
/// @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 heap ptr.
+/// @param sz size of ptr.
+/// @return the pointer allocated or **nil**.
+DK_EXTERN void* kernelAlloc(size_t sz);
+
+/// @brief free heap ptr.
+/// @param pointer to free
+DK_EXTERN void kernelFree(void*);
+
+/// @brief The highest API version of the DDK.
+DK_EXTERN int32_t c_api_version_highest;
+
+/// @brief The lowest API version of the DDK.
+DK_EXTERN int32_t c_api_version_least;
+
+/// @brief c_api_version_least+c_api_version_highest combined version.
+DK_EXTERN int32_t c_api_version; \ No newline at end of file
diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc
deleted file mode 100644
index cdca85dc..00000000
--- a/DDK/KernelStdCxx.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
- Purpose: Driver C++ Definitions.
-
-------------------------------------------- */
-
-#include <DDK/KernelStd.h>
-
-void* operator new(size_t sz) {
- if (!sz) ++sz;
-
- auto ptr = kernelCall("NewKernelHeap", 1, &sz, sizeof(size_t));
- kernelCall("ProtectKernelHeap", 1, ptr, sz);
-
- return ptr;
-}
-
-void operator delete(void* ptr) noexcept {
- if (!ptr) return;
-
- kernelCall("DeleteKernelHeap", 1, ptr, 0);
-}
diff --git a/DDK/KernelString.c b/DDK/KernelString.c
index 65403389..2cb6adcc 100644
--- a/DDK/KernelString.c
+++ b/DDK/KernelString.c
@@ -1,18 +1,23 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Strings.
+ Purpose: DDK Strings.
------------------------------------------- */
#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..dd6fdce6 100644
--- a/DDK/KernelString.h
+++ b/DDK/KernelString.h
@@ -1,8 +1,8 @@
/* -------------------------------------------
- Copyright Zeta Electronics Corporation
+ Copyright ZKA Technologies
- Purpose: Kernel Strings.
+ Purpose: DDK Strings.
------------------------------------------- */
@@ -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/KernelVersion.c b/DDK/KernelVersion.c
new file mode 100644
index 00000000..0f27d345
--- /dev/null
+++ b/DDK/KernelVersion.c
@@ -0,0 +1,21 @@
+/* -------------------------------------------
+
+ Copyright ZKA Technologies
+
+ Purpose: DDK versioning.
+
+------------------------------------------- */
+
+#include <KernelStd.h>
+
+#ifndef cDDKVersionHighest
+#define cDDKVersionHighest 1
+#endif // cDDKVersionHighest
+
+#ifndef cDDKVersionLowest
+#define cDDKVersionLowest 1
+#endif // cDDKVersionLowest
+
+int32_t c_api_version_highest = cDDKVersionHighest;
+int32_t c_api_version_least = cDDKVersionLowest;
+int32_t c_api_version = cDDKVersionHighest | cDDKVersionLowest; \ No newline at end of file
diff --git a/DDK/ReadMe.md b/DDK/ReadMe.md
new file mode 100644
index 00000000..cde81cf7
--- /dev/null
+++ b/DDK/ReadMe.md
@@ -0,0 +1,9 @@
+# DDK (Device Driver Kit)
+
+A kit used to write kernel HALs, using the NDK compiler suite.
+
+## How to use it
+
+Simply link against libDDK.
+
+###### Copyright 2024 ZKA Technologies, all rights reserved.
diff --git a/DDK/ReadMe.txt b/DDK/ReadMe.txt
deleted file mode 100644
index e33c88ec..00000000
--- a/DDK/ReadMe.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-== The Driver Kit ==
-
--> A kit used to write user level drivers.
--> Use MPCC to compile the code, it can work on a patched GNU compiler.
diff --git a/DDK/compile_flags.txt b/DDK/compile_flags.txt
new file mode 100644
index 00000000..48dfa8fe
--- /dev/null
+++ b/DDK/compile_flags.txt
@@ -0,0 +1,2 @@
+-std=c17
+-I../
diff --git a/DDK/x86_64.make b/DDK/x86_64.make
new file mode 100644
index 00000000..61cafeee
--- /dev/null
+++ b/DDK/x86_64.make
@@ -0,0 +1,14 @@
+##################################################
+# (C) ZKA Technologies, all rights reserved.
+# This is the DDK's makefile.
+##################################################
+
+CC=x86_64-w64-mingw32-gcc
+INC=-I./ -I../
+FLAGS=-ffreestanding -shared -std=c17 -std=c++20 -fno-rtti -fno-exceptions -D__DDK_AMD64__ -Wl,--subsystem=17
+VERSION=-DcDDKVersionLowest=1 -DcDDKVersionHighest=1
+OUTPUT=libDDK.dll
+
+.PHONY: all
+all:
+ $(CC) $(INC) $(FLAGS) $(VERSION) $(wildcard *.c) $(wildcard *.S) $(wildcard *.cxx) -o $(OUTPUT) \ No newline at end of file