summaryrefslogtreecommitdiffhomepage
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
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>
-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
-rw-r--r--Drv/Bonjour/Bonjour.c20
-rw-r--r--Drv/Hello/CheckStack.c11
-rw-r--r--Drv/Hello/DriverRsrc.rsrc (renamed from Drv/Bonjour/DriverRsrc.rsrc)2
-rw-r--r--Drv/Hello/Hello.c103
-rw-r--r--Drv/Hello/x86_64.mk (renamed from Drv/Bonjour/x86_64.mk)13
-rw-r--r--Drv/SampleDriver/x86_64.mk2
-rw-r--r--Drv/VideoDrv/CheckStck.c2
-rw-r--r--Drv/VideoDrv/VideoDrv.cc (renamed from Drv/VideoDrv/VideoDrv.c)9
-rw-r--r--Drv/VideoDrv/x86_64.make2
-rw-r--r--newoskrnl.files7
21 files changed, 216 insertions, 85 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.
diff --git a/Drv/Bonjour/Bonjour.c b/Drv/Bonjour/Bonjour.c
deleted file mode 100644
index 9bebdb32..00000000
--- a/Drv/Bonjour/Bonjour.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
-------------------------------------------- */
-
-#include <DDK/KernelString.h>
-#include <DDK/KernelPrint.h>
-
-int __ImageStart(void)
-{
- kernelPrintStr("Bonjour: Starting up zeroconf...\r");
- return 0;
-}
-
-int __ImageEnd(void)
-{
- kernelPrintStr("Bonjour: Shutting down zeroconf...\r");
- return 0;
-}
diff --git a/Drv/Hello/CheckStack.c b/Drv/Hello/CheckStack.c
new file mode 100644
index 00000000..a3c6621b
--- /dev/null
+++ b/Drv/Hello/CheckStack.c
@@ -0,0 +1,11 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+///! @brief Use this to check your stack, if using MinGW/MSVC/MPCC.
+void ___chkstk_ms(void)
+{
+ (void)0;
+}
diff --git a/Drv/Bonjour/DriverRsrc.rsrc b/Drv/Hello/DriverRsrc.rsrc
index 5b86834f..dbfc3f73 100644
--- a/Drv/Bonjour/DriverRsrc.rsrc
+++ b/Drv/Hello/DriverRsrc.rsrc
@@ -1,4 +1,4 @@
-1 ICON "../../Boot/Icons/driver-logo.ico"
+1 ICON "../../Icons/driver-logo.ico"
1 VERSIONINFO
FILEVERSION 1,0,0,0
diff --git a/Drv/Hello/Hello.c b/Drv/Hello/Hello.c
new file mode 100644
index 00000000..cba37b84
--- /dev/null
+++ b/Drv/Hello/Hello.c
@@ -0,0 +1,103 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <DDK/KernelString.h>
+#include <DDK/KernelPrint.h>
+#include <DDK/KernelDev.h>
+
+/// @file Hello.c
+/// @brief Zero configuration protocol, a much more better protocol for zero configuration.
+
+typedef struct HelloMasterConfigHeader
+{
+ int fMagic;
+ int fVersion;
+ int fProviderAddress;
+ char fDHCPLease[255];
+} __attribute__((packed)) HelloMasterConfigHeader;
+
+#define cHMCHDeviceLen 255
+
+static kernelDeviceRef cDev = nil;
+static char* cDeviceUUID = nil; // 3ed40738-c7d6-4b59-afdf-3c104b05fbf
+static HelloMasterConfigHeader* cHeader = nil;
+
+/// @brief Link to master device to attribute DHCP lease.
+static void __hello_link_device(void* a0)
+{
+ if (!cDev)
+ {
+ cDev = kernelOpenDevice("NET:\\HMCH\\0.0.0.0");
+ }
+
+ cDev->write("+LINK", kernelStringLength("+LINK"));
+ cDev->wait();
+
+ cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID));
+ cDev->wait();
+
+ if (cHeader)
+ {
+ kernelFree(cHeader);
+ cHeader = nil;
+ }
+
+ cHeader = cDev->read(nil, sizeof(HelloMasterConfigHeader));
+}
+
+static void __hello_unlink_device(void* a0)
+{
+ kernelPrintStr("Hello: shutting down Hello...\r");
+
+ if (cDev)
+ {
+ cDev->write("+UNLINK", kernelStringLength("+UNLINK"));
+ cDev->wait();
+
+ /// here is my uuid and my config header. Please disconnect me.
+ cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID));
+ cDev->write(cHeader, sizeof(cHeader));
+
+ cDev->wait();
+
+ kernelCloseDevice(cDev);
+ cDev = nil;
+ }
+
+ if (cDeviceUUID)
+ {
+ kernelFree((void*)cDeviceUUID);
+ cDeviceUUID = nil;
+ }
+
+ cDev = nil;
+}
+
+int __at_enter(void)
+{
+ kernelPrintStr("Hello: starting up Helloconf...\r");
+
+ cDeviceUUID = kernelAlloc(sizeof(char) * cHMCHDeviceLen);
+
+ kernelAddSyscall(0, __hello_link_device);
+ kernelAddSyscall(1, __hello_unlink_device);
+
+ return 0;
+}
+
+int __at_exit(void)
+{
+ kernelPrintStr("Hello: starting up Helloconf...\r");
+
+ // first unlink.
+ __hello_unlink_device(nil);
+
+ // then unregister syscalls.
+ kernelAddSyscall(0, nil);
+ kernelAddSyscall(1, nil);
+
+ return 0;
+}
diff --git a/Drv/Bonjour/x86_64.mk b/Drv/Hello/x86_64.mk
index 9114f4b4..564fe970 100644
--- a/Drv/Bonjour/x86_64.mk
+++ b/Drv/Hello/x86_64.mk
@@ -12,7 +12,7 @@ ADD_FILE=touch
COPY=cp
HTTP_GET=wget
-LD_FLAGS=-e __ImageStart --subsystem=17
+LD_FLAGS=-e __at_enter --subsystem=17
OBJ=*.o
@@ -21,15 +21,16 @@ REM=rm
REM_FLAG=-f
FLAG_ASM=-f win64
-FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mgeneral-regs-only -mno-red-zone -D__KERNEL__ -DEFI_FUNCTION_WRAPPER -I../ -I../../ -I./ -c -ffreestanding -std=c17 -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -D__BOOTLOADER__ -I./
+FLAG_GNU=-fshort-wchar -fno-rtti -fno-exceptions -D__DDK_AMD64__ -mgeneral-regs-only -mno-red-zone -D__KERNEL__ \
+ -DEFI_FUNCTION_WRAPPER -I../ -I../../ -I./ -c -ffreestanding -std=c17 -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -D__BOOTLOADER__ -I./
.PHONY: invalid-recipe
invalid-recipe:
- @echo "invalid-recipe: Use make all instead."
+ @echo "invalid-recipe: Use make all instead."
.PHONY: all
all: compile-amd64
- $(LD_GNU) $(OBJ) $(LD_FLAGS) -o Bonjour.exe
+ $(LD_GNU) $(OBJ) $(LD_FLAGS) -o Hello.exe
ifneq ($(DEBUG_SUPPORT), )
DEBUG = -D__DEBUG__
@@ -38,11 +39,11 @@ endif
.PHONY: compile-amd64
compile-amd64:
$(WINDRES) DriverRsrc.rsrc -O coff -o DriverRsrc.o
- $(CC_GNU) $(FLAG_GNU) $(DEBUG) $(wildcard *.c) $(wildcard ../../DDK/*.c) $(wildcard ../../DDK/*.S)
+ $(CC_GNU) $(FLAG_GNU) $(DEBUG) $(wildcard *.c) $(wildcard ../../DDK/*.cc) $(wildcard ../../DDK/*.c) $(wildcard ../../DDK/*.S)
.PHONY: clean
clean:
- $(REM) $(REM_FLAG) $(OBJ) Bonjour.exe
+ $(REM) $(REM_FLAG) $(OBJ) Hello.exe
.PHONY: help
help:
diff --git a/Drv/SampleDriver/x86_64.mk b/Drv/SampleDriver/x86_64.mk
index ec7e09f6..5655902f 100644
--- a/Drv/SampleDriver/x86_64.mk
+++ b/Drv/SampleDriver/x86_64.mk
@@ -12,7 +12,7 @@ ADD_FILE=touch
COPY=cp
HTTP_GET=wget
-LD_FLAGS=-e __ImageStart --subsystem=17
+LD_FLAGS=-e __at_enter --subsystem=17
OBJ=*.o
diff --git a/Drv/VideoDrv/CheckStck.c b/Drv/VideoDrv/CheckStck.c
index 3eb157ba..633636b4 100644
--- a/Drv/VideoDrv/CheckStck.c
+++ b/Drv/VideoDrv/CheckStck.c
@@ -4,7 +4,7 @@
------------------------------------------- */
-///! @brief Use this to check your stack, if using MinGW/MSVC/CodeTools.
+///! @brief Use this to check your stack, if using MinGW/MSVC/MPCC.
void ___chkstk_ms(void)
{
(void)0;
diff --git a/Drv/VideoDrv/VideoDrv.c b/Drv/VideoDrv/VideoDrv.cc
index 742abaf2..1af02b4a 100644
--- a/Drv/VideoDrv/VideoDrv.c
+++ b/Drv/VideoDrv/VideoDrv.cc
@@ -6,16 +6,17 @@
#include <DDK/KernelString.h>
#include <DDK/KernelPrint.h>
+
#include <Modules/CoreCG/CoreCG.hxx>
-int __at_enter(void)
+DK_EXTERN int __at_enter(void)
{
- kernelPrintStr("VideoDrv: Starting up GPU...\r");
+ kernelPrintStr("VideoDrv: Starting GPU...\r");
return 0;
}
-int __at_exit(void)
+DK_EXTERN int __at_exit(void)
{
- kernelPrintStr("VideoDrv: Shutting down GPU...\r");
+ kernelPrintStr("VideoDrv: Shutting GPU...\r");
return 0;
}
diff --git a/Drv/VideoDrv/x86_64.make b/Drv/VideoDrv/x86_64.make
index 8ec42277..a74a8d21 100644
--- a/Drv/VideoDrv/x86_64.make
+++ b/Drv/VideoDrv/x86_64.make
@@ -12,7 +12,7 @@ ADD_FILE=touch
COPY=cp
HTTP_GET=wget
-LD_FLAGS=-e __ImageStart --subsystem=17
+LD_FLAGS=-e __at_enter --subsystem=17
OBJ=*.o
diff --git a/newoskrnl.files b/newoskrnl.files
index 623f0383..43aea6e1 100644
--- a/newoskrnl.files
+++ b/newoskrnl.files
@@ -51,13 +51,14 @@ DDK/KernelString.c
DDK/KernelString.h
DDK/ReadMe.txt
Doxyfile
-Drv/Bonjour/Bonjour.c
-Drv/Bonjour/x86_64.mk
+Drv/Hello/CheckStack.c
+Drv/Hello/Hello.c
+Drv/Hello/x86_64.mk
Drv/SampleDriver/CheckStck.c
Drv/SampleDriver/SampleDriver.c
Drv/SampleDriver/x86_64.mk
Drv/VideoDrv/CheckStck.c
-Drv/VideoDrv/VideoDrv.c
+Drv/VideoDrv/VideoDrv.cc
Drv/VideoDrv/x86_64.make
Kernel/ArchKit/ArchKit.hpp
Kernel/ArchKit/compile_flags.txt