summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libDDK/src/DDKVersion.cpp (renamed from src/libDDK/src/Version.cpp)6
-rw-r--r--src/libDDK/src/KernelAllocator.cpp (renamed from src/libDDK/src/Allocator.cpp)4
-rw-r--r--src/libDDK/src/KernelCall.cpp8
-rw-r--r--src/libDDK/src/KernelDevice.cpp (renamed from src/libDDK/src/Device.cpp)4
-rw-r--r--src/libDDK/src/KernelDriverBase.cpp (renamed from src/libDDK/src/DriverBase.cpp)0
-rw-r--r--src/libDDK/src/KernelIO.cpp (renamed from src/libDDK/src/IO.cpp)6
-rw-r--r--src/libDDK/src/KernelString.cpp (renamed from src/libDDK/src/String.cpp)0
-rw-r--r--src/libMsg/MsgKit/Server.h8
-rw-r--r--src/libMsg/libMsg.json2
-rw-r--r--src/libMsg/scripts/hello-world.json (renamed from src/libMsg/scripts/window_client.json)4
-rw-r--r--src/libMsg/src/Server.cpp37
-rw-r--r--src/libPThread/PThreadKit/Thread.h7
-rw-r--r--src/libPThread/src/Thread.cpp55
-rw-r--r--src/libSystem/SystemKit/System.h19
-rw-r--r--src/libSystem/libSystem.json2
15 files changed, 115 insertions, 47 deletions
diff --git a/src/libDDK/src/Version.cpp b/src/libDDK/src/DDKVersion.cpp
index 5e60fbc4..eb65da89 100644
--- a/src/libDDK/src/Version.cpp
+++ b/src/libDDK/src/DDKVersion.cpp
@@ -7,15 +7,15 @@
#include <DriverKit/DriverKit.h>
#ifndef kDDKVersionHighest
-#define kDDKVersionHighest 1
+#define kDDKVersionHighest 0x010000
#endif // !kDDKVersionHighest
#ifndef kDDKVersionLowest
-#define kDDKVersionLowest 1
+#define kDDKVersionLowest 0x010000
#endif // !kDDKVersionLowest
#ifndef kDDKVersion
-#define kDDKVersion 1
+#define kDDKVersion 0x010000
#endif // !kDDKVersion
uint32_t kApiVersionHighest = kDDKVersionHighest;
diff --git a/src/libDDK/src/Allocator.cpp b/src/libDDK/src/KernelAllocator.cpp
index f350ab22..f2dd7b45 100644
--- a/src/libDDK/src/Allocator.cpp
+++ b/src/libDDK/src/KernelAllocator.cpp
@@ -14,7 +14,7 @@
DDK_EXTERN void* kalloc(size_t sz) {
if (!sz) ++sz;
- void* ptr = ke_call_dispatch("mm_alloc_ptr", 1, &sz, sizeof(size_t));
+ void* ptr = ::ke_call_dispatch("mm_alloc_ptr", 1, &sz, sizeof(size_t));
return ptr;
}
@@ -26,5 +26,5 @@ DDK_EXTERN void* kalloc(size_t sz) {
DDK_EXTERN void kfree(void* ptr) {
if (!ptr) return;
- ke_call_dispatch("mm_free_ptr", 1, ptr, 0);
+ ::ke_call_dispatch("mm_free_ptr", 1, ptr, 0);
}
diff --git a/src/libDDK/src/KernelCall.cpp b/src/libDDK/src/KernelCall.cpp
index bbaded64..43e4b79f 100644
--- a/src/libDDK/src/KernelCall.cpp
+++ b/src/libDDK/src/KernelCall.cpp
@@ -40,14 +40,14 @@ static uint64_t ddk_fnv_64(const char* path) {
/// @retval nil Kernel call failed, call KernelLastError(void)
DDK_EXTERN void* ke_call_dispatch(const char* name, int32_t cnt, void* data, size_t sz) {
if (name == nil || *name == 0 || data == nil || cnt == 0) return nil;
- return __ke_call_dispatch(ddk_fnv_64(name), cnt, data, sz);
+ return ::__ke_call_dispatch(ddk_fnv_64(name), cnt, data, sz);
}
/// @brief Add system call.
/// @param slot system call slot
/// @param slotFn, syscall slot.
DDK_EXTERN void ke_set_syscall(const int slot, void (*slotFn)(void* a0)) {
- ke_call_dispatch("ke_set_syscall", slot, (ptr_t) slotFn, 1);
+ ::ke_call_dispatch("ke_set_syscall", slot, (ptr_t) slotFn, 1);
}
/// @brief Get a Kernel object.
@@ -56,7 +56,7 @@ DDK_EXTERN void ke_set_syscall(const int slot, void (*slotFn)(void* a0)) {
/// @return Object manifest.
DDK_EXTERN struct DDK_OBJECT_MANIFEST* ke_get_obj(const int slot, const char* name) {
struct DDK_OBJECT_MANIFEST* manifest =
- (struct DDK_OBJECT_MANIFEST*) ke_call_dispatch("cfkit_get_kobj", slot, (void*) name, 1);
+ (struct DDK_OBJECT_MANIFEST*) ::ke_call_dispatch("cfkit_get_kobj", slot, (void*) name, 1);
if (!manifest) return nil;
@@ -70,5 +70,5 @@ DDK_EXTERN struct DDK_OBJECT_MANIFEST* ke_get_obj(const int slot, const char* na
/// @return property's object.
DDK_EXTERN void* ke_set_obj(const int slot, const struct DDK_OBJECT_MANIFEST* ddk_ptr) {
if (ddk_ptr == nil) return nil;
- return ke_call_dispatch("cfkit_set_kobj", slot, (void*) ddk_ptr, 1);
+ return ::ke_call_dispatch("cfkit_set_kobj", slot, (void*) ddk_ptr, 1);
}
diff --git a/src/libDDK/src/Device.cpp b/src/libDDK/src/KernelDevice.cpp
index 6390f05c..c5fb785f 100644
--- a/src/libDDK/src/Device.cpp
+++ b/src/libDDK/src/KernelDevice.cpp
@@ -11,7 +11,7 @@
DDK_EXTERN DDK_DEVICE_PTR kopen_dev(const char* devicePath) {
if (nil == devicePath) return nil;
- return (DDK_DEVICE_PTR) ke_call_dispatch("dk_open_dev", 1, (void*) devicePath,
+ return (DDK_DEVICE_PTR) ::ke_call_dispatch("dk_open_dev", 1, (void*) devicePath,
kstrlen(devicePath));
}
@@ -20,6 +20,6 @@ DDK_EXTERN DDK_DEVICE_PTR kopen_dev(const char* devicePath) {
DDK_EXTERN BOOL kclose_dev(DDK_DEVICE_PTR device) {
if (nil == device) return NO;
- ke_call_dispatch("dk_close_dev", 1, device, sizeof(DDK_DEVICE));
+ ::ke_call_dispatch("dk_close_dev", 1, device, sizeof(DDK_DEVICE));
return YES;
}
diff --git a/src/libDDK/src/DriverBase.cpp b/src/libDDK/src/KernelDriverBase.cpp
index 37b138a0..37b138a0 100644
--- a/src/libDDK/src/DriverBase.cpp
+++ b/src/libDDK/src/KernelDriverBase.cpp
diff --git a/src/libDDK/src/IO.cpp b/src/libDDK/src/KernelIO.cpp
index fc247e15..e978525d 100644
--- a/src/libDDK/src/IO.cpp
+++ b/src/libDDK/src/KernelIO.cpp
@@ -13,7 +13,7 @@ DDK_EXTERN void kputc(const char ch) {
assembled[0] = ch;
assembled[1] = 0;
- ke_call_dispatch("ke_put_string", 2, assembled, 2);
+ ::ke_call_dispatch("ke_put_string", 2, assembled, 2);
}
/// @brief print string to UART.
@@ -23,10 +23,10 @@ DDK_EXTERN void kprint(const char* message) {
if (*message == '\0') return;
size_t index = 0;
- size_t len = kstrlen(message);
+ size_t len = ::kstrlen(message);
while (index < len) {
- kputc(message[index]);
+ ::kputc(message[index]);
++index;
}
}
diff --git a/src/libDDK/src/String.cpp b/src/libDDK/src/KernelString.cpp
index 7aee7495..7aee7495 100644
--- a/src/libDDK/src/String.cpp
+++ b/src/libDDK/src/KernelString.cpp
diff --git a/src/libMsg/MsgKit/Server.h b/src/libMsg/MsgKit/Server.h
index 3ab8eb73..faac0b0b 100644
--- a/src/libMsg/MsgKit/Server.h
+++ b/src/libMsg/MsgKit/Server.h
@@ -6,6 +6,7 @@
#ifndef MSGKIT_SERVER_H
#define MSGKIT_SERVER_H
+#include "libSystem/SystemKit/Macros.h"
#ifdef __cplusplus
#include <CoreFoundation.fwrk/headers/String.h>
#else
@@ -25,9 +26,12 @@ struct LIBMSG_EXPR final {
CF::CFString* l_value{nullptr};
#else
// if we use C, we won't know about CF, so let's make those private.
- VoidPtr l_private_data[2]{nullptr};
+ VoidPtr l_key{nullptr};
+ VoidPtr l_value{nullptr};
#endif
+ SizeT l_index{};
+
LIBMSG_EXPR* l_head{nullptr};
LIBMSG_EXPR* l_tail{nullptr};
LIBMSG_EXPR* l_child{nullptr};
@@ -38,6 +42,6 @@ typedef Void (*libmsg_func_type)(struct LIBMSG_EXPR* self, VoidPtr arg, SizeT ar
IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt);
IMPORT_C UInt32 libmsg_close_library(Void);
-IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head);
+IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head, VoidPtr arg, SizeT arg_size);
#endif
diff --git a/src/libMsg/libMsg.json b/src/libMsg/libMsg.json
index 4b22534f..54f284b8 100644
--- a/src/libMsg/libMsg.json
+++ b/src/libMsg/libMsg.json
@@ -17,5 +17,5 @@
"kLibSystemVersionHighest=0x0100",
"kLibSystemVersionLowest=0x0100"
],
- "description": "OpenMessage Kit for NeKernel."
+ "description": "OpenMessage Kit for the NeSystem."
}
diff --git a/src/libMsg/scripts/window_client.json b/src/libMsg/scripts/hello-world.json
index 4c8a21ba..f23a3714 100644
--- a/src/libMsg/scripts/window_client.json
+++ b/src/libMsg/scripts/hello-world.json
@@ -2,6 +2,6 @@
"id": 1,
"pos": { "x": 100, "y": 100 },
"size": { "w": 300, "h": 200 },
- "title": "Window Client",
- "on-click": "_OnClickCSymbol"
+ "title": "Message",
+ "on-init": "_PrintHelloWorld"
} \ No newline at end of file
diff --git a/src/libMsg/src/Server.cpp b/src/libMsg/src/Server.cpp
index 3f2e8f5a..e4602047 100644
--- a/src/libMsg/src/Server.cpp
+++ b/src/libMsg/src/Server.cpp
@@ -5,9 +5,40 @@
#include <libMsg/MsgKit/Server.h>
-IMPORT_C UInt32 libmsg_close_library(Void) { return 0; }
+static libmsg_func_type* kFuncs{nullptr};
+static SizeT kFuncCnt{0};
+static SemaphoreRef kSemaphore{nullptr};
-IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head) { return 0; }
+IMPORT_C UInt32 libmsg_close_library(Void) {
+ if (kSemaphore) return 0;
-IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt) {}
+ kFuncs = nullptr;
+ kFuncCnt = 0;
+ return 0;
+}
+
+IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head, VoidPtr arg, SizeT arg_size) {
+ if (kSemaphore) return 0;
+
+ if (!head) return 0;
+
+ kSemaphore = SemCreate(1000, 1000, "libmsg_semaphore");
+
+ if (!kSemaphore) return 0;
+
+ kFuncs[head->l_index](head, arg, arg_size);
+
+ SemClose(kSemaphore);
+ kSemaphore = nullptr;
+
+ return 0;
+}
+
+IMPORT_C Void libmsg_init_library(libmsg_func_type* funcs, SizeT cnt) {
+ kFuncs = funcs;
+ kFuncCnt = cnt;
+
+ MUST_PASS(kFuncs != nullptr);
+ MUST_PASS(kFuncCnt > 0);
+}
diff --git a/src/libPThread/PThreadKit/Thread.h b/src/libPThread/PThreadKit/Thread.h
index 053885e7..85f7a320 100644
--- a/src/libPThread/PThreadKit/Thread.h
+++ b/src/libPThread/PThreadKit/Thread.h
@@ -11,4 +11,11 @@
#define PTHREAD_UNSAFE /* hint */
#define PTHREAD_SAFE /* hint */
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg);
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval);
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval);
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread);
+PTHREAD_SAFE ThreadRef pthread_self(Void);
+PTHREAD_SAFE SInt32 pthread_yield(void);
+
#endif // LIBPOSIX_POSIXKIT_THREAD_H
diff --git a/src/libPThread/src/Thread.cpp b/src/libPThread/src/Thread.cpp
index 34a610cd..5a351be8 100644
--- a/src/libPThread/src/Thread.cpp
+++ b/src/libPThread/src/Thread.cpp
@@ -5,29 +5,38 @@
#include <libPThread/PThreadKit/Thread.h>
-namespace POSIXKit::Detail {
-
- /// @brief Max path structure.
- constexpr auto kMaxPathLen = 255;
- static constexpr auto kCanaryValue = 0xf0f0488f;
-
- /// @brief Thread Information Structure.
- struct ThreadFrameParams final {
- SInt64 fCanary;
- VoidPtr fStackPtr;
- VoidPtr fCodePtr;
- SizeT fCodeSz;
- SizeT fStackSz;
- SInt64 fThrdID;
- SInt64 fUsrID, fGrpID;
- SInt64* fFD{};
- SizeT fFDCnt;
- Char fCWD[kMaxPathLen];
- Char fRoot[kMaxPathLen];
- ThreadRef fRef;
- };
-
-} // namespace POSIX::Detail
+PTHREAD_SAFE SInt32 pthread_detach(ThreadRef thread) {
+ return ThrDetachThread(thread);
+}
+PTHREAD_SAFE SInt32 pthread_yield(void) {
+ return ThrYieldThread(pthread_self());
+}
+PTHREAD_SAFE ThreadRef pthread_self(Void) {
+ return ThrCurrentThread();
+}
+
+PTHREAD_SAFE SInt32 pthread_exit(SInt32 retval) {
+ return ThrExitCurrentThread(retval);
+}
+
+PTHREAD_SAFE SInt32 pthread_join(ThreadRef thread, VoidPtr* retval) {
+ SInt32* ret = (SInt32*)retval;
+ *ret = ThrJoinThread(thread);
+
+ return 0;
+}
+
+PTHREAD_SAFE SInt32 pthread_create(_Output ThreadRef* thread, VoidPtr attr, VoidPtr (*start_routine)(VoidPtr), VoidPtr arg) {
+ LIBSYS_UNUSED(attr);
+
+ /// @note passing zero means you'd have to read the argv until you hit a nullptr.
+ ThreadRef thrd = ThrCreateThread("pthread_thread", (ThrProcKind)start_routine, 0, arg, 0);
+
+ if (!thrd) return -1;
+
+ *thread = thrd;
+ return 0;
+}
diff --git a/src/libSystem/SystemKit/System.h b/src/libSystem/SystemKit/System.h
index 4e766d9d..69cce9a7 100644
--- a/src/libSystem/SystemKit/System.h
+++ b/src/libSystem/SystemKit/System.h
@@ -21,6 +21,7 @@
/// @brief Types API.
// ------------------------------------------------------------------------------------------ //
+/// @brief Reference type, used for all references in the system, such as file descriptors, dylib handles, thread handles, etc.
struct REF_TYPE {
UInt64 __hash; /// @brief Hash of the syscall
VoidPtr __self; /// @brief Syscall self value.
@@ -210,12 +211,15 @@ typedef SInt32 (*ThrProcKind)(SInt32 argc, Char** argv);
/// @param flags Thread flags.
/// @return the thread object.
IMPORT_C ThreadRef ThrCreateThread(const Char* thread_name, ThrProcKind procedure,
- SInt32 argument_count, SInt32 flags);
+ SInt32 argument_count, VoidPtr args, SInt32 flags);
/// @brief Yields the current thread.
/// @param thread the thread to yield.
IMPORT_C SInt32 ThrYieldThread(ThreadRef thrd);
+/// @brief Get the current thread's ID.
+IMPORT_C ThreadRef ThrCurrentThread(Void);
+
/// @brief Joins a thread.
/// @param thread the thread to join.
IMPORT_C SInt32 ThrJoinThread(ThreadRef thrd);
@@ -389,4 +393,17 @@ IMPORT_C Char* StrFmt(const Char* fmt, ...);
IMPORT_C UInt64 StrMathToNumber(const Char* in, const Char** endp, const SInt16 base);
+// ------------------------------------------------------------------------------------------ //
+// @brief Semaphore API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Create a semaphore.
+IMPORT_C _Output SemaphoreRef SemCreate(_Input UInt32 initial_count, _Input UInt32 max_count, _Input const Char* name);
+
+/// @brief Wait on a semaphore.
+IMPORT_C SInt32 SemWait(_Input SemaphoreRef sem);
+
+/// @brief Close a semaphore.
+IMPORT_C SInt32 SemClose(_Input SemaphoreRef sem);
+
#endif // ifndef SYSTEMKIT_SYSTEM_H
diff --git a/src/libSystem/libSystem.json b/src/libSystem/libSystem.json
index 16557645..14f4bfc5 100644
--- a/src/libSystem/libSystem.json
+++ b/src/libSystem/libSystem.json
@@ -17,5 +17,5 @@
"kLibSystemVersionHighest=0x0100",
"kLibSystemVersionLowest=0x0100"
],
- "description": "The System Call Kit for the NeKernel Stack."
+ "description": "The System Call Kit for the NeSystem."
}