Merge remote-tracking branch 'riku/linux-user-for-upstream' into staging
This commit is contained in:
		
						commit
						81773a5055
					
				
							
								
								
									
										129
									
								
								arm-semi.c
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								arm-semi.c
									
									
									
									
									
								
							@ -34,6 +34,7 @@
 | 
			
		||||
#else
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "gdbstub.h"
 | 
			
		||||
#include "hw/arm-misc.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define SYS_OPEN        0x01
 | 
			
		||||
@ -369,68 +370,88 @@ uint32_t do_arm_semihosting(CPUState *env)
 | 
			
		||||
        return syscall_err;
 | 
			
		||||
#endif
 | 
			
		||||
    case SYS_GET_CMDLINE:
 | 
			
		||||
#ifdef CONFIG_USER_ONLY
 | 
			
		||||
        /* Build a commandline from the original argv.  */
 | 
			
		||||
        {
 | 
			
		||||
            char *arm_cmdline_buffer;
 | 
			
		||||
            const char *host_cmdline_buffer;
 | 
			
		||||
            /* Build a command-line from the original argv.
 | 
			
		||||
             *
 | 
			
		||||
             * The inputs are:
 | 
			
		||||
             *     * ARG(0), pointer to a buffer of at least the size
 | 
			
		||||
             *               specified in ARG(1).
 | 
			
		||||
             *     * ARG(1), size of the buffer pointed to by ARG(0) in
 | 
			
		||||
             *               bytes.
 | 
			
		||||
             *
 | 
			
		||||
             * The outputs are:
 | 
			
		||||
             *     * ARG(0), pointer to null-terminated string of the
 | 
			
		||||
             *               command line.
 | 
			
		||||
             *     * ARG(1), length of the string pointed to by ARG(0).
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            char *output_buffer;
 | 
			
		||||
            size_t input_size = ARG(1);
 | 
			
		||||
            size_t output_size;
 | 
			
		||||
            int status = 0;
 | 
			
		||||
 | 
			
		||||
            /* Compute the size of the output string.  */
 | 
			
		||||
#if !defined(CONFIG_USER_ONLY)
 | 
			
		||||
            output_size = strlen(ts->boot_info->kernel_filename)
 | 
			
		||||
                        + 1  /* Separating space.  */
 | 
			
		||||
                        + strlen(ts->boot_info->kernel_cmdline)
 | 
			
		||||
                        + 1; /* Terminating null byte.  */
 | 
			
		||||
#else
 | 
			
		||||
            unsigned int i;
 | 
			
		||||
            unsigned int arm_cmdline_len = ARG(1);
 | 
			
		||||
            unsigned int host_cmdline_len =
 | 
			
		||||
                ts->info->arg_end-ts->info->arg_start;
 | 
			
		||||
 | 
			
		||||
            if (!arm_cmdline_len || host_cmdline_len > arm_cmdline_len) {
 | 
			
		||||
                return -1; /* not enough space to store command line */
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!host_cmdline_len) {
 | 
			
		||||
            output_size = ts->info->arg_end - ts->info->arg_start;
 | 
			
		||||
            if (!output_size) {
 | 
			
		||||
                /* We special-case the "empty command line" case (argc==0).
 | 
			
		||||
                   Just provide the terminating 0. */
 | 
			
		||||
                arm_cmdline_buffer = lock_user(VERIFY_WRITE, ARG(0), 1, 0);
 | 
			
		||||
                arm_cmdline_buffer[0] = 0;
 | 
			
		||||
                unlock_user(arm_cmdline_buffer, ARG(0), 1);
 | 
			
		||||
 | 
			
		||||
                /* Adjust the commandline length argument. */
 | 
			
		||||
                SET_ARG(1, 0);
 | 
			
		||||
                return 0;
 | 
			
		||||
                output_size = 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* lock the buffers on the ARM side */
 | 
			
		||||
            arm_cmdline_buffer =
 | 
			
		||||
                lock_user(VERIFY_WRITE, ARG(0), host_cmdline_len, 0);
 | 
			
		||||
            host_cmdline_buffer =
 | 
			
		||||
                lock_user(VERIFY_READ, ts->info->arg_start,
 | 
			
		||||
                                       host_cmdline_len, 1);
 | 
			
		||||
 | 
			
		||||
            if (arm_cmdline_buffer && host_cmdline_buffer)
 | 
			
		||||
            {
 | 
			
		||||
                /* the last argument is zero-terminated;
 | 
			
		||||
                   no need for additional termination */
 | 
			
		||||
                memcpy(arm_cmdline_buffer, host_cmdline_buffer,
 | 
			
		||||
                       host_cmdline_len);
 | 
			
		||||
 | 
			
		||||
                /* separate arguments by white spaces */
 | 
			
		||||
                for (i = 0; i < host_cmdline_len-1; i++) {
 | 
			
		||||
                    if (arm_cmdline_buffer[i] == 0) {
 | 
			
		||||
                        arm_cmdline_buffer[i] = ' ';
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                /* Adjust the commandline length argument. */
 | 
			
		||||
                SET_ARG(1, host_cmdline_len-1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Unlock the buffers on the ARM side.  */
 | 
			
		||||
            unlock_user(arm_cmdline_buffer, ARG(0), host_cmdline_len);
 | 
			
		||||
            unlock_user((void*)host_cmdline_buffer, ts->info->arg_start, 0);
 | 
			
		||||
 | 
			
		||||
            /* Return success if we could return a commandline.  */
 | 
			
		||||
            return (arm_cmdline_buffer && host_cmdline_buffer) ? 0 : -1;
 | 
			
		||||
        }
 | 
			
		||||
#else
 | 
			
		||||
        return -1;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            if (output_size > input_size) {
 | 
			
		||||
                 /* Not enough space to store command-line arguments.  */
 | 
			
		||||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Adjust the command-line length.  */
 | 
			
		||||
            SET_ARG(1, output_size - 1);
 | 
			
		||||
 | 
			
		||||
            /* Lock the buffer on the ARM side.  */
 | 
			
		||||
            output_buffer = lock_user(VERIFY_WRITE, ARG(0), output_size, 0);
 | 
			
		||||
            if (!output_buffer) {
 | 
			
		||||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Copy the command-line arguments.  */
 | 
			
		||||
#if !defined(CONFIG_USER_ONLY)
 | 
			
		||||
            pstrcpy(output_buffer, output_size, ts->boot_info->kernel_filename);
 | 
			
		||||
            pstrcat(output_buffer, output_size, " ");
 | 
			
		||||
            pstrcat(output_buffer, output_size, ts->boot_info->kernel_cmdline);
 | 
			
		||||
#else
 | 
			
		||||
            if (output_size == 1) {
 | 
			
		||||
                /* Empty command-line.  */
 | 
			
		||||
                output_buffer[0] = '\0';
 | 
			
		||||
                goto out;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (copy_from_user(output_buffer, ts->info->arg_start,
 | 
			
		||||
                               output_size)) {
 | 
			
		||||
                status = -1;
 | 
			
		||||
                goto out;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Separate arguments by white spaces.  */
 | 
			
		||||
            for (i = 0; i < output_size - 1; i++) {
 | 
			
		||||
                if (output_buffer[i] == 0) {
 | 
			
		||||
                    output_buffer[i] = ' ';
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        out:
 | 
			
		||||
#endif
 | 
			
		||||
            /* Unlock the buffer on the ARM side.  */
 | 
			
		||||
            unlock_user(output_buffer, ARG(0), output_size);
 | 
			
		||||
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
    case SYS_HEAPINFO:
 | 
			
		||||
        {
 | 
			
		||||
            uint32_t *ptr;
 | 
			
		||||
 | 
			
		||||
@ -411,4 +411,25 @@
 | 
			
		||||
#define TARGET_NR_signalfd			476
 | 
			
		||||
#define TARGET_NR_timerfd			477
 | 
			
		||||
#define TARGET_NR_eventfd			478
 | 
			
		||||
 | 
			
		||||
#define TARGET_NR_recvmmsg                      479
 | 
			
		||||
#define TARGET_NR_fallocate                     480
 | 
			
		||||
#define TARGET_NR_timerfd_create                481
 | 
			
		||||
#define TARGET_NR_timerfd_settime               482
 | 
			
		||||
#define TARGET_NR_timerfd_gettime               483
 | 
			
		||||
#define TARGET_NR_signalfd4                     484
 | 
			
		||||
#define TARGET_NR_eventfd2                      485
 | 
			
		||||
#define TARGET_NR_epoll_create1                 486
 | 
			
		||||
#define TARGET_NR_dup3                          487
 | 
			
		||||
#define TARGET_NR_pipe2                         488
 | 
			
		||||
#define TARGET_NR_inotify_init1                 489
 | 
			
		||||
#define TARGET_NR_preadv                        490
 | 
			
		||||
#define TARGET_NR_pwritev                       491
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo             492
 | 
			
		||||
#define TARGET_NR_perf_event_open               493
 | 
			
		||||
#define TARGET_NR_fanotify_init                 494
 | 
			
		||||
#define TARGET_NR_fanotify_mark                 495
 | 
			
		||||
#define TARGET_NR_prlimit64                     496
 | 
			
		||||
#define TARGET_NR_name_to_handle_at             497
 | 
			
		||||
#define TARGET_NR_open_by_handle_at             498
 | 
			
		||||
#define TARGET_NR_clock_adjtime                 499
 | 
			
		||||
#define TARGET_NR_syncfs                        500
 | 
			
		||||
 | 
			
		||||
@ -365,3 +365,16 @@
 | 
			
		||||
#define TARGET_NR_dup3				(358)
 | 
			
		||||
#define TARGET_NR_pipe2			(359)
 | 
			
		||||
#define TARGET_NR_inotify_init1		(360)
 | 
			
		||||
#define TARGET_NR_preadv                       (361)
 | 
			
		||||
#define TARGET_NR_pwritev                      (362)
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo            (363)
 | 
			
		||||
#define TARGET_NR_perf_event_open              (364)
 | 
			
		||||
#define TARGET_NR_recvmmsg                     (365)
 | 
			
		||||
#define TARGET_NR_accept4                      (366)
 | 
			
		||||
#define TARGET_NR_fanotify_init                (367)
 | 
			
		||||
#define TARGET_NR_fanotify_mark                (368)
 | 
			
		||||
#define TARGET_NR_prlimit64                    (369)
 | 
			
		||||
#define TARGET_NR_name_to_handle_at            (370)
 | 
			
		||||
#define TARGET_NR_open_by_handle_at            (371)
 | 
			
		||||
#define TARGET_NR_clock_adjtime                (372)
 | 
			
		||||
#define TARGET_NR_syncfs                       (373)
 | 
			
		||||
 | 
			
		||||
@ -333,3 +333,5 @@
 | 
			
		||||
#define TARGET_NR_dup3               330
 | 
			
		||||
#define TARGET_NR_pipe2              331
 | 
			
		||||
#define TARGET_NR_inotify_init1      332
 | 
			
		||||
#define TARGET_NR_preadv             333
 | 
			
		||||
#define TARGET_NR_pwritev            334
 | 
			
		||||
 | 
			
		||||
@ -335,3 +335,15 @@
 | 
			
		||||
#define TARGET_NR_dup3			330
 | 
			
		||||
#define TARGET_NR_pipe2		331
 | 
			
		||||
#define TARGET_NR_inotify_init1	332
 | 
			
		||||
#define TARGET_NR_preadv                333
 | 
			
		||||
#define TARGET_NR_pwritev               334
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     335
 | 
			
		||||
#define TARGET_NR_perf_event_open       336
 | 
			
		||||
#define TARGET_NR_recvmmsg              337
 | 
			
		||||
#define TARGET_NR_fanotify_init         338
 | 
			
		||||
#define TARGET_NR_fanotify_mark         339
 | 
			
		||||
#define TARGET_NR_prlimit64             340
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     341
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     342
 | 
			
		||||
#define TARGET_NR_clock_adjtime         343
 | 
			
		||||
#define TARGET_NR_syncfs                344
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,10 @@
 | 
			
		||||
     IOCTL(KDSKBMODE, 0, TYPE_INT)
 | 
			
		||||
     IOCTL(KDGKBENT, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_kbentry)))
 | 
			
		||||
     IOCTL(KDGKBSENT, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_kbsentry)))
 | 
			
		||||
     IOCTL(KDGKBLED, 0, TYPE_INT)
 | 
			
		||||
     IOCTL(KDSKBLED, 0, TYPE_INT)
 | 
			
		||||
     IOCTL(KDGETLED, 0, TYPE_INT)
 | 
			
		||||
     IOCTL(KDSETLED, 0, TYPE_INT)
 | 
			
		||||
 | 
			
		||||
     IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT))
 | 
			
		||||
     IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT))
 | 
			
		||||
@ -325,6 +329,11 @@
 | 
			
		||||
  IOCTL(FBIOGET_FSCREENINFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_fb_fix_screeninfo)))
 | 
			
		||||
  IOCTL(FBIOGET_VSCREENINFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo)))
 | 
			
		||||
  IOCTL(FBIOPUT_VSCREENINFO, IOC_W, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo)))
 | 
			
		||||
  IOCTL(FBIOGETCMAP,        IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_cmap)))
 | 
			
		||||
  IOCTL(FBIOPUTCMAP,        IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_cmap)))
 | 
			
		||||
  IOCTL(FBIOPAN_DISPLAY,    IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_var_screeninfo)))
 | 
			
		||||
  IOCTL(FBIOGET_CON2FBMAP,  IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_con2fbmap)))
 | 
			
		||||
  IOCTL(FBIOPUT_CON2FBMAP,  IOC_RW, MK_PTR(MK_STRUCT(STRUCT_fb_con2fbmap)))
 | 
			
		||||
 | 
			
		||||
  IOCTL(VT_OPENQRY, IOC_R, MK_PTR(TYPE_INT))
 | 
			
		||||
  IOCTL(VT_GETSTATE, IOC_R, MK_PTR(MK_STRUCT(STRUCT_vt_stat)))
 | 
			
		||||
