diff --git a/src/drivers/bus.c b/src/drivers/bus.c index 6a090b8..d29be3e 100644 --- a/src/drivers/bus.c +++ b/src/drivers/bus.c @@ -9,4 +9,13 @@ #if defined(__amd64__) || defined(__i386__) # include "bus/ioport.c" + +/* bus_init */ +ukBus * bus_init(void) +{ + static ukBus * bus; + + bus = _ioport_bus_init(); + return bus; +} #endif diff --git a/src/drivers/bus.h b/src/drivers/bus.h index 5b2b0f8..50dcbfb 100644 --- a/src/drivers/bus.h +++ b/src/drivers/bus.h @@ -17,6 +17,8 @@ typedef struct _ukBusData ukBusData; struct _ukBus { + ukBus * (*init)(void); + int (*write8)(ukBus * bus, ukBusAddress * address, uint8_t value); int (*write16)(ukBus * bus, ukBusAddress * address, uint16_t value); int (*write32)(ukBus * bus, ukBusAddress * address, uint32_t value); diff --git a/src/drivers/bus/ioport.S b/src/drivers/bus/ioport.S index 4908960..d65735e 100644 --- a/src/drivers/bus/ioport.S +++ b/src/drivers/bus/ioport.S @@ -7,10 +7,10 @@ #if defined(__amd64__) || defined(__i386__) /* functions */ .section .text -/* ioport_write8 */ -.global ioport_write8 -.type ioport_write8, @function -ioport_write8: +/* ioport_bus_write8 */ +.global ioport_bus_write8 +.type ioport_bus_write8, @function +ioport_bus_write8: mov 0x8(%esp), %dx /* address */ mov 0xc(%esp), %al /* value */ out %al, %dx diff --git a/src/drivers/bus/ioport.c b/src/drivers/bus/ioport.c index 979aaa2..56cecbc 100644 --- a/src/drivers/bus/ioport.c +++ b/src/drivers/bus/ioport.c @@ -9,35 +9,44 @@ /* private */ +/* types */ +typedef struct _ukBus IOPortBus; + + /* prototypes */ -extern int ioport_write8(ukBus * bus, ukBusAddress * address, uint8_t value); -static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value); -static int _ioport_write32(ukBus * bus, ukBusAddress * address, uint32_t value); +static IOPortBus * _ioport_bus_init(void); +extern int ioport_bus_write8(IOPortBus * bus, ukBusAddress * address, + uint8_t value); +static int _ioport_bus_write16(IOPortBus * bus, ukBusAddress * address, + uint16_t value); +static int _ioport_bus_write32(IOPortBus * bus, ukBusAddress * address, + uint32_t value); /* variables */ -static ukBus _ioport_bus = +static IOPortBus _ioport_bus = { - ioport_write8, - _ioport_write16, - _ioport_write32, + _ioport_bus_init, + ioport_bus_write8, + _ioport_bus_write16, + _ioport_bus_write32, NULL }; -/* public */ +/* private */ /* functions */ -/* ukbus_init */ -ukBus * bus_init(void) +/* bus */ +/* ioport_bus_init */ +static IOPortBus * _ioport_bus_init(void) { return &_ioport_bus; } -/* private */ -/* useful */ -/* ioport_write16 */ -static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value) +/* ioport_bus_write16 */ +static int _ioport_bus_write16(IOPortBus * bus, ukBusAddress * address, + uint16_t value) { (void) bus; (void) address; @@ -48,7 +57,8 @@ static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value) /* ioport_write32 */ -static int _ioport_write32(ukBus * bus, ukBusAddress * address, uint32_t value) +static int _ioport_bus_write32(IOPortBus * bus, ukBusAddress * address, + uint32_t value) { (void) bus; (void) address; diff --git a/src/drivers/bus/stdio.c b/src/drivers/bus/stdio.c new file mode 100644 index 0000000..9f74970 --- /dev/null +++ b/src/drivers/bus/stdio.c @@ -0,0 +1,93 @@ +/* $Id$ */ +/* Copyright (c) 2018 Pierre Pronchery */ +/* This file is part of DeforaOS uKernel */ + + + +#include +#include + + +/* private */ +/* types */ +typedef struct _ukBus STDIOBus; + +typedef struct _ukBusData +{ + int fd; +} STDIOBusData; + + +/* prototypes */ +static STDIOBus * _stdio_bus_init(void); + +/* FIXME pass fd as the address */ +static int _stdio_bus_write8(STDIOBus * bus, ukBusAddress * address, + uint8_t value); +static int _stdio_bus_write16(STDIOBus * bus, ukBusAddress * address, + uint16_t value); +static int _stdio_bus_write32(STDIOBus * bus, ukBusAddress * address, + uint32_t value); + +/* XXX make this more elegant */ +extern int write(int fd, char const * buf, size_t len); + + +/* variables */ +static STDIOBusData _stdio_bus_data = +{ + 1 /* standard output */ +}; + + +static STDIOBus _stdio_bus = +{ + _stdio_bus_init, + _stdio_bus_write8, + _stdio_bus_write16, + _stdio_bus_write32, + &_stdio_bus_data +}; + + +/* private */ +/* functions */ +/* bus */ +/* stdio_bus_init */ +static STDIOBus * _stdio_bus_init(void) +{ + return &_stdio_bus; +} + + +/* stdio_bus_write8 */ +static int _stdio_bus_write8(STDIOBus * bus, ukBusAddress * address, + uint8_t value) +{ + STDIOBusData * data = bus->data; + (void) address; + + return write(data->fd, &value, sizeof(value)); +} + + +/* stdio_bus_write16 */ +static int _stdio_bus_write16(STDIOBus * bus, ukBusAddress * address, + uint16_t value) +{ + STDIOBusData * data = bus->data; + (void) address; + + return write(data->fd, &value, sizeof(value)); +} + + +/* stdio_bus_write32 */ +static int _stdio_bus_write32(STDIOBus * bus, ukBusAddress * address, + uint32_t value) +{ + STDIOBusData * data = bus->data; + (void) address; + + return write(data->fd, &value, sizeof(value)); +} diff --git a/src/drivers/console.c b/src/drivers/console.c index 30f93e1..1f7b8e7 100644 --- a/src/drivers/console.c +++ b/src/drivers/console.c @@ -13,6 +13,7 @@ static ukConsole * _console = NULL; +/* functions */ #if defined(__amd64__) || defined(__i386__) # include "console/vga.c" @@ -34,7 +35,6 @@ ukConsole * console_init(ukBus * bus) #endif -/* functions */ /* accessors */ /* console_get_default */ ukConsole * console_get_default(void) diff --git a/src/drivers/console/stdio.c b/src/drivers/console/stdio.c new file mode 100644 index 0000000..0903180 --- /dev/null +++ b/src/drivers/console/stdio.c @@ -0,0 +1,72 @@ +/* $Id$ */ +/* Copyright (c) 2018 Pierre Pronchery */ +/* This file is part of DeforaOS uKernel */ + + + +#include + + +/* private */ +/* types */ +typedef struct _ukConsole STDIOConsole; + +typedef struct _ukConsoleData +{ + ukBus * bus; +} STDIOConsoleData; + + +/* prototypes */ +/* console */ +static STDIOConsole * _stdio_console_init(ukBus * bus); + +static void _stdio_console_clear(STDIOConsole * console); + +static void _stdio_console_print(STDIOConsole * console, char const * str, + size_t len); + + +/* variables */ +static ukConsoleData _stdio_console_data = +{ + NULL +}; + +static STDIOConsole _stdio_console = +{ + _stdio_console_init, + _stdio_console_clear, + _stdio_console_print, + &_stdio_console_data +}; + + +/* functions */ +/* console */ +/* stdio_console_init */ +static ukConsole * _stdio_console_init(ukBus * bus) +{ + _stdio_console_data.bus = bus; + _stdio_console_clear(&_stdio_console); + return &_stdio_console; +} + + +/* stdio_console_clear */ +static void _stdio_console_clear(STDIOConsole * console) +{ + /* FIXME implement */ +} + + +/* stdio_console_print */ +static void _stdio_console_print(STDIOConsole * console, char const * str, + size_t len) +{ + STDIOConsoleData * data = console->data; + size_t i; + + for(i = 0; i < len; i++) + data->bus->write8(data->bus, NULL, str[i]); +} diff --git a/tools/arch/i386/start.S b/tools/arch/i386/start.S index e0e4059..0841cee 100644 --- a/tools/arch/i386/start.S +++ b/tools/arch/i386/start.S @@ -71,9 +71,9 @@ auxv_done: /* write */ -.global _write -.type _write, @function -_write: +.global write +.type write, @function +write: mov $0x4, %eax jmp _syscall diff --git a/tools/bus.c b/tools/bus.c index 70377ed..a4d2db7 100644 --- a/tools/bus.c +++ b/tools/bus.c @@ -6,20 +6,14 @@ #include "drivers/bus.h" - -/* types */ -struct _Bus -{ -}; +#include "drivers/bus/stdio.c" -/* variables */ -static Bus _bus; - - -/* functions */ /* bus_init */ -Bus * bus_init(void) +ukBus * bus_init(void) { - return &_bus; + static ukBus * bus; + + bus = _stdio_bus_init(); + return bus; } diff --git a/tools/console.c b/tools/console.c index 976b627..45e361c 100644 --- a/tools/console.c +++ b/tools/console.c @@ -4,44 +4,49 @@ -#include -#include #include "drivers/console.h" - -/* types */ -struct _Console -{ - int fd; -}; - - -/* prototypes */ -int _write(int fd, char const * buf, size_t len); +#include "drivers/console/stdio.c" +/* private */ /* variables */ -static Console _console; +static ukConsole * _console = NULL; /* functions */ /* console_init */ -Console * console_init(Bus * bus) +ukConsole * console_init(ukBus * bus) { - _console.fd = STDOUT_FILENO; - return &_console; + if((_console = _stdio_console_init(bus)) == NULL) + return NULL; + return _console; } -/* useful */ -/* console_clear */ -void console_clear(Console * console) +/* FIXME code duplication with src/drivers/console.c */ +/* accessors */ +/* console_get_default */ +ukConsole * console_get_default(void) { + return _console; +} + + +/* helpers */ +/* console_clear */ +void console_clear(ukConsole * console) +{ + if(console == NULL) + console = console_get_default(); + console->clear(console); } /* console_print */ -void console_print(Console * console, char const * text, size_t len) +void console_print(ukConsole * console, char const * str, size_t len) { - _write(console->fd, text, len); + if(console == NULL) + console = console_get_default(); + console->print(console, str, len); }