summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-08-14 10:47:10 +0200
committerAmlal <amlal@nekernel.org>2025-08-14 10:47:10 +0200
commit90acc37fd62f7c18c5b19fae2558f042adb4ded2 (patch)
tree9a9ebffaf26477ab29ff2f9fc37cae1e2792f0d0 /dev
parent9b9c013aca60c96c50984584873da30b26046b18 (diff)
fix! abi! Use FNV instead of direct strings for DDK symbols
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev')
-rw-r--r--dev/ddk/src/ddk_kernel_call.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/dev/ddk/src/ddk_kernel_call.c b/dev/ddk/src/ddk_kernel_call.c
index 168672b2..1ac0a0aa 100644
--- a/dev/ddk/src/ddk_kernel_call.c
+++ b/dev/ddk/src/ddk_kernel_call.c
@@ -12,8 +12,27 @@
#include <stdarg.h>
/// @brief this is an internal call, do not use it.
-DDK_EXTERN ATTRIBUTE(naked) void* __ke_call_dispatch(const char* name, int32_t cnt, void* data,
- size_t sz);
+DDK_EXTERN ATTRIBUTE(naked) void* __ke_call_dispatch(const int32_t name, int32_t cnt, void* data,
+ size_t sz);
+/// @brief This function hashes the path into a FNV symbol.
+/// @param path the path to hash.
+/// @retval 0 symbol wasn't hashed.
+/// @retval > 0 hashed symbol.
+static uint64_t ddk_fnv_64(const char* path) {
+ if (path == nil || *path == 0) return 0;
+
+ const uint64_t kFnvOffsetBase = 0xcbf29ce484222325ULL;
+ const uint64_t kFnvPrime64 = 0x100000001b3ULL;
+
+ uint64_t hash = kFnvOffsetBase;
+
+ while (*path) {
+ hash ^= (char) (*path++);
+ hash *= kFnvPrime64;
+ }
+
+ return hash;
+}
/// @brief Interrupt Kernel and call it's RPC.
/// @param name RPC name
@@ -24,7 +43,7 @@ DDK_EXTERN ATTRIBUTE(naked) void* __ke_call_dispatch(const char* name, int32_t c
/// @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(name, cnt, data, sz);
+ return __ke_call_dispatch(ddk_fnv_64(name), cnt, data, sz);
}
/// @brief Add system call.