53 lines
1.4 KiB
C++
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;
|
|
}
|
|
}
|