12 #include <lib/sprintf.h>
13 #include "io/serial_port.h"
14 #include "sys/scheduler.h"
17 void (*default_qemu_printf)(
const char *text, ...) =
qemu_printf;
19 void switch_qemu_logging() {
20 default_qemu_printf = new_qemu_printf;
30 void insl(uint16_t port, uint32_t *buffer, int32_t times) {
31 for (uint32_t index = 0; index < times; index++) {
32 buffer[index] = inl(port);
44 void outsl(uint16_t port, uint32_t *buffer, int32_t times) {
45 for (int32_t index = 0; index < times; index++) {
46 outl(port, buffer[index]);
50 void insw(uint16_t __port,
void *__buf,
unsigned long __n) {
51 __asm__
volatile(
"cld; rep; insw"
52 :
"+D"(__buf),
"+c"(__n)
56 void outsw(uint16_t __port,
const void *__buf,
unsigned long __n) {
57 __asm__
volatile(
"cld; rep; outsw"
58 :
"+S"(__buf),
"+c"(__n)
68 return inb(port + 5) & 0x20;
72 uint8_t serial_readchar(uint16_t port) {
74 while (is_signal_received(port) == 0){
83 int8_t serial_readchar_timeout(uint16_t port,
size_t timeout,
bool Alert) {
85 while (is_signal_received(port) == 0){
89 if (Alert) qemu_warn(
"TIMEOUT: %d",to);
110 return ((c >=
' ' && c <=
'~') ? 1 : 0);
151 va_start(args, text);
153 if (__com_getInit(1)) {
154 scheduler_mode(
false);
156 __com_pre_formatString(PORT_COM1, text, args);
158 scheduler_mode(
true);
164 void new_qemu_printf(
const char *format, ...) {
165 if (!__com_getInit(1))
169 va_start(args, format);
173 vasprintf(&container, format, args);
177 scheduler_mode(
false);
178 __com_writeString(PORT_COM1, container);
179 scheduler_mode(
true);
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации
int32_t is_transmit_empty(uint16_t port)
Проверка занятости порта
void outsl(uint16_t port, uint32_t *buffer, int32_t times)
Запись длинного слова через порт
void insl(uint16_t port, uint32_t *buffer, int32_t times)
Чтение длинного слова через порт
int is_com_port(int port)
Проверка на тип порта
void io_wait(void)
Небольшая задержка используя порт 128(0x80)
int isprint(char c)
Проверка, читаем ли символ