From 486425ed00acec134f8799bdde64bfd093c5fb55 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 26 Dec 2024 21:19:14 +0100 Subject: IMPL: A lot of new changes, see details. Signed-off-by: Amlal El Mahrouss --- dev/LibSCI/CompilerHint.h | 25 ++++ dev/LibSCI/GPU.h | 50 ++++++++ dev/LibSCI/LPC.h | 54 +++++++++ dev/LibSCI/Macros.h | 56 +++++++++ dev/LibSCI/SCI.h | 264 +++++++++++++++++++++++++++++++++++++++++++ dev/LibSCI/SysCalls.h | 20 ++++ dev/LibSCI/doc/SCIKit.drawio | 28 +++++ dev/LibSCI/sci.json | 20 ++++ dev/LibSCI/src/GPU.cc | 10 ++ dev/LibSCI/src/LPC.cc | 10 ++ dev/LibSCI/src/LibSCI+IO.asm | 50 ++++++++ dev/LibSCI/src/Makefile | 16 +++ dev/LibSCI/src/SCI.cc | 45 ++++++++ 13 files changed, 648 insertions(+) create mode 100644 dev/LibSCI/CompilerHint.h create mode 100644 dev/LibSCI/GPU.h create mode 100644 dev/LibSCI/LPC.h create mode 100644 dev/LibSCI/Macros.h create mode 100644 dev/LibSCI/SCI.h create mode 100644 dev/LibSCI/SysCalls.h create mode 100644 dev/LibSCI/doc/SCIKit.drawio create mode 100644 dev/LibSCI/sci.json create mode 100644 dev/LibSCI/src/GPU.cc create mode 100644 dev/LibSCI/src/LPC.cc create mode 100644 dev/LibSCI/src/LibSCI+IO.asm create mode 100644 dev/LibSCI/src/Makefile create mode 100644 dev/LibSCI/src/SCI.cc (limited to 'dev/LibSCI') diff --git a/dev/LibSCI/CompilerHint.h b/dev/LibSCI/CompilerHint.h new file mode 100644 index 00000000..3365bac2 --- /dev/null +++ b/dev/LibSCI/CompilerHint.h @@ -0,0 +1,25 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#ifndef SCI_HINT_H +#define SCI_HINT_H + +#ifdef __TK__ +#pragma compiler(hint_manifest) +#endif + +#define _Input +#define _Output + +#define _Optional + +#define _StrictCheckInput +#define _StrictCheckOutput + +#define _InOut +#define _StrictInOut + +#endif // ifndef SCI_HINT_H diff --git a/dev/LibSCI/GPU.h b/dev/LibSCI/GPU.h new file mode 100644 index 00000000..976ad2e5 --- /dev/null +++ b/dev/LibSCI/GPU.h @@ -0,0 +1,50 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: GPU.h +Purpose: GFX System Calls. + +------------------------------------------- */ + +#ifndef SCIKIT_GPU_H +#define SCIKIT_GPU_H + +#include + +// ------------------------------------------------------------------------------------------ // +// GPU API. +// ------------------------------------------------------------------------------------------ // + +// ------------------------------------------------------------------------------------------ // +// @brief Command buffer structure type. +// ------------------------------------------------------------------------------------------ // +struct GPU_CMD_BUFFER final +{ + SizeT X, Y, Z; + VoidPtr FrameData; + SizeT FrameDataSz; + SizeT BackBufferLayer; + Bool IsGPGPUData; + Bool BackBufferFirst; + + Bool isGPGPUData() + { + return !this->BackBufferFirst && this->IsGPGPUData; + } + + Bool isValid() + { + return this->FrameData && this->FrameDataSz > 0; + } +}; + +typedef VoidPtr GPUObject; + +IMPORT_C GPUObject GPUNewFromDeviceName(_Input const Char* device_name); + +IMPORT_C SInt32 GPUDisposeDevice(GPUObject gpu_handle, Bool cancel_all, Bool flush_all); + +IMPORT_C SInt32 GPUSendCmdBufferListWithCnt(GPU_CMD_BUFFER** cmd_list, SizeT cmd_list_cnt); + +#endif // ifndef SCIKIT_GPU_H diff --git a/dev/LibSCI/LPC.h b/dev/LibSCI/LPC.h new file mode 100644 index 00000000..717c32ec --- /dev/null +++ b/dev/LibSCI/LPC.h @@ -0,0 +1,54 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +/// @file LPC.h +/// @brief Local Process 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 kErrorUnimplemented = 0; + +/// @brief The last error reported by the system to the process. +IMPORT_C ErrObject kLastError; diff --git a/dev/LibSCI/Macros.h b/dev/LibSCI/Macros.h new file mode 100644 index 00000000..5443252c --- /dev/null +++ b/dev/LibSCI/Macros.h @@ -0,0 +1,56 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: Macros.h +Purpose: LibSCI Macros header. + +------------------------------------------- */ + +#pragma once + +/***********************************************************************************/ +/// @file LibSCI/Macros.h +/// @brief Macros and core types. +/***********************************************************************************/ + +#include + +#define ATTRIBUTE(X) __attribute__((X)) +#define IMPORT_CXX extern "C++" +#define IMPORT_C extern "C" + +#define DEPRECATED ATTRIBUTE(deprecated) + +typedef bool Bool; +typedef void Void; + +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; + +typedef VoidPtr SCIObject; + +typedef SCIObject IOObject; +typedef IOObject FSObject; +typedef SCIObject DLLObject; +typedef SCIObject ThreadObject; +typedef SCIObject SocketObject; + +#ifdef SYSCALL_DECL +#undef SYSCALL_DECL +#endif // SYSCALL_DECL + +#define SYSCALL_DECL(NAME, ...) IMPORT_C VoidPtr NAME(__VA_ARGS__); diff --git a/dev/LibSCI/SCI.h b/dev/LibSCI/SCI.h new file mode 100644 index 00000000..2eb6ed80 --- /dev/null +++ b/dev/LibSCI/SCI.h @@ -0,0 +1,264 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: LibSCI.h +Purpose: System Calls. + +------------------------------------------- */ + +#ifndef SCIKIT_FOUNDATION_H +#define SCIKIT_FOUNDATION_H + +#include + +// ------------------------------------------------------------------------------------------ // +/// @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 void. +/// @return > 0 error ocurred or already present, = 0 success. +IMPORT_C UInt32 RtlSpawnIB(Void); + +/// @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 Fill memory region. +IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value); + +// ------------------------------------------------------------------------ +// Error API. +// ------------------------------------------------------------------------ + +IMPORT_C SInt32 ErrGetLastError(Void); + +// ------------------------------------------------------------------------ +// 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); + +// ------------------------------------------------------------------------ +// 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. +// ------------------------------------------------------------------------------------------ // + +IMPORT_C Void PwrShutdownMachine(const Char* _Input msg, _Input SInt32 code); + +IMPORT_C Void PwrRebootMachine(const Char* _Input msg, _Input SInt32 code); + +IMPORT_C Void PwrSleepMachine(const Char* _Input msg, _Input SInt32 code); + +IMPORT_C SInt32 PwrGetCode(_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); + +#endif // ifndef SCIKIT_FOUNDATION_H diff --git a/dev/LibSCI/SysCalls.h b/dev/LibSCI/SysCalls.h new file mode 100644 index 00000000..10556000 --- /dev/null +++ b/dev/LibSCI/SysCalls.h @@ -0,0 +1,20 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: Macros.h +Purpose: LibSCI Macros header. + +------------------------------------------- */ + +#pragma once + +#include + +/// @brief In this file we define filesystem calls. + +SYSCALL_DECL(FCloseFile, const SCIObject handle); +SYSCALL_DECL(FOpenFile, const Char* name, const Char* rest); +SYSCALL_DECL(FSeekFile, const SCIObject handle, const SizeT pos); +SYSCALL_DECL(FReadFile, const SCIObject handle, const Char* out_buf, const SizeT out_buf_size); +SYSCALL_DECL(FWriteFile, const SCIObject handle, const Char* out_buf, const SizeT out_buf_size); diff --git a/dev/LibSCI/doc/SCIKit.drawio b/dev/LibSCI/doc/SCIKit.drawio new file mode 100644 index 00000000..132eacc1 --- /dev/null +++ b/dev/LibSCI/doc/SCIKit.drawio @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dev/LibSCI/sci.json b/dev/LibSCI/sci.json new file mode 100644 index 00000000..34f4fb0a --- /dev/null +++ b/dev/LibSCI/sci.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": "LibSCI.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/LibSCI/src/GPU.cc b/dev/LibSCI/src/GPU.cc new file mode 100644 index 00000000..46e090e6 --- /dev/null +++ b/dev/LibSCI/src/GPU.cc @@ -0,0 +1,10 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: GPU.cc +Purpose: GPU Interface. + +------------------------------------------- */ + +#include diff --git a/dev/LibSCI/src/LPC.cc b/dev/LibSCI/src/LPC.cc new file mode 100644 index 00000000..47f47ce6 --- /dev/null +++ b/dev/LibSCI/src/LPC.cc @@ -0,0 +1,10 @@ +/* ------------------------------------------- + +Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +File: LPC.cc +Purpose: Local Procedure Codes. + +------------------------------------------- */ + +#include diff --git a/dev/LibSCI/src/LibSCI+IO.asm b/dev/LibSCI/src/LibSCI+IO.asm new file mode 100644 index 00000000..82ac82b7 --- /dev/null +++ b/dev/LibSCI/src/LibSCI+IO.asm @@ -0,0 +1,50 @@ +;; /* +;; * ======================================================== +;; * +;; * LibSCI +;; * Copyright (C) 2024, Theater Quality Inc, all rights reserved., 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/LibSCI/src/Makefile b/dev/LibSCI/src/Makefile new file mode 100644 index 00000000..d76fa5ac --- /dev/null +++ b/dev/LibSCI/src/Makefile @@ -0,0 +1,16 @@ +################################################## +# (c) Theater Quality Inc, all rights reserved. +# This is the bootloader makefile. +################################################## + +ASM=nasm +FLAGS=-f win64 + +.PHONY: error +error: + @echo "==> Invalid rule." + @echo "==> Use sci_asm_io_ instead." + +.PHONY: sci_asm_io_x64 +sci_asm_io_x64: + $(ASM) $(FLAGS) LibSCI+IO.asm -o LibSCI+IO.o diff --git a/dev/LibSCI/src/SCI.cc b/dev/LibSCI/src/SCI.cc new file mode 100644 index 00000000..ec6cb937 --- /dev/null +++ b/dev/LibSCI/src/SCI.cc @@ -0,0 +1,45 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#include + +/// @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; +} -- cgit v1.2.3