diff options
Diffstat (limited to '')
-rw-r--r-- | sw/z80/kernel/include/filesystem.h | 77 | ||||
-rw-r--r-- | sw/z80/kernel/include/memory.h | 2 | ||||
-rw-r--r-- | sw/z80/kernel/include/process.h | 20 | ||||
-rw-r--r-- | sw/z80/kernel/include/syscall.h | 4 | ||||
-rw-r--r-- | sw/z80/kernel/include/types.h | 2 |
5 files changed, 93 insertions, 12 deletions
diff --git a/sw/z80/kernel/include/filesystem.h b/sw/z80/kernel/include/filesystem.h new file mode 100644 index 0000000..6505d5e --- /dev/null +++ b/sw/z80/kernel/include/filesystem.h @@ -0,0 +1,77 @@ +#ifndef __FILESYSTEM_H__ +#define __FILESYSTEM_H__ + +#include "types.h" + +#define FS_OFFSET 0x1000 + +#define FS_BLOCK_SIZE 512 +#define FS_BLOCKS_N 12 +/* #define FS_IBLOCKS_N 1 */ + +#define INODE_TYPE_FILE 0 +#define INODE_TYPE_DIR 1 +#define INODE_TYPE_LINK 2 + +typedef struct time_s +{ + uint16_t time; + uint16_t date; +} time_t; + + +/* on-disk structures */ +struct fs_superblock +{ + uint8_t magic; + uint16_t blk_size; /* default is 512 bytes */ + uint16_t imap_size; /* size of the inode bitmap in blocks */ + uint16_t dmap_size; /* size of the data blocks map in blocks */ +}; + + +struct fs_blk +{ + uint size; +}; + +typedef struct fs_inode +{ + uint i_used :1; // inode is free + uint i_mode :3; // inode mode (rwx) + + uint8_t i_uid; // user (owner) id + uint16_t i_number; // identifier + + uint16_t i_blocks; // number of blocks + + struct fs_blk i_block[FS_BLOCKS_N]; // direct blocks +/* struct fs_blk i_iblock[FS_IBLOCKS_N]; // indirect blocks */ + + inode_t *parent; +} inode_t; + +/* inode table structures */ +struct fs_inode_entry +{ + uint16_t i_number; + uint8_t str_len; + char name[24]; +}; + +/* filesystem struct for the operating system */ +struct filesystem +{ + size_t size; + size_t fsize; + inode_t *mntpt; +}; + +void fs_parse_superblock(struct filesystem *fs); + +void fs_write_imap(); +void fs_write_dmap(); + +/* void fs_ */ + +#endif // __FILESYSTEM_H__ diff --git a/sw/z80/kernel/include/memory.h b/sw/z80/kernel/include/memory.h index 5bca5a5..e4352b5 100644 --- a/sw/z80/kernel/include/memory.h +++ b/sw/z80/kernel/include/memory.h @@ -34,7 +34,7 @@ struct page { uint used :1; - uint8_t pid; // process owner of the page + pid_t pid; // process owner of the page uint16_t addr; // physical address }; diff --git a/sw/z80/kernel/include/process.h b/sw/z80/kernel/include/process.h index ffd39e7..d7aa7fd 100644 --- a/sw/z80/kernel/include/process.h +++ b/sw/z80/kernel/include/process.h @@ -2,6 +2,7 @@ #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 @@ -10,17 +11,17 @@ struct executable { - void *text; - size_t text_size; - void *bss; - size_t bss_size; -} + 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[4]; // pages used by the process + uint blocked :1; // process is waiting for hardware or locked + uint running :1; // pid is used + struct page pages[4]; // pages used by the process // TODO: implement quick callback? }; @@ -29,8 +30,9 @@ struct process * limitation but for our purposes is more than enough */ extern struct process proc_table[255]; +extern struct process *current_proc; -static pid_t newpid(void); +pid_t newpid(void); int fork(void); int exec(char *path, char *args); diff --git a/sw/z80/kernel/include/syscall.h b/sw/z80/kernel/include/syscall.h index 9641f25..29941c9 100644 --- a/sw/z80/kernel/include/syscall.h +++ b/sw/z80/kernel/include/syscall.h @@ -1,5 +1,5 @@ -#ifndef SYS_CALL -#define SYS_CALL +#ifndef __SYS_CALL_H__ +#define __SYS_CALL_H__ /* * Enable / disable virtual address traslation diff --git a/sw/z80/kernel/include/types.h b/sw/z80/kernel/include/types.h index 44df3eb..7c1424a 100644 --- a/sw/z80/kernel/include/types.h +++ b/sw/z80/kernel/include/types.h @@ -1,6 +1,8 @@ #ifndef __TYPES_H__ #define __TYPES_H__ +/* only types from primitive types are defined in this file */ + #define register_t volatile unsigned char #define uint unsigned int |