diff --git a/kernel-src/arch/x86-64/e9.c b/kernel-src/arch/x86-64/e9.c index 06b69548..7d465e4e 100644 --- a/kernel-src/arch/x86-64/e9.c +++ b/kernel-src/arch/x86-64/e9.c @@ -1,4 +1,6 @@ #include +#include +#include void arch_e9_putc(char c) { #ifdef X86_64_ENABLE_E9 @@ -13,3 +15,23 @@ void arch_e9_puts(char *c) { } #endif } + +static int devwrite(int minor, void *bufferp, size_t count, uintmax_t offset, int flags, size_t *wcount) { + uint8_t *buffer = bufferp; + + for (uintmax_t i = 0; i < count; ++i) + outb(0xe9, buffer[i]); + + *wcount = count; + return 0; +} + +static devops_t devops = { + .write = devwrite +}; + +void arch_e9_initdev() { +#ifdef X86_64_ENABLE_E9 + __assert(devfs_register(&devops, "e9", V_TYPE_CHDEV, DEV_MAJOR_E9, 0, 0644) == 0); +#endif +} diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index b8f6d9d0..234c99d2 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -63,6 +63,7 @@ void kernel_entry() { block_init(); pseudodevices_init(); + arch_e9_initdev(); pci_init(); keyboard_init(); arch_ps2_init(); diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index ff82f2c3..88c36e0d 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -12,6 +12,7 @@ #define DEV_MAJOR_FB 5 #define DEV_MAJOR_KEYBOARD 6 #define DEV_MAJOR_BLOCK 7 +#define DEV_MAJOR_E9 8 typedef struct { int (*open)(int minor, int flags); diff --git a/kernel-src/include/x86-64/arch/e9.h b/kernel-src/include/x86-64/arch/e9.h index d67bc789..0ad418eb 100644 --- a/kernel-src/include/x86-64/arch/e9.h +++ b/kernel-src/include/x86-64/arch/e9.h @@ -3,5 +3,6 @@ void arch_e9_putc(char); void arch_e9_puts(char *); +void arch_e9_initdev(); #endif