@ -332,3 +341,7 @@
 | 
			
		||||
  IOCTL(VT_WAITACTIVE, 0, TYPE_INT)
 | 
			
		||||
  IOCTL(VT_LOCKSWITCH, 0, TYPE_INT)
 | 
			
		||||
  IOCTL(VT_UNLOCKSWITCH, 0, TYPE_INT)
 | 
			
		||||
  IOCTL(VT_GETMODE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_vt_mode)))
 | 
			
		||||
  IOCTL(VT_SETMODE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_vt_mode)))
 | 
			
		||||
  IOCTL(VT_RELDISP, 0, TYPE_INT)
 | 
			
		||||
  IOCTL(VT_DISALLOCATE, 0, TYPE_INT)
 | 
			
		||||
 | 
			
		||||
@ -328,3 +328,19 @@
 | 
			
		||||
#define TARGET_NR_dup3			326
 | 
			
		||||
#define TARGET_NR_pipe2		327
 | 
			
		||||
#define TARGET_NR_inotify_init1	328
 | 
			
		||||
#define TARGET_NR_inotify_init1         328
 | 
			
		||||
#define TARGET_NR_preadv                329
 | 
			
		||||
#define TARGET_NR_pwritev               330
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     331
 | 
			
		||||
#define TARGET_NR_perf_event_open       332
 | 
			
		||||
