From 0b0f61ae48bbd8827d6088feab6cf58e7837bf92 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 15 Apr 2025 17:04:45 +0200 Subject: dev, user: drafting a system call map. Signed-off-by: Amlal El Mahrouss --- dev/user/Macros.h | 34 ++++++++++++++- dev/user/src/SystemCalls.cc | 48 +++++++++++++++++++++- .../frameworks/DiskImage.fwrk/headers/DiskImage.h | 1 - public/tools/diutil/diutil.json | 4 +- 4 files changed, 82 insertions(+), 5 deletions(-) diff --git a/dev/user/Macros.h b/dev/user/Macros.h index 98beeb0d..556833ea 100644 --- a/dev/user/Macros.h +++ b/dev/user/Macros.h @@ -90,4 +90,36 @@ IMPORT_C void _rtl_assert(Bool expr, const Char* origin); #define ARRAY_SIZE(X) \ (((sizeof(X) / sizeof(*(X))) / \ (static_cast(!(sizeof(X) % sizeof(*(X))))))) -#endif \ No newline at end of file +#endif + +#ifndef KIB +#define KIB(X) (UInt64)((X) / 1024) +#endif + +#ifndef kib_cast +#define kib_cast(X) (UInt64)((X)*1024) +#endif + +#ifndef MIB +#define MIB(X) (UInt64)((UInt64)KIB(X) / 1024) +#endif + +#ifndef mib_cast +#define mib_cast(X) (UInt64)((UInt64)kib_cast(X) * 1024) +#endif + +#ifndef GIB +#define GIB(X) (UInt64)((UInt64)MIB(X) / 1024) +#endif + +#ifndef gib_cast +#define gib_cast(X) (UInt64)((UInt64)mib_cast(X) * 1024) +#endif + +#ifndef TIB +#define TIB(X) (UInt64)((UInt64)GIB(X) / 1024) +#endif + +#ifndef tib_cast +#define tib_cast(X) ((UInt64)gib_cast(X) * 1024) +#endif diff --git a/dev/user/src/SystemCalls.cc b/dev/user/src/SystemCalls.cc index 2dd27dc0..7ad0fe6f 100644 --- a/dev/user/src/SystemCalls.cc +++ b/dev/user/src/SystemCalls.cc @@ -6,9 +6,14 @@ #include -/// @file libsci.cc +/// @file SystemCalls.cc /// @brief Source file for the memory functions of the libsci. +IMPORT_C VoidPtr sci_syscall_arg_1(SizeT id); +IMPORT_C VoidPtr sci_syscall_arg_2(SizeT id, VoidPtr arg1); +IMPORT_C VoidPtr sci_syscall_arg_3(SizeT id, VoidPtr arg1, VoidPtr arg3); +IMPORT_C VoidPtr sci_syscall_arg_4(SizeT id, VoidPtr arg1, VoidPtr arg3, VoidPtr arg4); + /// @brief Copy memory region. IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len) { @@ -27,6 +32,21 @@ IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input Si return dest; } +IMPORT_C SInt64 MmStrLen(const Char* in) +{ + if (!in) + return 0; + + SizeT len{0}; + + do + { + ++len; + } while (in[len] != '\0'); + + return len; +} + /// @brief Fill memory region **dest** with **value**. IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value) { @@ -43,3 +63,29 @@ IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt return dest; } + +IMPORT_C Ref IoOpenFile(_Input const Char* path, _Input const Char* drv_letter) +{ + return sci_syscall_arg_3(1, reinterpret_cast(const_cast(path)), + reinterpret_cast(const_cast(drv_letter))); +} + +IMPORT_C Void IoCloseFile(_Input Ref desc) +{ + sci_syscall_arg_2(2, desc); +} + +IMPORT_C UInt64 IoSeekFile(_Input Ref desc, _Input UInt64 off) +{ + auto ret = (UInt64*)sci_syscall_arg_3(3, reinterpret_cast(desc), + reinterpret_cast(&off)); + + MUST_PASS((*ret) != ~0UL); + return *ret; +} + +IMPORT_C UInt64 IoTellFile(_Input Ref desc) +{ + auto ret = (UInt64*)sci_syscall_arg_2(4, reinterpret_cast(desc)); + return *ret; +} diff --git a/public/frameworks/DiskImage.fwrk/headers/DiskImage.h b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h index 1dc23c0a..c0566485 100644 --- a/public/frameworks/DiskImage.fwrk/headers/DiskImage.h +++ b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h @@ -10,7 +10,6 @@ #pragma once #include -#include #define kDISectorSz (512) #define kDIMinDiskSz mib_cast(1) diff --git a/public/tools/diutil/diutil.json b/public/tools/diutil/diutil.json index 0805e69f..19b845c5 100644 --- a/public/tools/diutil/diutil.json +++ b/public/tools/diutil/diutil.json @@ -1,8 +1,8 @@ { "compiler_path": "g++", "compiler_std": "c++20", - "headers_path": ["./", "../../../dev/kernel", "../../../dev/", "./"], - "sources_path": ["src/CommandLine.cc"], + "headers_path": ["./", "../../../dev/kernel", "../../../public/frameworks/", "../../../dev/", "./"], + "sources_path": ["src/CommandLine.cc", "../../../public/frameworks/DiskImage.fwrk/src/*.cc", "../../../dev/user/src/*.cc"], "output_name": "./dist/diutil", "cpp_macros": [ "kDUTILVersion=0x0100", -- cgit v1.2.3