Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2015 Anton Ivanov (aivanov@{brocade.com,kot-begemot.co.uk})
0004  * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
0005  * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
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 /* This is to get size_t */
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 /* os_access() flags */
0032 #define OS_ACC_F_OK    0       /* Test for existence.  */
0033 #define OS_ACC_X_OK    1       /* Test for execute permission.  */
0034 #define OS_ACC_W_OK    2       /* Test for write permission.  */
0035 #define OS_ACC_R_OK    4       /* Test for read permission.  */
0036 #define OS_ACC_RW_OK   (OS_ACC_W_OK | OS_ACC_R_OK) /* Test for RW permission */
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  * types taken from stat_file() in hostfs_user.c
0048  * (if they are wrong here, they are wrong there...).
0049  */
0050 struct uml_stat {
0051     int                ust_dev;        /* device */
0052     unsigned long long ust_ino;        /* inode */
0053     int                ust_mode;       /* protection */
0054     int                ust_nlink;      /* number of hard links */
0055     int                ust_uid;        /* user ID of owner */
0056     int                ust_gid;        /* group ID of owner */
0057     unsigned long long ust_size;       /* total size, in bytes */
0058     int                ust_blksize;    /* blocksize for filesystem I/O */
0059     unsigned long long ust_blocks;     /* number of blocks allocated */
0060     unsigned long      ust_atime;      /* time of last access */
0061     unsigned long      ust_mtime;      /* time of last modification */
0062     unsigned long      ust_ctime;      /* time of last change */
0063 };
0064 
0065 struct openflags {
0066     unsigned int r : 1;
0067     unsigned int w : 1;
0068     unsigned int s : 1; /* O_SYNC */
0069     unsigned int c : 1; /* O_CREAT */
0070     unsigned int t : 1; /* O_TRUNC */
0071     unsigned int a : 1; /* O_APPEND */
0072     unsigned int e : 1; /* O_EXCL */
0073     unsigned int cl : 1;    /* FD_CLOEXEC */
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 /* file.c */
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 /* start_up.c */
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 /* mem.c */
0192 extern int create_mem_file(unsigned long long len);
0193 
0194 /* process.c */
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 /* execvp.c */
0217 extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
0218 /* helper.c */
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 /* umid.c */
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 /* signal.c */
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 /* util.c */
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 /* time.c */
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 /* skas/mem.c */
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 /* skas/process.c */
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 /* irq.c */
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 /* sigio.c */
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  * unlocked versions for IRQ controller code.
0319  *
0320  * This is safe because it's used at suspend/resume and nothing
0321  * else is running.
0322  */
0323 extern int __add_sigio_fd(int fd);
0324 extern int __ignore_sigio_fd(int fd);
0325 
0326 /* prctl.c */
0327 extern int os_arch_prctl(int pid, int option, unsigned long *arg2);
0328 
0329 /* tty.c */
0330 extern int get_pty(void);
0331 
0332 /* sys-$ARCH/task_size.c */
0333 extern unsigned long os_get_top_address(void);
0334 
0335 long syscall(long number, ...);
0336 
0337 /* irqflags tracing */
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 /* time-travel */
0344 extern void deliver_time_travel_irqs(void);
0345 
0346 #endif