summaryrefslogtreecommitdiffhomepage
path: root/dev/user
diff options
context:
space:
mode:
Diffstat (limited to 'dev/user')
-rw-r--r--dev/user/Macros.h34
-rw-r--r--dev/user/SystemCalls.h17
-rw-r--r--dev/user/src/GNUmakefile4
-rw-r--r--dev/user/src/SystemCalls+IO.asm (renamed from dev/user/src/SystemCall+IO.asm)2
-rw-r--r--dev/user/src/SystemCalls.cc50
-rw-r--r--dev/user/user.json1
6 files changed, 95 insertions, 13 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<SizeT>(!(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/SystemCalls.h b/dev/user/SystemCalls.h
index 97a49469..df91bc1e 100644
--- a/dev/user/SystemCalls.h
+++ b/dev/user/SystemCalls.h
@@ -322,14 +322,17 @@ 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 FsCopy(const Char* path, const Char* dst);
-IMPORT_C BOOL FsExists(const char* path);
+IMPORT_C BOOL FsMove(const Char* path, const Char* dst);
-IMPORT_C BOOL FsCreateDir(const char* path);
-IMPORT_C BOOL FsCreateFile(const char* path);
-IMPORT_C BOOL FsCreateAlias(const char* path, const char* from);
+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.
@@ -337,6 +340,6 @@ IMPORT_C BOOL FsCreateAlias(const char* path, const char* from);
IMPORT_C Char* StrFmt(const Char* fmt, ...);
-IMPORT_C UInt64 MathToNumber(const Char* in, const Char** endp, const SInt16 base);
+IMPORT_C UInt64 StrMathToNumber(const Char* in, const Char** endp, const SInt16 base);
#endif // ifndef SCI_SCI_H
diff --git a/dev/user/src/GNUmakefile b/dev/user/src/GNUmakefile
index c0ddd5b4..09993d16 100644
--- a/dev/user/src/GNUmakefile
+++ b/dev/user/src/GNUmakefile
@@ -1,6 +1,6 @@
##################################################
# (c) Amlal El Mahrouss, all rights reserved.
-# This is the bootloader makefile.
+# This file is for user.sys's syscall stubs.
##################################################
ASM=nasm
@@ -13,4 +13,4 @@ error:
.PHONY: sci_asm_io_x64
sci_asm_io_x64:
- $(ASM) $(FLAGS) SystemCall+IO.asm -o SystemCall+IO.o
+ $(ASM) $(FLAGS) SystemCalls+IO.asm -o SystemCalls+IO.asm.o
diff --git a/dev/user/src/SystemCall+IO.asm b/dev/user/src/SystemCalls+IO.asm
index 8f123ec8..58ea79e7 100644
--- a/dev/user/src/SystemCall+IO.asm
+++ b/dev/user/src/SystemCalls+IO.asm
@@ -9,6 +9,8 @@
[bits 64]
+;; @brief Syscall dispatch, also taking note the Microsoft's calling convention to translate it to NeKernel's ABI.
+
section .text
global sci_syscall_arg_1
diff --git a/dev/user/src/SystemCalls.cc b/dev/user/src/SystemCalls.cc
index 19f1fe42..7ad0fe6f 100644
--- a/dev/user/src/SystemCalls.cc
+++ b/dev/user/src/SystemCalls.cc
@@ -6,9 +6,14 @@
#include <user/SystemCalls.h>
-/// @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,7 +32,22 @@ IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input Si
return dest;
}
-/// @brief Fill memory region with **value**.
+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)
{
if (!len ||
@@ -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<VoidPtr>(const_cast<Char*>(path)),
+ reinterpret_cast<VoidPtr>(const_cast<Char*>(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<VoidPtr>(desc),
+ reinterpret_cast<VoidPtr>(&off));
+
+ MUST_PASS((*ret) != ~0UL);
+ return *ret;
+}
+
+IMPORT_C UInt64 IoTellFile(_Input Ref desc)
+{
+ auto ret = (UInt64*)sci_syscall_arg_2(4, reinterpret_cast<VoidPtr>(desc));
+ return *ret;
+}
diff --git a/dev/user/user.json b/dev/user/user.json
index 481280f8..9581d4d4 100644
--- a/dev/user/user.json
+++ b/dev/user/user.json
@@ -5,7 +5,6 @@
"sources_path": ["src/*.cc", "src/*.o"],
"output_name": "user.sys",
"compiler_flags": [
- "-fPIC",
"-ffreestanding",
"-shared",
"-fno-rtti",