diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-27 17:24:21 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-03-27 17:24:21 +0100 |
| commit | b8f7ef086d1d1b1cd686fff04d0a587f8fd39d81 (patch) | |
| tree | b6c2eb3ca2c51dc87ddd81b6170d5f63eabb9090 /dev/ddk/src/ddk_kernel_call.c | |
| parent | eb86df50ec5afb392998e2e171de54e1f26d8e7a (diff) | |
add: new driver device kit API. (DDK)
refactor: rename SCIKit -> user (then libuser.dylib)
boot/modules/netboot: fixed compilation for amd64.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/ddk/src/ddk_kernel_call.c')
| -rw-r--r-- | dev/ddk/src/ddk_kernel_call.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/dev/ddk/src/ddk_kernel_call.c b/dev/ddk/src/ddk_kernel_call.c new file mode 100644 index 00000000..71dbebeb --- /dev/null +++ b/dev/ddk/src/ddk_kernel_call.c @@ -0,0 +1,60 @@ +/* ------------------------------------------- + + Copyright Amlal EL Mahrouss. + + Purpose: DDK Kernel call. + +------------------------------------------- */ + +#include <ddk/ddk.h> +#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); + +/// @brief Interupt Kernel and call it's RPC. +/// @param KernelRpcName RPC name +/// @param cnt number of elements in **data** pointer. +/// @param data data pointer. +/// @param sz The size of the whole data pointer. +/// @retval void* Kernel call was successful. +/// @retval nil Kernel call failed, call KernelLastError(void) +DDK_EXTERN void* ke_call(const char* name, int32_t cnt, void* data, size_t sz) +{ + if (!name || *name == 0 || cnt == 0) + return nil; + + return ke_call_dispatch(name, cnt, data, sz); +} + +/// @brief Add system call. +/// @param slot system call slot +/// @param slotFn, syscall slot. +DDK_EXTERN void ke_add_syscall(const int slot, void (*slotFn)(void* a0)) +{ + ke_call("ke_add_syscall", slot, slotFn, 1); +} + +/// @brief Get a Kernel object. +/// @param slot property id (always 0) +/// @param name the object's name. +/// @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("cf_get_kobj", slot, (void*)name, 1); + + if (!manifest) + return nil; + + return manifest; +} + +/// @brief Set a Kernel object. +/// @param slot property id (always 0) +/// @param name the object's name. +/// @param ddk_pr pointer to a object's DDK_OBJECT_MANIFEST. +/// @return property's object. +DDK_EXTERN void* ke_set_obj(const int slot, const struct DDK_OBJECT_MANIFEST* ddk_pr) +{ + return ke_call("cf_set_kobj", slot, (void*)ddk_pr, 1); +} |
