6 #define PORT_COM1 0x3f8
7 #define PORT_COM2 0x2F8
8 #define PORT_COM3 0x3E8
9 #define PORT_COM4 0x2E8
10 #define PORT_COM5 0x5F8
11 #define PORT_COM6 0x4F8
12 #define PORT_COM7 0x5E8
13 #define PORT_COM8 0x4E8
15 #define LOG_WITH_TIME 0
17 extern void (*default_qemu_printf)(
const char *text, ...)
__attribute__((format(printf, 1, 2)));
20 #if LOG_WITH_TIME == 0
21 #define qemu_log(M, ...) default_qemu_printf("[LOG] (%s:%s:%d) " M "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
22 #define qemu_note(M, ...) default_qemu_printf("[\033[36;1mNOTE\033[33;0m] (%s:%s:%d) \033[36;1m" M "\033[0m\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
23 #define qemu_warn(M, ...) default_qemu_printf("[\033[33;1mWARN\033[33;0m] (%s:%s:%d) \033[33;1m" M "\033[0m\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
24 #define qemu_ok(M, ...) default_qemu_printf("[\033[32;1mOK\033[33;0m] (%s:%s:%d) \033[32;1m" M "\033[0m\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
25 #define qemu_err(M, ...) default_qemu_printf("[\033[31;1mERROR\033[33;0m] (%s:%s:%d) \033[31;1m" M "\033[0m\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
27 #define qemu_log(M, ...) qemu_printf("[LOG] [%d] (%s:%s:%d) " M "\033[0m\n", timestamp(), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
28 #define qemu_note(M, ...) qemu_printf("[\033[36;1mWARN\033[33;0m] [%d] (%s:%s:%d) \033[36;1m" M "\033[0m\n", timestamp(), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
29 #define qemu_warn(M, ...) qemu_printf("[\033[33;1mWARN\033[33;0m] [%d] (%s:%s:%d) \033[33;1m" M "\033[0m\n", timestamp(), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
30 #define qemu_ok(M, ...) qemu_printf("[\033[32;1mOK\033[33;0m] [%d] (%s:%s:%d) \033[32;1m" M "\033[0m\n", timestamp(), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
31 #define qemu_err(M, ...) qemu_printf("[\033[31;1mERR\033[33;0m] [%d] (%s:%s:%d) \033[31;1m" M "\033[0m\n", timestamp(), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
34 #define qemu_note(M, ...)
35 #define qemu_log(M, ...)
36 #define qemu_warn(M, ...)
37 #define qemu_ok(M, ...)
38 #define qemu_err(M, ...)
41 #define assert(condition, format, ...) do { if (condition) { \
42 qemu_printf("======================================\n"); \
43 qemu_printf("[%s:%s:%d] ASSERT FAILED: " format "\n", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
44 qemu_printf("======================================\n"); \
45 bsod_screen((registers_t){}, "ASSERT_FAIL", "See additional information on COM1 port. (Or Qemu.log if you're using QEMU)", 0xFFFF); \
49 #define is_signal_received(port) (inb(port + 5) & 1)
57 SAYORI_INLINE
void outb(uint16_t port, uint8_t val) {
58 __asm__
volatile(
"outb %b0, %w1" : :
"a"(val),
"Nd"(port));
67 SAYORI_INLINE uint8_t inb(uint16_t port) {
69 __asm__
volatile (
"inb %1, %0"
82 SAYORI_INLINE
void outl(uint16_t port, uint32_t val) {
83 __asm__
volatile (
"outl %0, %1" : :
"a"(val),
"Nd"(port) );
92 SAYORI_INLINE uint32_t inl(uint16_t port) {
94 __asm__
volatile(
"inl %1, %0" :
"=a"(ret) :
"Nd"(port) );
104 SAYORI_INLINE uint16_t inw(uint16_t port) {
106 __asm__
volatile (
"inw %1, %0" :
"=a" (ret) :
"Nd" (port));
116 SAYORI_INLINE
void outw(uint16_t port, uint16_t data) {
117 __asm__
volatile (
"outw %1, %0" ::
"Nd" (port),
"a" (data));
120 void insw(uint16_t __port,
void *__buf,
unsigned long __n);
121 void outsw(uint16_t __port,
const void *__buf,
unsigned long __n);
122 void insl(uint16_t reg, uint32_t *buffer, int32_t quads);
123 void outsl(uint16_t reg, uint32_t *buffer, int32_t quads);
125 void outl(uint16_t port, uint32_t val);
126 uint32_t inl(uint16_t port);
128 int32_t com1_is_transmit_empty();
130 void com1_write_char(
char a);
134 uint8_t serial_readchar(uint16_t port);
137 void new_qemu_printf(
const char *format, ...);
Основные определения ядра
struct registers __attribute__((packed))
Структура данных пакета от мыши
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)