#include "os/syscall.hpp" #include #include #include "os/cpu.hpp" #include "os/segments.hpp" #include "os/serial.hpp" #include "os/tty.hpp" extern "C" void __handleSyscall(); namespace baos { void setupSyscall() noexcept { // enable syscall/sysexit cpu::setMSRBits(cpu::MSR::IA32_EFER, cpu::IA32_EFER_SYSTEM_CALL_EXTENSIONS_BIT); cpu::writeMSR(cpu::MSR::LSTAR, std::bit_cast(&__handleSyscall)); cpu::writeMSR(cpu::MSR::STAR, static_cast(SEGIDX_KERNEL_CODE) << 32 | static_cast(SEGIDX_KERNEL_DATA) << 48); } void sysFileRead(unsigned fileDescriptor, char* buffer, std::size_t count) noexcept { // TODO } void sysFileWrite(unsigned fileDescriptor, const char* buffer, std::size_t count) noexcept { for (std::size_t index = 0; index < count; ++index) { serialWrite(PORT_COM1, buffer[index]); } tty::write(buffer, count); } } extern "C" void __baosSyscall(baos::Syscall cmd, std::uint64_t param0, std::uint64_t param1, std::uint64_t param2) noexcept { using namespace baos; switch (cmd) { case Syscall::FILE_READ: sysFileRead(static_cast(param0), std::bit_cast(param1), param2); break; case Syscall::FILE_WRITE: sysFileWrite(static_cast(param0), std::bit_cast(param1), param2); break; case Syscall::EXIT: break; } }