aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/context_switching/syscall
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/context_switching/syscall')
-rw-r--r--arch/x86_64/src/context_switching/syscall/main.cpp17
-rw-r--r--arch/x86_64/src/context_switching/syscall/syscall_handler.cpp17
2 files changed, 30 insertions, 4 deletions
diff --git a/arch/x86_64/src/context_switching/syscall/main.cpp b/arch/x86_64/src/context_switching/syscall/main.cpp
index 93fc613..996d7fb 100644
--- a/arch/x86_64/src/context_switching/syscall/main.cpp
+++ b/arch/x86_64/src/context_switching/syscall/main.cpp
@@ -2,7 +2,7 @@
namespace teachos::arch::context_switching::syscall
{
- auto syscall(type syscall_number, arguments args) -> error
+ auto syscall(type syscall_number, arguments args) -> response
{
asm volatile("mov %[input], %%rax"
: /* no output from call */
@@ -18,9 +18,18 @@ namespace teachos::arch::context_switching::syscall
asm volatile("syscall");
- error error{};
- asm volatile("mov %%rax, %[output]" : [output] "=m"(error));
- return error;
+ error error_code{};
+ asm volatile("mov %%rax, %[output]" : [output] "=m"(error_code));
+
+ arguments values{};
+ asm volatile("mov %%rdi, %[output]" : [output] "=m"(values.arg_0));
+ asm volatile("mov %%rsi, %[output]" : [output] "=m"(values.arg_1));
+ asm volatile("mov %%rdx, %[output]" : [output] "=m"(values.arg_2));
+ asm volatile("mov %%r10, %[output]" : [output] "=m"(values.arg_3));
+ asm volatile("mov %%r8, %[output]" : [output] "=m"(values.arg_4));
+ asm volatile("mov %%r9, %[output]" : [output] "=m"(values.arg_5));
+
+ return {error_code, values};
}
} // namespace teachos::arch::context_switching::syscall
diff --git a/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp b/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp
index da9eb1b..b88f273 100644
--- a/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp
+++ b/arch/x86_64/src/context_switching/syscall/syscall_handler.cpp
@@ -16,6 +16,20 @@ namespace teachos::arch::context_switching::syscall
video::vga::text::newline();
return error::OK;
}
+
+ auto expand_user_heap() -> error
+ {
+ arguments args{};
+ asm volatile("mov %[input], %%rdi"
+ : /* no output from call */
+ : [input] "m"(args.arg_0)
+ : "memory");
+ asm volatile("mov %[input], %%rsi"
+ : /* no output from call */
+ : [input] "m"(args.arg_1)
+ : "memory");
+ return error::OUT_OF_MEMORY;
+ }
} // namespace
auto syscall_handler() -> void
@@ -46,6 +60,9 @@ namespace teachos::arch::context_switching::syscall
case type::WRITE:
result = write_to_vga_buffer(arg_0);
break;
+ case type::EXPAND_HEAP:
+ result = expand_user_heap();
+ break;
default:
teachos::arch::exception_handling::panic("[Syscall Handler] Invalid syscall number");
break;