Use buses for the userland implementation as well
This commit is contained in:
parent
7bb329e41a
commit
ca9dc4bb53
|
@ -9,4 +9,13 @@
|
||||||
|
|
||||||
#if defined(__amd64__) || defined(__i386__)
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
# include "bus/ioport.c"
|
# include "bus/ioport.c"
|
||||||
|
|
||||||
|
/* bus_init */
|
||||||
|
ukBus * bus_init(void)
|
||||||
|
{
|
||||||
|
static ukBus * bus;
|
||||||
|
|
||||||
|
bus = _ioport_bus_init();
|
||||||
|
return bus;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,6 +17,8 @@ typedef struct _ukBusData ukBusData;
|
||||||
|
|
||||||
struct _ukBus
|
struct _ukBus
|
||||||
{
|
{
|
||||||
|
ukBus * (*init)(void);
|
||||||
|
|
||||||
int (*write8)(ukBus * bus, ukBusAddress * address, uint8_t value);
|
int (*write8)(ukBus * bus, ukBusAddress * address, uint8_t value);
|
||||||
int (*write16)(ukBus * bus, ukBusAddress * address, uint16_t value);
|
int (*write16)(ukBus * bus, ukBusAddress * address, uint16_t value);
|
||||||
int (*write32)(ukBus * bus, ukBusAddress * address, uint32_t value);
|
int (*write32)(ukBus * bus, ukBusAddress * address, uint32_t value);
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
#if defined(__amd64__) || defined(__i386__)
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
/* functions */
|
/* functions */
|
||||||
.section .text
|
.section .text
|
||||||
/* ioport_write8 */
|
/* ioport_bus_write8 */
|
||||||
.global ioport_write8
|
.global ioport_bus_write8
|
||||||
.type ioport_write8, @function
|
.type ioport_bus_write8, @function
|
||||||
ioport_write8:
|
ioport_bus_write8:
|
||||||
mov 0x8(%esp), %dx /* address */
|
mov 0x8(%esp), %dx /* address */
|
||||||
mov 0xc(%esp), %al /* value */
|
mov 0xc(%esp), %al /* value */
|
||||||
out %al, %dx
|
out %al, %dx
|
||||||
|
|
|
@ -9,35 +9,44 @@
|
||||||
|
|
||||||
|
|
||||||
/* private */
|
/* private */
|
||||||
|
/* types */
|
||||||
|
typedef struct _ukBus IOPortBus;
|
||||||
|
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
extern int ioport_write8(ukBus * bus, ukBusAddress * address, uint8_t value);
|
static IOPortBus * _ioport_bus_init(void);
|
||||||
static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value);
|
extern int ioport_bus_write8(IOPortBus * bus, ukBusAddress * address,
|
||||||
static int _ioport_write32(ukBus * bus, ukBusAddress * address, uint32_t value);
|
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 */
|
/* variables */
|
||||||
static ukBus _ioport_bus =
|
static IOPortBus _ioport_bus =
|
||||||
{
|
{
|
||||||
ioport_write8,
|
_ioport_bus_init,
|
||||||
_ioport_write16,
|
ioport_bus_write8,
|
||||||
_ioport_write32,
|
_ioport_bus_write16,
|
||||||
|
_ioport_bus_write32,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* public */
|
/* private */
|
||||||
/* functions */
|
/* functions */
|
||||||
/* ukbus_init */
|
/* bus */
|
||||||
ukBus * bus_init(void)
|
/* ioport_bus_init */
|
||||||
|
static IOPortBus * _ioport_bus_init(void)
|
||||||
{
|
{
|
||||||
return &_ioport_bus;
|
return &_ioport_bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* private */
|
/* ioport_bus_write16 */
|
||||||
/* useful */
|
static int _ioport_bus_write16(IOPortBus * bus, ukBusAddress * address,
|
||||||
/* ioport_write16 */
|
uint16_t value)
|
||||||
static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value)
|
|
||||||
{
|
{
|
||||||
(void) bus;
|
(void) bus;
|
||||||
(void) address;
|
(void) address;
|
||||||
|
@ -48,7 +57,8 @@ static int _ioport_write16(ukBus * bus, ukBusAddress * address, uint16_t value)
|
||||||
|
|
||||||
|
|
||||||
/* ioport_write32 */
|
/* 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) bus;
|
||||||
(void) address;
|
(void) address;
|
||||||
|
|
93
src/drivers/bus/stdio.c
Normal file
93
src/drivers/bus/stdio.c
Normal 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));
|
||||||
|
}
|
|
@ -13,6 +13,7 @@
|
||||||
static ukConsole * _console = NULL;
|
static ukConsole * _console = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* functions */
|
||||||
#if defined(__amd64__) || defined(__i386__)
|
#if defined(__amd64__) || defined(__i386__)
|
||||||
# include "console/vga.c"
|
# include "console/vga.c"
|
||||||
|
|
||||||
|
@ -34,7 +35,6 @@ ukConsole * console_init(ukBus * bus)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
/* console_get_default */
|
/* console_get_default */
|
||||||
ukConsole * console_get_default(void)
|
ukConsole * console_get_default(void)
|
||||||
|
|
72
src/drivers/console/stdio.c
Normal file
72
src/drivers/console/stdio.c
Normal 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]);
|
||||||
|
}
|
|
@ -71,9 +71,9 @@ auxv_done:
|
||||||
|
|
||||||
|
|
||||||
/* write */
|
/* write */
|
||||||
.global _write
|
.global write
|
||||||
.type _write, @function
|
.type write, @function
|
||||||
_write:
|
write:
|
||||||
mov $0x4, %eax
|
mov $0x4, %eax
|
||||||
jmp _syscall
|
jmp _syscall
|
||||||
|
|
||||||
|
|
18
tools/bus.c
18
tools/bus.c
|
@ -6,20 +6,14 @@
|
||||||
|
|
||||||
#include "drivers/bus.h"
|
#include "drivers/bus.h"
|
||||||
|
|
||||||
|
#include "drivers/bus/stdio.c"
|
||||||
/* types */
|
|
||||||
struct _Bus
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* variables */
|
|
||||||
static Bus _bus;
|
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
|
||||||
/* bus_init */
|
/* bus_init */
|
||||||
Bus * bus_init(void)
|
ukBus * bus_init(void)
|
||||||
{
|
{
|
||||||
return &_bus;
|
static ukBus * bus;
|
||||||
|
|
||||||
|
bus = _stdio_bus_init();
|
||||||
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,44 +4,49 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "drivers/console.h"
|
#include "drivers/console.h"
|
||||||
|
|
||||||
|
#include "drivers/console/stdio.c"
|
||||||
/* types */
|
|
||||||
struct _Console
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* prototypes */
|
|
||||||
int _write(int fd, char const * buf, size_t len);
|
|
||||||
|
|
||||||
|
|
||||||
|
/* private */
|
||||||
/* variables */
|
/* variables */
|
||||||
static Console _console;
|
static ukConsole * _console = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
/* console_init */
|
/* console_init */
|
||||||
Console * console_init(Bus * bus)
|
ukConsole * console_init(ukBus * bus)
|
||||||
{
|
{
|
||||||
_console.fd = STDOUT_FILENO;
|
if((_console = _stdio_console_init(bus)) == NULL)
|
||||||
return &_console;
|
return NULL;
|
||||||
|
return _console;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* useful */
|
/* FIXME code duplication with src/drivers/console.c */
|
||||||
/* console_clear */
|
/* accessors */
|
||||||
void console_clear(Console * console)
|
/* 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 */
|
/* 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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user