Use buses for the userland implementation as well

This commit is contained in:
Pierre Pronchery 2018-04-04 03:28:36 +02:00
parent 7bb329e41a
commit ca9dc4bb53
10 changed files with 241 additions and 56 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;

93
src/drivers/bus/stdio.c Normal file
View File

@ -0,0 +1,93 @@
/* $Id$ */
/* Copyright (c) 2018 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS uKernel */
#include <stddef.h>
#include <errno.h>
/* 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));
}

View File

@ -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)

View File

@ -0,0 +1,72 @@
/* $Id$ */
/* Copyright (c) 2018 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS uKernel */
#include <string.h>
/* 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]);
}

View File

@ -71,9 +71,9 @@ auxv_done:
/* write */
.global _write
.type _write, @function
_write:
.global write
.type write, @function
write:
mov $0x4, %eax
jmp _syscall

View File

@ -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;
}

View File

@ -4,44 +4,49 @@
#include <unistd.h>
#include <stdint.h>
#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);
}