mirror of https://github.com/flysand7/ciabatta.git
Underscore prefix TinyRT definitions
This commit is contained in:
parent
06e1057ad2
commit
dbd10db051
8
build.py
8
build.py
|
@ -97,7 +97,7 @@ try:
|
|||
if is_defined:
|
||||
tinyrt_apis.append(api_name)
|
||||
is_defined_int = 1 if is_defined else 0
|
||||
tinyrt_header_file.write(f'#define {api_name.upper()} {is_defined_int}\n')
|
||||
tinyrt_header_file.write(f'#define _{api_name.upper()} {is_defined_int}\n')
|
||||
except Exception as error:
|
||||
print(f" -> [ERROR] writing to file '{tinyrt_header_path}'")
|
||||
print(f" * {error}")
|
||||
|
@ -206,7 +206,6 @@ def archive(srcs, out):
|
|||
sys.exit(code)
|
||||
|
||||
|
||||
|
||||
# Ciabatta build spec
|
||||
if not os.path.exists('lib'):
|
||||
os.mkdir('lib')
|
||||
|
@ -218,7 +217,8 @@ p = os.path.join
|
|||
assemble(p('src', 'linux', 'crt-entry.asm'), p('bin', 'crt-entry.o'))
|
||||
compile([p('src', 'linux', 'crt-ctors.c')], p('bin', 'crt-ctors.o'), '-fpic -c')
|
||||
compile([p('src', 'ciabatta.c')], p('bin', 'ciabatta.o'), '-fpic -c')
|
||||
archive([p('bin', 'ciabatta.o'), p('bin', 'crt-ctors.o'), p('bin', 'crt-entry.o')], p('lib', lib_file))
|
||||
archive([p('bin', 'crt-ctors.o'), p('bin', 'crt-entry.o')], p('lib', crt_file))
|
||||
archive([p('bin', 'ciabatta.o'), ], p('lib', lib_file))
|
||||
|
||||
if args.test:
|
||||
compile([args.test, p('lib', lib_file)], 'a', '-pie')
|
||||
compile([args.test, p('lib', lib_file), p('lib', crt_file)], 'a', '-pie')
|
||||
|
|
|
@ -37,11 +37,11 @@ noreturn void exit(int code) {
|
|||
}
|
||||
// TODO(bumbread): flush all the unflushed file streams
|
||||
// TODO(bumbread): close all file streams and delete temporary files
|
||||
rt_program_exit(code);
|
||||
_rt_program_exit(code);
|
||||
}
|
||||
|
||||
noreturn void _Exit(int code) {
|
||||
rt_program_exit(code);
|
||||
_rt_program_exit(code);
|
||||
}
|
||||
|
||||
noreturn void quick_exit(int code) {
|
||||
|
@ -49,6 +49,6 @@ noreturn void quick_exit(int code) {
|
|||
void (*handler)(void) = at_quick_exit_handlers[i];
|
||||
handler();
|
||||
}
|
||||
rt_program_exit(code);
|
||||
_rt_program_exit(code);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,61 +1,60 @@
|
|||
|
||||
// See src/tinyrt.h file for the interface this file implements
|
||||
|
||||
static RT_Status rt_file_open(RT_File *file, char *name, int rt_flags) {
|
||||
if((rt_flags & 0x3) == 0) {
|
||||
return RT_ERROR_BAD_PARAM;
|
||||
static _RT_Status _rt_file_open(_RT_File *file, char *name, int _rt_flags) {
|
||||
if((_rt_flags & 0x3) == 0) {
|
||||
return _RT_ERROR_BAD_PARAM;
|
||||
}
|
||||
int mode = 0;
|
||||
int flags = 0;
|
||||
if((rt_flags & 0x03) == 0x03) mode = O_RDWR;
|
||||
else if(rt_flags & RT_FILE_READ) mode = O_RDONLY;
|
||||
else if(rt_flags & RT_FILE_WRITE) mode = O_RDWR;
|
||||
if(rt_flags & RT_FILE_CREATE) flags |= O_CREAT;
|
||||
if(rt_flags & RT_FILE_EXCLUSIVE) flags |= O_EXCL;
|
||||
if(rt_flags & RT_FILE_TRUNCATE) flags |= O_TRUNC;
|
||||
if((_rt_flags & 0x03) == 0x03) mode = O_RDWR;
|
||||
else if(_rt_flags & _RT_FILE_READ) mode = O_RDONLY;
|
||||
else if(_rt_flags & _RT_FILE_WRITE) mode = O_RDWR;
|
||||
if(_rt_flags & _RT_FILE_CREATE) flags |= O_CREAT;
|
||||
if(_rt_flags & _RT_FILE_EXCLUSIVE) flags |= O_EXCL;
|
||||
if(_rt_flags & _RT_FILE_TRUNCATE) flags |= O_TRUNC;
|
||||
i64 fd = syscall_open(name, flags, mode);
|
||||
if(-fd == EACCES) return RT_STATUS_FILE_ACCESS;
|
||||
if(-fd == EEXIST) return RT_STATUS_FILE_EXISTS;
|
||||
if(-fd == ENOENT) return RT_STATUS_FILE_NOT_EXISTS;
|
||||
if(-fd == EINVAL) return RT_ERROR_BAD_PARAM;
|
||||
if(-fd == EISDIR) return RT_STATUS_FILE_DIRECTORY;
|
||||
if(-fd == EACCES) return _RT_STATUS_FILE_ACCESS;
|
||||
if(-fd == EEXIST) return _RT_STATUS_FILE_EXISTS;
|
||||
if(-fd == ENOENT) return _RT_STATUS_FILE_NOT_EXISTS;
|
||||
if(-fd == EINVAL) return _RT_ERROR_BAD_PARAM;
|
||||
if(-fd == EISDIR) return _RT_STATUS_FILE_DIRECTORY;
|
||||
// I'm too lazy to fill in the rest so lets leave it at that for now
|
||||
if(fd < 0) return RT_STATUS_FILE_IO_ERROR;
|
||||
if(fd < 0) return _RT_STATUS_FILE_IO_ERROR;
|
||||
file->fd = (u64)fd;
|
||||
file->flags = rt_flags;
|
||||
return RT_STATUS_OK;
|
||||
file->flags = _rt_flags;
|
||||
return _RT_STATUS_OK;
|
||||
}
|
||||
|
||||
static RT_Status rt_file_read(u64 size, void *buffer, RT_File *from, u64 *out_bytes_read) {
|
||||
static _RT_Status _rt_file_read(u64 size, void *buffer, _RT_File *from, u64 *out_bytes_read) {
|
||||
i64 bytes_read = syscall_read(from->fd, buffer, size);
|
||||
if(bytes_read == 0) {
|
||||
return RT_STATUS_FILE_EOF;
|
||||
return _RT_STATUS_FILE_EOF;
|
||||
}
|
||||
if(bytes_read < 0) {
|
||||
return RT_STATUS_FILE_IO_ERROR;
|
||||
return _RT_STATUS_FILE_IO_ERROR;
|
||||
}
|
||||
*out_bytes_read = bytes_read;
|
||||
return RT_STATUS_OK;
|
||||
return _RT_STATUS_OK;
|
||||
}
|
||||
|
||||
static RT_Status rt_file_write(RT_File *to, u64 size, void *buffer, u64 *out_bytes_written) {
|
||||
// Call the syscall
|
||||
static _RT_Status _rt_file_write(_RT_File *to, u64 size, void *buffer, u64 *out_bytes_written) {
|
||||
i64 status = syscall_write(to->fd, buffer, size);
|
||||
if(-status == EBADF) return RT_ERROR_BAD_PARAM;
|
||||
if(-status == EIO) return RT_STATUS_FILE_IO_ERROR;
|
||||
if(-status > 0) return RT_STATUS_FILE_IO_ERROR;
|
||||
if(-status == EBADF) return _RT_ERROR_BAD_PARAM;
|
||||
if(-status == EIO) return _RT_STATUS_FILE_IO_ERROR;
|
||||
if(-status > 0) return _RT_STATUS_FILE_IO_ERROR;
|
||||
*out_bytes_written = status;
|
||||
return RT_STATUS_OK;
|
||||
return _RT_STATUS_OK;
|
||||
}
|
||||
|
||||
static RT_Status rt_file_close(RT_File *file) {
|
||||
static _RT_Status _rt_file_close(_RT_File *file) {
|
||||
i64 result = syscall_close(file->fd);
|
||||
if(result < 0) {
|
||||
return RT_STATUS_FILE_IO_ERROR;
|
||||
return _RT_STATUS_FILE_IO_ERROR;
|
||||
}
|
||||
return RT_STATUS_OK;
|
||||
return _RT_STATUS_OK;
|
||||
}
|
||||
|
||||
static noreturn void rt_program_exit(int code) {
|
||||
static noreturn void _rt_program_exit(int code) {
|
||||
syscall_exit(code);
|
||||
}
|
||||
|
|
74
src/tinyrt.h
74
src/tinyrt.h
|
@ -2,65 +2,65 @@
|
|||
#pragma once
|
||||
|
||||
// Common errors
|
||||
#define RT_STATUS_OK 0 // No errors
|
||||
#define RT_ERROR_NOT_IMPLEMENTED -1 // Function not implemented
|
||||
#define RT_ERROR_BAD_PARAM -2 // One of the function parameters was wrong
|
||||
#define _RT_STATUS_OK 0 // No errors
|
||||
#define _RT_ERROR_NOT_IMPLEMENTED -1 // Function not implemented
|
||||
#define _RT_ERROR_BAD_PARAM -2 // One of the function parameters was wrong
|
||||
|
||||
// File API errors
|
||||
#define RT_STATUS_FILE_ACCESS 1 // No access to the file
|
||||
#define RT_STATUS_FILE_NO_SPACE 2 // Storage device has no space for the file
|
||||
#define RT_STATUS_FILE_EXISTS 3 // File exists when shouldn't
|
||||
#define RT_STATUS_FILE_NOT_EXISTS 4 // File doesn't exist when should
|
||||
#define RT_STATUS_FILE_DIRECTORY 5 // The file was a directory when shouldn't've been
|
||||
#define RT_STATUS_FILE_NOT_DIRECTORY 6 // The file wasn't a directory when should've been
|
||||
#define RT_STATUS_FILE_NAME_TOO_LONG 7 // The filename was too long for the Filesystem
|
||||
#define RT_STATUS_FILE_LOOP 8 // Too many symlinks followed or a symlink encountered when expected none
|
||||
#define RT_STATUS_FILE_BUSY 9 // The device is busy if exclusive access is requested
|
||||
#define RT_STATUS_FILE_TOO_MANY_OPEN 10 // Too many open files in the process
|
||||
#define RT_STATUS_FILE_NO_MEMORY 11 // No kernel memory or user limit on memory allocation exceeded
|
||||
#define RT_STATUS_FILE_IO_ERROR 12 // I/O error
|
||||
#define RT_STATUS_FILE_BAD_FILE 13 // Bad file handle
|
||||
#define RT_STATUS_FILE_EOF 14 // Read operation reached the end-of-file
|
||||
#define _RT_STATUS_FILE_ACCESS 1 // No access to the file
|
||||
#define _RT_STATUS_FILE_NO_SPACE 2 // Storage device has no space for the file
|
||||
#define _RT_STATUS_FILE_EXISTS 3 // File exists when shouldn't
|
||||
#define _RT_STATUS_FILE_NOT_EXISTS 4 // File doesn't exist when should
|
||||
#define _RT_STATUS_FILE_DIRECTORY 5 // The file was a directory when shouldn't've been
|
||||
#define _RT_STATUS_FILE_NOT_DIRECTORY 6 // The file wasn't a directory when should've been
|
||||
#define _RT_STATUS_FILE_NAME_TOO_LONG 7 // The filename was too long for the Filesystem
|
||||
#define _RT_STATUS_FILE_LOOP 8 // Too many symlinks followed or a symlink encountered when expected none
|
||||
#define _RT_STATUS_FILE_BUSY 9 // The device is busy if exclusive access is requested
|
||||
#define _RT_STATUS_FILE_TOO_MANY_OPEN 10 // Too many open files in the process
|
||||
#define _RT_STATUS_FILE_NO_MEMORY 11 // No kernel memory or user limit on memory allocation exceeded
|
||||
#define _RT_STATUS_FILE_IO_ERROR 12 // I/O error
|
||||
#define _RT_STATUS_FILE_BAD_FILE 13 // Bad file handle
|
||||
#define _RT_STATUS_FILE_EOF 14 // Read operation reached the end-of-file
|
||||
|
||||
// File API flags
|
||||
#define RT_FILE_READ 0x01
|
||||
#define RT_FILE_WRITE 0x02
|
||||
#define RT_FILE_CREATE 0x04
|
||||
#define RT_FILE_EXCLUSIVE 0x08
|
||||
#define RT_FILE_TRUNCATE 0x10
|
||||
#define _RT_FILE_READ 0x01
|
||||
#define _RT_FILE_WRITE 0x02
|
||||
#define _RT_FILE_CREATE 0x04
|
||||
#define _RT_FILE_EXCLUSIVE 0x08
|
||||
#define _RT_FILE_TRUNCATE 0x10
|
||||
|
||||
typedef i32 RT_Status;
|
||||
typedef i32 _RT_Status;
|
||||
|
||||
// API implementation flags (managed and used by the layers on top of tinyrt)
|
||||
static bool _rt_api_file;
|
||||
static bool _rt_api_tmpfile;
|
||||
|
||||
// Initialization & termination of minirt
|
||||
static RT_Status rt_init();
|
||||
static RT_Status rt_deinit();
|
||||
static _RT_Status _rt_init();
|
||||
static _RT_Status _rt_deinit();
|
||||
|
||||
// Program API
|
||||
#if RT_API_PROGRAM == 1
|
||||
static noreturn void rt_program_exit(int code);
|
||||
#if _RT_API_PROGRAM == 1
|
||||
static noreturn void _rt_program_exit(int code);
|
||||
#endif
|
||||
|
||||
#if RT_API_ENVIRONMENT == 1
|
||||
static RT_Status rt_shell_exec(char const *cmd);
|
||||
static RT_Status rt_env_get(char const *name);
|
||||
#if _RT_API_ENVIRONMENT == 1
|
||||
static _RT_Status _rt_shell_exec(char const *cmd);
|
||||
static _RT_Status _rt_env_get(char const *name);
|
||||
#endif
|
||||
|
||||
// File API
|
||||
#if RT_API_FILE == 1
|
||||
struct RT_File typedef RT_File;
|
||||
struct RT_File {
|
||||
#if _RT_API_FILE == 1
|
||||
struct _RT_File typedef _RT_File;
|
||||
struct _RT_File {
|
||||
union {
|
||||
void *handle;
|
||||
u64 fd;
|
||||
};
|
||||
i32 flags;
|
||||
};
|
||||
static RT_Status rt_file_open(RT_File *file, char *name, int flags);
|
||||
static RT_Status rt_file_read(u64 size, void *buffer, RT_File *from, u64 *out_bytes_read);
|
||||
static RT_Status rt_file_write(RT_File *to, u64 size, void *buffer, u64 *out_bytes_written);
|
||||
static RT_Status rt_file_close(RT_File *file);
|
||||
static _RT_Status _rt_file_open(_RT_File *file, char *name, int flags);
|
||||
static _RT_Status _rt_file_read(u64 size, void *buffer, _RT_File *from, u64 *out_bytes_read);
|
||||
static _RT_Status _rt_file_write(_RT_File *to, u64 size, void *buffer, u64 *out_bytes_written);
|
||||
static _RT_Status _rt_file_close(_RT_File *file);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue