1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Copyright (C) 2015 Anton Ivanov (aivanov@{brocade.com,kot-begemot.co.uk})
4   * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
5   * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
6   */
7  
8  #ifndef __OS_H__
9  #define __OS_H__
10  
11  #include <stdarg.h>
12  #include <irq_user.h>
13  #include <longjmp.h>
14  #include <mm_id.h>
15  
16  #define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR))
17  
18  #define OS_TYPE_FILE 1
19  #define OS_TYPE_DIR 2
20  #define OS_TYPE_SYMLINK 3
21  #define OS_TYPE_CHARDEV 4
22  #define OS_TYPE_BLOCKDEV 5
23  #define OS_TYPE_FIFO 6
24  #define OS_TYPE_SOCK 7
25  
26  /* os_access() flags */
27  #define OS_ACC_F_OK    0       /* Test for existence.  */
28  #define OS_ACC_X_OK    1       /* Test for execute permission.  */
29  #define OS_ACC_W_OK    2       /* Test for write permission.  */
30  #define OS_ACC_R_OK    4       /* Test for read permission.  */
31  #define OS_ACC_RW_OK   (OS_ACC_W_OK | OS_ACC_R_OK) /* Test for RW permission */
32  
33  #ifdef CONFIG_64BIT
34  #define OS_LIB_PATH	"/usr/lib64/"
35  #else
36  #define OS_LIB_PATH	"/usr/lib/"
37  #endif
38  
39  #define OS_SENDMSG_MAX_FDS 8
40  
41  /*
42   * types taken from stat_file() in hostfs_user.c
43   * (if they are wrong here, they are wrong there...).
44   */
45  struct uml_stat {
46  	int                ust_dev;        /* device */
47  	unsigned long long ust_ino;        /* inode */
48  	int                ust_mode;       /* protection */
49  	int                ust_nlink;      /* number of hard links */
50  	int                ust_uid;        /* user ID of owner */
51  	int                ust_gid;        /* group ID of owner */
52  	unsigned long long ust_size;       /* total size, in bytes */
53  	int                ust_blksize;    /* blocksize for filesystem I/O */
54  	unsigned long long ust_blocks;     /* number of blocks allocated */
55  	unsigned long      ust_atime;      /* time of last access */
56  	unsigned long      ust_mtime;      /* time of last modification */
57  	unsigned long      ust_ctime;      /* time of last change */
58  };
59  
60  struct openflags {
61  	unsigned int r : 1;
62  	unsigned int w : 1;
63  	unsigned int s : 1;	/* O_SYNC */
64  	unsigned int c : 1;	/* O_CREAT */
65  	unsigned int t : 1;	/* O_TRUNC */
66  	unsigned int a : 1;	/* O_APPEND */
67  	unsigned int e : 1;	/* O_EXCL */
68  	unsigned int cl : 1;    /* FD_CLOEXEC */
69  };
70  
71  #define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \
72  					  .t = 0, .a = 0, .e = 0, .cl = 0 })
73  
of_read(struct openflags flags)74  static inline struct openflags of_read(struct openflags flags)
75  {
76  	flags.r = 1;
77  	return flags;
78  }
79  
of_write(struct openflags flags)80  static inline struct openflags of_write(struct openflags flags)
81  {
82  	flags.w = 1;
83  	return flags;
84  }
85  
of_rdwr(struct openflags flags)86  static inline struct openflags of_rdwr(struct openflags flags)
87  {
88  	return of_read(of_write(flags));
89  }
90  
of_set_rw(struct openflags flags,int r,int w)91  static inline struct openflags of_set_rw(struct openflags flags, int r, int w)
92  {
93  	flags.r = r;
94  	flags.w = w;
95  	return flags;
96  }
97  
of_sync(struct openflags flags)98  static inline struct openflags of_sync(struct openflags flags)
99  {
100  	flags.s = 1;
101  	return flags;
102  }
103  
of_create(struct openflags flags)104  static inline struct openflags of_create(struct openflags flags)
105  {
106  	flags.c = 1;
107  	return flags;
108  }
109  
of_trunc(struct openflags flags)110  static inline struct openflags of_trunc(struct openflags flags)
111  {
112  	flags.t = 1;
113  	return flags;
114  }
115  
of_append(struct openflags flags)116  static inline struct openflags of_append(struct openflags flags)
117  {
118  	flags.a = 1;
119  	return flags;
120  }
121  
of_excl(struct openflags flags)122  static inline struct openflags of_excl(struct openflags flags)
123  {
124  	flags.e = 1;
125  	return flags;
126  }
127  
of_cloexec(struct openflags flags)128  static inline struct openflags of_cloexec(struct openflags flags)
129  {
130  	flags.cl = 1;
131  	return flags;
132  }
133  
134  /* file.c */
135  extern int os_stat_file(const char *file_name, struct uml_stat *buf);
136  extern int os_stat_fd(const int fd, struct uml_stat *buf);
137  extern int os_access(const char *file, int mode);
138  extern int os_set_exec_close(int fd);
139  extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg);
140  extern int os_get_ifname(int fd, char *namebuf);
141  extern int os_set_slip(int fd);
142  extern int os_mode_fd(int fd, int mode);
143  extern int os_fsync_file(int fd);
144  
145  extern int os_seek_file(int fd, unsigned long long offset);
146  extern int os_open_file(const char *file, struct openflags flags, int mode);
147  extern int os_read_file(int fd, void *buf, int len);
148  extern int os_write_file(int fd, const void *buf, int count);
149  extern int os_sync_file(int fd);
150  extern int os_file_size(const char *file, unsigned long long *size_out);
151  extern int os_pread_file(int fd, void *buf, int len, unsigned long long offset);
152  extern int os_pwrite_file(int fd, const void *buf, int count, unsigned long long offset);
153  extern int os_file_modtime(const char *file, unsigned long *modtime);
154  extern int os_pipe(int *fd, int stream, int close_on_exec);
155  extern int os_set_fd_async(int fd);
156  extern int os_clear_fd_async(int fd);
157  extern int os_set_fd_block(int fd, int blocking);
158  extern int os_accept_connection(int fd);
159  extern int os_create_unix_socket(const char *file, int len, int close_on_exec);
160  extern int os_shutdown_socket(int fd, int r, int w);
161  extern void os_close_file(int fd);
162  extern int os_rcv_fd(int fd, int *helper_pid_out);
163  extern int create_unix_socket(char *file, int len, int close_on_exec);
164  extern int os_connect_socket(const char *name);
165  extern int os_file_type(char *file);
166  extern int os_file_mode(const char *file, struct openflags *mode_out);
167  extern int os_lock_file(int fd, int excl);
168  extern void os_flush_stdout(void);
169  extern int os_stat_filesystem(char *path, long *bsize_out,
170  			      long long *blocks_out, long long *bfree_out,
171  			      long long *bavail_out, long long *files_out,
172  			      long long *ffree_out, void *fsid_out,
173  			      int fsid_size, long *namelen_out,
174  			      long *spare_out);
175  extern int os_change_dir(char *dir);
176  extern int os_fchange_dir(int fd);
177  extern unsigned os_major(unsigned long long dev);
178  extern unsigned os_minor(unsigned long long dev);
179  extern unsigned long long os_makedev(unsigned major, unsigned minor);
180  extern int os_falloc_punch(int fd, unsigned long long offset, int count);
181  extern int os_eventfd(unsigned int initval, int flags);
182  extern int os_sendmsg_fds(int fd, const void *buf, unsigned int len,
183  			  const int *fds, unsigned int fds_num);
184  
185  /* start_up.c */
186  extern void os_early_checks(void);
187  extern void os_check_bugs(void);
188  extern void check_host_supports_tls(int *supports_tls, int *tls_min);
189  
190  /* mem.c */
191  extern int create_mem_file(unsigned long long len);
192  
193  /* process.c */
194  extern unsigned long os_process_pc(int pid);
195  extern int os_process_parent(int pid);
196  extern void os_alarm_process(int pid);
197  extern void os_stop_process(int pid);
198  extern void os_kill_process(int pid, int reap_child);
199  extern void os_kill_ptraced_process(int pid, int reap_child);
200  
201  extern int os_getpid(void);
202  extern int os_getpgrp(void);
203  
204  extern void init_new_thread_signals(void);
205  
206  extern int os_map_memory(void *virt, int fd, unsigned long long off,
207  			 unsigned long len, int r, int w, int x);
208  extern int os_protect_memory(void *addr, unsigned long len,
209  			     int r, int w, int x);
210  extern int os_unmap_memory(void *addr, int len);
211  extern int os_drop_memory(void *addr, int length);
212  extern int can_drop_memory(void);
213  extern void os_flush_stdout(void);
214  extern int os_mincore(void *addr, unsigned long len);
215  
216  /* execvp.c */
217  extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
218  /* helper.c */
219  extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
220  extern int run_helper_thread(int (*proc)(void *), void *arg,
221  			     unsigned int flags, unsigned long *stack_out);
222  extern int helper_wait(int pid);
223  
224  
225  /* umid.c */
226  extern int umid_file_name(char *name, char *buf, int len);
227  extern int set_umid(char *name);
228  extern char *get_umid(void);
229  
230  /* signal.c */
231  extern void timer_set_signal_handler(void);
232  extern void set_sigstack(void *sig_stack, int size);
233  extern void remove_sigstack(void);
234  extern void set_handler(int sig);
235  extern int change_sig(int signal, int on);
236  extern void block_signals(void);
237  extern void unblock_signals(void);
238  extern int get_signals(void);
239  extern int set_signals(int enable);
240  extern int set_signals_trace(int enable);
241  extern int os_is_signal_stack(void);
242  extern void deliver_alarm(void);
243  
244  /* util.c */
245  extern void stack_protections(unsigned long address);
246  extern int raw(int fd);
247  extern void setup_machinename(char *machine_out);
248  extern void setup_hostinfo(char *buf, int len);
249  extern void os_dump_core(void) __attribute__ ((noreturn));
250  extern void um_early_printk(const char *s, unsigned int n);
251  extern void os_fix_helper_signals(void);
252  extern void os_info(const char *fmt, ...)
253  	__attribute__ ((format (printf, 1, 2)));
254  extern void os_warn(const char *fmt, ...)
255  	__attribute__ ((format (printf, 1, 2)));
256  
257  /* time.c */
258  extern void os_idle_sleep(unsigned long long nsecs);
259  extern int os_timer_create(void);
260  extern int os_timer_set_interval(unsigned long long nsecs);
261  extern int os_timer_one_shot(unsigned long long nsecs);
262  extern void os_timer_disable(void);
263  extern void uml_idle_timer(void);
264  extern long long os_persistent_clock_emulation(void);
265  extern long long os_nsecs(void);
266  
267  /* skas/mem.c */
268  extern long run_syscall_stub(struct mm_id * mm_idp,
269  			     int syscall, unsigned long *args, long expected,
270  			     void **addr, int done);
271  extern long syscall_stub_data(struct mm_id * mm_idp,
272  			      unsigned long *data, int data_count,
273  			      void **addr, void **stub_addr);
274  extern int map(struct mm_id * mm_idp, unsigned long virt,
275  	       unsigned long len, int prot, int phys_fd,
276  	       unsigned long long offset, int done, void **data);
277  extern int unmap(struct mm_id * mm_idp, unsigned long addr, unsigned long len,
278  		 int done, void **data);
279  extern int protect(struct mm_id * mm_idp, unsigned long addr,
280  		   unsigned long len, unsigned int prot, int done, void **data);
281  
282  /* skas/process.c */
283  extern int is_skas_winch(int pid, int fd, void *data);
284  extern int start_userspace(unsigned long stub_stack);
285  extern int copy_context_skas0(unsigned long stack, int pid);
286  extern void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs);
287  extern int map_stub_pages(int fd, unsigned long code, unsigned long data,
288  			  unsigned long stack);
289  extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
290  extern void switch_threads(jmp_buf *me, jmp_buf *you);
291  extern int start_idle_thread(void *stack, jmp_buf *switch_buf);
292  extern void initial_thread_cb_skas(void (*proc)(void *),
293  				 void *arg);
294  extern void halt_skas(void);
295  extern void reboot_skas(void);
296  
297  /* irq.c */
298  extern int os_waiting_for_events_epoll(void);
299  extern void *os_epoll_get_data_pointer(int index);
300  extern int os_epoll_triggered(int index, int events);
301  extern int os_event_mask(int irq_type);
302  extern int os_setup_epoll(void);
303  extern int os_add_epoll_fd(int events, int fd, void *data);
304  extern int os_mod_epoll_fd(int events, int fd, void *data);
305  extern int os_del_epoll_fd(int fd);
306  extern void os_set_ioignore(void);
307  extern void os_close_epoll_fd(void);
308  
309  /* sigio.c */
310  extern int add_sigio_fd(int fd);
311  extern int ignore_sigio_fd(int fd);
312  extern void maybe_sigio_broken(int fd, int read);
313  extern void sigio_broken(int fd, int read);
314  
315  /* prctl.c */
316  extern int os_arch_prctl(int pid, int option, unsigned long *arg2);
317  
318  /* tty.c */
319  extern int get_pty(void);
320  
321  /* sys-$ARCH/task_size.c */
322  extern unsigned long os_get_top_address(void);
323  
324  long syscall(long number, ...);
325  
326  /* irqflags tracing */
327  extern void block_signals_trace(void);
328  extern void unblock_signals_trace(void);
329  extern void um_trace_signals_on(void);
330  extern void um_trace_signals_off(void);
331  
332  #endif
333