From 8f262d685126a9a9f68beb6d4002ba30bebae401 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 28 May 2024 11:52:48 +0200 Subject: MHR-23: Improve scheduler code: Dont use 39, write kErrorProcessFault instead. MHR-23: Improve filesystem structure. Signed-off-by: Amlal El Mahrouss --- DDK/KernelCall.c | 25 +++++++++++++++++++++++++ DDK/KernelDev.c | 37 +++++++++++++++++++++++++++++++++++++ DDK/KernelDev.h | 33 +++++++++++++++++++++++++++++++++ DDK/KernelDispatchCall.S | 21 +++++++++++++++++++++ DDK/KernelPrint.c | 33 +++++++++++++++++++++++++++++++++ DDK/KernelPrint.h | 18 ++++++++++++++++++ DDK/KernelStd.h | 22 ++++++++++++++++++++++ DDK/KernelStdCxx.cc | 24 ++++++++++++++++++++++++ DDK/KernelString.c | 34 ++++++++++++++++++++++++++++++++++ DDK/KernelString.h | 16 ++++++++++++++++ DDK/ReadMe.txt | 4 ++++ 11 files changed, 267 insertions(+) create mode 100644 DDK/KernelCall.c create mode 100644 DDK/KernelDev.c create mode 100644 DDK/KernelDev.h create mode 100644 DDK/KernelDispatchCall.S create mode 100644 DDK/KernelPrint.c create mode 100644 DDK/KernelPrint.h create mode 100644 DDK/KernelStd.h create mode 100644 DDK/KernelStdCxx.cc create mode 100644 DDK/KernelString.c create mode 100644 DDK/KernelString.h create mode 100644 DDK/ReadMe.txt (limited to 'DDK') diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c new file mode 100644 index 00000000..17e0b5d5 --- /dev/null +++ b/DDK/KernelCall.c @@ -0,0 +1,25 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Definitions. + +------------------------------------------- */ + +#include +#include + +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/DDK/KernelDev.c b/DDK/KernelDev.c new file mode 100644 index 00000000..ee7aa84b --- /dev/null +++ b/DDK/KernelDev.c @@ -0,0 +1,37 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Text I/O. + +------------------------------------------- */ + +#include + +/// @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/DDK/KernelDev.h b/DDK/KernelDev.h new file mode 100644 index 00000000..4710023a --- /dev/null +++ b/DDK/KernelDev.h @@ -0,0 +1,33 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Devices. + +------------------------------------------- */ + +#pragma once + +#include + +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. + 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/DDK/KernelDispatchCall.S b/DDK/KernelDispatchCall.S new file mode 100644 index 00000000..64b6663e --- /dev/null +++ b/DDK/KernelDispatchCall.S @@ -0,0 +1,21 @@ +.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 new file mode 100644 index 00000000..9e25d31b --- /dev/null +++ b/DDK/KernelPrint.c @@ -0,0 +1,33 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Text I/O. + +------------------------------------------- */ + +#include + +DK_EXTERN void kernelPrintChar(const char ch) +{ + kernelCall("WriteCharacter", 1, 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/DDK/KernelPrint.h b/DDK/KernelPrint.h new file mode 100644 index 00000000..135abcc0 --- /dev/null +++ b/DDK/KernelPrint.h @@ -0,0 +1,18 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel 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 UART to transmit. +DK_EXTERN void kernelPrintStr(const char* message); diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h new file mode 100644 index 00000000..b0dba70e --- /dev/null +++ b/DDK/KernelStd.h @@ -0,0 +1,22 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + 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 +#include + +DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...); diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc new file mode 100644 index 00000000..7d8c9ff3 --- /dev/null +++ b/DDK/KernelStdCxx.cc @@ -0,0 +1,24 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Driver C++ Definitions. + +------------------------------------------- */ + +#include + +void* operator new(size_t sz) { + if (!sz) ++sz; + + auto ptr = kernelCall("NewKernelHeap", 1, sz); + kernelCall("ProtectKernelHeap", 1, ptr); + + return ptr; +} + +void operator delete(void* ptr) noexcept { + if (!ptr) return; + + kernelCall("DeleteKernelHeap", 1,ptr); +} diff --git a/DDK/KernelString.c b/DDK/KernelString.c new file mode 100644 index 00000000..1bd4c8c6 --- /dev/null +++ b/DDK/KernelString.c @@ -0,0 +1,34 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Strings. + +------------------------------------------- */ + +#include + +DK_EXTERN size_t kernelStringLength(const char* str) +{ + size_t index = 0; + + while (str[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/DDK/KernelString.h b/DDK/KernelString.h new file mode 100644 index 00000000..d39aeea1 --- /dev/null +++ b/DDK/KernelString.h @@ -0,0 +1,16 @@ +/* ------------------------------------------- + + Copyright SoftwareLabs + + Purpose: Kernel Strings. + +------------------------------------------- */ + +#pragma once + +#include + +/// @brief DDK equivalent of POSIX's string.h. + +DK_EXTERN size_t kernelStringLength(const char* str); +DK_EXTERN int kernelStringCopy(char* dst, const char* src, size_t len); diff --git a/DDK/ReadMe.txt b/DDK/ReadMe.txt new file mode 100644 index 00000000..e33c88ec --- /dev/null +++ b/DDK/ReadMe.txt @@ -0,0 +1,4 @@ +== 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. -- cgit v1.2.3 From 9994b8f3f88131f41be1061fb0947177e66dc7b0 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Wed, 5 Jun 2024 08:28:39 +0200 Subject: MHR-23: Add EPM PDF, add docs in KernelCall.c and fix log in NewFS.cxx Signed-off-by: Amlal EL Mahrouss --- DDK/KernelCall.c | 5 +++++ Kernel/Docs/Explicit Partition Map.pdf | Bin 0 -> 12326 bytes Kernel/KernelKit/PEF.hpp | 2 +- Kernel/Sources/FS/NewFS.cxx | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 Kernel/Docs/Explicit Partition Map.pdf (limited to 'DDK') diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c index 17e0b5d5..26a0b83b 100644 --- a/DDK/KernelCall.c +++ b/DDK/KernelCall.c @@ -11,6 +11,11 @@ DK_EXTERN __attribute__((naked)) void __kernelDispatchCall(int32_t cnt, ...); +/// @brief Execute a function on the kernel. +/// @param kernelRpcName the name of the function. +/// @param cnt number of arguments. +/// @param +/// @return DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...) { if (!kernelRpcName || cnt == 0) diff --git a/Kernel/Docs/Explicit Partition Map.pdf b/Kernel/Docs/Explicit Partition Map.pdf new file mode 100644 index 00000000..1e2f5318 Binary files /dev/null and b/Kernel/Docs/Explicit Partition Map.pdf differ diff --git a/Kernel/KernelKit/PEF.hpp b/Kernel/KernelKit/PEF.hpp index 1874aa4e..98a413aa 100644 --- a/Kernel/KernelKit/PEF.hpp +++ b/Kernel/KernelKit/PEF.hpp @@ -44,7 +44,7 @@ namespace NewOS { kPefSubArchAMD, kPefSubArchIntel, - kPefSubArchARM, + kPefSubArchGeneric, kPefSubArchIBM, }; diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx index 5e07fef8..a60fc228 100644 --- a/Kernel/Sources/FS/NewFS.cxx +++ b/Kernel/Sources/FS/NewFS.cxx @@ -46,7 +46,7 @@ _Output NewFork* NewFSParser::CreateFork(_Input NewCatalog* catalog, Lba lba = (theFork.Kind == kNewFSDataForkKind) ? catalog->DataFork : catalog->ResourceFork; - kcout << "Fork Lba: " << hex_number(lba) << endl; + kcout << "newoskrnl: fork lba: " << hex_number(lba) << endl; if (lba <= kNewFSCatalogStartAddress) return nullptr; -- cgit v1.2.3