serenity/Kernel/Arch/x86_64/DebugOutput.cpp
kleines Filmröllchen 398d271a46 Kernel: Share Processor class (and others) across architectures
About half of the Processor code is common across architectures, so
let's share it with a templated base class. Also, other code that can be
shared in some ways, like FPUState and TrapFrame functions, is adjusted
here. Functions which cannot be shared trivially (without internal
refactoring) are left alone for now.
2023-10-03 16:08:29 -06:00

50 lines
1.1 KiB
C++

/*
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <Kernel/Arch/DebugOutput.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/x86_64/BochsDebugOutput.h>
#include <Kernel/Arch/x86_64/IO.h>
namespace Kernel {
static constexpr u16 serial_com1_io_port = 0x3F8;
void bochs_debug_output(char ch)
{
IO::out8(IO::BOCHS_DEBUG_PORT, ch);
}
void debug_output(char ch)
{
static bool serial_ready = false;
static bool was_cr = false;
if (!serial_ready) {
IO::out8(serial_com1_io_port + 1, 0x00);
IO::out8(serial_com1_io_port + 3, 0x80);
IO::out8(serial_com1_io_port + 0, 0x02);
IO::out8(serial_com1_io_port + 1, 0x00);
IO::out8(serial_com1_io_port + 3, 0x03);
IO::out8(serial_com1_io_port + 2, 0xC7);
IO::out8(serial_com1_io_port + 4, 0x0B);
serial_ready = true;
}
while ((IO::in8(serial_com1_io_port + 5) & 0x20) == 0)
Processor::wait_check();
if (ch == '\n' && !was_cr)
IO::out8(serial_com1_io_port, '\r');
IO::out8(serial_com1_io_port, ch);
was_cr = ch == '\r';
}
}