1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
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 */
|