diff options
Diffstat (limited to 'sw-old/z80/kernel/include')
-rw-r--r-- | sw-old/z80/kernel/include/devices.h | 15 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/errno.h | 35 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/dev.h | 29 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/dirent.h | 17 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/fd.h | 102 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/fdop.h | 140 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/fs.h | 63 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/iter.h | 17 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/fs/users.h | 21 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/memory.h | 50 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/process.h | 43 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/sio.h | 43 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/stat.h | 24 | ||||
-rw-r--r-- | sw-old/z80/kernel/include/types.h | 62 |
14 files changed, 661 insertions, 0 deletions
diff --git a/sw-old/z80/kernel/include/devices.h b/sw-old/z80/kernel/include/devices.h new file mode 100644 index 0000000..a846f9b --- /dev/null +++ b/sw-old/z80/kernel/include/devices.h @@ -0,0 +1,15 @@ +#ifndef __DEVICES_H__ +#define __DEVICES_H__ + +#define ADDR_DEV_ROM_L 0x0000 +#define ADDR_DEV_ROM_H 0x2000 + +#define ADDR_DEV_USART 0x4000 +#define ADDR_DEV_CTC 0x4100 +#define ADDR_DEV_PIO 0x4200 + +#define ADDR_DEV_MMU + +#define ADDR_DEV_RAM 0x8000 + +#endif diff --git a/sw-old/z80/kernel/include/errno.h b/sw-old/z80/kernel/include/errno.h new file mode 100644 index 0000000..7632269 --- /dev/null +++ b/sw-old/z80/kernel/include/errno.h @@ -0,0 +1,35 @@ +#ifndef ERRNO_H +#define ERRNO_H + +extern int errno; + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* Input/output error */ +#define ENXIO 6 /* Device not configured */ +#define E2BIG 7 /* Argument list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file descriptor */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock avoided */ + +#define ENOMEM 12 /* Cannot allocate memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ + +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device busy */ +#define EEXIST 17 /* File exists */ + +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* Operation not supported by device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Inappropriate ioctl for device */ + +#endif diff --git a/sw-old/z80/kernel/include/fs/dev.h b/sw-old/z80/kernel/include/fs/dev.h new file mode 100644 index 0000000..8e550f3 --- /dev/null +++ b/sw-old/z80/kernel/include/fs/dev.h @@ -0,0 +1,29 @@ +#ifndef DEV_H +#define DEV_H + +#include "types.h" + +#define FS_MOUNT_LIMIT 16 + +struct fs_superblock +{ + uint8_t magic; // identifier + + size_t blk_size; // size of a single block + size_t imap_size; // quantity of inodes + size_t dmap_size; // quantity of blocks +}; + +struct fs_dev +{ + uint enabled :1; // in use + uint port_no :3; // serial port number + uint :4; + inode_t inode; // dir mounted + struct fs_superblock superblock; // block informations +}; + +/* list of devices */ +extern struct fs_dev devices[FS_MOUNT_LIMIT]; + +#endif diff --git a/sw-old/z80/kernel/include/fs/dirent.h b/sw-old/z80/kernel/include/fs/dirent.h new file mode 100644 index 0000000..2fd224a --- /dev/null +++ b/sw-old/z80/kernel/include/fs/dirent.h @@ -0,0 +1,17 @@ +#ifndef __DIRENT_H__ +#define __DIRENT_H__ + +#include "types.h" + +struct dirent +{ + ino_t inode; // inode referred + uint8_t name_size; // size of the name + char name[]; // name of the referred inode +}; + +/* if inode is FS_INO_NULL, then the dirent is a memory leak */ +/* Warning: dirent leaks are generated by rm or rmdir operations */ +/* Filesystem must be periodically checked and cleaned */ + +#endif // __DIRENT_H__ diff --git a/sw-old/z80/kernel/include/fs/fd.h b/sw-old/z80/kernel/include/fs/fd.h new file mode 100644 index 0000000..d2fea2a --- /dev/null +++ b/sw-old/z80/kernel/include/fs/fd.h @@ -0,0 +1,102 @@ +#ifndef __FD_H__ +#define __FD_H__ + +#include "types.h" + +#define FD_MAX 32 + +#define OPEN_READ 0x1 +#define OPEN_WRITE 0x2 +#define OPEN_BIN 0x4 +#define OPEN_APPEND 0x8 +#define OPEN_ERASE 0x10 +#define OPEN_DIR 0x20 +#define OPEN_LINK 0x40 + +#define LS_ALL 0x1 + +/* declare dirent, not include */ +#ifndef __DIRENT_H__ +struct dirent; +#endif + +/* set of operations callback for fd */ +struct fd_operations +{ + size_t (*readline)(inode_t, fsize_t, char *, char term); + size_t (*print)(inode_t, fsize_t, const char *); + size_t (*append)(inode_t, fsize_t*, const char *); + + size_t (*read)(inode_t, fsize_t, void *, size_t); + size_t (*write)(inode_t, fsize_t, const void *, size_t); + size_t (*bin_append)(inode_t, fsize_t*, const void *, size_t); + + size_t (*ls)(inode_t, struct dirent *, uint8_t); + size_t (*find)(inode_t, struct dirent *, const char *); + int8_t (*mkdir)(inode_t, const char *); + int8_t (*rmdir)(inode_t, const char *); + int8_t (*touch)(inode_t, const char *); + int8_t (*rm)(inode_t, const char *); + int8_t (*ln)(inode_t, const char *, const char *); + + int8_t (*special)(inode_t, void *, size_t); +}; + +/* file descriptor */ +struct file_desc +{ + inode_t inode; // inode pointed + fsize_t seek; // virtual seek + devsize_t begin; // beginning of blocks + struct fd_operations opers; // bound operations +}; + +/* bitmap of used file descriptors */ +extern struct uint8_t fd_bmap[FD_TABLE_SIZE / 8]; + +/* table of file descriptors */ +extern struct file_desc fd_table[FD_TABLE_SIZE]; + +/* returns a free file descriptor */ +int8_t __fd_new(); + +/* opens a file streaming of the cwd */ +int8_t __open_c_inode(uint8_t flags); + +/* opens a file streaming by a path */ +int8_t open(const char *path, uint8_t flags); + +/* list content of directory */ +size_t ls(int8_t fd, struct dirent *buf, uint8_t all); + +/* find name through the directory entries */ +size_t find(int8_t fd, struct dirent *buf, const char *name); + +/* creates a new directory inside fd with the specified name */ +int8_t mkdir(int8_t fd, const char *name); + +/* creates a new file inside fd with the specified name */ +int8_t touch(int8_t fd, const char *name); + +/* creates a new symlink inside fd with the specified name */ +int8_t ln(int8_t fd, const char *name); + +/* change virtual seek position of the fd */ +int8_t seek(int8_t fd, fsize_t pos); + +/* reads a string from the fd until the terminator is reached */ +size_t readline(int8_t fd, char *buf, char term); + +/* writes a string into the fd */ +int8_t print(int8_t fd, const char *str); + +/* reads n bytes from the fd */ +size_t read(int8_t fd, void *buf, size_t n); + +/* writes n bytes into the fd */ +int8_t write(int8_t fd, const void *buf, size_t n); + +/* frees fd space */ +void close(int8_t fd); + +#endif // __FD_H__ diff --git a/sw-old/z80/kernel/include/fs/fdop.h b/sw-old/z80/kernel/include/fs/fdop.h new file mode 100644 index 0000000..d4b1b77 --- /dev/null +++ b/sw-old/z80/kernel/include/fs/fdop.h @@ -0,0 +1,140 @@ +#ifndef __FDOP_H__ +#define __FDOP_H__ + +#include "types.h" + +#ifndef __DIRENT_H__ +struct dirent; +#endif + +/* macro for direct binding */ + +#define FD_BIND_AS_DIR(oper) { \ + oper.ls = &as_ls; \ + oper.find = &as_find; \ + oper.mkdir = &as_mkdir; \ + oper.rmdir = &as_rmdir; \ + oper.touch = &as_touch; \ + oper.rm = &as_rm; \ + oper.ln = &as_ln; \ + } + +#define FD_BIND_SS_DIR(oper) { \ + oper.ls = &ss_ls; \ + oper.find = &ss_find; \ + oper.mkdir = &ss_mkdir; \ + oper.rmdir = &ss_rmdir; \ + oper.touch = &ss_touch; \ + oper.rm = &ss_rm; \ + oper.ln = &ss_ln; \ + } + +#define FD_BIND_AS_FILE(opers, flags) { \ + if (flags & OPEN_READ) \ + opers.readline = as_readline; \ + if (flags & OPEN_APPEND) \ + opers.append = as_append; \ + else if (flags & OPEN_WRITE) \ + opers.print = as_print; \ + } + +#define FD_BIND_SS_FILE(opers, flags) { \ + if (flags & OPEN_READ) \ + opers.readline = ss_readline; \ + if (flags & OPEN_APPEND) \ + opers.append = ss_append; \ + else if (flags & OPEN_WRITE) \ + opers.print = ss_print; \ + } + +#define FD_BIND_AS_BINFILE(opers, flags) { \ + if (flags & OPEN_READ) \ + opers.read = as_read; \ + if (flags & OPEN_APPEND) \ + opers.bin_append = as_bin_append; \ + else if (flags & OPEN_WRITE) \ + opers.write = as_write; \ + } + +#define FD_BIND_SS_BINFILE(opers, flags) { \ + if (flags & OPEN_READ) \ + opers.read = ss_read; \ + if (flags & OPEN_APPEND) \ + opers.bin_append = ss_bin_append; \ + else if (flags & OPEN_WRITE) \ + opers.write = ss_write; \ + } + +/* Set of file descriptors operations */ +/* Determines if to use the serial interface or the address space */ + +/* Address space section */ + +/* File functions */ + +size_t as_readline(inode_t inode, fsize_t seek, char *buf, char term); + +size_t as_print(inode_t inode, fsize_t seek, const char *str); + +size_t as_append(inode_t inode, fsize_t *seek_ptr, const char *str); + + +size_t as_read(inode_t inode, fsize_t seek, void *buf, size_t n); + +size_t as_write(inode_t inode, fsize_t seek, const void *buf, size_t n); + +size_t as_bin_append(inode_t inode, fsize_t *seek_ptr, const void *buf, size_t +n); + +/* Directory functions */ + +size_t as_ls(inode_t inode, struct dirent *buf, uint8_t all); + +size_t as_find(inode_t inode, struct dirent *buf, const char *name); + +int8_t as_mkdir(inode_t inode, const char *name); + +int8_t as_rmdir(inode_t inode, const char *name); + +int8_t as_touch(inode_t inode, const char *name); + +int8_t as_rm(inode_t inode, const char *name); + +int8_t as_ln(inode_t inode, const char *path, const char *name); + +/* Serial Space section */ +/* Warning, it doesn't switch to the right driver */ + +/* File functions */ + +size_t ss_readline(inode_t inode, fsize_t seek, char *buf, char term); + +size_t ss_print(inode_t inode, fsize_t seek, const char *str); + +size_t ss_append(inode_t inode, fsize_t *seek_ptr, const char *str); + + +size_t ss_read(inode_t inode, fsize_t seek, void *buf, size_t n); + +size_t ss_write(inode_t inode, fsize_t seek, const void *buf, size_t n); + +size_t ss_bin_append(inode_t inode, fsize_t *seek_ptr, const void *buf, size_t +n); + +/* Directory functions */ + +size_t ss_ls(inode_t inode, struct dirent *buf, uint8_t all); + +size_t ss_find(inode_t inode, struct dirent *buf, const char *name); + +int8_t ss_mkdir(inode_t inode, const char *name); + +int8_t ss_rmdir(inode_t inode, const char *name); + +int8_t ss_touch(inode_t inode, const char *name); + +int8_t ss_rm(inode_t inode, const char *name); + +int8_t ss_ln(inode_t, const char *path, const char *name); + +#endif // __FDOP_H__ diff --git a/sw-old/z80/kernel/include/fs/fs.h b/sw-old/z80/kernel/include/fs/fs.h new file mode 100644 index 0000000..ad20adb --- /dev/null +++ b/sw-old/z80/kernel/include/fs/fs.h @@ -0,0 +1,63 @@ +#ifndef __FS_H__ +#define __FS_H__ + +#include "types.h" + +#define FS_OFFSET 0x1000 + +#define FS_BLOCKS_SIZE 512 +#define FS_BLOCKS_N 8 +#define FS_BLOCKS_IND 6 + +#define INODE_TYPE_FILE 0x0 +#define INODE_TYPE_DIR 0x1 +#define INODE_TYPE_SLINK 0x2 +#define INODE_TYPE_SPECIAL 0x3 + +#define INODE_META_SIZE 8 + +/* inode basic structure */ +struct fs_inode +{ + /* inode meta data */ + + uint mode :3; // chmod + uint uid :3; // chown + uint type :2; // file, dir, sym-link, special + + time_t ctime; // creation time + + uint24_t size; // inode size + + /* data storage informations */ + /* it doesn't allocate memory, virtual size FS_BLOCKS_N */ + blk_t blocks[]; +}; + +#define FS_DEV_ROM 0x7f /* 01111111 */ +#define FS_DEV_NULL 0x80 /* 10000000 */ + +#define FS_ROM_SPACE 0x2000 // second rom + +#define FS_INO_ROOT 0x0 // first inode + +#define FS_INODE_ROOT(inode) {inode.dev = 0xff; inode.inode = 0x0} +#define FS_INODE_NULL(inode) {inode.dev = 0x80; inode.inode = 0x0} + +#define FS_USE_ROM(inode) {inode.dev == 0x7f} + +/* get block seek in current device */ +devsize_t fs_block(blk_t block); + +/* get common inode seek in current device */ +/* c_inode must be set first */ +/* returns seek at the beginning of blocks field */ +devsize_t fs_inode(struct fs_inode *buf); + +/* common inode for syscalls */ +extern inode_t c_inode; + +/* parse a path, absolute or relative to c_inode */ +inode_t fs_parse_path(const char *path); + +#endif // __FS_H__ diff --git a/sw-old/z80/kernel/include/fs/iter.h b/sw-old/z80/kernel/include/fs/iter.h new file mode 100644 index 0000000..41f011d --- /dev/null +++ b/sw-old/z80/kernel/include/fs/iter.h @@ -0,0 +1,17 @@ +#ifndef __ITER_H__ +#define __ITER_H__ + +struct inode_iter +{ + devsize_t dev_seek; /* seek position in the volume */ + devsize_t blk_end; /* end of the block */ + + int16_t blk_index; /* index of the block */ + + int8_t blk_level; /* recursion level, indirect blocks */ + + fsize_t fseek; /* virtual seek in the file */ + fsize_t size; /* file size */ +}; + +#endif // __ITER_H__ diff --git a/sw-old/z80/kernel/include/fs/users.h b/sw-old/z80/kernel/include/fs/users.h new file mode 100644 index 0000000..83980e5 --- /dev/null +++ b/sw-old/z80/kernel/include/fs/users.h @@ -0,0 +1,21 @@ +#ifndef USERS_H +#define USERS_H + +#include "types.h" + +#define USERS_MAX 8 +#define USER_ROOT 0 + +/* current user in use */ +extern struct fs_user c_user; + +struct fs_user +{ + char name[32]; + ino_t home; + uint8_t perm; // TODO, permissions +}; + +/* all users are in rom device */ + +#endif diff --git a/sw-old/z80/kernel/include/memory.h b/sw-old/z80/kernel/include/memory.h new file mode 100644 index 0000000..67c4b88 --- /dev/null +++ b/sw-old/z80/kernel/include/memory.h @@ -0,0 +1,50 @@ +#ifndef __MEMORY_H__ +#define __MEMORY_H__ + +#include "types.h" +#include "devices.h" + +/* maximum number of pages on the system */ +#define PAGES_MAX_COUNT 32 +#define PAGE_SIZE 1000 + +/* in our system there are only 16 pages since only 64KB can be addressed + * to optimize the memory management in ROM and RAM only pages from this set + * shall be used + */ +// ROM +#define ADDR_PAGE_0 0x0000 +#define ADDR_PAGE_1 0x1000 +#define ADDR_PAGE_2 0x2000 +#define ADDR_PAGE_3 0x3000 +// IOSPACE +#define ADDR_PAGE_4 0x4000 +#define ADDR_PAGE_5 0x5000 +#define ADDR_PAGE_6 0x6000 +#define ADDR_PAGE_7 0x7000 +// RAM +#define ADDR_PAGE_8 0x8000 +#define ADDR_PAGE_9 0x9000 +#define ADDR_PAGE_10 0xA000 +#define ADDR_PAGE_11 0xB000 +#define ADDR_PAGE_12 0xC000 +#define ADDR_PAGE_13 0xD000 +#define ADDR_PAGE_14 0xE000 +#define ADDR_PAGE_15 0xF000 + +#define ADDR_PAGE_FIRST ADDR_PAGE_8 +#define ADDR_PAGE_LAST ADDR_PAGE_15 + +struct page +{ + pid_t pid; // process owner of the page (0 if free) + uint16_t addr; // physical address +}; + +int mmu_write_table(void); + +int page_new(void); +int page_map(int page, int pid, uint16_t addr); +int page_unmap(int page); + +#endif // __MEMORY_H__ diff --git a/sw-old/z80/kernel/include/process.h b/sw-old/z80/kernel/include/process.h new file mode 100644 index 0000000..3b0c843 --- /dev/null +++ b/sw-old/z80/kernel/include/process.h @@ -0,0 +1,43 @@ +#ifndef __PROCESS_H__ +#define __PROCESS_H__ + +#include "types.h" +#include "memory.h" + + /* maximum number of processes (i.e. pages in ram) + * since each program can use only one page in ram + */ +#define PROC_COUNT 2 + +/* the pid is defined with a single byte (pid_t is uint8_t), because of that + * there cannot be more than 255 processes open at the same time. this is a + * limitation but for our purposes is more than enough + */ +#define PID_COUNT_MAX 255 + +struct executable +{ + void *text; + size_t text_size; + void *bss; + size_t bss_size; +}; + +struct process +{ + uint blocked :1; // process is waiting for hardware or locked + uint running :1; // pid is used + uint pages; // number of pages used by the process + struct page page[4]; // pages used by the process +}; + +pid_t newpid(void); + +int fork(void); +int exec(char *path, char *args); +int spawn(char *path, char *args); + +pid_t getpid(void); +int kill(pid_t pid); + +#endif // __PROCESS_H__ diff --git a/sw-old/z80/kernel/include/sio.h b/sw-old/z80/kernel/include/sio.h new file mode 100644 index 0000000..276b99c --- /dev/null +++ b/sw-old/z80/kernel/include/sio.h @@ -0,0 +1,43 @@ +#ifndef __SIO_H__ +#define __SIO_H__ + +#include "types.h" + +#define SIO_PORT_0 0x0 +#define SIO_PORT_1 0x1 +#define SIO_PORT_2 0x2 +#define SIO_PORT_3 0x3 +#define SIO_PORT_4 0x4 +#define SIO_PORT_5 0x5 +#define SIO_PORT_6 0x6 +#define SIO_PORT_7 0x7 + +/* current port in use */ +extern uint8_t sio_port; + +/* current seek in the device */ +extern devsize_t sio_seek; + +struct dev_buffer +{ + // TODO, bytes needed to the device buffer interface +}; + +/* points to the buffers mapped in the I/O space */ +/* to be defined precisely in assembly */ +extern volatile struct dev_buffer sio_buffers[8]; + +/* initialize serial interface */ +void sio_init(); + +/* syscall: read one byte from the current device */ +uint8_t sio_recv(); +/* syscall: write one byte into the current device */ +void sio_send(uint8_t value); + +/* read n bytes from the current port */ +size_t sio_read(void *buffer, size_t n); +/* write n bytes into the current port */ +int8_t sio_write(const void *buffer, size_t n); + +#endif // __SIO_H__ diff --git a/sw-old/z80/kernel/include/stat.h b/sw-old/z80/kernel/include/stat.h new file mode 100644 index 0000000..44c0f63 --- /dev/null +++ b/sw-old/z80/kernel/include/stat.h @@ -0,0 +1,24 @@ +#ifndef __STAT_H__ +#define __STAT_H__ + +#include "types.h" + +struct stat +{ + inode_t inode; /* inode reference */ + + uint mode :3; /* mode */ + uint uid :3; /* owner id */ + uint type :2; /* file, dir or link */ + + devsize_t size; /* file size */ + + size_t blk_size; /* single block size */ + size_t blk_used; /* blocks used by the file */ + + time_t ctime; /* creation time */ +} + +struct stat * stat(const char *path, struct stat *buffer); + +#endif // __STAT_H__ diff --git a/sw-old/z80/kernel/include/types.h b/sw-old/z80/kernel/include/types.h new file mode 100644 index 0000000..c6e620b --- /dev/null +++ b/sw-old/z80/kernel/include/types.h @@ -0,0 +1,62 @@ +#ifndef __TYPES_H__ +#define __TYPES_H__ + +/* only types from primitive types are defined in this file */ + +typedef volatile unsigned char register_t; + +typedef unsigned int uint; + +typedef char int8_t; +typedef unsigned char uint8_t; +typedef int int16_t; +typedef unsigned int uint16_t; +typedef long int int32_t; +typedef unsigned long int uint32_t; + +typedef uint16_t size_t; +typedef int16_t ssize_t; + +typedef uint8_t pid_t; +typedef uint16_t ino_t; + +typedef uint8_t dev_t; +typedef uint32_t devsize_t; +typedef uint8_t fd_t; +typedef uint16_t blk_t; +typedef uint8_t user_t; + +typedef struct { + uint8_t member[3]; + +} uint24_t; + +typedef uint32_t fsize_t; + +typedef struct +{ + dev_t dev; // device id, global in the fs + ino_t inode; // inode id relative to the volume + +} inode_t; + +typedef struct time_s +{ + struct + { + uint minutes :6; + uint hour :5; + + } time; + + struct + { + uint day :5; + uint month :4; + uint year :12; + + } date; + +} time_t; + +#endif |