#define TARGET_NR_get_thread_area       333
 | 
			
		||||
#define TARGET_NR_set_thread_area       334
 | 
			
		||||
#define TARGET_NR_atomic_cmpxchg_32     335
 | 
			
		||||
#define TARGET_NR_atomic_barrier        336
 | 
			
		||||
#define TARGET_NR_fanotify_init         337
 | 
			
		||||
#define TARGET_NR_fanotify_mark         338
 | 
			
		||||
#define TARGET_NR_prlimit64             339
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     340
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     341
 | 
			
		||||
#define TARGET_NR_clock_adjtime         342
 | 
			
		||||
#define TARGET_NR_syncfs                343
 | 
			
		||||
 | 
			
		||||
@ -1875,7 +1875,7 @@ static const uint8_t mips_syscall_args[] = {
 | 
			
		||||
	MIPS_SYS(sys_getcwd	, 2)
 | 
			
		||||
	MIPS_SYS(sys_capget	, 2)
 | 
			
		||||
	MIPS_SYS(sys_capset	, 2)	/* 4205 */
 | 
			
		||||
	MIPS_SYS(sys_sigaltstack	, 0)
 | 
			
		||||
	MIPS_SYS(sys_sigaltstack	, 2)
 | 
			
		||||
	MIPS_SYS(sys_sendfile	, 4)
 | 
			
		||||
	MIPS_SYS(sys_ni_syscall	, 0)
 | 
			
		||||
	MIPS_SYS(sys_ni_syscall	, 0)
 | 
			
		||||
@ -1985,6 +1985,33 @@ static const uint8_t mips_syscall_args[] = {
 | 
			
		||||
	MIPS_SYS(sys_epoll_pwait, 6)
 | 
			
		||||
	MIPS_SYS(sys_ioprio_set, 3)
 | 
			
		||||
	MIPS_SYS(sys_ioprio_get, 2)
 | 
			
		||||
        MIPS_SYS(sys_utimensat, 4)
 | 
			
		||||
        MIPS_SYS(sys_signalfd, 3)
 | 
			
		||||
        MIPS_SYS(sys_ni_syscall, 0)     /* was timerfd */
 | 
			
		||||
        MIPS_SYS(sys_eventfd, 1)
 | 
			
		||||
        MIPS_SYS(sys_fallocate, 6)      /* 4320 */
 | 
			
		||||
        MIPS_SYS(sys_timerfd_create, 2)
 | 
			
		||||
        MIPS_SYS(sys_timerfd_gettime, 2)
 | 
			
		||||
        MIPS_SYS(sys_timerfd_settime, 4)
 | 
			
		||||
        MIPS_SYS(sys_signalfd4, 4)
 | 
			
		||||
        MIPS_SYS(sys_eventfd2, 2)       /* 4325 */
 | 
			
		||||
        MIPS_SYS(sys_epoll_create1, 1)
 | 
			
		||||
        MIPS_SYS(sys_dup3, 3)
 | 
			
		||||
        MIPS_SYS(sys_pipe2, 2)
 | 
			
		||||
        MIPS_SYS(sys_inotify_init1, 1)
 | 
			
		||||
        MIPS_SYS(sys_preadv, 6)         /* 4330 */
 | 
			
		||||
        MIPS_SYS(sys_pwritev, 6)
 | 
			
		||||
        MIPS_SYS(sys_rt_tgsigqueueinfo, 4)
 | 
			
		||||
        MIPS_SYS(sys_perf_event_open, 5)
 | 
			
		||||
        MIPS_SYS(sys_accept4, 4)
 | 
			
		||||
        MIPS_SYS(sys_recvmmsg, 5)       /* 4335 */
 | 
			
		||||
        MIPS_SYS(sys_fanotify_init, 2)
 | 
			
		||||
        MIPS_SYS(sys_fanotify_mark, 6)
 | 
			
		||||
        MIPS_SYS(sys_prlimit64, 4)
 | 
			
		||||
        MIPS_SYS(sys_name_to_handle_at, 5)
 | 
			
		||||
        MIPS_SYS(sys_open_by_handle_at, 3) /* 4340 */
 | 
			
		||||
        MIPS_SYS(sys_clock_adjtime, 2)
 | 
			
		||||
        MIPS_SYS(sys_syncfs, 1)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef MIPS_SYS
 | 
			
		||||
@ -2053,7 +2080,7 @@ void cpu_loop(CPUMIPSState *env)
 | 
			
		||||
            syscall_num = env->active_tc.gpr[2] - 4000;
 | 
			
		||||
            env->active_tc.PC += 4;
 | 
			
		||||
            if (syscall_num >= sizeof(mips_syscall_args)) {
 | 
			
		||||
                ret = -ENOSYS;
 | 
			
		||||
                ret = -TARGET_ENOSYS;
 | 
			
		||||
            } else {
 | 
			
		||||
                int nb_args;
 | 
			
		||||
                abi_ulong sp_reg;
 | 
			
		||||
@ -2093,6 +2120,8 @@ void cpu_loop(CPUMIPSState *env)
 | 
			
		||||
            break;
 | 
			
		||||
        case EXCP_TLBL:
 | 
			
		||||
        case EXCP_TLBS:
 | 
			
		||||
        case EXCP_AdEL:
 | 
			
		||||
        case EXCP_AdES:
 | 
			
		||||
            info.si_signo = TARGET_SIGSEGV;
 | 
			
		||||
            info.si_errno = 0;
 | 
			
		||||
            /* XXX: check env->error_code */
 | 
			
		||||
 | 
			
		||||
@ -364,6 +364,16 @@
 | 
			
		||||
#define TARGET_NR_sendmsg		360 /* new */
 | 
			
		||||
#define TARGET_NR_recvmsg		361 /* new */
 | 
			
		||||
#define TARGET_NR_accept04		362 /* new */
 | 
			
		||||
 | 
			
		||||
#define TARGET_NR_syscalls		363
 | 
			
		||||
#define TARGET_NR_preadv                363 /* new */
 | 
			
		||||
#define TARGET_NR_pwritev               364 /* new */
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     365 /* new */
 | 
			
		||||
#define TARGET_NR_perf_event_open       366 /* new */
 | 
			
		||||
#define TARGET_NR_recvmmsg              367 /* new */
 | 
			
		||||
#define TARGET_NR_fanotify_init         368
 | 
			
		||||
#define TARGET_NR_fanotify_mark         369
 | 
			
		||||
#define TARGET_NR_prlimit64             370
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     371
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     372
 | 
			
		||||
#define TARGET_NR_clock_adjtime         373
 | 
			
		||||
#define TARGET_NR_syncfs                374
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -332,3 +332,16 @@
 | 
			
		||||
#define TARGET_NR_dup3			(TARGET_NR_Linux + 327)
 | 
			
		||||
#define TARGET_NR_pipe2		(TARGET_NR_Linux + 328)
 | 
			
		||||
#define TARGET_NR_inotify_init1	(TARGET_NR_Linux + 329)
 | 
			
		||||
#define TARGET_NR_preadv                (TARGET_NR_Linux + 330)
 | 
			
		||||
#define TARGET_NR_pwritev               (TARGET_NR_Linux + 331)
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     (TARGET_NR_Linux + 332)
 | 
			
		||||
#define TARGET_NR_perf_event_open       (TARGET_NR_Linux + 333)
 | 
			
		||||
#define TARGET_NR_accept4               (TARGET_NR_Linux + 334)
 | 
			
		||||
#define TARGET_NR_recvmmsg              (TARGET_NR_Linux + 335)
 | 
			
		||||
#define TARGET_NR_fanotify_init         (TARGET_NR_Linux + 336)
 | 
			
		||||
#define TARGET_NR_fanotify_mark         (TARGET_NR_Linux + 337)
 | 
			
		||||
#define TARGET_NR_prlimit64             (TARGET_NR_Linux + 338)
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     (TARGET_NR_Linux + 339)
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     (TARGET_NR_Linux + 340)
 | 
			
		||||
#define TARGET_NR_clock_adjtime         (TARGET_NR_Linux + 341)
 | 
			
		||||
#define TARGET_NR_syncfs                (TARGET_NR_Linux + 342)
 | 
			
		||||
 | 
			
		||||
@ -291,3 +291,16 @@
 | 
			
		||||
#define TARGET_NR_dup3				(TARGET_NR_Linux + 286)
 | 
			
		||||
#define TARGET_NR_pipe2			(TARGET_NR_Linux + 287)
 | 
			
		||||
#define TARGET_NR_inotify_init1		(TARGET_NR_Linux + 288)
 | 
			
		||||
#define TARGET_NR_preadv                        (TARGET_NR_Linux + 289)
 | 
			
		||||
#define TARGET_NR_pwritev                       (TARGET_NR_Linux + 290)
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo             (TARGET_NR_Linux + 291)
 | 
			
		||||
#define TARGET_NR_perf_event_open               (TARGET_NR_Linux + 292)
 | 
			
		||||
#define TARGET_NR_accept4                       (TARGET_NR_Linux + 293)
 | 
			
		||||
#define TARGET_NR_recvmmsg                      (TARGET_NR_Linux + 294)
 | 
			
		||||
#define TARGET_NR_fanotify_init                 (TARGET_NR_Linux + 295)
 | 
			
		||||
#define TARGET_NR_fanotify_mark                 (TARGET_NR_Linux + 296)
 | 
			
		||||
#define TARGET_NR_prlimit64                     (TARGET_NR_Linux + 297)
 | 
			
		||||
#define TARGET_NR_name_to_handle_at             (TARGET_NR_Linux + 298)
 | 
			
		||||
#define TARGET_NR_open_by_handle_at             (TARGET_NR_Linux + 299)
 | 
			
		||||
#define TARGET_NR_clock_adjtime                 (TARGET_NR_Linux + 300)
 | 
			
		||||
#define TARGET_NR_syncfs                        (TARGET_NR_Linux + 301)
 | 
			
		||||
 | 
			
		||||
@ -295,3 +295,17 @@
 | 
			
		||||
#define TARGET_NR_dup3				(TARGET_NR_Linux + 290)
 | 
			
		||||
#define TARGET_NR_pipe2			(TARGET_NR_Linux + 291)
 | 
			
		||||
#define TARGET_NR_inotify_init1		(TARGET_NR_Linux + 292)
 | 
			
		||||
#define TARGET_NR_preadv                        (TARGET_NR_Linux + 293)
 | 
			
		||||
#define TARGET_NR_pwritev                       (TARGET_NR_Linux + 294)
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo             (TARGET_NR_Linux + 295)
 | 
			
		||||
#define TARGET_NR_perf_event_open               (TARGET_NR_Linux + 296)
 | 
			
		||||
#define TARGET_NR_accept4                       (TARGET_NR_Linux + 297)
 | 
			
		||||
#define TARGET_NR_recvmmsg                      (TARGET_NR_Linux + 298)
 | 
			
		||||
#define TARGET_NR_getdents64                    (TARGET_NR_Linux + 299)
 | 
			
		||||
#define TARGET_NR_fanotify_init                 (TARGET_NR_Linux + 300)
 | 
			
		||||
#define TARGET_NR_fanotify_mark                 (TARGET_NR_Linux + 301)
 | 
			
		||||
#define TARGET_NR_prlimit64                     (TARGET_NR_Linux + 302)
 | 
			
		||||
#define TARGET_NR_name_to_handle_at             (TARGET_NR_Linux + 303)
 | 
			
		||||
#define TARGET_NR_open_by_handle_at             (TARGET_NR_Linux + 304)
 | 
			
		||||
#define TARGET_NR_clock_adjtime                 (TARGET_NR_Linux + 305)
 | 
			
		||||
#define TARGET_NR_syncfs                        (TARGET_NR_Linux + 306)
 | 
			
		||||
 | 
			
		||||
@ -332,3 +332,33 @@
 | 
			
		||||
#define TARGET_NR_dup3			316
 | 
			
		||||
#define TARGET_NR_pipe2		317
 | 
			
		||||
#define TARGET_NR_inotify_init1	318
 | 
			
		||||
#define TARGET_NR_perf_event_open       319
 | 
			
		||||
#define TARGET_NR_preadv                320
 | 
			
		||||
#define TARGET_NR_pwritev               321
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     322
 | 
			
		||||
#define TARGET_NR_fanotify_init         323
 | 
			
		||||
#define TARGET_NR_fanotify_mark         324
 | 
			
		||||
#define TARGET_NR_prlimit64             325
 | 
			
		||||
#define TARGET_NR_socket                326
 | 
			
		||||
#define TARGET_NR_bind                  327
 | 
			
		||||
#define TARGET_NR_connect               328
 | 
			
		||||
#define TARGET_NR_listen                329
 | 
			
		||||
#define TARGET_NR_accept                330
 | 
			
		||||
#define TARGET_NR_getsockname           331
 | 
			
		||||
#define TARGET_NR_getpeername           332
 | 
			
		||||
#define TARGET_NR_socketpair            333
 | 
			
		||||
#define TARGET_NR_send                  334
 | 
			
		||||
#define TARGET_NR_sendto                335
 | 
			
		||||
#define TARGET_NR_recv                  336
 | 
			
		||||
#define TARGET_NR_recvfrom              337
 | 
			
		||||
#define TARGET_NR_shutdown              338
 | 
			
		||||
#define TARGET_NR_setsockopt            339
 | 
			
		||||
#define TARGET_NR_getsockopt            340
 | 
			
		||||
#define TARGET_NR_sendmsg               341
 | 
			
		||||
#define TARGET_NR_recvmsg               342
 | 
			
		||||
#define TARGET_NR_recvmmsg              343
 | 
			
		||||
#define TARGET_NR_accept4               344
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     345
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     346
 | 
			
		||||
#define TARGET_NR_clock_adjtime         347
 | 
			
		||||
#define TARGET_NR_syncfs                348
 | 
			
		||||
 | 
			
		||||
@ -254,8 +254,17 @@
 | 
			
		||||
#define TARGET_NR_pipe2		325
 | 
			
		||||
#define TARGET_NR_dup3		326
 | 
			
		||||
#define TARGET_NR_epoll_create1	327
 | 
			
		||||
#undef NR_syscalls
 | 
			
		||||
#define NR_syscalls 328
 | 
			
		||||
#define TARGET_NR_preadv                328
 | 
			
		||||
#define TARGET_NR_pwritev               329
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     330
 | 
			
		||||
#define TARGET_NR_perf_event_open       331
 | 
			
		||||
#define TARGET_NR_fanotify_init         332
 | 
			
		||||
#define TARGET_NR_fanotify_mark         333
 | 
			
		||||
#define TARGET_NR_prlimit64             334
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     335
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     336
 | 
			
		||||
#define TARGET_NR_clock_adjtime         337
 | 
			
		||||
#define TARGET_NR_syncfs                338
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * There are some system calls that are not present on 64 bit, some
 | 
			
		||||
 | 
			
		||||
@ -125,7 +125,7 @@
 | 
			
		||||
#define TARGET_NR_clone		120
 | 
			
		||||
#define TARGET_NR_setdomainname	121
 | 
			
		||||
#define TARGET_NR_uname		122
 | 
			
		||||
#define TARGET_NR_modify_ldt		123
 | 
			
		||||
#define TARGET_NR_cacheflush		123
 | 
			
		||||
#define TARGET_NR_adjtimex		124
 | 
			
		||||
#define TARGET_NR_mprotect		125
 | 
			
		||||
#define TARGET_NR_sigprocmask	126
 | 
			
		||||
@ -334,3 +334,35 @@
 | 
			
		||||
#define TARGET_NR_dup3			330
 | 
			
		||||
#define TARGET_NR_pipe2		331
 | 
			
		||||
#define TARGET_NR_inotify_init1	332
 | 
			
		||||
#define TARGET_NR_preadv                333
 | 
			
		||||
#define TARGET_NR_pwritev               334
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     335
 | 
			
		||||
#define TARGET_NR_perf_event_open       336
 | 
			
		||||
#define TARGET_NR_fanotify_init         337
 | 
			
		||||
#define TARGET_NR_fanotify_mark         338
 | 
			
		||||
#define TARGET_NR_prlimit64             339
 | 
			
		||||
 | 
			
		||||
/* Non-multiplexed socket family */
 | 
			
		||||
#define TARGET_NR_socket                340
 | 
			
		||||
#define TARGET_NR_bind                  341
 | 
			
		||||
#define TARGET_NR_connect               342
 | 
			
		||||
#define TARGET_NR_listen                343
 | 
			
		||||
#define TARGET_NR_accept                344
 | 
			
		||||
#define TARGET_NR_getsockname           345
 | 
			
		||||
#define TARGET_NR_getpeername           346
 | 
			
		||||
#define TARGET_NR_socketpair            347
 | 
			
		||||
#define TARGET_NR_send                  348
 | 
			
		||||
#define TARGET_NR_sendto                349
 | 
			
		||||
#define TARGET_NR_recv                  350
 | 
			
		||||
#define TARGET_NR_recvfrom              351
 | 
			
		||||
#define TARGET_NR_shutdown              352
 | 
			
		||||
#define TARGET_NR_setsockopt            353
 | 
			
		||||
#define TARGET_NR_getsockopt            354
 | 
			
		||||
#define TARGET_NR_sendmsg               355
 | 
			
		||||
#define TARGET_NR_recvmsg               356
 | 
			
		||||
#define TARGET_NR_recvmmsg              357
 | 
			
		||||
#define TARGET_NR_accept4               358
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     359
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     360
 | 
			
		||||
#define TARGET_NR_clock_adjtime         361
 | 
			
		||||
#define TARGET_NR_syncfs                362
 | 
			
		||||
 | 
			
		||||
@ -3662,11 +3662,11 @@ typedef struct {
 | 
			
		||||
} sigframe;
 | 
			
		||||
 | 
			
		||||
struct target_ucontext {
 | 
			
		||||
    target_ulong uc_flags;
 | 
			
		||||
    struct target_ucontext *uc_link;
 | 
			
		||||
    target_stack_t uc_stack;
 | 
			
		||||
    target_sigregs uc_mcontext;
 | 
			
		||||
    target_sigset_t uc_sigmask;   /* mask last for extensibility */
 | 
			
		||||
    target_ulong tuc_flags;
 | 
			
		||||
    struct target_ucontext *tuc_link;
 | 
			
		||||
    target_stack_t tuc_stack;
 | 
			
		||||
    target_sigregs tuc_mcontext;
 | 
			
		||||
    target_sigset_t tuc_sigmask;   /* mask last for extensibility */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@ -3814,16 +3814,16 @@ static void setup_rt_frame(int sig, struct target_sigaction *ka,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Create the ucontext.  */
 | 
			
		||||
    __put_user(0, &frame->uc.uc_flags);
 | 
			
		||||
    __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.uc_link);
 | 
			
		||||
    __put_user(target_sigaltstack_used.ss_sp, &frame->uc.uc_stack.ss_sp);
 | 
			
		||||
    __put_user(0, &frame->uc.tuc_flags);
 | 
			
		||||
    __put_user((abi_ulong)0, (abi_ulong *)&frame->uc.tuc_link);
 | 
			
		||||
    __put_user(target_sigaltstack_used.ss_sp, &frame->uc.tuc_stack.ss_sp);
 | 
			
		||||
    __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
 | 
			
		||||
                      &frame->uc.uc_stack.ss_flags);
 | 
			
		||||
    __put_user(target_sigaltstack_used.ss_size, &frame->uc.uc_stack.ss_size);
 | 
			
		||||
    save_sigregs(env, &frame->uc.uc_mcontext);
 | 
			
		||||
                      &frame->uc.tuc_stack.ss_flags);
 | 
			
		||||
    __put_user(target_sigaltstack_used.ss_size, &frame->uc.tuc_stack.ss_size);
 | 
			
		||||
    save_sigregs(env, &frame->uc.tuc_mcontext);
 | 
			
		||||
    for (i = 0; i < TARGET_NSIG_WORDS; i++) {
 | 
			
		||||
        __put_user((abi_ulong)set->sig[i],
 | 
			
		||||
        (abi_ulong *)&frame->uc.uc_sigmask.sig[i]);
 | 
			
		||||
        (abi_ulong *)&frame->uc.tuc_sigmask.sig[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Set up to return from userspace.  If provided, use a stub
 | 
			
		||||
@ -3928,15 +3928,15 @@ long do_rt_sigreturn(CPUState *env)
 | 
			
		||||
    if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) {
 | 
			
		||||
        goto badframe;
 | 
			
		||||
    }
 | 
			
		||||
    target_to_host_sigset(&set, &frame->uc.uc_sigmask);
 | 
			
		||||
    target_to_host_sigset(&set, &frame->uc.tuc_sigmask);
 | 
			
		||||
 | 
			
		||||
    sigprocmask(SIG_SETMASK, &set, NULL); /* ~_BLOCKABLE? */
 | 
			
		||||
 | 
			
		||||
    if (restore_sigregs(env, &frame->uc.uc_mcontext)) {
 | 
			
		||||
    if (restore_sigregs(env, &frame->uc.tuc_mcontext)) {
 | 
			
		||||
        goto badframe;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.uc_stack), 0,
 | 
			
		||||
    if (do_sigaltstack(frame_addr + offsetof(rt_sigframe, uc.tuc_stack), 0,
 | 
			
		||||
                       get_sp_from_cpustate(env)) == -EFAULT) {
 | 
			
		||||
        goto badframe;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -285,3 +285,15 @@
 | 
			
		||||
#define TARGET_NR_pipe2		321
 | 
			
		||||
#define TARGET_NR_inotify_init1	322
 | 
			
		||||
#define TARGET_NR_accept4		323
 | 
			
		||||
#define TARGET_NR_preadv                324
 | 
			
		||||
#define TARGET_NR_pwritev               325
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     326
 | 
			
		||||
#define TARGET_NR_perf_event_open       327
 | 
			
		||||
#define TARGET_NR_recvmmsg              328
 | 
			
		||||
#define TARGET_NR_fanotify_init         329
 | 
			
		||||
#define TARGET_NR_fanotify_mark         330
 | 
			
		||||
#define TARGET_NR_prlimit64             331
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     332
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     333
 | 
			
		||||
#define TARGET_NR_clock_adjtime         334
 | 
			
		||||
#define TARGET_NR_syncfs                335
 | 
			
		||||
 | 
			
		||||
@ -322,3 +322,15 @@
 | 
			
		||||
#define TARGET_NR_pipe2		321
 | 
			
		||||
#define TARGET_NR_inotify_init1	322
 | 
			
		||||
#define TARGET_NR_accept4		323
 | 
			
		||||
#define TARGET_NR_preadv                324
 | 
			
		||||
#define TARGET_NR_pwritev               325
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     326
 | 
			
		||||
#define TARGET_NR_perf_event_open       327
 | 
			
		||||
#define TARGET_NR_recvmmsg              328
 | 
			
		||||
#define TARGET_NR_fanotify_init         329
 | 
			
		||||
#define TARGET_NR_fanotify_mark         330
 | 
			
		||||
#define TARGET_NR_prlimit64             331
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     332
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     333
 | 
			
		||||
#define TARGET_NR_clock_adjtime         334
 | 
			
		||||
#define TARGET_NR_syncfs                335
 | 
			
		||||
 | 
			
		||||
@ -559,12 +559,38 @@ _syscall6(int, sys_pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds,
 | 
			
		||||
          fd_set *, exceptfds, struct timespec *, timeout, void *, sig);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_NR_prlimit64)
 | 
			
		||||
#ifndef __NR_prlimit64
 | 
			
		||||
# define __NR_prlimit64 -1
 | 
			
		||||
#endif
 | 
			
		||||
#define __NR_sys_prlimit64 __NR_prlimit64
 | 
			
		||||
/* The glibc rlimit structure may not be that used by the underlying syscall */
 | 
			
		||||
struct host_rlimit64 {
 | 
			
		||||
    uint64_t rlim_cur;
 | 
			
		||||
    uint64_t rlim_max;
 | 
			
		||||
};
 | 
			
		||||
_syscall4(int, sys_prlimit64, pid_t, pid, int, resource,
 | 
			
		||||
          const struct host_rlimit64 *, new_limit,
 | 
			
		||||
          struct host_rlimit64 *, old_limit)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern int personality(int);
 | 
			
		||||
extern int flock(int, int);
 | 
			
		||||
extern int setfsuid(int);
 | 
			
		||||
extern int setfsgid(int);
 | 
			
		||||
extern int setgroups(int, gid_t *);
 | 
			
		||||
 | 
			
		||||
/* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */
 | 
			
		||||
#ifdef TARGET_ARM 
 | 
			
		||||
static inline int regpairs_aligned(void *cpu_env) {
 | 
			
		||||
    return ((((CPUARMState *)cpu_env)->eabi) == 1) ;
 | 
			
		||||
}
 | 
			
		||||
#elif defined(TARGET_MIPS)
 | 
			
		||||
static inline int regpairs_aligned(void *cpu_env) { return 1; }
 | 
			
		||||
#else
 | 
			
		||||
static inline int regpairs_aligned(void *cpu_env) { return 0; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define ERRNO_TABLE_SIZE 1200
 | 
			
		||||
 | 
			
		||||
/* target_to_host_errno_table[] is initialized from
 | 
			
		||||
@ -919,18 +945,68 @@ static inline abi_long host_to_target_rusage(abi_ulong target_addr,
 | 
			
		||||
 | 
			
		||||
static inline rlim_t target_to_host_rlim(target_ulong target_rlim)
 | 
			
		||||
{
 | 
			
		||||
    if (target_rlim == TARGET_RLIM_INFINITY)
 | 
			
		||||
        return RLIM_INFINITY;
 | 
			
		||||
    target_ulong target_rlim_swap;
 | 
			
		||||
    rlim_t result;
 | 
			
		||||
    
 | 
			
		||||
    target_rlim_swap = tswapl(target_rlim);
 | 
			
		||||
    if (target_rlim_swap == TARGET_RLIM_INFINITY || target_rlim_swap != (rlim_t)target_rlim_swap)
 | 
			
		||||
        result = RLIM_INFINITY;
 | 
			
		||||
    else
 | 
			
		||||
        return tswapl(target_rlim);
 | 
			
		||||
        result = target_rlim_swap;
 | 
			
		||||
    
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline target_ulong host_to_target_rlim(rlim_t rlim)
 | 
			
		||||
{
 | 
			
		||||
    target_ulong target_rlim_swap;
 | 
			
		||||
    target_ulong result;
 | 
			
		||||
    
 | 
			
		||||
    if (rlim == RLIM_INFINITY || rlim != (target_long)rlim)
 | 
			
		||||
        return TARGET_RLIM_INFINITY;
 | 
			
		||||
        target_rlim_swap = TARGET_RLIM_INFINITY;
 | 
			
		||||
    else
 | 
			
		||||
        return tswapl(rlim);
 | 
			
		||||
        target_rlim_swap = rlim;
 | 
			
		||||
    result = tswapl(target_rlim_swap);
 | 
			
		||||
    
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int target_to_host_resource(int code)
 | 
			
		||||
{
 | 
			
		||||
    switch (code) {
 | 
			
		||||
    case TARGET_RLIMIT_AS:
 | 
			
		||||
        return RLIMIT_AS;
 | 
			
		||||
    case TARGET_RLIMIT_CORE:
 | 
			
		||||
        return RLIMIT_CORE;
 | 
			
		||||
    case TARGET_RLIMIT_CPU:
 | 
			
		||||
        return RLIMIT_CPU;
 | 
			
		||||
    case TARGET_RLIMIT_DATA:
 | 
			
		||||
        return RLIMIT_DATA;
 | 
			
		||||
    case TARGET_RLIMIT_FSIZE:
 | 
			
		||||
        return RLIMIT_FSIZE;
 | 
			
		||||
    case TARGET_RLIMIT_LOCKS:
 | 
			
		||||
        return RLIMIT_LOCKS;
 | 
			
		||||
    case TARGET_RLIMIT_MEMLOCK:
 | 
			
		||||
        return RLIMIT_MEMLOCK;
 | 
			
		||||
    case TARGET_RLIMIT_MSGQUEUE:
 | 
			
		||||
        return RLIMIT_MSGQUEUE;
 | 
			
		||||
    case TARGET_RLIMIT_NICE:
 | 
			
		||||
        return RLIMIT_NICE;
 | 
			
		||||
    case TARGET_RLIMIT_NOFILE:
 | 
			
		||||
        return RLIMIT_NOFILE;
 | 
			
		||||
    case TARGET_RLIMIT_NPROC:
 | 
			
		||||
        return RLIMIT_NPROC;
 | 
			
		||||
    case TARGET_RLIMIT_RSS:
 | 
			
		||||
        return RLIMIT_RSS;
 | 
			
		||||
    case TARGET_RLIMIT_RTPRIO:
 | 
			
		||||
        return RLIMIT_RTPRIO;
 | 
			
		||||
    case TARGET_RLIMIT_SIGPENDING:
 | 
			
		||||
        return RLIMIT_SIGPENDING;
 | 
			
		||||
    case TARGET_RLIMIT_STACK:
 | 
			
		||||
        return RLIMIT_STACK;
 | 
			
		||||
    default:
 | 
			
		||||
        return code;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline abi_long copy_from_user_timeval(struct timeval *tv,
 | 
			
		||||
@ -4310,13 +4386,10 @@ static inline abi_long target_truncate64(void *cpu_env, const char *arg1,
 | 
			
		||||
                                         abi_long arg3,
 | 
			
		||||
                                         abi_long arg4)
 | 
			
		||||
{
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
    if (((CPUARMState *)cpu_env)->eabi)
 | 
			
		||||
      {
 | 
			
		||||
    if (regpairs_aligned(cpu_env)) {
 | 
			
		||||
        arg2 = arg3;
 | 
			
		||||
        arg3 = arg4;
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    return get_errno(truncate64(arg1, target_offset64(arg2, arg3)));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@ -4327,13 +4400,10 @@ static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1,
 | 
			
		||||
                                          abi_long arg3,
 | 
			
		||||
                                          abi_long arg4)
 | 
			
		||||
{
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
    if (((CPUARMState *)cpu_env)->eabi)
 | 
			
		||||
      {
 | 
			
		||||
    if (regpairs_aligned(cpu_env)) {
 | 
			
		||||
        arg2 = arg3;
 | 
			
		||||
        arg3 = arg4;
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3)));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
@ -5543,7 +5613,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
        break;
 | 
			
		||||
    case TARGET_NR_setrlimit:
 | 
			
		||||
        {
 | 
			
		||||
            int resource = arg1;
 | 
			
		||||
            int resource = target_to_host_resource(arg1);
 | 
			
		||||
            struct target_rlimit *target_rlim;
 | 
			
		||||
            struct rlimit rlim;
 | 
			
		||||
            if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1))
 | 
			
		||||
@ -5556,7 +5626,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
        break;
 | 
			
		||||
    case TARGET_NR_getrlimit:
 | 
			
		||||
        {
 | 
			
		||||
            int resource = arg1;
 | 
			
		||||
            int resource = target_to_host_resource(arg1);
 | 
			
		||||
            struct target_rlimit *target_rlim;
 | 
			
		||||
            struct rlimit rlim;
 | 
			
		||||
 | 
			
		||||
@ -5684,6 +5754,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
 | 
			
		||||
                if (arg_sigset) {
 | 
			
		||||
                    sig.set = &set;
 | 
			
		||||
                    if (arg_sigsize != sizeof(*target_sigset)) {
 | 
			
		||||
                        /* Like the kernel, we enforce correct size sigsets */
 | 
			
		||||
                        ret = -TARGET_EINVAL;
 | 
			
		||||
                        goto fail;
 | 
			
		||||
                    }
 | 
			
		||||
                    target_sigset = lock_user(VERIFY_READ, arg_sigset,
 | 
			
		||||
                                              sizeof(*target_sigset), 1);
 | 
			
		||||
                    if (!target_sigset) {
 | 
			
		||||
@ -6787,20 +6862,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef TARGET_NR_pread
 | 
			
		||||
    case TARGET_NR_pread:
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
        if (((CPUARMState *)cpu_env)->eabi)
 | 
			
		||||
        if (regpairs_aligned(cpu_env))
 | 
			
		||||
            arg4 = arg5;
 | 
			
		||||
#endif
 | 
			
		||||
        if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
 | 
			
		||||
            goto efault;
 | 
			
		||||
        ret = get_errno(pread(arg1, p, arg3, arg4));
 | 
			
		||||
        unlock_user(p, arg2, ret);
 | 
			
		||||
        break;
 | 
			
		||||
    case TARGET_NR_pwrite:
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
        if (((CPUARMState *)cpu_env)->eabi)
 | 
			
		||||
        if (regpairs_aligned(cpu_env))
 | 
			
		||||
            arg4 = arg5;
 | 
			
		||||
#endif
 | 
			
		||||
        if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
 | 
			
		||||
            goto efault;
 | 
			
		||||
        ret = get_errno(pwrite(arg1, p, arg3, arg4));
 | 
			
		||||
@ -6860,7 +6931,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
    case TARGET_NR_ugetrlimit:
 | 
			
		||||
    {
 | 
			
		||||
	struct rlimit rlim;
 | 
			
		||||
	ret = get_errno(getrlimit(arg1, &rlim));
 | 
			
		||||
	int resource = target_to_host_resource(arg1);
 | 
			
		||||
	ret = get_errno(getrlimit(resource, &rlim));
 | 
			
		||||
	if (!is_error(ret)) {
 | 
			
		||||
	    struct target_rlimit *target_rlim;
 | 
			
		||||
            if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
 | 
			
		||||
@ -7550,14 +7622,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
#ifdef TARGET_NR_readahead
 | 
			
		||||
    case TARGET_NR_readahead:
 | 
			
		||||
#if TARGET_ABI_BITS == 32
 | 
			
		||||
#ifdef TARGET_ARM
 | 
			
		||||
        if (((CPUARMState *)cpu_env)->eabi)
 | 
			
		||||
        {
 | 
			
		||||
        if (regpairs_aligned(cpu_env)) {
 | 
			
		||||
            arg2 = arg3;
 | 
			
		||||
            arg3 = arg4;
 | 
			
		||||
            arg4 = arg5;
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
        ret = get_errno(readahead(arg1, ((off64_t)arg3 << 32) | arg2, arg4));
 | 
			
		||||
#else
 | 
			
		||||
        ret = get_errno(readahead(arg1, arg2, arg3));
 | 
			
		||||
@ -7989,6 +8058,34 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef TARGET_NR_prlimit64
 | 
			
		||||
    case TARGET_NR_prlimit64:
 | 
			
		||||
    {
 | 
			
		||||
        /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
 | 
			
		||||
        struct target_rlimit64 *target_rnew, *target_rold;
 | 
			
		||||
        struct host_rlimit64 rnew, rold, *rnewp = 0;
 | 
			
		||||
        if (arg3) {
 | 
			
		||||
            if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
 | 
			
		||||
                goto efault;
 | 
			
		||||
            }
 | 
			
		||||
            rnew.rlim_cur = tswap64(target_rnew->rlim_cur);
 | 
			
		||||
            rnew.rlim_max = tswap64(target_rnew->rlim_max);
 | 
			
		||||
            unlock_user_struct(target_rnew, arg3, 0);
 | 
			
		||||
            rnewp = &rnew;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ret = get_errno(sys_prlimit64(arg1, arg2, rnewp, arg4 ? &rold : 0));
 | 
			
		||||
        if (!is_error(ret) && arg4) {
 | 
			
		||||
            if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) {
 | 
			
		||||
                goto efault;
 | 
			
		||||
            }
 | 
			
		||||
            target_rold->rlim_cur = tswap64(rold.rlim_cur);
 | 
			
		||||
            target_rold->rlim_max = tswap64(rold.rlim_max);
 | 
			
		||||
            unlock_user_struct(target_rold, arg4, 1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    default:
 | 
			
		||||
    unimplemented:
 | 
			
		||||
 | 
			
		||||
@ -693,6 +693,40 @@ struct target_rlimit {
 | 
			
		||||
#define TARGET_RLIM_INFINITY	((target_ulong)~0UL)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(TARGET_MIPS)
 | 
			
		||||
#define TARGET_RLIMIT_CPU		0
 | 
			
		||||
#define TARGET_RLIMIT_FSIZE		1
 | 
			
		||||
#define TARGET_RLIMIT_DATA		2
 | 
			
		||||
#define TARGET_RLIMIT_STACK		3
 | 
			
		||||
#define TARGET_RLIMIT_CORE		4
 | 
			
		||||
#define TARGET_RLIMIT_RSS		7
 | 
			
		||||
#define TARGET_RLIMIT_NPROC		8
 | 
			
		||||
#define TARGET_RLIMIT_NOFILE		5
 | 
			
		||||
#define TARGET_RLIMIT_MEMLOCK		9
 | 
			
		||||
#define TARGET_RLIMIT_AS		6
 | 
			
		||||
#define TARGET_RLIMIT_LOCKS		10
 | 
			
		||||
#define TARGET_RLIMIT_SIGPENDING	11
 | 
			
		||||
#define TARGET_RLIMIT_MSGQUEUE		12
 | 
			
		||||
#define TARGET_RLIMIT_NICE		13
 | 
			
		||||
#define TARGET_RLIMIT_RTPRIO		14
 | 
			
		||||
#else
 | 
			
		||||
#define TARGET_RLIMIT_CPU		0
 | 
			
		||||
#define TARGET_RLIMIT_FSIZE		1
 | 
			
		||||
#define TARGET_RLIMIT_DATA		2
 | 
			
		||||
#define TARGET_RLIMIT_STACK		3
 | 
			
		||||
#define TARGET_RLIMIT_CORE		4
 | 
			
		||||
#define TARGET_RLIMIT_RSS		5
 | 
			
		||||
#define TARGET_RLIMIT_NPROC		6
 | 
			
		||||
#define TARGET_RLIMIT_NOFILE		7
 | 
			
		||||
#define TARGET_RLIMIT_MEMLOCK		8
 | 
			
		||||
#define TARGET_RLIMIT_AS		9
 | 
			
		||||
#define TARGET_RLIMIT_LOCKS		10
 | 
			
		||||
#define TARGET_RLIMIT_SIGPENDING	11
 | 
			
		||||
#define TARGET_RLIMIT_MSGQUEUE		12
 | 
			
		||||
#define TARGET_RLIMIT_NICE		13
 | 
			
		||||
#define TARGET_RLIMIT_RTPRIO		14
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct target_pollfd {
 | 
			
		||||
    int fd;           /* file descriptor */
 | 
			
		||||
    short events;     /* requested events */
 | 
			
		||||
@ -708,6 +742,10 @@ struct target_pollfd {
 | 
			
		||||
#define TARGET_KDSKBMODE       0x4b45
 | 
			
		||||
#define TARGET_KDGKBENT	       0x4B46	/* gets one entry in translation table */
 | 
			
		||||
#define TARGET_KDGKBSENT       0x4B48	/* gets one function key string entry */
 | 
			
		||||
#define TARGET_KDGKBLED        0x4B64	/* get led flags (not lights) */
 | 
			
		||||
#define TARGET_KDSKBLED        0x4B65	/* set led flags (not lights) */
 | 
			
		||||
#define TARGET_KDGETLED        0x4B31	/* return current led state */
 | 
			
		||||
#define TARGET_KDSETLED        0x4B32	/* set led state [lights, not flags] */
 | 
			
		||||
 | 
			
		||||
#define TARGET_SIOCATMARK      0x8905
 | 
			
		||||
 | 
			
		||||
@ -928,6 +966,11 @@ struct target_pollfd {
 | 
			
		||||
#define TARGET_FBIOGET_VSCREENINFO    0x4600
 | 
			
		||||
#define TARGET_FBIOPUT_VSCREENINFO    0x4601
 | 
			
		||||
#define TARGET_FBIOGET_FSCREENINFO    0x4602
 | 
			
		||||
#define TARGET_FBIOGETCMAP            0x4604
 | 
			
		||||
#define TARGET_FBIOPUTCMAP            0x4605
 | 
			
		||||
#define TARGET_FBIOPAN_DISPLAY        0x4606
 | 
			
		||||
#define TARGET_FBIOGET_CON2FBMAP      0x460F
 | 
			
		||||
#define TARGET_FBIOPUT_CON2FBMAP      0x4610
 | 
			
		||||
 | 
			
		||||
/* vt ioctls */
 | 
			
		||||
#define TARGET_VT_OPENQRY             0x5600
 | 
			
		||||
@ -936,6 +979,10 @@ struct target_pollfd {
 | 
			
		||||
#define TARGET_VT_WAITACTIVE          0x5607
 | 
			
		||||
#define TARGET_VT_LOCKSWITCH          0x560b
 | 
			
		||||
#define TARGET_VT_UNLOCKSWITCH        0x560c
 | 
			
		||||
#define TARGET_VT_GETMODE             0x5601
 | 
			
		||||
#define TARGET_VT_SETMODE             0x5602
 | 
			
		||||
#define TARGET_VT_RELDISP             0x5605
 | 
			
		||||
#define TARGET_VT_DISALLOCATE         0x5608
 | 
			
		||||
 | 
			
		||||
/* from asm/termbits.h */
 | 
			
		||||
 | 
			
		||||
@ -2280,3 +2327,7 @@ struct target_epoll_event {
 | 
			
		||||
    target_epoll_data_t data;
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
struct target_rlimit64 {
 | 
			
		||||
    uint64_t rlim_cur;
 | 
			
		||||
    uint64_t rlim_max;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -161,11 +161,31 @@ STRUCT(fb_var_screeninfo,
 | 
			
		||||
       TYPE_INT, /* rotate */
 | 
			
		||||
       MK_ARRAY(TYPE_INT, 5)) /* reserved */
 | 
			
		||||
 | 
			
		||||
STRUCT(fb_cmap,
 | 
			
		||||
       TYPE_INT, /* start  */
 | 
			
		||||
       TYPE_INT, /* len    */
 | 
			
		||||
       TYPE_PTRVOID, /* red    */
 | 
			
		||||
       TYPE_PTRVOID, /* green  */
 | 
			
		||||
       TYPE_PTRVOID, /* blue   */
 | 
			
		||||
       TYPE_PTRVOID) /* transp */
 | 
			
		||||
 | 
			
		||||
STRUCT(fb_con2fbmap,
 | 
			
		||||
       TYPE_INT, /* console     */
 | 
			
		||||
       TYPE_INT) /* framebuffer */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
STRUCT(vt_stat,
 | 
			
		||||
       TYPE_SHORT, /* v_active */
 | 
			
		||||
       TYPE_SHORT, /* v_signal */
 | 
			
		||||
       TYPE_SHORT) /* v_state */
 | 
			
		||||
 | 
			
		||||
STRUCT(vt_mode,
 | 
			
		||||
       TYPE_CHAR,  /* mode   */
 | 
			
		||||
       TYPE_CHAR,  /* waitv  */
 | 
			
		||||
       TYPE_SHORT, /* relsig */
 | 
			
		||||
       TYPE_SHORT, /* acqsig */
 | 
			
		||||
       TYPE_SHORT) /* frsig  */
 | 
			
		||||
 | 
			
		||||
STRUCT(fiemap_extent,
 | 
			
		||||
       TYPE_ULONGLONG, /* fe_logical */
 | 
			
		||||
       TYPE_ULONGLONG, /* fe_physical */
 | 
			
		||||
 | 
			
		||||
@ -293,3 +293,15 @@
 | 
			
		||||
#define TARGET_NR_dup3			292
 | 
			
		||||
#define TARGET_NR_pipe2		293
 | 
			
		||||
#define TARGET_NR_inotify_init1	294
 | 
			
		||||
#define TARGET_NR_preadv                295
 | 
			
		||||
#define TARGET_NR_pwritev               296
 | 
			
		||||
#define TARGET_NR_rt_tgsigqueueinfo     297
 | 
			
		||||
#define TARGET_NR_perf_event_open       298
 | 
			
		||||
#define TARGET_NR_recvmmsg              299
 | 
			
		||||
#define TARGET_NR_fanotify_init         300
 | 
			
		||||
#define TARGET_NR_fanotify_mark         301
 | 
			
		||||
#define TARGET_NR_prlimit64             302
 | 
			
		||||
#define TARGET_NR_name_to_handle_at     303
 | 
			
		||||
#define TARGET_NR_open_by_handle_at     304
 | 
			
		||||
#define TARGET_NR_clock_adjtime         305
 | 
			
		||||
#define TARGET_NR_syncfs                306
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user