mirror of
https://git.planet-casio.com/Vhex-Kernel-Core/fxlibc.git
synced 2025-04-20 01:47:12 +02:00
fxlibc - v1.4.2 : fix reallocarray() + remove old Vhex/Casiowin sources
@update > CMakeLists.txt | remove casiowin-* target (unused) | remove x86-generic target (unused) | update files location | remove old vhex sources files (deprecated, unused) > src/posix | remove this folder > src/libc | move its content to src/ | remove thread module > src/stdlib/reallocarray | check if the multiplication overflow failed | set appropriate errno value if multiplication failed
This commit is contained in:
parent
996b2b8ded
commit
619afe25da
192 changed files with 163 additions and 1089 deletions
346
CMakeLists.txt
346
CMakeLists.txt
|
@ -23,18 +23,6 @@ if(FXLIBC_TARGET STREQUAL vhex-sh)
|
||||||
set(CMAKE_INSTALL_PREFIX "${FXSDK_COMPILER_INSTALL}" CACHE PATH "..." FORCE)
|
set(CMAKE_INSTALL_PREFIX "${FXSDK_COMPILER_INSTALL}" CACHE PATH "..." FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(FXLIBC_TARGET STREQUAL casiowin-fx)
|
|
||||||
list(APPEND TARGET_FOLDERS sh-generic)
|
|
||||||
set(FXLIBC_ARCH sh)
|
|
||||||
add_definitions(-D__SUPPORT_CASIOWIN_FX9860G)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(FXLIBC_TARGET STREQUAL casiowin-cg)
|
|
||||||
list(APPEND TARGET_FOLDERS sh-generic)
|
|
||||||
set(FXLIBC_ARCH sh)
|
|
||||||
add_definitions(-D__SUPPORT_CASIOWIN_FXCG50)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(FXLIBC_TARGET STREQUAL gint)
|
if(FXLIBC_TARGET STREQUAL gint)
|
||||||
list(APPEND TARGET_FOLDERS sh-generic)
|
list(APPEND TARGET_FOLDERS sh-generic)
|
||||||
set(FXLIBC_ARCH sh)
|
set(FXLIBC_ARCH sh)
|
||||||
|
@ -55,10 +43,6 @@ if(sh-generic IN_LIST TARGET_FOLDERS)
|
||||||
add_definitions(-D__SUPPORT_ARCH_SH)
|
add_definitions(-D__SUPPORT_ARCH_SH)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(x86-generic IN_LIST TARGET_FOLDERS)
|
|
||||||
add_definitions(-D__SUPPORT_ARCH_X86)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO: Preprocessor definitions for configuration
|
# TODO: Preprocessor definitions for configuration
|
||||||
# configure_file()
|
# configure_file()
|
||||||
|
|
||||||
|
@ -83,209 +67,187 @@ set(SOURCES
|
||||||
3rdparty/tinymt32/rand.c
|
3rdparty/tinymt32/rand.c
|
||||||
3rdparty/tinymt32/tinymt32.c
|
3rdparty/tinymt32/tinymt32.c
|
||||||
# assert
|
# assert
|
||||||
src/libc/assert/assert.c
|
src/assert/assert.c
|
||||||
# ctype
|
# ctype
|
||||||
src/libc/ctype/isalnum.c
|
src/ctype/isalnum.c
|
||||||
src/libc/ctype/isalpha.c
|
src/ctype/isalpha.c
|
||||||
src/libc/ctype/isblank.c
|
src/ctype/isblank.c
|
||||||
src/libc/ctype/iscntrl.c
|
src/ctype/iscntrl.c
|
||||||
src/libc/ctype/isdigit.c
|
src/ctype/isdigit.c
|
||||||
src/libc/ctype/isgraph.c
|
src/ctype/isgraph.c
|
||||||
src/libc/ctype/islower.c
|
src/ctype/islower.c
|
||||||
src/libc/ctype/isprint.c
|
src/ctype/isprint.c
|
||||||
src/libc/ctype/ispunct.c
|
src/ctype/ispunct.c
|
||||||
src/libc/ctype/isspace.c
|
src/ctype/isspace.c
|
||||||
src/libc/ctype/isupper.c
|
src/ctype/isupper.c
|
||||||
src/libc/ctype/isxdigit.c
|
src/ctype/isxdigit.c
|
||||||
src/libc/ctype/tolower.c
|
src/ctype/tolower.c
|
||||||
src/libc/ctype/toupper.c
|
src/ctype/toupper.c
|
||||||
# errno
|
# errno
|
||||||
src/libc/errno/errno.c
|
src/errno/errno.c
|
||||||
# inttypes
|
# inttypes
|
||||||
src/libc/inttypes/imaxabs.c
|
src/inttypes/imaxabs.c
|
||||||
src/libc/inttypes/imaxdiv.c
|
src/inttypes/imaxdiv.c
|
||||||
src/libc/inttypes/strtoimax.c
|
src/inttypes/strtoimax.c
|
||||||
src/libc/inttypes/strtoumax.c
|
src/inttypes/strtoumax.c
|
||||||
# locale
|
# locale
|
||||||
src/libc/locale/setlocale.c
|
src/locale/setlocale.c
|
||||||
src/libc/locale/localeconv.c
|
src/locale/localeconv.c
|
||||||
# signal
|
# signal
|
||||||
src/libc/signal/signal.c
|
src/signal/signal.c
|
||||||
src/libc/signal/raise.c
|
src/signal/raise.c
|
||||||
# stdio
|
# stdio
|
||||||
src/libc/stdio/asprintf.c
|
src/stdio/asprintf.c
|
||||||
src/libc/stdio/clearerr.c
|
src/stdio/clearerr.c
|
||||||
src/libc/stdio/dprintf.c
|
src/stdio/dprintf.c
|
||||||
src/libc/stdio/fclose.c
|
src/stdio/fclose.c
|
||||||
src/libc/stdio/fdopen.c
|
src/stdio/fdopen.c
|
||||||
src/libc/stdio/ferror.c
|
src/stdio/ferror.c
|
||||||
src/libc/stdio/feof.c
|
src/stdio/feof.c
|
||||||
src/libc/stdio/fflush.c
|
src/stdio/fflush.c
|
||||||
src/libc/stdio/fgetc.c
|
src/stdio/fgetc.c
|
||||||
src/libc/stdio/fgetpos.c
|
src/stdio/fgetpos.c
|
||||||
src/libc/stdio/fgets.c
|
src/stdio/fgets.c
|
||||||
src/libc/stdio/fileutil.c
|
src/stdio/fileutil.c
|
||||||
src/libc/stdio/fopen.c
|
src/stdio/fopen.c
|
||||||
src/libc/stdio/fprintf.c
|
src/stdio/fprintf.c
|
||||||
src/libc/stdio/fputc.c
|
src/stdio/fputc.c
|
||||||
src/libc/stdio/fputs.c
|
src/stdio/fputs.c
|
||||||
src/libc/stdio/fread.c
|
src/stdio/fread.c
|
||||||
src/libc/stdio/freopen.c
|
src/stdio/freopen.c
|
||||||
src/libc/stdio/fseek.c
|
src/stdio/fseek.c
|
||||||
src/libc/stdio/fsetpos.c
|
src/stdio/fsetpos.c
|
||||||
src/libc/stdio/ftell.c
|
src/stdio/ftell.c
|
||||||
src/libc/stdio/fwrite.c
|
src/stdio/fwrite.c
|
||||||
src/libc/stdio/getc.c
|
src/stdio/getc.c
|
||||||
src/libc/stdio/getchar.c
|
src/stdio/getchar.c
|
||||||
src/libc/stdio/gets.c
|
src/stdio/gets.c
|
||||||
src/libc/stdio/getline.c
|
src/stdio/getline.c
|
||||||
src/libc/stdio/getdelim.c
|
src/stdio/getdelim.c
|
||||||
src/libc/stdio/perror.c
|
src/stdio/perror.c
|
||||||
src/libc/stdio/printf.c
|
src/stdio/printf.c
|
||||||
src/libc/stdio/printf/format_fixed.c
|
src/stdio/printf/format_fixed.c
|
||||||
src/libc/stdio/printf/format_fp.c
|
src/stdio/printf/format_fp.c
|
||||||
src/libc/stdio/printf/format_usual.c
|
src/stdio/printf/format_usual.c
|
||||||
src/libc/stdio/printf/print.c
|
src/stdio/printf/print.c
|
||||||
src/libc/stdio/printf/util.c
|
src/stdio/printf/util.c
|
||||||
src/libc/stdio/putc.c
|
src/stdio/putc.c
|
||||||
src/libc/stdio/putchar.c
|
src/stdio/putchar.c
|
||||||
src/libc/stdio/puts.c
|
src/stdio/puts.c
|
||||||
src/libc/stdio/remove.c
|
src/stdio/remove.c
|
||||||
src/libc/stdio/rewind.c
|
src/stdio/rewind.c
|
||||||
src/libc/stdio/setbuf.c
|
src/stdio/setbuf.c
|
||||||
src/libc/stdio/setvbuf.c
|
src/stdio/setvbuf.c
|
||||||
src/libc/stdio/snprintf.c
|
src/stdio/snprintf.c
|
||||||
src/libc/stdio/sprintf.c
|
src/stdio/sprintf.c
|
||||||
src/libc/stdio/streams.c
|
src/stdio/streams.c
|
||||||
src/libc/stdio/ungetc.c
|
src/stdio/ungetc.c
|
||||||
src/libc/stdio/vasprintf.c
|
src/stdio/vasprintf.c
|
||||||
src/libc/stdio/vdprintf.c
|
src/stdio/vdprintf.c
|
||||||
src/libc/stdio/vfprintf.c
|
src/stdio/vfprintf.c
|
||||||
src/libc/stdio/vprintf.c
|
src/stdio/vprintf.c
|
||||||
src/libc/stdio/vsnprintf.c
|
src/stdio/vsnprintf.c
|
||||||
src/libc/stdio/vsprintf.c
|
src/stdio/vsprintf.c
|
||||||
# stdlib
|
# stdlib
|
||||||
src/libc/stdlib/abort.c
|
src/stdlib/abort.c
|
||||||
src/libc/stdlib/abs.c
|
src/stdlib/abs.c
|
||||||
src/libc/stdlib/atof.c
|
src/stdlib/atof.c
|
||||||
src/libc/stdlib/atoi.c
|
src/stdlib/atoi.c
|
||||||
src/libc/stdlib/atol.c
|
src/stdlib/atol.c
|
||||||
src/libc/stdlib/atoll.c
|
src/stdlib/atoll.c
|
||||||
src/libc/stdlib/calloc.c
|
src/stdlib/calloc.c
|
||||||
src/libc/stdlib/div.c
|
src/stdlib/div.c
|
||||||
src/libc/stdlib/exit.c
|
src/stdlib/exit.c
|
||||||
src/libc/stdlib/labs.c
|
src/stdlib/labs.c
|
||||||
src/libc/stdlib/ldiv.c
|
src/stdlib/ldiv.c
|
||||||
src/libc/stdlib/llabs.c
|
src/stdlib/llabs.c
|
||||||
src/libc/stdlib/lldiv.c
|
src/stdlib/lldiv.c
|
||||||
src/libc/stdlib/qsort.c
|
src/stdlib/qsort.c
|
||||||
src/libc/stdlib/reallocarray.c
|
src/stdlib/reallocarray.c
|
||||||
src/libc/stdlib/strto_fp.c
|
src/stdlib/strto_fp.c
|
||||||
src/libc/stdlib/strto_int.c
|
src/stdlib/strto_int.c
|
||||||
src/libc/stdlib/strtod.c
|
src/stdlib/strtod.c
|
||||||
src/libc/stdlib/strtof.c
|
src/stdlib/strtof.c
|
||||||
src/libc/stdlib/strtol.c
|
src/stdlib/strtol.c
|
||||||
src/libc/stdlib/strtold.c
|
src/stdlib/strtold.c
|
||||||
src/libc/stdlib/strtoll.c
|
src/stdlib/strtoll.c
|
||||||
src/libc/stdlib/strtoul.c
|
src/stdlib/strtoul.c
|
||||||
src/libc/stdlib/strtoull.c
|
src/stdlib/strtoull.c
|
||||||
# string
|
# string
|
||||||
src/libc/string/memchr.c
|
src/string/memchr.c
|
||||||
src/libc/string/memcmp.c
|
src/string/memcmp.c
|
||||||
src/libc/string/memcpy.c
|
src/string/memcpy.c
|
||||||
src/libc/string/memmove.c
|
src/string/memmove.c
|
||||||
src/libc/string/memrchr.c
|
src/string/memrchr.c
|
||||||
src/libc/string/memset.c
|
src/string/memset.c
|
||||||
src/libc/string/strcasecmp.c
|
src/string/strcasecmp.c
|
||||||
src/libc/string/strcasestr.c
|
src/string/strcasestr.c
|
||||||
src/libc/string/strcat.c
|
src/string/strcat.c
|
||||||
src/libc/string/strchr.c
|
src/string/strchr.c
|
||||||
src/libc/string/strchrnul.c
|
src/string/strchrnul.c
|
||||||
src/libc/string/strcmp.c
|
src/string/strcmp.c
|
||||||
src/libc/string/strcoll.c
|
src/string/strcoll.c
|
||||||
src/libc/string/strcpy.c
|
src/string/strcpy.c
|
||||||
src/libc/string/strcspn.c
|
src/string/strcspn.c
|
||||||
src/libc/string/strdup.c
|
src/string/strdup.c
|
||||||
src/libc/string/strerror.c
|
src/string/strerror.c
|
||||||
src/libc/string/strlen.c
|
src/string/strlen.c
|
||||||
src/libc/string/strncasecmp.c
|
src/string/strncasecmp.c
|
||||||
src/libc/string/strncat.c
|
src/string/strncat.c
|
||||||
src/libc/string/strncmp.c
|
src/string/strncmp.c
|
||||||
src/libc/string/strncpy.c
|
src/string/strncpy.c
|
||||||
src/libc/string/strndup.c
|
src/string/strndup.c
|
||||||
src/libc/string/strnlen.c
|
src/string/strnlen.c
|
||||||
src/libc/string/strpbrk.c
|
src/string/strpbrk.c
|
||||||
src/libc/string/strrchr.c
|
src/string/strrchr.c
|
||||||
src/libc/string/strspn.c
|
src/string/strspn.c
|
||||||
src/libc/string/strstr.c
|
src/string/strstr.c
|
||||||
src/libc/string/strstr_base.c
|
src/string/strstr_base.c
|
||||||
src/libc/string/strtok.c
|
src/string/strtok.c
|
||||||
src/libc/string/strxfrm.c
|
src/string/strxfrm.c
|
||||||
# time
|
# time
|
||||||
src/libc/time/asctime.c
|
src/time/asctime.c
|
||||||
src/libc/time/ctime.c
|
src/time/ctime.c
|
||||||
src/libc/time/difftime.c
|
src/time/difftime.c
|
||||||
src/libc/time/gmtime.c
|
src/time/gmtime.c
|
||||||
src/libc/time/localtime.c
|
src/time/localtime.c
|
||||||
src/libc/time/mktime.c
|
src/time/mktime.c
|
||||||
src/libc/time/strftime.c)
|
src/time/strftime.c)
|
||||||
|
|
||||||
# Silence extended warnings on Grisu2b code
|
# Silence extended warnings on Grisu2b code
|
||||||
set_source_files_properties(3rdparty/grisu2b_59_56/grisu2b_59_56.c PROPERTIES
|
set_source_files_properties(3rdparty/grisu2b_59_56/grisu2b_59_56.c PROPERTIES
|
||||||
COMPILE_OPTIONS "-Wno-all;-Wno-extra")
|
COMPILE_OPTIONS "-Wno-all;-Wno-extra")
|
||||||
|
|
||||||
if(vhex-generic IN_LIST TARGET_FOLDERS)
|
|
||||||
# TODO
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(vhex-sh IN_LIST TARGET_FOLDERS)
|
if(vhex-sh IN_LIST TARGET_FOLDERS)
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
src/libc/signal/target/vhex-sh/kill.S
|
src/stdlib/target/vhex-sh/free.c
|
||||||
src/libc/signal/target/vhex-sh/signal.S
|
src/stdlib/target/vhex-sh/malloc.c
|
||||||
src/libc/stdlib/target/vhex-sh/free.c
|
src/stdlib/target/vhex-sh/realloc.c
|
||||||
src/libc/stdlib/target/vhex-sh/malloc.c
|
)
|
||||||
src/libc/stdlib/target/vhex-sh/realloc.c
|
|
||||||
src/posix/fcntl/target/vhex-sh/open.S
|
|
||||||
src/posix/sys/wait/target/vhex-sh/wait.S
|
|
||||||
src/posix/sys/wait/target/vhex-sh/waitpid.S
|
|
||||||
src/posix/unistd/target/vhex-sh/read.S
|
|
||||||
src/posix/unistd/target/vhex-sh/getppid.S
|
|
||||||
src/posix/unistd/target/vhex-sh/close.S
|
|
||||||
src/posix/unistd/target/vhex-sh/fork_execve.S
|
|
||||||
src/posix/unistd/target/vhex-sh/lseek.S
|
|
||||||
src/posix/unistd/target/vhex-sh/getpid.S
|
|
||||||
src/posix/unistd/target/vhex-sh/getpgid.S
|
|
||||||
src/posix/unistd/target/vhex-sh/setpgid.S
|
|
||||||
src/posix/unistd/target/vhex-sh/write.S)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(sh-generic IN_LIST TARGET_FOLDERS)
|
if(sh-generic IN_LIST TARGET_FOLDERS)
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
src/libc/setjmp/target/sh-generic/setjmp.S
|
src/setjmp/target/sh-generic/setjmp.S
|
||||||
src/libc/setjmp/target/sh-generic/longjmp.S
|
src/setjmp/target/sh-generic/longjmp.S
|
||||||
src/libc/string/target/sh-generic/memchr.S
|
src/string/target/sh-generic/memchr.S
|
||||||
src/libc/string/target/sh-generic/memcmp.S
|
src/string/target/sh-generic/memcmp.S
|
||||||
src/libc/string/target/sh-generic/memcpy.S
|
src/string/target/sh-generic/memcpy.S
|
||||||
src/libc/string/target/sh-generic/memmove.S
|
src/string/target/sh-generic/memmove.S
|
||||||
src/libc/string/target/sh-generic/memset.S
|
src/string/target/sh-generic/memset.S
|
||||||
src/libc/string/target/sh-generic/strlen.S
|
src/string/target/sh-generic/strlen.S
|
||||||
src/target/sh-generic/cpucap.c)
|
src/target/sh-generic/cpucap.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(gint IN_LIST TARGET_FOLDERS)
|
if(gint IN_LIST TARGET_FOLDERS)
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
# stdlib
|
# stdlib
|
||||||
src/libc/stdlib/target/gint/free.c
|
src/stdlib/target/gint/free.c
|
||||||
src/libc/stdlib/target/gint/malloc.c
|
src/stdlib/target/gint/malloc.c
|
||||||
src/libc/stdlib/target/gint/realloc.c
|
src/stdlib/target/gint/realloc.c
|
||||||
# time
|
# time
|
||||||
src/libc/time/target/gint/clock.c
|
src/time/target/gint/clock.c
|
||||||
src/libc/time/target/gint/time.c)
|
src/time/target/gint/time.c)
|
||||||
endif()
|
|
||||||
|
|
||||||
if(casiowin-fx IN_LIST TARGET_FOLDERS)
|
|
||||||
list(APPEND SOURCES
|
|
||||||
src/posix/unistd/target/casiowin-fx/close.S)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO: All targets
|
# TODO: All targets
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
#ifndef __BITS_TRAPA_H__
|
|
||||||
# define __BITS_TRAPA_H__
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Normally the SH3/SH4 processor provide a "trapa" instruction which allow
|
|
||||||
** tipping between userland and kernel. But Casio's don't use this method
|
|
||||||
** (this is why we are always in "privilegied mode" and we can do whatever
|
|
||||||
** we whant) but use custom calling convention to access the syscall call.
|
|
||||||
**
|
|
||||||
** The convention whant that the user jump into the syscall trampoline code
|
|
||||||
** located at 0x80010070 for fx9860g and 0x80020070 for fxcg20/50.
|
|
||||||
*/
|
|
||||||
# define casio_trapa(id) \
|
|
||||||
mov.l syscall_table, r2 ;\
|
|
||||||
mov.l syscall_id, r0 ;\
|
|
||||||
jmp @r2 ;\
|
|
||||||
nop ;\
|
|
||||||
.align 4 ;\
|
|
||||||
syscall_table: .long 0x80020070 ;\
|
|
||||||
syscall_id: .long id
|
|
||||||
|
|
||||||
#endif /*__BITS_TRAPA_H__*/
|
|
|
@ -1,34 +0,0 @@
|
||||||
#ifndef __BITS_UNISTD_32_H__
|
|
||||||
# define __BITS_UNISTD_32_H__
|
|
||||||
|
|
||||||
// File manipulation
|
|
||||||
#define __NR_BFile_Remove 0x00001db4
|
|
||||||
#define __NR_BFile_Create 0x00001dae
|
|
||||||
#define __NR_BFile_Open 0x00001da3
|
|
||||||
#define __NR_BFile_Close 0x00001da4
|
|
||||||
#define __NR_BFile_Size 0x00001da6
|
|
||||||
#define __NR_BFile_Write 0x00001daf
|
|
||||||
#define __NR_BFile_Read 0x00001dac
|
|
||||||
#define __NR_BFile_FindFirst 0x00001db7
|
|
||||||
#define __NR_BFile_FindNext 0x00001db9
|
|
||||||
#define __NR_BFile_FindClose 0x00001dba
|
|
||||||
|
|
||||||
// Keyboard interface
|
|
||||||
#define __NR_PutKeyCode 0x000012c6
|
|
||||||
#define __NR_GetKeyWait 0x000012bf
|
|
||||||
#define __NR_ClearKeyBuffer 0x000012c7
|
|
||||||
#define __NR_GetVRAMAddress 0x000001e6
|
|
||||||
|
|
||||||
// Memory management
|
|
||||||
#define __NR_Bmem_malloc 0x00001f44
|
|
||||||
#define __NR_Bmem_free 0x00001f42
|
|
||||||
#define __NR_Bmem_calloc 0x00001f40
|
|
||||||
#define __NR_Bmem_realloc 0x00001f46
|
|
||||||
|
|
||||||
// Timer interface
|
|
||||||
#define __NR_Timer_Install 0x000008d9
|
|
||||||
#define __NR_Timer_Deinstall 0x000008da
|
|
||||||
#define __NR_Timer_Start 0x000008db
|
|
||||||
#define __NR_Timer_Stop 0x000008dc
|
|
||||||
|
|
||||||
#endif /*__BITS_UNISTD_32_H__*/
|
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef __BITS_CONFNAME_H__
|
|
||||||
# define __BITS_CONFNAME_H__
|
|
||||||
|
|
||||||
#define _SC_PAGE_SIZE 0
|
|
||||||
#define _SC_PAGESIZE _SC_PAGE_SIZE
|
|
||||||
|
|
||||||
#endif /*__BITS_CONFNAME_H__*/
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef __BITS_EXIT_H__
|
|
||||||
# define __BITS_EXIT_H__
|
|
||||||
|
|
||||||
/* Exit codes for CASIOWIN add-ins. */
|
|
||||||
#define EXIT_SUCCESS 1
|
|
||||||
#define EXIT_FAILURE 0
|
|
||||||
|
|
||||||
#endif /*__BITS_EXIT_H__*/
|
|
|
@ -1,57 +0,0 @@
|
||||||
#ifndef __BITS_UNISTD_32_H__
|
|
||||||
# define __BITS_UNISTD_32_H__
|
|
||||||
|
|
||||||
// File manipulation
|
|
||||||
#define __NR_Bfile_CreateFile 0x00000434
|
|
||||||
#define __NR_Bfile_OpenFile 0x0000042c
|
|
||||||
#define __NR_Bfile_WriteFile 0x00000435
|
|
||||||
#define __NR_Bfile_ReadFile 0x00000432
|
|
||||||
#define __NR_Bfile_SeekFile 0x00000431
|
|
||||||
#define __NR_Bfile_CloseFile 0x0000042d
|
|
||||||
#define __NR_Bfile_FindFirst 0x0000043b
|
|
||||||
#define __NR_Bfile_FindNext 0x0000043c
|
|
||||||
#define __NR_Bfile_FindClose 0x0000043d
|
|
||||||
#define __NR_Bfile_GetMediaFree 0x0000042e
|
|
||||||
#define __NR_Bfile_RemoveFile 0x00000439
|
|
||||||
|
|
||||||
// Display syscalls
|
|
||||||
#define __NR_Bdisp_GetVRAM 0x00000135
|
|
||||||
#define __NR_Bdisp_DrawLine 0x00000030
|
|
||||||
#define __NR_Bdisp_AllClr_VRAM 0x00000143
|
|
||||||
#define __NR_Bdisp_Display 0x00000028
|
|
||||||
#define __NR_Bdisp_PrintMini 0x00000c4f
|
|
||||||
#define __NR_Bdisp_ClearArea 0x0000014b
|
|
||||||
#define __NR_Bdisp_ReverseArea 0x0000014d
|
|
||||||
#define __NR_Bdisp_RestoreDisp 0x00000814
|
|
||||||
#define __NR_Bdisp_SaveDisp 0x00000813
|
|
||||||
|
|
||||||
// Keyboard primitives
|
|
||||||
#define __NR_Bkey_GetKey 0x0000090f
|
|
||||||
#define __NR_Bkey_PutKeycode 0x0000024f
|
|
||||||
#define __NR_BKey_GetKeyWait 0x00000247
|
|
||||||
|
|
||||||
// Memory management
|
|
||||||
#define __NR_Bmem_malloc 0x00000acd
|
|
||||||
#define __NR_Bmem_realloc 0x00000e6d
|
|
||||||
#define __NR_Bmem_called 0x00000e6b
|
|
||||||
#define __NR_Bmem_free 0x00000acc
|
|
||||||
|
|
||||||
// USB primitive
|
|
||||||
#define __NR_USB_Open 0x000002ac // not sure
|
|
||||||
#define __NR_USB_Close 0x000004a4 // not sure
|
|
||||||
|
|
||||||
// SD Card primitives
|
|
||||||
#define __NR_SDC_Init 0x0000017a // not sure
|
|
||||||
#define __NR_SDC_Mount 0x0000044b // not sure
|
|
||||||
#define __NR_SDC_Umount 0x0000044a
|
|
||||||
|
|
||||||
// Timer interface
|
|
||||||
#define __NR_TimerInstall 0x00000118
|
|
||||||
#define __NR_TimerDeinstall 0x00000119
|
|
||||||
#define __NR_TimerStart 0x0000011a
|
|
||||||
#define __NR_TimerStop 0x0000011b
|
|
||||||
|
|
||||||
// power management
|
|
||||||
#define __NR_PowerOff 0x000003f4
|
|
||||||
|
|
||||||
#endif /*__BITS_UNISTD_32__*/
|
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef __BITS_CONFNAME_H__
|
|
||||||
# define __BITS_CONFNAME_H__
|
|
||||||
|
|
||||||
#define _SC_PAGE_SIZE 0
|
|
||||||
#define _SC_PAGESIZE _SC_PAGE_SIZE
|
|
||||||
|
|
||||||
#endif /*__BITS_CONFNAME_H__*/
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef __BITS_EXIT_H__
|
|
||||||
# define __BITS_EXIT_H__
|
|
||||||
|
|
||||||
/* Exit codes for CASIOWIN add-ins. */
|
|
||||||
#define EXIT_SUCCESS 1
|
|
||||||
#define EXIT_FAILURE 0
|
|
||||||
|
|
||||||
#endif /*__BITS_EXIT_H__*/
|
|
|
@ -1,22 +0,0 @@
|
||||||
#ifndef __BITS_TRAPA_H__
|
|
||||||
# define __BITS_TRAPA_H__
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Normally the SH3/SH4 processor provide a "trapa" instruction which allow
|
|
||||||
** tipping between userland and kernel. But Casio's don't use this method
|
|
||||||
** (this is why we are always in "privilegied mode" and we can do whatever
|
|
||||||
** we whant) but use custom calling convention to access the syscall call.
|
|
||||||
**
|
|
||||||
** The convention whant that the user jump into the syscall trampoline code
|
|
||||||
** located at 0x80010070 for fx9860g and 0x80020070 for fxcg20/50.
|
|
||||||
*/
|
|
||||||
# define casio_trapa(id) \
|
|
||||||
mov.l syscall_table, r2 ;\
|
|
||||||
mov.l syscall_id, r0 ;\
|
|
||||||
jmp @r2 ;\
|
|
||||||
nop ;\
|
|
||||||
.align 4 ;\
|
|
||||||
syscall_table: .long 0x80010070 ;\
|
|
||||||
syscall_id: .long id
|
|
||||||
|
|
||||||
#endif /*__BITS_TRAPA_H__*/
|
|
|
@ -1,45 +0,0 @@
|
||||||
#ifndef __BITS_ASM_UNISTD_32_H__
|
|
||||||
# define __BITS_ASM_UNISTD_32_H__
|
|
||||||
|
|
||||||
// Define the number of syscall
|
|
||||||
#define __NR_MAX 21
|
|
||||||
|
|
||||||
// Kernel Test
|
|
||||||
#define __NR_test_syscall 0
|
|
||||||
|
|
||||||
// Process
|
|
||||||
#define __NR_exit 1
|
|
||||||
#define __NR_fork_execve 2 // (custom)
|
|
||||||
#define __NR_waitpid 3
|
|
||||||
#define __NR_wait 4
|
|
||||||
#define __NR_getpid 5
|
|
||||||
#define __NR_getppid 6
|
|
||||||
#define __NR_getpgid 7
|
|
||||||
#define __NR_setpgid 8
|
|
||||||
|
|
||||||
// Signal
|
|
||||||
#define __NR_signal 9
|
|
||||||
#define __NR_sigreturn 10
|
|
||||||
#define __NR_sigaction 11
|
|
||||||
#define __NR_kill 12
|
|
||||||
#define __NR_sigprogmask 13
|
|
||||||
#define __NR_sigpending 14
|
|
||||||
#define __NR_sigaltstack 15
|
|
||||||
|
|
||||||
// VFS
|
|
||||||
#define __NR_read 16
|
|
||||||
#define __NR_write 17
|
|
||||||
#define __NR_open 18
|
|
||||||
#define __NR_close 19
|
|
||||||
#define __NR_lseek 20
|
|
||||||
#define __NR_pread 21
|
|
||||||
#define __NR_pwrite 22
|
|
||||||
|
|
||||||
// Memory
|
|
||||||
#define __NR_mmap 23
|
|
||||||
#define __NR_munmap 24
|
|
||||||
#define __NR_proc_heap_alloc 25 // (custom)
|
|
||||||
#define __NR_proc_heap_free 26 // (custom)
|
|
||||||
#define __NR_proc_heap_realloc 27 // (custom)
|
|
||||||
|
|
||||||
#endif /*__BITS_ASM_UNISTD_32_H__*/
|
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef __BITS_CONFNAME_H__
|
|
||||||
# define __BITS_CONFNAME_H__
|
|
||||||
|
|
||||||
//FIXME: this part is probably arch-specific(?)
|
|
||||||
#define _SC_PAGE_SIZE 0
|
|
||||||
#define _SC_PAGESIZE _SC_PAGE_SIZE
|
|
||||||
|
|
||||||
#endif /*__BITS_CONFNAME_H__*/
|
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef __BITS_EXIT_H__
|
|
||||||
# define __BITS_EXIT_H__
|
|
||||||
|
|
||||||
#define EXIT_SUCCESS 0
|
|
||||||
#define EXIT_FAILURE 1
|
|
||||||
|
|
||||||
#endif /*__BITS_EXIT_H__*/
|
|
|
@ -1,12 +0,0 @@
|
||||||
#ifndef __BITS_SIGACTION_H__
|
|
||||||
# define __BITS_SIGACTION_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
/* Values for the HOW argument to `sigprocmask'. */
|
|
||||||
#define SIG_BLOCK 0 /* Block signals. */
|
|
||||||
#define SIG_UNBLOCK 1 /* Unblock signals. */
|
|
||||||
#define SIG_SETMASK 2 /* Set the set of blocked signals. */
|
|
||||||
|
|
||||||
#endif /*__BITS_SIGACTION_H__*/
|
|
|
@ -1,50 +0,0 @@
|
||||||
#ifndef __BITS_SIGNUM_H__
|
|
||||||
# define __BITS_SIGNUM_H__
|
|
||||||
|
|
||||||
// Define the number of signals
|
|
||||||
#define _NSIG 32
|
|
||||||
|
|
||||||
// Vhex kernel internal define used to indicate
|
|
||||||
// if the signal is implemented or not
|
|
||||||
#define __SIGUNDEF ((__sighandler_t) -2) /* Not implemented */
|
|
||||||
|
|
||||||
/* Fake signal functions. */
|
|
||||||
#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
|
|
||||||
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
|
|
||||||
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
|
|
||||||
|
|
||||||
/* ISO C99 signals. */
|
|
||||||
#define SIGINT 2 /* Interactive attention signal. */
|
|
||||||
#define SIGILL 4 /* Illegal instruction. */
|
|
||||||
#define SIGABRT 6 /* Abnormal termination. */
|
|
||||||
#define SIGFPE 8 /* Erroneous arithmetic operation. */
|
|
||||||
#define SIGSEGV 11 /* Invalid access to storage. */
|
|
||||||
#define SIGTERM 15 /* Termination request. */
|
|
||||||
|
|
||||||
/* Historical signals specified by POSIX. */
|
|
||||||
#define SIGHUP 1 /* Hangup. */
|
|
||||||
#define SIGQUIT 3 /* Quit. */
|
|
||||||
#define SIGTRAP 5 /* Trace/breakpoint trap. */
|
|
||||||
#define SIGKILL 9 /* Killed. */
|
|
||||||
#define SIGBUS 10 /* Bus error. */
|
|
||||||
#define SIGSYS 12 /* Bad system call. */
|
|
||||||
#define SIGPIPE 13 /* Broken pipe. */
|
|
||||||
#define SIGALRM 14 /* Alarm clock. */
|
|
||||||
|
|
||||||
/* New(er) POSIX signals (1003.1-2008, 1003.1-2013). */
|
|
||||||
#define SIGURG 16 /* Urgent data is available at a socket. */
|
|
||||||
#define SIGSTOP 17 /* Stop, unblockable. */
|
|
||||||
#define SIGTSTP 18 /* Keyboard stop. */
|
|
||||||
#define SIGCONT 19 /* Continue. */
|
|
||||||
#define SIGCHLD 20 /* Child terminated or stopped. */
|
|
||||||
#define SIGTTIN 21 /* Background read from control terminal. */
|
|
||||||
#define SIGTTOU 22 /* Background write to control terminal. */
|
|
||||||
#define SIGPOLL 23 /* Pollable event occurred (System V). */
|
|
||||||
#define SIGXCPU 24 /* CPU time limit exceeded. */
|
|
||||||
#define SIGXFSZ 25 /* File size limit exceeded. */
|
|
||||||
#define SIGVTALRM 26 /* Virtual timer expired. */
|
|
||||||
#define SIGPROF 27 /* Profiling timer expired. */
|
|
||||||
#define SIGUSR1 30 /* User-defined signal 1. */
|
|
||||||
#define SIGUSR2 31 /* User-defined signal 2. */
|
|
||||||
|
|
||||||
#endif /*__BITS_SIGNUM_H__*/
|
|
|
@ -1,9 +0,0 @@
|
||||||
#ifndef __BITS_WAITFLAGS_H__
|
|
||||||
# define __BITS_WAITFLAGS_H__
|
|
||||||
|
|
||||||
/* Bits in the third argument to `waitpid'. */
|
|
||||||
#define WNOHANG 1 /* Don't block waiting. */
|
|
||||||
#define WUNTRACED 2 /* Report status of stopped child. */
|
|
||||||
#define WCONTINUED 3 /* Report continued child. */
|
|
||||||
|
|
||||||
#endif /*__BITS_WAITFLAGS_H__*/
|
|
|
@ -1,35 +0,0 @@
|
||||||
#ifndef __BITS_WAITSTATUS_H__
|
|
||||||
# define __BITS_WAITSTATUS_H__
|
|
||||||
|
|
||||||
/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */
|
|
||||||
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
|
|
||||||
|
|
||||||
/* If WIFSIGNALED(STATUS), the terminating signal. */
|
|
||||||
#define __WTERMSIG(status) ((status) & 0x7f)
|
|
||||||
|
|
||||||
/* If WIFSTOPPED(STATUS), the signal that stopped the child. */
|
|
||||||
#define __WSTOPSIG(status) __WEXITSTATUS(status)
|
|
||||||
|
|
||||||
/* Nonzero if STATUS indicates normal termination. */
|
|
||||||
#define __WIFEXITED(status) (__WTERMSIG(status) == 0)
|
|
||||||
|
|
||||||
/* Nonzero if STATUS indicates termination by a signal. */
|
|
||||||
#define __WIFSIGNALED(status) \
|
|
||||||
(((signed char) (((status) & 0x7f) + 1) >> 1) > 0)
|
|
||||||
|
|
||||||
/* Nonzero if STATUS indicates the child is stopped. */
|
|
||||||
#define __WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
|
|
||||||
|
|
||||||
/* Nonzero if STATUS indicates the child continued after a stop. */
|
|
||||||
# define __WIFCONTINUED(status) ((status) == __W_CONTINUED)
|
|
||||||
|
|
||||||
/* Nonzero if STATUS indicates the child dumped core. */
|
|
||||||
#define __WCOREDUMP(status) ((status) & __WCOREFLAG)
|
|
||||||
|
|
||||||
/* Macros for constructing status values. */
|
|
||||||
#define __W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
|
|
||||||
#define __W_STOPCODE(sig) ((sig) << 8 | 0x7f)
|
|
||||||
#define __W_CONTINUED 0xffff
|
|
||||||
#define __WCOREFLAG 0x80
|
|
||||||
|
|
||||||
#endif /*__BITS_WAITSTATUS_H__*/
|
|
|
@ -1,85 +0,0 @@
|
||||||
#ifndef __THREADS_H__
|
|
||||||
# define __THREADS_H__
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
//---
|
|
||||||
// Warnig, this part is experimental and reserved for Vhex
|
|
||||||
//---
|
|
||||||
|
|
||||||
// Define Mutex type
|
|
||||||
enum {
|
|
||||||
mtx_plain = 0,
|
|
||||||
mtx_recursive = 1,
|
|
||||||
mtx_timed = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
// Define mutex structure
|
|
||||||
// @note: This is a custom implementation
|
|
||||||
#define MTX_WATERMARK (0xdeadbeef)
|
|
||||||
struct __mtx_s {
|
|
||||||
uint32_t __watermark;
|
|
||||||
uint16_t lock;
|
|
||||||
uint8_t type;
|
|
||||||
};
|
|
||||||
typedef struct __mtx_s mtx_t;
|
|
||||||
|
|
||||||
|
|
||||||
//---
|
|
||||||
// Mutex functions
|
|
||||||
//---
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Creates a new mutex object with type __TYPE.
|
|
||||||
** @note: If successful the new object is pointed by __MUTEX.
|
|
||||||
*/
|
|
||||||
extern int mtx_init(mtx_t *__mutex, int __type);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Block the current thread until the mutex pointed to by __MUTEX is unlocked.
|
|
||||||
** In that case current thread will not be blocked.
|
|
||||||
*/
|
|
||||||
extern int mtx_lock(mtx_t *__mutex);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Try to lock the mutex pointed by __MUTEX without blocking.
|
|
||||||
** @note: If the mutex is free the current threads takes control of it,
|
|
||||||
** otherwise it returns immediately.
|
|
||||||
*/
|
|
||||||
extern int mtx_trylock(mtx_t *__mutex);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Unlock the mutex pointed by __MUTEX.
|
|
||||||
** @note: It may potentially awake other threads waiting on this mutex.
|
|
||||||
*/
|
|
||||||
extern int mtx_unlock (mtx_t *__mutex);
|
|
||||||
|
|
||||||
/* Destroy the mutex object pointed by __MUTEX. */
|
|
||||||
extern void mtx_destroy(mtx_t *__mutex);
|
|
||||||
|
|
||||||
|
|
||||||
//---
|
|
||||||
// Atomic operations
|
|
||||||
//---
|
|
||||||
/*
|
|
||||||
** Save the current SR register and set the SR.BIT bit up (start atomic operations)
|
|
||||||
** @note: return the saved SR register (if has been saved), 0xffffffff otherwise.
|
|
||||||
*/
|
|
||||||
extern uint32_t __thread_atomic_start(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Restore the saved SR register
|
|
||||||
** @note: return the restored SR register or -1 otherwise.
|
|
||||||
*/
|
|
||||||
extern uint32_t __thread_atomic_stop(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*__THREADS_H__*/
|
|
|
@ -1,18 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _kill
|
|
||||||
.type _kill, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern int kill(pid_t pid, int sig);
|
|
||||||
** Send signal SIG to process number PID. If PID is zero, send SIG to all
|
|
||||||
** processes in the current process's process group. If PID is < -1, send SIG to
|
|
||||||
** all processes in process group - PID.
|
|
||||||
*/
|
|
||||||
_kill:
|
|
||||||
trapa #__NR_kill
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _signal
|
|
||||||
.type _signal, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern void (*signal(int signum, void (*handler)(int)))(int);
|
|
||||||
** Set the handler for the signal SIG to HANDLER, returning the old handler, or
|
|
||||||
** SIG_ERR on error. By default `signal' has the BSD semantic.
|
|
||||||
*/
|
|
||||||
_signal:
|
|
||||||
trapa #__NR_signal
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,95 +0,0 @@
|
||||||
.text
|
|
||||||
.global ___thread_atomic_start
|
|
||||||
.global ___thread_atomic_stop
|
|
||||||
|
|
||||||
.type ___thread_atomic_start, @function
|
|
||||||
.type ___thread_atomic_stop, @function
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern uint32_t __thread_atomic_start(void)
|
|
||||||
** Save the current SR register and set the SR.BIT bit up to start an atomic
|
|
||||||
** context (interrupt is blocked).
|
|
||||||
** Return the saved SR register (only if the we enter into an atomic context),
|
|
||||||
** 0xffffffff otherwise.
|
|
||||||
*/
|
|
||||||
___thread_atomic_start:
|
|
||||||
! Check if the user is currently into an atomic operation
|
|
||||||
! and update atomic counter.
|
|
||||||
mov.l atomic_counter, r1
|
|
||||||
mov.l @r1, r2
|
|
||||||
tst r2, r2
|
|
||||||
add #1, r2
|
|
||||||
mov.l r2, @r1
|
|
||||||
bf.s atomic_start_exit
|
|
||||||
mov #-1, r0
|
|
||||||
|
|
||||||
! Block interrupt if needed.
|
|
||||||
stc sr, r1
|
|
||||||
mov r1, r0
|
|
||||||
mov.l bl_mask, r2
|
|
||||||
or r2, r1
|
|
||||||
ldc r1, sr
|
|
||||||
|
|
||||||
! Save "old" SR register.
|
|
||||||
mov.l sr_save, r1
|
|
||||||
mov.l r0, @r1
|
|
||||||
|
|
||||||
atomic_start_exit:
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
|
|
||||||
/*
|
|
||||||
** extern uint32_t __thread_atomic_stop(void)
|
|
||||||
** Decreate the internal "atomic context counter" and if the counter is 0,
|
|
||||||
** restore the saved SR register status.
|
|
||||||
** Return the restored SR register (if restored) or -1 otherwise.
|
|
||||||
*/
|
|
||||||
___thread_atomic_stop:
|
|
||||||
|
|
||||||
! Check if the device is currently into an atomic operation
|
|
||||||
! and update atomic counter and, if needed, restore the SR
|
|
||||||
! regsiter
|
|
||||||
mov.l atomic_counter, r1
|
|
||||||
mov.l @r1, r0
|
|
||||||
tst r0, r0
|
|
||||||
bt atomic_end_error
|
|
||||||
cmp/eq #1, r0
|
|
||||||
add #-1, r0
|
|
||||||
mov.l r0, @r1
|
|
||||||
bf atomic_end_error
|
|
||||||
|
|
||||||
! Restore saved SR register data.
|
|
||||||
mov.l sr_save, r1
|
|
||||||
mov.l @r1, r0
|
|
||||||
ldc r0, sr
|
|
||||||
bra atomic_end_exit
|
|
||||||
nop
|
|
||||||
|
|
||||||
atomic_end_error:
|
|
||||||
mov #-1, r0
|
|
||||||
|
|
||||||
atomic_end_exit:
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
bl_mask: .long 0x100000f0
|
|
||||||
sr_save: .long ___thread_atomic_sr_save
|
|
||||||
atomic_counter: .long ___thread_atomic_counter
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
##---
|
|
||||||
## Global part.
|
|
||||||
##---
|
|
||||||
.data
|
|
||||||
.global ___thread_atomic_sr_save
|
|
||||||
.global ___thread_atomic_counter
|
|
||||||
|
|
||||||
.type ___thread_atomic_sr_save, @object
|
|
||||||
.type ___thread_atomic_counter, @object
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
___thread_atomic_sr_save: .long 0x00000000
|
|
||||||
___thread_atomic_counter: .long 0x00000000
|
|
|
@ -1,107 +0,0 @@
|
||||||
#include <threads.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
// Creates a new mutex object with type __TYPE.
|
|
||||||
// @note: If successful the new object is pointed by __MUTEX.
|
|
||||||
int mtx_init (mtx_t *__mutex, int __type)
|
|
||||||
{
|
|
||||||
// Check if the mutext is already initialized
|
|
||||||
if (__mutex->__watermark == MTX_WATERMARK)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
// Initialize mutex
|
|
||||||
__mutex->__watermark = MTX_WATERMARK;
|
|
||||||
__mutex->type = __type;
|
|
||||||
__mutex->lock = 0;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Block the current thread until the mutex pointed to by __MUTEX is unlocked.
|
|
||||||
// In that case current thread will not be blocked.
|
|
||||||
int mtx_lock(mtx_t *__mutex)
|
|
||||||
{
|
|
||||||
// Check mutex validity
|
|
||||||
if (__mutex->__watermark != MTX_WATERMARK)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
// Wait util the mutex is unlocked
|
|
||||||
while (1) {
|
|
||||||
// Check if the mutex is unlock
|
|
||||||
__thread_atomic_start();
|
|
||||||
if (__mutex->lock == 0)
|
|
||||||
break;
|
|
||||||
__thread_atomic_stop();
|
|
||||||
|
|
||||||
// TODO: force kernel schedule
|
|
||||||
__asm__ volatile ("sleep");
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: handle mutex type !!
|
|
||||||
(void)__mutex->type;
|
|
||||||
|
|
||||||
// Lock the mutex
|
|
||||||
__mutex->lock = 1;
|
|
||||||
|
|
||||||
// Stop atomic operations
|
|
||||||
__thread_atomic_stop();
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to lock the mutex pointed by __MUTEX without blocking.
|
|
||||||
// @note: If the mutex is free the current threads takes control of it,
|
|
||||||
// otherwise it returns immediately.
|
|
||||||
int mtx_trylock(mtx_t *__mutex)
|
|
||||||
{
|
|
||||||
// Check mutex validity
|
|
||||||
if (__mutex->__watermark != MTX_WATERMARK)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
// Start atomic operations
|
|
||||||
__thread_atomic_start();
|
|
||||||
|
|
||||||
// Check if the mutex is already free
|
|
||||||
int ret = -1;
|
|
||||||
if (__mutex->lock == 0) {
|
|
||||||
//TODO: handle mutex type !!
|
|
||||||
(void)__mutex->type;
|
|
||||||
|
|
||||||
// lock the mutex and change the return value
|
|
||||||
__mutex->lock = 1;
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop atomic operation and return
|
|
||||||
__thread_atomic_stop();
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unlock the mutex pointed by __MUTEX.
|
|
||||||
// @note: It may potentially awake other threads waiting on this mutex.
|
|
||||||
int mtx_unlock(mtx_t *__mutex)
|
|
||||||
{
|
|
||||||
// Check mutex validity
|
|
||||||
if (__mutex->__watermark != MTX_WATERMARK)
|
|
||||||
return (-1);
|
|
||||||
|
|
||||||
// Start atomic operation
|
|
||||||
__thread_atomic_start();
|
|
||||||
|
|
||||||
// Check if the mutex is realy used and unluck if needed
|
|
||||||
int ret = -1;
|
|
||||||
if (__mutex->lock != 0) {
|
|
||||||
__mutex->lock = 0;
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop atomic operation and return
|
|
||||||
__thread_atomic_stop();
|
|
||||||
return (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Destroy the mutex object pointed by __MUTEX.
|
|
||||||
// TODO: check if the mutex is in use ?
|
|
||||||
void mtx_destroy(mtx_t *__mutex)
|
|
||||||
{
|
|
||||||
__mutex->__watermark = 0x00000000;
|
|
||||||
__mutex->type = -1;
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _open
|
|
||||||
.type _open, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern int open(const char *pathname, int flags, ...);
|
|
||||||
** Open FILE and return a new file descriptor for it, or -1 on error.
|
|
||||||
** OFLAG determines the type of access used. If O_CREAT or O_TMPFILE is set
|
|
||||||
** in OFLAG, the third argument is taken as a `mode_t', the mode of the
|
|
||||||
** created file.
|
|
||||||
*/
|
|
||||||
_open:
|
|
||||||
trapa #__NR_open
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _wait
|
|
||||||
.type _wait, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern pid_t wait(int *wstatus);
|
|
||||||
** Wait for a child to die. When one does, put its status in *STAT_LOC
|
|
||||||
** and return its process ID. For errors, return (pid_t) -1.
|
|
||||||
*/
|
|
||||||
_wait:
|
|
||||||
trapa #__NR_wait
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,27 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _waitpid
|
|
||||||
.type _waitpid, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern pid_t waitpid(pid_t pid, int *wstatus, int options);
|
|
||||||
** Wait for a child matching PID to die.
|
|
||||||
** - If PID is greater than 0, match any process whose process ID is PID.
|
|
||||||
** - If PID is (pid_t) -1, match any process.
|
|
||||||
** - If PID is (pid_t) 0, match any process with the same process group as the
|
|
||||||
** current process.
|
|
||||||
** - If PID is less than -1, match any process whose process group is the absolute
|
|
||||||
** value of PID.
|
|
||||||
** - If the WNOHANG bit is set in OPTIONS, and that child is not already dead,
|
|
||||||
** return (pid_t) 0. If successful, return PID and store the dead child's
|
|
||||||
** status in STAT_LOC.
|
|
||||||
** - Return (pid_t) -1 for errors. If the WUNTRACED bit is set in OPTIONS,
|
|
||||||
** return status for stopped children; otherwise don't.
|
|
||||||
*/
|
|
||||||
_waitpid:
|
|
||||||
trapa #__NR_waitpid
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,18 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
#include <bits/trapa.h>
|
|
||||||
.text
|
|
||||||
.global _close
|
|
||||||
.type _close, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** int close(int fd)
|
|
||||||
** close() closes a file descriptor, so that it no longer refers to any file
|
|
||||||
** and may be reused.
|
|
||||||
*/
|
|
||||||
_close:
|
|
||||||
casio_trapa(__NR_Bfile_CloseFile)
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _close
|
|
||||||
.type _close, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** int close(int fd)
|
|
||||||
** close() closes a file descriptor, so that it no longer refers to any file
|
|
||||||
** and may be reused.
|
|
||||||
*/
|
|
||||||
_close:
|
|
||||||
trapa #__NR_close
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,22 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _fork_execve
|
|
||||||
.type _fork_execve, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** pid_t fork_execve(const char *pathname, char **argv, char **envp);
|
|
||||||
** Custom syscall used to create a new process based on the new command passed
|
|
||||||
** using the `argv` and `envp` parametter. This sycall is equivalent of fork()
|
|
||||||
** and execve() combined.
|
|
||||||
**
|
|
||||||
** This custom syscall exist because the Vhex kernel doesn't have access to the
|
|
||||||
** MMU, so we cannot ensure that the memory requested by the potential new
|
|
||||||
** process is enough when execve() is involved by the user.
|
|
||||||
*/
|
|
||||||
_fork_execve:
|
|
||||||
trapa #__NR_fork_execve
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _getpgid
|
|
||||||
.type _getpgid, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern pid_t getpgid(void);
|
|
||||||
** Get the process group ID of the calling process.
|
|
||||||
*/
|
|
||||||
_getpgid:
|
|
||||||
trapa #__NR_getpgid
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _getpid
|
|
||||||
.type _getpid, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern pid_t getpid(void);
|
|
||||||
** Get the process ID of the calling process.
|
|
||||||
*/
|
|
||||||
_getpid:
|
|
||||||
trapa #__NR_getpid
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _getppid
|
|
||||||
.type _getppid, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern pid_t getpgid(void);
|
|
||||||
** Get the parent process ID of the calling process.
|
|
||||||
*/
|
|
||||||
_getppid:
|
|
||||||
trapa #__NR_getppid
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,19 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _lseek
|
|
||||||
.type _lseek, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern off_t lseek(int fd, off_t offset, int whence)
|
|
||||||
** Move FD's file position to OFFSET bytes from the beginning of the file
|
|
||||||
** (if WHENCE is SEEK_SET), the current position (if WHENCE is SEEK_CUR),
|
|
||||||
** or the end of the file (if WHENCE is SEEK_END).
|
|
||||||
** Return the new file position.
|
|
||||||
*/
|
|
||||||
_lseek:
|
|
||||||
trapa #__NR_lseek
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _read
|
|
||||||
.type _read, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern ssize_t write(int __fd, const void *__buf, size_t __nbytes);
|
|
||||||
** Write N bytes of BUF to FD.
|
|
||||||
** Return the number written, or -1.
|
|
||||||
*/
|
|
||||||
_read:
|
|
||||||
trapa #__NR_read
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,18 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _setpgid
|
|
||||||
.type _setpgid, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern int setpgid(pid_t __pid, pid_t __pgid);
|
|
||||||
** Set the process group ID of the process matching PID to PGID.
|
|
||||||
** If PID is zero, the current process's process group ID is set.
|
|
||||||
** If PGID is zero, the process ID of the process is used.
|
|
||||||
*/
|
|
||||||
_setpgid:
|
|
||||||
trapa #__NR_setpgid
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#include <bits/asm/unistd_32.h>
|
|
||||||
.text
|
|
||||||
.global _write
|
|
||||||
.type _write, @function
|
|
||||||
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
/*
|
|
||||||
** extern ssize_t write(int __fd, const void *__buf, size_t __nbytes);
|
|
||||||
** Write N bytes of BUF to FD.
|
|
||||||
** Return the number written, or -1.
|
|
||||||
*/
|
|
||||||
_write:
|
|
||||||
trapa #__NR_write
|
|
||||||
rts
|
|
||||||
nop
|
|
||||||
.end
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <fxlibc/printf.h>
|
#include <fxlibc/printf.h>
|
||||||
#include "../../../../3rdparty/grisu2b_59_56/grisu2.h"
|
#include "../../../3rdparty/grisu2b_59_56/grisu2.h"
|
||||||
|
|
||||||
#define min(x, y) ({ \
|
#define min(x, y) ({ \
|
||||||
__auto_type _x = (x); \
|
__auto_type _x = (x); \
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue