53 lines
1.4 KiB
C++

#include "os/syscall.hpp"
#include <bit>
#include <cstddef>
#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<std::uint64_t>(&__handleSyscall));
cpu::writeMSR(cpu::MSR::STAR, static_cast<std::uint64_t>(SEGIDX_KERNEL_CODE) << 32 | static_cast<std::uint64_t>(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<unsigned>(param0), std::bit_cast<char*>(param1), param2);
break;
case Syscall::FILE_WRITE:
sysFileWrite(static_cast<unsigned>(param0), std::bit_cast<const char*>(param1), param2);
break;
case Syscall::EXIT:
break;
}
}