diff options
| author | Amlal <amlal@nekernel.org> | 2025-08-14 10:47:10 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-08-14 10:47:10 +0200 |
| commit | 90acc37fd62f7c18c5b19fae2558f042adb4ded2 (patch) | |
| tree | 9a9ebffaf26477ab29ff2f9fc37cae1e2792f0d0 /dev | |
| parent | 9b9c013aca60c96c50984584873da30b26046b18 (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.c | 25 |
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. |
