0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __OS_H__
0009 #define __OS_H__
0010
0011 #include <irq_user.h>
0012 #include <longjmp.h>
0013 #include <mm_id.h>
0014
0015 #ifndef __UM_HOST__
0016 #include <linux/types.h>
0017 #else
0018 #include <sys/types.h>
0019 #endif
0020
0021 #define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR))
0022
0023 #define OS_TYPE_FILE 1
0024 #define OS_TYPE_DIR 2
0025 #define OS_TYPE_SYMLINK 3
0026 #define OS_TYPE_CHARDEV 4
0027 #define OS_TYPE_BLOCKDEV 5
0028 #define OS_TYPE_FIFO 6
0029 #define OS_TYPE_SOCK 7
0030
0031
0032 #define OS_ACC_F_OK 0
0033 #define OS_ACC_X_OK 1
0034 #define OS_ACC_W_OK 2
0035 #define OS_ACC_R_OK 4
0036 #define OS_ACC_RW_OK (OS_ACC_W_OK | OS_ACC_R_OK)
0037
0038 #ifdef CONFIG_64BIT
0039 #define OS_LIB_PATH "/usr/lib64/"
0040 #else
0041 #define OS_LIB_PATH "/usr/lib/"
0042 #endif
0043
0044 #define OS_SENDMSG_MAX_FDS 8
0045
0046
0047
0048
0049
0050 struct uml_stat {
0051 int ust_dev;
0052 unsigned long long ust_ino;
0053 int ust_mode;
0054 int ust_nlink;
0055 int ust_uid;
0056 int ust_gid;
0057 unsigned long long ust_size;
0058 int ust_blksize;
0059 unsigned long long ust_blocks;
0060 unsigned long ust_atime;
0061 unsigned long ust_mtime;
0062 unsigned long ust_ctime;
0063 };
0064
0065 struct openflags {
0066 unsigned int r : 1;
0067 unsigned int w : 1;
0068 unsigned int s : 1;
0069 unsigned int c : 1;
0070 unsigned int t : 1;
0071 unsigned int a : 1;
0072 unsigned int e : 1;
0073 unsigned int cl : 1;
0074 };
0075
0076 #define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \
0077 .t = 0, .a = 0, .e = 0, .cl = 0 })
0078
0079 static inline struct openflags of_read(struct openflags flags)
0080 {
0081 flags.r = 1;
0082 return flags;
0083 }
0084
0085 static inline struct openflags of_write(struct openflags flags)
0086 {
0087 flags.w = 1;
0088 return flags;
0089 }
0090
0091 static inline struct openflags of_rdwr(struct openflags flags)
0092 {
0093 return of_read(of_write(flags));
0094 }
0095
0096 static inline struct openflags of_set_rw(struct openflags flags, int r, int w)
0097 {
0098 flags.r = r;
0099 flags.w = w;
0100 return flags;
0101 }
0102
0103 static inline struct openflags of_sync(struct openflags flags)
0104 {
0105 flags.s = 1;
0106 return flags;
0107 }
0108
0109 static inline struct openflags of_create(struct openflags flags)
0110 {
0111 flags.c = 1;
0112 return flags;
0113 }
0114
0115 static inline struct openflags of_trunc(struct openflags flags)
0116 {
0117 flags.t = 1;
0118 return flags;
0119 }
0120
0121 static inline struct openflags of_append(struct openflags flags)
0122 {
0123 flags.a = 1;
0124 return flags;
0125 }
0126
0127 static inline struct openflags of_excl(struct openflags flags)
0128 {
0129 flags.e = 1;
0130 return flags;
0131 }
0132
0133 static inline struct openflags of_cloexec(struct openflags flags)
0134 {
0135 flags.cl = 1;
0136 return flags;
0137 }
0138
0139
0140 extern int os_stat_file(const char *file_name, struct uml_stat *buf);
0141 extern int os_stat_fd(const int fd, struct uml_stat *buf);
0142 extern int os_access(const char *file, int mode);
0143 extern int os_set_exec_close(int fd);
0144 extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg);
0145 extern int os_get_ifname(int fd, char *namebuf);
0146 extern int os_set_slip(int fd);
0147 extern int os_mode_fd(int fd, int mode);
0148 extern int os_fsync_file(int fd);
0149
0150 extern int os_seek_file(int fd, unsigned long long offset);
0151 extern int os_open_file(const char *file, struct openflags flags, int mode);
0152 extern int os_read_file(int fd, void *buf, int len);
0153 extern int os_write_file(int fd, const void *buf, int count);
0154 extern int os_sync_file(int fd);
0155 extern int os_file_size(const char *file, unsigned long long *size_out);
0156 extern int os_pread_file(int fd, void *buf, int len, unsigned long long offset);
0157 extern int os_pwrite_file(int fd, const void *buf, int count, unsigned long long offset);
0158 extern int os_file_modtime(const char *file, long long *modtime);
0159 extern int os_pipe(int *fd, int stream, int close_on_exec);
0160 extern int os_set_fd_async(int fd);
0161 extern int os_clear_fd_async(int fd);
0162 extern int os_set_fd_block(int fd, int blocking);
0163 extern int os_accept_connection(int fd);
0164 extern int os_create_unix_socket(const char *file, int len, int close_on_exec);
0165 extern int os_shutdown_socket(int fd, int r, int w);
0166 extern void os_close_file(int fd);
0167 extern int os_rcv_fd(int fd, int *helper_pid_out);
0168 extern int os_connect_socket(const char *name);
0169 extern int os_file_type(char *file);
0170 extern int os_file_mode(const char *file, struct openflags *mode_out);
0171 extern int os_lock_file(int fd, int excl);
0172 extern void os_flush_stdout(void);
0173 extern unsigned os_major(unsigned long long dev);
0174 extern unsigned os_minor(unsigned long long dev);
0175 extern unsigned long long os_makedev(unsigned major, unsigned minor);
0176 extern int os_falloc_punch(int fd, unsigned long long offset, int count);
0177 extern int os_falloc_zeroes(int fd, unsigned long long offset, int count);
0178 extern int os_eventfd(unsigned int initval, int flags);
0179 extern int os_sendmsg_fds(int fd, const void *buf, unsigned int len,
0180 const int *fds, unsigned int fds_num);
0181 int os_poll(unsigned int n, const int *fds);
0182
0183
0184 extern void os_early_checks(void);
0185 extern void os_check_bugs(void);
0186 extern void check_host_supports_tls(int *supports_tls, int *tls_min);
0187 extern void get_host_cpu_features(
0188 void (*flags_helper_func)(char *line),
0189 void (*cache_helper_func)(char *line));
0190
0191
0192 extern int create_mem_file(unsigned long long len);
0193
0194
0195 extern unsigned long os_process_pc(int pid);
0196 extern int os_process_parent(int pid);
0197 extern void os_alarm_process(int pid);
0198 extern void os_stop_process(int pid);
0199 extern void os_kill_process(int pid, int reap_child);
0200 extern void os_kill_ptraced_process(int pid, int reap_child);
0201
0202 extern int os_getpid(void);
0203 extern int os_getpgrp(void);
0204
0205 extern void init_new_thread_signals(void);
0206
0207 extern int os_map_memory(void *virt, int fd, unsigned long long off,
0208 unsigned long len, int r, int w, int x);
0209 extern int os_protect_memory(void *addr, unsigned long len,
0210 int r, int w, int x);
0211 extern int os_unmap_memory(void *addr, int len);
0212 extern int os_drop_memory(void *addr, int length);
0213 extern int can_drop_memory(void);
0214 extern int os_mincore(void *addr, unsigned long len);
0215
0216
0217 extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
0218
0219 extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
0220 extern int run_helper_thread(int (*proc)(void *), void *arg,
0221 unsigned int flags, unsigned long *stack_out);
0222 extern int helper_wait(int pid);
0223
0224
0225
0226 extern int umid_file_name(char *name, char *buf, int len);
0227 extern int set_umid(char *name);
0228 extern char *get_umid(void);
0229
0230
0231 extern void timer_set_signal_handler(void);
0232 extern void set_sigstack(void *sig_stack, int size);
0233 extern void set_handler(int sig);
0234 extern void send_sigio_to_self(void);
0235 extern int change_sig(int signal, int on);
0236 extern void block_signals(void);
0237 extern void unblock_signals(void);
0238 extern int um_set_signals(int enable);
0239 extern int um_set_signals_trace(int enable);
0240 extern int os_is_signal_stack(void);
0241 extern void deliver_alarm(void);
0242 extern void register_pm_wake_signal(void);
0243 extern void block_signals_hard(void);
0244 extern void unblock_signals_hard(void);
0245 extern void mark_sigio_pending(void);
0246
0247
0248 extern void stack_protections(unsigned long address);
0249 extern int raw(int fd);
0250 extern void setup_machinename(char *machine_out);
0251 extern void setup_hostinfo(char *buf, int len);
0252 extern ssize_t os_getrandom(void *buf, size_t len, unsigned int flags);
0253 extern void os_dump_core(void) __attribute__ ((noreturn));
0254 extern void um_early_printk(const char *s, unsigned int n);
0255 extern void os_fix_helper_signals(void);
0256 extern void os_info(const char *fmt, ...)
0257 __attribute__ ((format (printf, 1, 2)));
0258 extern void os_warn(const char *fmt, ...)
0259 __attribute__ ((format (printf, 1, 2)));
0260
0261
0262 extern void os_idle_sleep(void);
0263 extern int os_timer_create(void);
0264 extern int os_timer_set_interval(unsigned long long nsecs);
0265 extern int os_timer_one_shot(unsigned long long nsecs);
0266 extern void os_timer_disable(void);
0267 extern long long os_persistent_clock_emulation(void);
0268 extern long long os_nsecs(void);
0269
0270
0271 extern long run_syscall_stub(struct mm_id * mm_idp,
0272 int syscall, unsigned long *args, long expected,
0273 void **addr, int done);
0274 extern long syscall_stub_data(struct mm_id * mm_idp,
0275 unsigned long *data, int data_count,
0276 void **addr, void **stub_addr);
0277 extern int map(struct mm_id * mm_idp, unsigned long virt,
0278 unsigned long len, int prot, int phys_fd,
0279 unsigned long long offset, int done, void **data);
0280 extern int unmap(struct mm_id * mm_idp, unsigned long addr, unsigned long len,
0281 int done, void **data);
0282 extern int protect(struct mm_id * mm_idp, unsigned long addr,
0283 unsigned long len, unsigned int prot, int done, void **data);
0284
0285
0286 extern int is_skas_winch(int pid, int fd, void *data);
0287 extern int start_userspace(unsigned long stub_stack);
0288 extern int copy_context_skas0(unsigned long stack, int pid);
0289 extern void userspace(struct uml_pt_regs *regs, unsigned long *aux_fp_regs);
0290 extern void new_thread(void *stack, jmp_buf *buf, void (*handler)(void));
0291 extern void switch_threads(jmp_buf *me, jmp_buf *you);
0292 extern int start_idle_thread(void *stack, jmp_buf *switch_buf);
0293 extern void initial_thread_cb_skas(void (*proc)(void *),
0294 void *arg);
0295 extern void halt_skas(void);
0296 extern void reboot_skas(void);
0297
0298
0299 extern int os_waiting_for_events_epoll(void);
0300 extern void *os_epoll_get_data_pointer(int index);
0301 extern int os_epoll_triggered(int index, int events);
0302 extern int os_event_mask(enum um_irq_type irq_type);
0303 extern int os_setup_epoll(void);
0304 extern int os_add_epoll_fd(int events, int fd, void *data);
0305 extern int os_mod_epoll_fd(int events, int fd, void *data);
0306 extern int os_del_epoll_fd(int fd);
0307 extern void os_set_ioignore(void);
0308 extern void os_close_epoll_fd(void);
0309 extern void um_irqs_suspend(void);
0310 extern void um_irqs_resume(void);
0311
0312
0313 extern int add_sigio_fd(int fd);
0314 extern int ignore_sigio_fd(int fd);
0315 extern void maybe_sigio_broken(int fd);
0316 extern void sigio_broken(int fd);
0317
0318
0319
0320
0321
0322
0323 extern int __add_sigio_fd(int fd);
0324 extern int __ignore_sigio_fd(int fd);
0325
0326
0327 extern int os_arch_prctl(int pid, int option, unsigned long *arg2);
0328
0329
0330 extern int get_pty(void);
0331
0332
0333 extern unsigned long os_get_top_address(void);
0334
0335 long syscall(long number, ...);
0336
0337
0338 extern void block_signals_trace(void);
0339 extern void unblock_signals_trace(void);
0340 extern void um_trace_signals_on(void);
0341 extern void um_trace_signals_off(void);
0342
0343
0344 extern void deliver_time_travel_irqs(void);
0345
0346 #endif