summaryrefslogtreecommitdiffhomepage
path: root/dev/user
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-03-27 17:24:21 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-03-27 17:24:21 +0100
commitb8f7ef086d1d1b1cd686fff04d0a587f8fd39d81 (patch)
treeb6c2eb3ca2c51dc87ddd81b6170d5f63eabb9090 /dev/user
parenteb86df50ec5afb392998e2e171de54e1f26d8e7a (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/user')
-rw-r--r--dev/user/LPC.h56
-rw-r--r--dev/user/Macros.h93
-rw-r--r--dev/user/SystemCalls.h341
-rw-r--r--dev/user/docs/SPECIFICATION_SYSCALLS.md9
-rw-r--r--dev/user/libsci.json20
-rw-r--r--dev/user/src/GNUmakefile16
-rw-r--r--dev/user/src/LPC.cc10
-rw-r--r--dev/user/src/SystemCall+IO.asm50
-rw-r--r--dev/user/src/SystemCalls.cc45
9 files changed, 640 insertions, 0 deletions
diff --git a/dev/user/LPC.h b/dev/user/LPC.h
new file mode 100644
index 00000000..87e5e500
--- /dev/null
+++ b/dev/user/LPC.h
@@ -0,0 +1,56 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <user/Macros.h>
+
+/// @file LPC.h
+/// @brief Local Procedure Code type and values.
+
+#define err_local_ok() (kLastError == kErrorSuccess)
+#define err_local_fail() (kLastError != kErrorSuccess)
+#define err_local_get() (kLastError)
+
+typedef SInt32 ErrObject;
+
+inline constexpr ErrObject kErrorSuccess = 0;
+inline constexpr ErrObject kErrorExecutable = 33;
+inline constexpr ErrObject kErrorExecutableLib = 34;
+inline constexpr ErrObject kErrorFileNotFound = 35;
+inline constexpr ErrObject kErrorDirectoryNotFound = 36;
+inline constexpr ErrObject kErrorDiskReadOnly = 37;
+inline constexpr ErrObject kErrorDiskIsFull = 38;
+inline constexpr ErrObject kErrorProcessFault = 39;
+inline constexpr ErrObject kErrorSocketHangUp = 40;
+inline constexpr ErrObject kErrorThreadLocalStorage = 41;
+inline constexpr ErrObject kErrorMath = 42;
+inline constexpr ErrObject kErrorNoNetwork = 43;
+inline constexpr ErrObject kErrorHeapOutOfMemory = 44;
+inline constexpr ErrObject kErrorNoSuchDisk = 45;
+inline constexpr ErrObject kErrorFileExists = 46;
+inline constexpr ErrObject kErrorFormatFailed = 47;
+inline constexpr ErrObject kErrorNetworkTimeout = 48;
+inline constexpr ErrObject kErrorInternal = 49;
+inline constexpr ErrObject kErrorForkAlreadyExists = 50;
+inline constexpr ErrObject kErrorOutOfTeamSlot = 51;
+inline constexpr ErrObject kErrorHeapNotPresent = 52;
+inline constexpr ErrObject kErrorNoEntrypoint = 53;
+inline constexpr ErrObject kErrorDiskIsCorrupted = 54;
+inline constexpr ErrObject kErrorDisk = 55;
+inline constexpr ErrObject kErrorInvalidData = 56;
+inline constexpr ErrObject kErrorAsync = 57;
+inline constexpr ErrObject kErrorNonBlocking = 58;
+inline constexpr ErrObject kErrorIPC = 59;
+inline constexpr ErrObject kErrorSign = 60;
+inline constexpr ErrObject kErrorInvalidCreds = 61;
+inline constexpr ErrObject kErrorCDTrayBroken = 62;
+inline constexpr ErrObject kErrorUnrecoverableDisk = 63;
+inline constexpr ErrObject kErrorFileLocked = 64;
+inline constexpr ErrObject kErrorUnimplemented = -1;
+
+/// @brief The last error reported by the system to the process.
+IMPORT_C ErrObject kLastError;
diff --git a/dev/user/Macros.h b/dev/user/Macros.h
new file mode 100644
index 00000000..e2759258
--- /dev/null
+++ b/dev/user/Macros.h
@@ -0,0 +1,93 @@
+/* -------------------------------------------
+
+Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+File: Macros.h
+Purpose: libsci Macros header.
+
+------------------------------------------- */
+
+#pragma once
+
+/***********************************************************************************/
+/// @file user/Macros.h
+/// @brief Macros and Core types of the SCI (System Call Interface).
+/***********************************************************************************/
+
+#include <HintKit/CompilerHint.h>
+
+#define ATTRIBUTE(X) __attribute__((X))
+
+#define IMPORT_CXX extern "C++"
+#define IMPORT_C extern "C"
+
+#define DEPRECATED ATTRIBUTE(deprecated)
+
+#define EXIT_SUCCESS (0)
+#define EXIT_FAILURE (1)
+
+#define FILE_MAX_LEN (256)
+
+#ifndef BOOL
+#define BOOL bool
+#endif
+
+typedef bool Bool;
+typedef bool Boolean;
+typedef void Void;
+
+#ifndef __cplusplus
+#define true (1)
+#define false (0)
+#endif
+
+#define YES true
+#define NO false
+
+typedef __UINT64_TYPE__ UInt64;
+typedef __UINT32_TYPE__ UInt32;
+typedef __UINT16_TYPE__ UInt16;
+typedef __UINT8_TYPE__ UInt8;
+
+typedef __SIZE_TYPE__ SizeT;
+
+typedef __INT64_TYPE__ SInt64;
+typedef __INT32_TYPE__ SInt32;
+typedef __INT16_TYPE__ SInt16;
+typedef __INT8_TYPE__ SInt8;
+
+typedef void* VoidPtr;
+typedef __UINTPTR_TYPE__ UIntPtr;
+typedef char Char;
+
+#ifdef __cplusplus
+typedef decltype(nullptr) nullPtr;
+typedef nullPtr NullPtr;
+
+#define SCI_COPY_DELETE(KLASS) \
+ KLASS& operator=(const KLASS&) = delete; \
+ KLASS(const KLASS&) = delete;
+
+#define SCI_COPY_DEFAULT(KLASS) \
+ KLASS& operator=(const KLASS&) = default; \
+ KLASS(const KLASS&) = default;
+
+#define SCI_MOVE_DELETE(KLASS) \
+ KLASS& operator=(KLASS&&) = delete; \
+ KLASS(KLASS&&) = delete;
+
+#define SCI_MOVE_DEFAULT(KLASS) \
+ KLASS& operator=(KLASS&&) = default; \
+ KLASS(KLASS&&) = default;
+
+#endif
+
+IMPORT_C void _rtl_assert(Bool expr, const Char* origin);
+
+#define MUST_PASS(X) _rtl_assert(X, __FILE__)
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(X) \
+ (((sizeof(X) / sizeof(*(X))) / \
+ (static_cast<SizeT>(!(sizeof(X) % sizeof(*(X)))))))
+#endif \ No newline at end of file
diff --git a/dev/user/SystemCalls.h b/dev/user/SystemCalls.h
new file mode 100644
index 00000000..6a0c2845
--- /dev/null
+++ b/dev/user/SystemCalls.h
@@ -0,0 +1,341 @@
+/* -------------------------------------------
+
+Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+File: SystemCalls.h
+Purpose: System Call Interface.
+
+------------------------------------------- */
+
+#ifndef SCI_SCI_H
+#define SCI_SCI_H
+
+#include <user/Macros.h>
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Types API.
+// ------------------------------------------------------------------------------------------ //
+
+typedef VoidPtr SCIObject;
+
+typedef SCIObject IOObject;
+typedef IOObject FSObject;
+typedef SCIObject DLLObject;
+typedef SCIObject ThreadObject;
+typedef SCIObject SocketObject;
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Dynamic Loader API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Get function which is part of the DLL.
+/// @param symbol the symbol to look for
+/// @param dll_handle the DLL handle.
+/// @return the proc pointer.
+IMPORT_C SCIObject LdrGetDLLSymbolFromHandle(_Input const Char* symbol, _Input SCIObject dll_handle);
+
+/// @brief Open DLL handle.
+/// @param path
+/// @param drv
+/// @return
+IMPORT_C SCIObject LdrOpenDLLHandle(_Input const Char* path, _Input const Char* drive_letter);
+
+/// @brief Close DLL handle
+/// @param dll_handle
+/// @return
+IMPORT_C Void LdrCloseDLLHandle(_Input SCIObject* dll_handle);
+
+// ------------------------------------------------------------------------------------------ //
+// File API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Opens a file from a drive.
+/// @param fs_path the filesystem path.
+/// @param drive_letter drive name, use NULL to use default drive location.
+/// @return the file descriptor of the file.
+IMPORT_C SCIObject IoOpenFile(const Char* fs_path, const Char* drive_letter);
+
+/// @brief Closes a file and flushes its content.
+/// @param file_desc the file descriptor.
+/// @return Function doesn't return a type.
+IMPORT_C Void IoCloseFile(_Input SCIObject file_desc);
+
+/// @brief Write data to a file.
+/// @param file_desc the file descriptor.
+/// @param out_data the data to write.
+/// @param sz_data the size of the data to write.
+/// @return the number of bytes written.
+IMPORT_C UInt32 IoWriteFile(_Input SCIObject file_desc, _Output VoidPtr out_data, SizeT sz_data);
+
+/// @brief Read data from a file.
+/// @param file_desc the file descriptor.
+/// @param out_data the data to read.
+/// @param sz_data the size of the data to read.
+IMPORT_C UInt32 IoReadFile(_Input SCIObject file_desc, _Output VoidPtr* out_data, SizeT sz_data);
+
+/// @brief Rewind the file pointer to the beginning of the file.
+/// @param file_desc the file descriptor.
+/// @return the number of bytes read.
+IMPORT_C UInt64 IoRewindFile(_Input SCIObject file_desc);
+
+/// @brief Tell the current position of the file pointer.
+/// @param file_desc the file descriptor.
+/// @return the current position of the file pointer.
+IMPORT_C UInt64 IoTellFile(_Input SCIObject file_desc);
+
+/// @brief Seek file offset from file descriptor.
+IMPORT_C UInt64 IoSeekFile(_Input SCIObject file_desc, UInt64 file_offset);
+
+// ------------------------------------------------------------------------
+// Process API.
+// ------------------------------------------------------------------------
+
+/// @brief Spawns a Thread Information Block and Global Information Block inside the current process.
+/// @param process_id Target Process ID, must be valid.
+/// @return > 0 error ocurred or already present, = 0 success.
+IMPORT_C UInt32 RtlSpawnIB(UIntPtr process_id);
+
+/// @brief Spawns a process with a unique pid (stored as UIntPtr).
+/// @param process_path process filesystem path.
+/// @return > 0 process was created.
+IMPORT_C UIntPtr RtlSpawnProcess(const Char* process_path, SizeT argc, Char** argv, Char** envp, SizeT envp_len);
+
+/// @brief Exits a process with an exit_code.
+/// @return if it has succeeded true, otherwise false.
+IMPORT_C Bool RtlExitProcess(UIntPtr handle, UIntPtr exit_code);
+
+/// @brief Get current PID of process.
+/// @return Current process ID.
+IMPORT_C UIntPtr RtlCurrentPID(Void);
+
+// ------------------------------------------------------------------------
+// Memory Manager API.
+// ------------------------------------------------------------------------
+
+/// @brief Creates a new heap from the process's address space.
+/// @param len the length of it.
+/// @param flags the flags of it.
+/// @return heap pointer.
+IMPORT_C VoidPtr MmCreateHeap(_Input SizeT len, _Input UInt32 flags);
+
+/// @brief Destroys the pointer
+/// @param heap the heap itself.
+/// @return void.
+IMPORT_C Void MmDestroyHeap(_Input VoidPtr heap);
+
+/// @brief Change protection flags of a memory region.
+IMPORT_C Void MmSetHeapFlags(_Input VoidPtr heap, _Input UInt32 flags);
+
+/// @brief Change protection flags of a memory region.
+IMPORT_C UInt32 MmGetHeapFlags(_Input VoidPtr heap);
+
+/// @brief Fill memory region with CRC32.
+IMPORT_C UInt32 MmFillCRC32Heap(_Input VoidPtr heap);
+
+/// @brief Copy memory region.
+IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len);
+
+/// @brief Compare memory regions.
+IMPORT_C SInt64 MmCmpMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len);
+
+/// @brief Fill memory region.
+IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value);
+
+/// @brief Compare string regions.
+IMPORT_C SInt64 MmStrCmp(_Input const Char* dest, _Input const Char* src);
+
+/// @brief Get length of string.
+IMPORT_C SInt64 MmStrLen(const Char* str);
+
+// ------------------------------------------------------------------------
+// @brief Error API.
+// ------------------------------------------------------------------------
+
+IMPORT_C SInt32 ErrGetLastError(Void);
+
+// ------------------------------------------------------------------------
+// @brief Threading API.
+// ------------------------------------------------------------------------
+
+/// @brief Exit the current thread.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitCurrentThread(_Input SInt32 exit_code);
+
+/// @brief Exit the main thread.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitMainThread(_Input SInt32 exit_code);
+
+/// @brief Exit a thread.
+/// @param thread the thread to exit.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitThread(_Input ThreadObject thread, _Input SInt32 exit_code);
+
+/// @brief Thread procedure function type.
+typedef Void (*thread_proc_kind)(int argc, char** argv);
+
+/// @brief Creates a thread.
+/// @param procedure the thread procedure.
+/// @param argument_count number of arguments inside that thread.
+/// @param flags Thread flags.
+/// @return the thread object.
+IMPORT_C ThreadObject ThrCreateThread(thread_proc_kind procedure, SInt32 argument_count, SInt32 flags);
+
+/// @brief Yields the current thread.
+/// @param thread the thread to yield.
+IMPORT_C Void ThrYieldThread(ThreadObject thrd);
+
+/// @brief Joins a thread.
+/// @param thread the thread to join.
+IMPORT_C Void ThrJoinThread(ThreadObject thrd);
+
+/// @brief Detach a thread.
+/// @param thread the thread to detach.
+IMPORT_C Void ThrDetachThread(ThreadObject thrd);
+
+// ------------------------------------------------------------------------
+// @brief Drive Management API.
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Get the default drive letter.
+/// @param void.
+/// @return the drive letter.
+// ------------------------------------------------------------------------------------------ //
+IMPORT_C Char* DrvGetDefaultDriveLetter(Void);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Get the drive letter from a path.
+/// @param path the path.
+/// @return the drive letter.
+// ------------------------------------------------------------------------------------------ //
+IMPORT_C Char* DrvGetDriveLetterFromPath(_Input const Char* path);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Get a mounted drive from a letter.
+/// @param letter the letter (A..Z).
+/// @return the drive object.
+// ------------------------------------------------------------------------------------------ //
+IMPORT_C SCIObject DrvGetMountedDrive(_Input const Char letter);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Mount a drive.
+/// @param path the path to mount.
+/// @param letter the letter to mount.
+// ------------------------------------------------------------------------------------------ //
+IMPORT_C Void DrvMountDrive(_Input const Char* path, _Input const Char* letter);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Unmount a drive.
+/// @param letter the letter to unmount.
+// ------------------------------------------------------------------------------------------ //
+IMPORT_C Void DrvUnmountDrive(_Input const Char letter);
+
+// ------------------------------------------------------------------------
+// Event handling API, use to listen to OS specific events.
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Add an event listener.
+/// @param event_name the event name.
+/// @param listener the listener to add.
+/// @return the event listener.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C Void EvtAddListener(_Input const Char* event_name, _Input SCIObject listener);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Remove an event listener.
+/// @param event_name the event name.
+/// @param listener the listener to remove.
+/// @return the event listener.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C Void EvtRemoveListener(_Input const Char* event_name, _Input SCIObject listener);
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Dispatch an event.
+/// @param event_name the event name.
+/// @param event_data the event data.
+/// @return the event data.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C VoidPtr EvtDispatchEvent(_Input const Char* event_name, _Input VoidPtr event_data);
+
+// ------------------------------------------------------------------------------------------ //
+// Power API.
+// ------------------------------------------------------------------------------------------ //
+
+enum
+{
+ kPowerCodeShutdown,
+ kPowerCodeReboot,
+ kPowerCodeSleep,
+ kPowerCodeWake,
+ kPowerCodeCount,
+};
+
+IMPORT_C SInt32 PwrReadCode(_Output SInt32& code);
+
+IMPORT_C SInt32 PwrSendCode(_Output SInt32& code);
+
+// ------------------------------------------------------------------------------------------ //
+// CD-ROM API.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C SInt32 CdEjectDrive(_Input const Char drv_letter);
+
+IMPORT_C SInt32 CdOpenTray(Void);
+
+IMPORT_C SInt32 CdCloseTray(Void);
+
+// ------------------------------------------------------------------------------------------ //
+// Printer API.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C SInt32 PrintOut(IOObject file /* nullptr to direct to stdout */, const Char* fmt, ...);
+
+IMPORT_C SInt32 PrintIn(IOObject file /* nullptr to direct to stdout */, const Char* fmt, ...);
+
+IMPORT_C IOObject PrintCreate(Void);
+
+IMPORT_C SInt32 PrintRelease(IOObject);
+
+IMPORT_C IOObject PrintGet(const Char* path);
+
+// ------------------------------------------------------------------------------------------ //
+// @brief Scheduler/Debug API.
+// ------------------------------------------------------------------------------------------ //
+
+typedef SInt32 AffinityKind;
+typedef UInt64 PID;
+
+IMPORT_C SInt32 SchedAffinity(PID, SInt32 req, AffinityKind* local);
+
+IMPORT_C SInt32 SchedTrace(PID, SInt32 req, VoidPtr address, VoidPtr data);
+
+IMPORT_C SInt32 SchedKill(PID, SInt32 req);
+
+IMPORT_C SInt32 SchedBreakPoint(Void);
+
+// ------------------------------------------------------------------------------------------ //
+// @brief Filesystem API.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C BOOL FsCopy(const char* path, const char* dst);
+IMPORT_C BOOL FsMove(const char* path, const char* dst);
+
+IMPORT_C BOOL FsExists(const char* path);
+
+IMPORT_C BOOL FsCreateDir(const char* path);
+IMPORT_C BOOL FsCreateFile(const char* path);
+IMPORT_C BOOL FsCreateAlias(const char* path, const char* from);
+
+// ------------------------------------------------------------------------------------------ //
+// @brief Format API.
+// ------------------------------------------------------------------------------------------ //
+
+IMPORT_C Char* StrFmt(const Char* fmt, ...);
+
+IMPORT_C UInt64 MathToNumber(const Char* in, const Char** endp, const SInt16 base);
+
+#endif // ifndef SCI_SCI_H
diff --git a/dev/user/docs/SPECIFICATION_SYSCALLS.md b/dev/user/docs/SPECIFICATION_SYSCALLS.md
new file mode 100644
index 00000000..b01018c7
--- /dev/null
+++ b/dev/user/docs/SPECIFICATION_SYSCALLS.md
@@ -0,0 +1,9 @@
+===================================
+
+# 0: General Information
+
+===================================
+
+- Programming Language: C/C++
+- Build System: Make/BTB
+- Purpose: System Call Interface
diff --git a/dev/user/libsci.json b/dev/user/libsci.json
new file mode 100644
index 00000000..ed9a8739
--- /dev/null
+++ b/dev/user/libsci.json
@@ -0,0 +1,20 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-g++",
+ "compiler_std": "c++20",
+ "headers_path": ["../", "./"],
+ "sources_path": ["src/*.cc", "src/*.o"],
+ "output_name": "libuser.dylib",
+ "compiler_flags": [
+ "-fPIC",
+ "-ffreestanding",
+ "-shared",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17"
+ ],
+ "cpp_macros": [
+ "kSCIVersion=0x0100",
+ "kSCIVersionHighest=0x0100",
+ "kSCIVersionLowest=0x0100"
+ ]
+}
diff --git a/dev/user/src/GNUmakefile b/dev/user/src/GNUmakefile
new file mode 100644
index 00000000..471e22d1
--- /dev/null
+++ b/dev/user/src/GNUmakefile
@@ -0,0 +1,16 @@
+##################################################
+# (c) Amlal EL Mahrouss, all rights reserved.
+# This is the bootloader makefile.
+##################################################
+
+ASM=nasm
+FLAGS=-f win64
+
+.PHONY: error
+error:
+ @echo "==> Invalid rule."
+ @echo "==> Use sci_asm_io_<arch> instead."
+
+.PHONY: sci_asm_io_x64
+sci_asm_io_x64:
+ $(ASM) $(FLAGS) SystemCall+IO.asm -o SystemCall+IO.o
diff --git a/dev/user/src/LPC.cc b/dev/user/src/LPC.cc
new file mode 100644
index 00000000..f3f320b7
--- /dev/null
+++ b/dev/user/src/LPC.cc
@@ -0,0 +1,10 @@
+/* -------------------------------------------
+
+Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+File: LPC.cc
+Purpose: Local Procedure Codes.
+
+------------------------------------------- */
+
+#include <user/LPC.h>
diff --git a/dev/user/src/SystemCall+IO.asm b/dev/user/src/SystemCall+IO.asm
new file mode 100644
index 00000000..769ae513
--- /dev/null
+++ b/dev/user/src/SystemCall+IO.asm
@@ -0,0 +1,50 @@
+;; /*
+;; * ========================================================
+;; *
+;; * libsci
+;; * Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+;; *
+;; * ========================================================
+;; */
+
+[bits 64]
+
+section .text
+
+global sci_syscall_arg_1
+global sci_syscall_arg_2
+global sci_syscall_arg_3
+global sci_syscall_arg_4
+
+sci_syscall_arg_1:
+ mov r8, rcx
+ syscall
+ ret
+
+sci_syscall_arg_2:
+ mov r8, rcx
+ mov r9, rdx
+ syscall
+ ret
+
+sci_syscall_arg_3:
+ mov rbx, r8
+
+ mov r8, rcx
+ mov r9, rdx
+ mov r10, rbx
+
+ syscall
+ ret
+
+sci_syscall_arg_4:
+ mov rbx, r8
+ mov rax, r9
+
+ mov r8, rcx
+ mov r9, rdx
+ mov r10, rbx
+ mov r11, rax
+
+ syscall
+ ret
diff --git a/dev/user/src/SystemCalls.cc b/dev/user/src/SystemCalls.cc
new file mode 100644
index 00000000..eadb07ce
--- /dev/null
+++ b/dev/user/src/SystemCalls.cc
@@ -0,0 +1,45 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <user/SystemCalls.h>
+
+/// @file libsci.cc
+/// @brief Source file for the memory functions of the libsci.
+
+/// @brief Copy memory region.
+IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len)
+{
+ if (!len ||
+ !dest ||
+ !src)
+ {
+ return nullptr;
+ }
+
+ for (SizeT i = 0; i < len; i++)
+ {
+ ((Char*)dest)[i] = ((Char*)src)[i];
+ }
+
+ return dest;
+}
+
+/// @brief Fill memory region with **value**.
+IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value)
+{
+ if (!len ||
+ !dest)
+ {
+ return nullptr;
+ }
+
+ for (SizeT i = 0; i < len; i++)
+ {
+ ((Char*)dest)[i] = value;
+ }
+
+ return dest;
+}