summaryrefslogtreecommitdiff
path: root/cpu/cpu-sysdeps.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/cpu-sysdeps.h')
-rw-r--r--cpu/cpu-sysdeps.h288
1 files changed, 288 insertions, 0 deletions
diff --git a/cpu/cpu-sysdeps.h b/cpu/cpu-sysdeps.h
new file mode 100644
index 0000000..81bb926
--- /dev/null
+++ b/cpu/cpu-sysdeps.h
@@ -0,0 +1,288 @@
+/***************************************************************
+ __CPU_SYSDEPS.H
+
+ This file contains HOST-dependent system call wrapper
+ declarations and internal MCPU syscall ABI constants.
+
+ PART OF : CPU - library .
+
+ USAGE : Internal only .
+
+ NOTE : Include "libmcpu.h" before this FILE .
+
+ Copyright (C) 2026 by Andrew V.Kosteltsev.
+ All Rights Reserved.
+ ***************************************************************/
+
+#ifndef __CPU_SYSDEPS_H
+#define __CPU_SYSDEPS_H
+
+#include <cpu-errno.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* MCPU open(2) ABI. These values are HOST-independent. */
+#define __CPU_O_ACCMODE 00000003U
+#define __CPU_O_RDONLY 00000000U
+#define __CPU_O_WRONLY 00000001U
+#define __CPU_O_RDWR 00000002U
+#define __CPU_O_CREAT 00000100U
+#define __CPU_O_EXCL 00000200U
+#define __CPU_O_NOCTTY 00000400U
+#define __CPU_O_TRUNC 00001000U
+#define __CPU_O_APPEND 00002000U
+#define __CPU_O_NONBLOCK 00004000U
+
+#define __CPU_O_SUPPORTED ( __CPU_O_ACCMODE | __CPU_O_CREAT | __CPU_O_EXCL | \
+ __CPU_O_NOCTTY | __CPU_O_TRUNC | __CPU_O_APPEND | \
+ __CPU_O_NONBLOCK )
+
+/* MCPU fcntl(2) ABI. Commands and descriptor flags are guest values. */
+#define __CPU_F_DUPFD 0U
+#define __CPU_F_GETFD 1U
+#define __CPU_F_SETFD 2U
+#define __CPU_F_GETFL 3U
+#define __CPU_F_SETFL 4U
+
+#define __CPU_FD_CLOEXEC 1U
+#define __CPU_FD_SUPPORTED __CPU_FD_CLOEXEC
+
+/* F_SETFL accepts access-mode bits for the conventional GETFL/SETFL cycle,
+ but only APPEND and NONBLOCK are mutable file-status flags. */
+#define __CPU_F_SETFL_SUPPORTED \
+ ( __CPU_O_ACCMODE | __CPU_O_APPEND | __CPU_O_NONBLOCK )
+
+/* MCPU pipe2(2) ABI. O_CLOEXEC is guest descriptor state; only
+ O_NONBLOCK is translated to a HOST file-status flag. */
+#define __CPU_O_CLOEXEC 02000000U
+#define __CPU_PIPE2_SUPPORTED ( __CPU_O_NONBLOCK | __CPU_O_CLOEXEC )
+#define __CPU_PIPEFD_SIZE 16U
+#define __CPU_PIPEFD_READ 0U
+#define __CPU_PIPEFD_WRITE 8U
+
+/* MCPU mode bits used by open(2) when O_CREAT is present. */
+#define __CPU_S_ISUID 00004000U
+#define __CPU_S_ISGID 00002000U
+#define __CPU_S_ISVTX 00001000U
+#define __CPU_S_IRUSR 00000400U
+#define __CPU_S_IWUSR 00000200U
+#define __CPU_S_IXUSR 00000100U
+#define __CPU_S_IRGRP 00000040U
+#define __CPU_S_IWGRP 00000020U
+#define __CPU_S_IXGRP 00000010U
+#define __CPU_S_IROTH 00000004U
+#define __CPU_S_IWOTH 00000002U
+#define __CPU_S_IXOTH 00000001U
+#define __CPU_S_SUPPORTED 00007777U
+
+/* MCPU chown(2) ABI. UINT64_MAX means "leave this ID unchanged". */
+#define __CPU_ID_NO_CHANGE ((__mpu_uint64_t)-1)
+
+#define __CPU_SEEK_SET 0U
+#define __CPU_SEEK_CUR 1U
+#define __CPU_SEEK_END 2U
+
+/* MCPU access(2) ABI. These values are HOST-independent. */
+#define __CPU_F_OK 0U
+#define __CPU_X_OK 1U
+#define __CPU_W_OK 2U
+#define __CPU_R_OK 4U
+#define __CPU_ACCESS_SUPPORTED (__CPU_X_OK | __CPU_W_OK | __CPU_R_OK)
+
+/* MCPU time ABI. All time values use signed 64-bit seconds and a separate
+ signed 64-bit fractional field. Clock IDs are HOST-independent. */
+#define __CPU_CLOCK_REALTIME 0U
+#define __CPU_CLOCK_MONOTONIC 1U
+#define __CPU_TIMER_ABSTIME 1U
+
+#define __CPU_TIMEVAL_SIZE 16U
+#define __CPU_TIMEVAL_TV_SEC 0U
+#define __CPU_TIMEVAL_TV_USEC 8U
+
+#define __CPU_TIMESPEC_SIZE 16U
+#define __CPU_TIMESPEC_TV_SEC 0U
+#define __CPU_TIMESPEC_TV_NSEC 8U
+
+struct __cpu_timeval
+{
+ __mpu_int64_t tv_sec;
+ __mpu_int64_t tv_usec;
+};
+
+struct __cpu_timespec
+{
+ __mpu_int64_t tv_sec;
+ __mpu_int64_t tv_nsec;
+};
+
+/* MCPU select(2) ABI. Descriptor sets contain four target-order u64
+ words, for a total of 256 guest descriptor bits. The timeout is input-only. */
+#define __CPU_FD_SETSIZE 256U
+#define __CPU_FD_SET_WORDS 4U
+#define __CPU_FD_SET_SIZE 32U
+
+#define __CPU_SELECT_READ 0x01U
+#define __CPU_SELECT_WRITE 0x02U
+#define __CPU_SELECT_EXCEPT 0x04U
+
+struct __cpu_select_entry
+{
+ unsigned int guest_fd;
+ int host_fd;
+ unsigned int events;
+ unsigned int revents;
+};
+
+/* MCPU stat(2) ABI. The structure is always exactly 128 bytes. */
+#define __CPU_STAT_SIZE 128U
+#define __CPU_STAT_ST_DEV 0U
+#define __CPU_STAT_ST_INO 8U
+#define __CPU_STAT_ST_MODE 16U
+#define __CPU_STAT_ST_NLINK 24U
+#define __CPU_STAT_ST_UID 32U
+#define __CPU_STAT_ST_GID 40U
+#define __CPU_STAT_ST_RDEV 48U
+#define __CPU_STAT_ST_SIZE 56U
+#define __CPU_STAT_ST_BLKSIZE 64U
+#define __CPU_STAT_ST_BLOCKS 72U
+#define __CPU_STAT_ST_ATIME_SEC 80U
+#define __CPU_STAT_ST_ATIME_NSEC 88U
+#define __CPU_STAT_ST_MTIME_SEC 96U
+#define __CPU_STAT_ST_MTIME_NSEC 104U
+#define __CPU_STAT_ST_CTIME_SEC 112U
+#define __CPU_STAT_ST_CTIME_NSEC 120U
+
+#define __CPU_S_IFMT 000170000U
+#define __CPU_S_IFIFO 000010000U
+#define __CPU_S_IFCHR 000020000U
+#define __CPU_S_IFDIR 000040000U
+#define __CPU_S_IFBLK 000060000U
+#define __CPU_S_IFREG 000100000U
+#define __CPU_S_IFLNK 000120000U
+#define __CPU_S_IFSOCK 000140000U
+
+/* MCPU getdents(2) ABI. Records are fixed at 288 bytes. */
+#define __CPU_DIRENT_SIZE 288U
+#define __CPU_DIRENT_D_INO 0U
+#define __CPU_DIRENT_D_OFF 8U
+#define __CPU_DIRENT_D_RECLEN 16U
+#define __CPU_DIRENT_D_TYPE 24U
+#define __CPU_DIRENT_D_NAME 32U
+#define __CPU_DIRENT_NAME_SIZE 256U
+
+#define __CPU_DT_UNKNOWN 0U
+#define __CPU_DT_FIFO 1U
+#define __CPU_DT_CHR 2U
+#define __CPU_DT_DIR 4U
+#define __CPU_DT_BLK 6U
+#define __CPU_DT_REG 8U
+#define __CPU_DT_LNK 10U
+#define __CPU_DT_SOCK 12U
+
+struct __cpu_dirent
+{
+ __mpu_uint64_t d_ino;
+ __mpu_int64_t d_off;
+ __mpu_uint64_t d_reclen;
+ __mpu_uint64_t d_type;
+ unsigned char d_name[__CPU_DIRENT_NAME_SIZE];
+};
+
+struct __cpu_stat
+{
+ __mpu_uint64_t st_dev;
+ __mpu_uint64_t st_ino;
+ __mpu_uint64_t st_mode;
+ __mpu_uint64_t st_nlink;
+ __mpu_uint64_t st_uid;
+ __mpu_uint64_t st_gid;
+ __mpu_uint64_t st_rdev;
+ __mpu_int64_t st_size;
+ __mpu_int64_t st_blksize;
+ __mpu_int64_t st_blocks;
+ __mpu_int64_t st_atime_sec;
+ __mpu_uint64_t st_atime_nsec;
+ __mpu_int64_t st_mtime_sec;
+ __mpu_uint64_t st_mtime_nsec;
+ __mpu_int64_t st_ctime_sec;
+ __mpu_uint64_t st_ctime_nsec;
+};
+
+
+
+/* Translate a positive HOST errno value into the stable positive MCPU errno
+ namespace. Zero maps to zero; unknown values map to __MCPU_EUNKNOWN. */
+extern int __cpu_errno_from_host( int errnum );
+
+extern __mpu_int64_t __cpu_sys_cwd_init( void );
+extern __mpu_int64_t __cpu_sys_chdir( int dirfd, const char *path );
+extern __mpu_int64_t __cpu_sys_fchdir( int fd );
+
+extern __mpu_int64_t __cpu_sys_open ( int dirfd, const char *path,
+ __mpu_uint64_t flags,
+ __mpu_uint64_t mode );
+extern __mpu_int64_t __cpu_sys_creat( int dirfd, const char *path,
+ __mpu_uint64_t mode );
+extern __mpu_int64_t __cpu_sys_close( int fd );
+extern __mpu_int64_t __cpu_sys_dup ( int fd );
+extern __mpu_int64_t __cpu_sys_read ( int fd, void *buf, __mpu_uint64_t count );
+extern __mpu_int64_t __cpu_sys_write( int fd, const void *buf, __mpu_uint64_t count );
+extern __mpu_int64_t __cpu_sys_lseek( int fd, __mpu_int64_t offset,
+ __mpu_uint64_t whence );
+extern __mpu_int64_t __cpu_sys_link ( int dirfd, const char *oldpath,
+ const char *newpath );
+extern __mpu_int64_t __cpu_sys_unlink( int dirfd, const char *path );
+extern __mpu_int64_t __cpu_sys_rename( int dirfd, const char *oldpath,
+ const char *newpath );
+extern __mpu_int64_t __cpu_sys_symlink( int dirfd, const char *target,
+ const char *linkpath );
+extern __mpu_int64_t __cpu_sys_readlink( int dirfd, const char *path,
+ void *buf, __mpu_uint64_t count );
+extern __mpu_int64_t __cpu_sys_mkdir ( int dirfd, const char *path,
+ __mpu_uint64_t mode );
+extern __mpu_int64_t __cpu_sys_chmod ( int dirfd, const char *path,
+ __mpu_uint64_t mode );
+extern __mpu_int64_t __cpu_sys_chown ( int dirfd, const char *path,
+ __mpu_uint64_t uid,
+ __mpu_uint64_t gid );
+extern __mpu_int64_t __cpu_sys_rmdir ( int dirfd, const char *path );
+extern __mpu_int64_t __cpu_sys_access( int dirfd, const char *path,
+ __mpu_uint64_t mode );
+
+extern __mpu_int64_t __cpu_sys_stat ( int dirfd, const char *path,
+ struct __cpu_stat *st );
+extern __mpu_int64_t __cpu_sys_fstat( int fd, struct __cpu_stat *st );
+extern __mpu_int64_t __cpu_sys_lstat( int dirfd, const char *path,
+ struct __cpu_stat *st );
+extern __mpu_int64_t __cpu_sys_getdents( int fd, struct __cpu_dirent *dirp,
+ __mpu_uint64_t count );
+extern __mpu_int64_t __cpu_sys_fsync( int fd );
+extern __mpu_int64_t __cpu_sys_truncate( int dirfd, const char *path,
+ __mpu_int64_t length );
+extern __mpu_int64_t __cpu_sys_ftruncate( int fd, __mpu_int64_t length );
+extern __mpu_int64_t __cpu_sys_fchmod( int fd, __mpu_uint64_t mode );
+extern __mpu_int64_t __cpu_sys_fchown( int fd, __mpu_uint64_t uid,
+ __mpu_uint64_t gid );
+extern __mpu_int64_t __cpu_sys_fcntl( int fd, __mpu_uint64_t cmd,
+ __mpu_uint64_t arg );
+extern __mpu_int64_t __cpu_sys_pipe2( int pipefd[2], __mpu_uint64_t flags );
+extern __mpu_int64_t __cpu_sys_select( struct __cpu_select_entry *entries,
+ __mpu_uint64_t count,
+ const struct __cpu_timeval *timeout );
+extern __mpu_int64_t __cpu_sys_clock_gettime( __mpu_uint64_t clockid,
+ struct __cpu_timespec *tp );
+extern __mpu_int64_t __cpu_sys_clock_getres( __mpu_uint64_t clockid,
+ struct __cpu_timespec *res );
+extern __mpu_int64_t __cpu_sys_clock_nanosleep( __mpu_uint64_t clockid,
+ __mpu_uint64_t flags,
+ const struct __cpu_timespec *req,
+ struct __cpu_timespec *rem );
+
+#ifdef __cplusplus
+} /* ... extern "C" */
+#endif
+
+#endif /* __CPU_SYSDEPS_H */