From da70596895d8135e08f8caac6978117697b4c021 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 18 Aug 2024 21:39:29 +0200 Subject: [REFACTOR] Improved project structure. Signed-off-by: Amlal El Mahrouss --- dev/DDK/DispatchKernelCall.S | 36 ++++++++++++++++++++++++ dev/DDK/KernelAlloc.c | 34 ++++++++++++++++++++++ dev/DDK/KernelCall.c | 36 ++++++++++++++++++++++++ dev/DDK/KernelCxxRt.cxx | 29 +++++++++++++++++++ dev/DDK/KernelDev.c | 29 +++++++++++++++++++ dev/DDK/KernelDev.h | 32 +++++++++++++++++++++ dev/DDK/KernelPrint.c | 37 ++++++++++++++++++++++++ dev/DDK/KernelPrint.h | 18 ++++++++++++ dev/DDK/KernelStd.h | 67 ++++++++++++++++++++++++++++++++++++++++++++ dev/DDK/KernelString.c | 39 ++++++++++++++++++++++++++ dev/DDK/KernelString.h | 17 +++++++++++ dev/DDK/KernelVersion.c | 21 ++++++++++++++ dev/DDK/ReadMe.md | 9 ++++++ dev/DDK/build.json | 10 +++++++ dev/DDK/compile_flags.txt | 2 ++ dev/DDK/source_deploy.xml | 7 +++++ dev/DDK/x86_64.make | 14 +++++++++ 17 files changed, 437 insertions(+) create mode 100644 dev/DDK/DispatchKernelCall.S create mode 100644 dev/DDK/KernelAlloc.c create mode 100644 dev/DDK/KernelCall.c create mode 100644 dev/DDK/KernelCxxRt.cxx create mode 100644 dev/DDK/KernelDev.c create mode 100644 dev/DDK/KernelDev.h create mode 100644 dev/DDK/KernelPrint.c create mode 100644 dev/DDK/KernelPrint.h create mode 100644 dev/DDK/KernelStd.h create mode 100644 dev/DDK/KernelString.c create mode 100644 dev/DDK/KernelString.h create mode 100644 dev/DDK/KernelVersion.c create mode 100644 dev/DDK/ReadMe.md create mode 100644 dev/DDK/build.json create mode 100644 dev/DDK/compile_flags.txt create mode 100644 dev/DDK/source_deploy.xml create mode 100644 dev/DDK/x86_64.make (limited to 'dev/DDK') diff --git a/dev/DDK/DispatchKernelCall.S b/dev/DDK/DispatchKernelCall.S new file mode 100644 index 00000000..b6ce8004 --- /dev/null +++ b/dev/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/dev/DDK/KernelAlloc.c b/dev/DDK/KernelAlloc.c new file mode 100644 index 00000000..76d26ee8 --- /dev/null +++ b/dev/DDK/KernelAlloc.c @@ -0,0 +1,34 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK allocator. + +------------------------------------------- */ + +#include + +/** + \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/dev/DDK/KernelCall.c b/dev/DDK/KernelCall.c new file mode 100644 index 00000000..17e6640d --- /dev/null +++ b/dev/DDK/KernelCall.c @@ -0,0 +1,36 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK kernel call. + +------------------------------------------- */ + +#include +#include + +/// @brief this is an internal call, do not use it. +DK_EXTERN __attribute__((naked)) void* __kernelCallDispatch(const char* name, int32_t cnt, void* data, size_t sz); + +/// @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 __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/dev/DDK/KernelCxxRt.cxx b/dev/DDK/KernelCxxRt.cxx new file mode 100644 index 00000000..82ea8e85 --- /dev/null +++ b/dev/DDK/KernelCxxRt.cxx @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK C++ runtime. + +------------------------------------------- */ + +#include + +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/dev/DDK/KernelDev.c b/dev/DDK/KernelDev.c new file mode 100644 index 00000000..5ed482b9 --- /dev/null +++ b/dev/DDK/KernelDev.c @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Text I/O. + +------------------------------------------- */ + +#include +#include + +/// @brief Open a new binary device from path. +DK_EXTERN kernelDeviceRef kernelOpenDevice(const char* devicePath) +{ + if (!devicePath) + return nil; + + return kernelCall("OpenDevice", 1, (void*)devicePath, kernelStringLength(devicePath)); +} + +/// @brief Close any device. +/// @param device valid device. +DK_EXTERN void kernelCloseDevice(kernelDeviceRef device) +{ + if (!device) + return; + + kernelCall("CloseDevice", 1, device, sizeof(kernelDevice)); +} diff --git a/dev/DDK/KernelDev.h b/dev/DDK/KernelDev.h new file mode 100644 index 00000000..e99cb0a7 --- /dev/null +++ b/dev/DDK/KernelDev.h @@ -0,0 +1,32 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Devices. + +------------------------------------------- */ + +#pragma once + +#include + +struct _kernelDevice; + +/// @brief Kernel Device driver. +typedef struct _kernelDevice +{ + 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 device from path. +/// @param devicePath the device's path. +DK_EXTERN kernelDeviceRef kernelOpenDevice(const char* devicePath); + +/// @brief Close any device. +/// @param device valid device. +DK_EXTERN void kernelCloseDevice(kernelDeviceRef device); diff --git a/dev/DDK/KernelPrint.c b/dev/DDK/KernelPrint.c new file mode 100644 index 00000000..148803b7 --- /dev/null +++ b/dev/DDK/KernelPrint.c @@ -0,0 +1,37 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Text I/O. + +------------------------------------------- */ + +#include + +DK_EXTERN void kernelPrintChar(const char ch) +{ + char assembled[2] = {0}; + assembled[0] = ch; + assembled[1] = 0; + + kernelCall("WriteCharacter", 1, assembled, 1); +} + +/// @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/dev/DDK/KernelPrint.h b/dev/DDK/KernelPrint.h new file mode 100644 index 00000000..49021377 --- /dev/null +++ b/dev/DDK/KernelPrint.h @@ -0,0 +1,18 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Text I/O. + +------------------------------------------- */ + +#pragma once + +#include + +/// @brief print character into UART. +DK_EXTERN void kernelPrintChar(const char ch); + +/// @brief print string to UART. +/// @param message string to transmit to UART. +DK_EXTERN void kernelPrintStr(const char* message); diff --git a/dev/DDK/KernelStd.h b/dev/DDK/KernelStd.h new file mode 100644 index 00000000..a00a080b --- /dev/null +++ b/dev/DDK/KernelStd.h @@ -0,0 +1,67 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK DLL Base Header. + +------------------------------------------- */ + +#pragma once + +#include +#include + +#if defined(__cplusplus) +#define DK_EXTERN extern "C" +#define nil nullptr +#define DK_FINAL final +#else +#define DK_EXTERN extern +#define nil ((void*)0) +#define DK_FINAL +#endif // defined(__cplusplus) + +#ifndef __NEWOSKRNL__ +#error !!! including header in user mode !!! +#endif // __NEWOSKRNL__ + +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 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/dev/DDK/KernelString.c b/dev/DDK/KernelString.c new file mode 100644 index 00000000..410ce826 --- /dev/null +++ b/dev/DDK/KernelString.c @@ -0,0 +1,39 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Strings. + +------------------------------------------- */ + +#include + +DK_EXTERN size_t kernelStringLength(const char* in) +{ + if (in == nil) + return 0; + if (*in == 0) + return 0; + + size_t index = 0; + + while (in[index] != 0) + { + ++index; + } + + return index; +} + +DK_EXTERN int kernelStringCopy(char* dst, const char* src, size_t len) +{ + size_t index = 0; + + while (index != len) + { + dst[index] = src[index]; + ++index; + } + + return index; +} diff --git a/dev/DDK/KernelString.h b/dev/DDK/KernelString.h new file mode 100644 index 00000000..a0b811dc --- /dev/null +++ b/dev/DDK/KernelString.h @@ -0,0 +1,17 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK Strings. + +------------------------------------------- */ + +#pragma once + +#include + +/// @brief DDK equivalent of POSIX's string.h +/// @file kernelString.h + +DK_EXTERN size_t kernelStringLength(const char* in); +DK_EXTERN int kernelStringCopy(char* dst, const char* src, size_t len); diff --git a/dev/DDK/KernelVersion.c b/dev/DDK/KernelVersion.c new file mode 100644 index 00000000..84abc4f7 --- /dev/null +++ b/dev/DDK/KernelVersion.c @@ -0,0 +1,21 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + Purpose: DDK versioning. + +------------------------------------------- */ + +#include + +#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/dev/DDK/ReadMe.md b/dev/DDK/ReadMe.md new file mode 100644 index 00000000..ee12a9c1 --- /dev/null +++ b/dev/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 ddk.dll. + +###### Copyright 2024 ZKA Technologies, all rights reserved. diff --git a/dev/DDK/build.json b/dev/DDK/build.json new file mode 100644 index 00000000..328165ba --- /dev/null +++ b/dev/DDK/build.json @@ -0,0 +1,10 @@ +{ + "compiler_path": "x86_64-w64-mingw32-gcc", + "compiler_std": "c++20", + "headers_path": ["../", "./"], + "sources_path": ["*.c", "*.cxx", "*.S"], + "output_name": "ddk.dll", + "compiler_flags": ["-ffreestanding", "-shared", "-std=c17", "-std=c++20", "-fno-rtti", "-fno-exceptions", " -Wl,--subsystem=17"], + "cpp_macros": ["__NEWOSKRNL__", "__DDK_AMD64__", "cDDKVersionHighest=1", "cDDKVersionLowest=1"] + } + \ No newline at end of file diff --git a/dev/DDK/compile_flags.txt b/dev/DDK/compile_flags.txt new file mode 100644 index 00000000..48dfa8fe --- /dev/null +++ b/dev/DDK/compile_flags.txt @@ -0,0 +1,2 @@ +-std=c17 +-I../ diff --git a/dev/DDK/source_deploy.xml b/dev/DDK/source_deploy.xml new file mode 100644 index 00000000..3d2325a8 --- /dev/null +++ b/dev/DDK/source_deploy.xml @@ -0,0 +1,7 @@ + + + *.cxx + *.c + *.S + + diff --git a/dev/DDK/x86_64.make b/dev/DDK/x86_64.make new file mode 100644 index 00000000..f1f7bb4b --- /dev/null +++ b/dev/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 -D__NEWOSKRNL__ -fno-rtti -fno-exceptions -D__DDK_AMD64__ -Wl,--subsystem=17 +VERSION=-DcDDKVersionLowest=1 -DcDDKVersionHighest=1 +OUTPUT=ddk.dll + +.PHONY: x86_64-build +x86_64-build: + $(CC) $(INC) $(FLAGS) $(VERSION) $(wildcard *.c) $(wildcard *.S) $(wildcard *.cxx) -o $(OUTPUT) \ No newline at end of file -- cgit v1.2.3