77 lines
2.6 KiB
C
77 lines
2.6 KiB
C
/*
|
|
Copyright 2025 Kamil Kowalczyk
|
|
|
|
Redistribution and use in source and binary forms, with or
|
|
without modification, are permitted provided that the following
|
|
conditions are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
3. Neither the name of the copyright holder nor the names of its
|
|
contributors may be used to endorse or promote products derived from
|
|
this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <libk/types.h>
|
|
#include <libk/string.h>
|
|
#include <libk/stdarg.h>
|
|
#include <libk/printf.h>
|
|
#include <sys/serialdbg.h>
|
|
#include <sys/ioport.h>
|
|
#include <config.h>
|
|
|
|
static uint8_t serialdbg_tx_empty(void) {
|
|
return ioport_in8(CFG_I386_PC_DEBUG_SERIAL_PORT + 5) & 0x20;
|
|
}
|
|
|
|
static void serialdbg_writechr(char x) {
|
|
while (!serialdbg_tx_empty());
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT, (uint8_t)x);
|
|
}
|
|
|
|
void serialdbg_printf(const char *fmt, ...) {
|
|
char buffer[CFG_I386_PC_DEBUG_SERIAL_BUFFER_SIZE];
|
|
memset(buffer, 0, sizeof(buffer));
|
|
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
vsnprintf(buffer, sizeof(buffer), fmt, ap);
|
|
va_end(ap);
|
|
|
|
buffer[sizeof(buffer) - 1] = '\0';
|
|
|
|
const char *p = buffer;
|
|
while (*p) {
|
|
serialdbg_writechr(*p);
|
|
p++;
|
|
}
|
|
}
|
|
|
|
void serialdbg_init(void) {
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 1, 0x00);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 3, 0x80);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 0, 0x03);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 1, 0x00);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 3, 0x03);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 2, 0xC7);
|
|
ioport_out8(CFG_I386_PC_DEBUG_SERIAL_PORT + 4, 0x0B);
|
|
}
|
|
|