Author: dchagin
Date: Sun Apr 28 14:16:00 2019
New Revision: 346838
URL: https://svnweb.freebsd.org/changeset/base/346838

Log:
  MFC r345469, r345470:
  
  Linux between 4.18 and 5.0 split IPC system calls.
  In preparation for doing this in the Linuxulator modify our linux_shmat()
  to match actual Linux shmat() system call.

Modified:
  stable/11/sys/amd64/linux/linux_proto.h
  stable/11/sys/amd64/linux/linux_systrace_args.c
  stable/11/sys/amd64/linux32/linux32_machdep.c
  stable/11/sys/amd64/linux32/linux32_proto.h
  stable/11/sys/amd64/linux32/linux32_systrace_args.c
  stable/11/sys/amd64/linux32/syscalls.master
  stable/11/sys/compat/linux/linux_ipc.c
  stable/11/sys/compat/linux/linux_ipc.h
  stable/11/sys/i386/linux/linux_machdep.c
  stable/11/sys/i386/linux/linux_proto.h
  stable/11/sys/i386/linux/linux_systrace_args.c
  stable/11/sys/i386/linux/syscalls.master
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/amd64/linux/linux_proto.h
==============================================================================
--- stable/11/sys/amd64/linux/linux_proto.h     Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/amd64/linux/linux_proto.h     Sun Apr 28 14:16:00 2019        
(r346838)
@@ -66,8 +66,8 @@ struct linux_mmap2_args {
 };
 struct linux_mprotect_args {
        char addr_l_[PADL_(caddr_t)]; caddr_t addr; char 
addr_r_[PADR_(caddr_t)];
-       char len_l_[PADL_(int)]; int len; char len_r_[PADR_(int)];
-       char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)];
+       char len_l_[PADL_(l_int)]; l_int len; char len_r_[PADR_(l_int)];
+       char prot_l_[PADL_(l_int)]; l_int prot; char prot_r_[PADR_(l_int)];
 };
 struct linux_brk_args {
        char dsend_l_[PADL_(l_ulong)]; l_ulong dsend; char 
dsend_r_[PADR_(l_ulong)];
@@ -173,8 +173,8 @@ struct linux_getpid_args {
        register_t dummy;
 };
 struct linux_sendfile_args {
-       char out_l_[PADL_(int)]; int out; char out_r_[PADR_(int)];
-       char in_l_[PADL_(int)]; int in; char in_r_[PADR_(int)];
+       char out_l_[PADL_(l_int)]; l_int out; char out_r_[PADR_(l_int)];
+       char in_l_[PADL_(l_int)]; l_int in; char in_r_[PADR_(l_int)];
        char offset_l_[PADL_(l_long *)]; l_long * offset; char 
offset_r_[PADR_(l_long *)];
        char count_l_[PADL_(l_size_t)]; l_size_t count; char 
count_r_[PADR_(l_size_t)];
 };
@@ -281,7 +281,7 @@ struct linux_execve_args {
        char envp_l_[PADL_(char **)]; char ** envp; char envp_r_[PADR_(char 
**)];
 };
 struct linux_exit_args {
-       char rval_l_[PADL_(int)]; int rval; char rval_r_[PADR_(int)];
+       char rval_l_[PADL_(l_int)]; l_int rval; char rval_r_[PADR_(l_int)];
 };
 struct linux_wait4_args {
        char pid_l_[PADL_(l_pid_t)]; l_pid_t pid; char pid_r_[PADR_(l_pid_t)];
@@ -518,8 +518,8 @@ struct linux_sysfs_args {
        char arg2_l_[PADL_(l_ulong)]; l_ulong arg2; char 
arg2_r_[PADR_(l_ulong)];
 };
 struct linux_getpriority_args {
-       char which_l_[PADL_(int)]; int which; char which_r_[PADR_(int)];
-       char who_l_[PADL_(int)]; int who; char who_r_[PADR_(int)];
+       char which_l_[PADL_(l_int)]; l_int which; char which_r_[PADR_(l_int)];
+       char who_l_[PADL_(l_int)]; l_int who; char who_r_[PADR_(l_int)];
 };
 struct linux_sched_setparam_args {
        char pid_l_[PADL_(l_pid_t)]; l_pid_t pid; char pid_r_[PADR_(l_pid_t)];
@@ -654,19 +654,19 @@ struct linux_fremovexattr_args {
        register_t dummy;
 };
 struct linux_tkill_args {
-       char tid_l_[PADL_(int)]; int tid; char tid_r_[PADR_(int)];
-       char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)];
+       char tid_l_[PADL_(l_int)]; l_int tid; char tid_r_[PADR_(l_int)];
+       char sig_l_[PADL_(l_int)]; l_int sig; char sig_r_[PADR_(l_int)];
 };
 struct linux_time_args {
        char tm_l_[PADL_(l_time_t *)]; l_time_t * tm; char tm_r_[PADR_(l_time_t 
*)];
 };
 struct linux_sys_futex_args {
        char uaddr_l_[PADL_(void *)]; void * uaddr; char uaddr_r_[PADR_(void 
*)];
-       char op_l_[PADL_(int)]; int op; char op_r_[PADR_(int)];
-       char val_l_[PADL_(int)]; int val; char val_r_[PADR_(int)];
+       char op_l_[PADL_(l_int)]; l_int op; char op_r_[PADR_(l_int)];
+       char val_l_[PADL_(l_int)]; l_int val; char val_r_[PADR_(l_int)];
        char timeout_l_[PADL_(struct l_timespec *)]; struct l_timespec * 
timeout; char timeout_r_[PADR_(struct l_timespec *)];
        char uaddr2_l_[PADL_(void *)]; void * uaddr2; char uaddr2_r_[PADR_(void 
*)];
-       char val3_l_[PADL_(int)]; int val3; char val3_r_[PADR_(int)];
+       char val3_l_[PADL_(l_int)]; l_int val3; char val3_r_[PADR_(l_int)];
 };
 struct linux_sched_setaffinity_args {
        char pid_l_[PADL_(l_pid_t)]; l_pid_t pid; char pid_r_[PADR_(l_pid_t)];
@@ -693,16 +693,16 @@ struct linux_getdents64_args {
        char count_l_[PADL_(l_uint)]; l_uint count; char 
count_r_[PADR_(l_uint)];
 };
 struct linux_set_tid_address_args {
-       char tidptr_l_[PADL_(int *)]; int * tidptr; char tidptr_r_[PADR_(int 
*)];
+       char tidptr_l_[PADL_(l_int *)]; l_int * tidptr; char 
tidptr_r_[PADR_(l_int *)];
 };
 struct linux_semtimedop_args {
        register_t dummy;
 };
 struct linux_fadvise64_args {
-       char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+       char fd_l_[PADL_(l_int)]; l_int fd; char fd_r_[PADR_(l_int)];
        char offset_l_[PADL_(l_loff_t)]; l_loff_t offset; char 
offset_r_[PADR_(l_loff_t)];
        char len_l_[PADL_(l_size_t)]; l_size_t len; char 
len_r_[PADR_(l_size_t)];
-       char advice_l_[PADL_(int)]; int advice; char advice_r_[PADR_(int)];
+       char advice_l_[PADL_(l_int)]; l_int advice; char 
advice_r_[PADR_(l_int)];
 };
 struct linux_timer_create_args {
        char clock_id_l_[PADL_(clockid_t)]; clockid_t clock_id; char 
clock_id_r_[PADR_(clockid_t)];
@@ -744,7 +744,7 @@ struct linux_clock_nanosleep_args {
        char rmtp_l_[PADL_(struct l_timespec *)]; struct l_timespec * rmtp; 
char rmtp_r_[PADR_(struct l_timespec *)];
 };
 struct linux_exit_group_args {
-       char error_code_l_[PADL_(int)]; int error_code; char 
error_code_r_[PADR_(int)];
+       char error_code_l_[PADL_(l_int)]; l_int error_code; char 
error_code_r_[PADR_(l_int)];
 };
 struct linux_epoll_wait_args {
        char epfd_l_[PADL_(l_int)]; l_int epfd; char epfd_r_[PADR_(l_int)];
@@ -759,9 +759,9 @@ struct linux_epoll_ctl_args {
        char event_l_[PADL_(struct epoll_event *)]; struct epoll_event * event; 
char event_r_[PADR_(struct epoll_event *)];
 };
 struct linux_tgkill_args {
-       char tgid_l_[PADL_(int)]; int tgid; char tgid_r_[PADR_(int)];
-       char pid_l_[PADL_(int)]; int pid; char pid_r_[PADR_(int)];
-       char sig_l_[PADL_(int)]; int sig; char sig_r_[PADR_(int)];
+       char tgid_l_[PADL_(l_int)]; l_int tgid; char tgid_r_[PADR_(l_int)];
+       char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
+       char sig_l_[PADL_(l_int)]; l_int sig; char sig_r_[PADR_(l_int)];
 };
 struct linux_utimes_args {
        char fname_l_[PADL_(char *)]; char * fname; char fname_r_[PADR_(char 
*)];
@@ -798,10 +798,10 @@ struct linux_kexec_load_args {
        register_t dummy;
 };
 struct linux_waitid_args {
-       char idtype_l_[PADL_(int)]; int idtype; char idtype_r_[PADR_(int)];
+       char idtype_l_[PADL_(l_int)]; l_int idtype; char 
idtype_r_[PADR_(l_int)];
        char id_l_[PADL_(l_pid_t)]; l_pid_t id; char id_r_[PADR_(l_pid_t)];
        char info_l_[PADL_(l_siginfo_t *)]; l_siginfo_t * info; char 
info_r_[PADR_(l_siginfo_t *)];
-       char options_l_[PADL_(int)]; int options; char options_r_[PADR_(int)];
+       char options_l_[PADL_(l_int)]; l_int options; char 
options_r_[PADR_(l_int)];
        char rusage_l_[PADL_(struct rusage *)]; struct rusage * rusage; char 
rusage_r_[PADR_(struct rusage *)];
 };
 struct linux_add_key_args {

Modified: stable/11/sys/amd64/linux/linux_systrace_args.c
==============================================================================
--- stable/11/sys/amd64/linux/linux_systrace_args.c     Sun Apr 28 14:11:21 
2019        (r346837)
+++ stable/11/sys/amd64/linux/linux_systrace_args.c     Sun Apr 28 14:16:00 
2019        (r346838)
@@ -104,8 +104,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        case 10: {
                struct linux_mprotect_args *p = params;
                uarg[0] = (intptr_t) p->addr; /* caddr_t */
-               iarg[1] = p->len; /* int */
-               iarg[2] = p->prot; /* int */
+               iarg[1] = p->len; /* l_int */
+               iarg[2] = p->prot; /* l_int */
                *n_args = 3;
                break;
        }
@@ -354,8 +354,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_sendfile */
        case 40: {
                struct linux_sendfile_args *p = params;
-               iarg[0] = p->out; /* int */
-               iarg[1] = p->in; /* int */
+               iarg[0] = p->out; /* l_int */
+               iarg[1] = p->in; /* l_int */
                uarg[2] = (intptr_t) p->offset; /* l_long * */
                iarg[3] = p->count; /* l_size_t */
                *n_args = 4;
@@ -538,7 +538,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_exit */
        case 60: {
                struct linux_exit_args *p = params;
-               iarg[0] = p->rval; /* int */
+               iarg[0] = p->rval; /* l_int */
                *n_args = 1;
                break;
        }
@@ -1160,8 +1160,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_getpriority */
        case 140: {
                struct linux_getpriority_args *p = params;
-               iarg[0] = p->which; /* int */
-               iarg[1] = p->who; /* int */
+               iarg[0] = p->which; /* l_int */
+               iarg[1] = p->who; /* l_int */
                *n_args = 2;
                break;
        }
@@ -1479,8 +1479,8 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_tkill */
        case 200: {
                struct linux_tkill_args *p = params;
-               iarg[0] = p->tid; /* int */
-               iarg[1] = p->sig; /* int */
+               iarg[0] = p->tid; /* l_int */
+               iarg[1] = p->sig; /* l_int */
                *n_args = 2;
                break;
        }
@@ -1495,11 +1495,11 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        case 202: {
                struct linux_sys_futex_args *p = params;
                uarg[0] = (intptr_t) p->uaddr; /* void * */
-               iarg[1] = p->op; /* int */
-               iarg[2] = p->val; /* int */
+               iarg[1] = p->op; /* l_int */
+               iarg[2] = p->val; /* l_int */
                uarg[3] = (intptr_t) p->timeout; /* struct l_timespec * */
                uarg[4] = (intptr_t) p->uaddr2; /* void * */
-               iarg[5] = p->val3; /* int */
+               iarg[5] = p->val3; /* l_int */
                *n_args = 6;
                break;
        }
@@ -1550,7 +1550,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_set_tid_address */
        case 218: {
                struct linux_set_tid_address_args *p = params;
-               uarg[0] = (intptr_t) p->tidptr; /* int * */
+               uarg[0] = (intptr_t) p->tidptr; /* l_int * */
                *n_args = 1;
                break;
        }
@@ -1562,10 +1562,10 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_fadvise64 */
        case 221: {
                struct linux_fadvise64_args *p = params;
-               iarg[0] = p->fd; /* int */
+               iarg[0] = p->fd; /* l_int */
                iarg[1] = p->offset; /* l_loff_t */
                iarg[2] = p->len; /* l_size_t */
-               iarg[3] = p->advice; /* int */
+               iarg[3] = p->advice; /* l_int */
                *n_args = 4;
                break;
        }
@@ -1647,7 +1647,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_exit_group */
        case 231: {
                struct linux_exit_group_args *p = params;
-               iarg[0] = p->error_code; /* int */
+               iarg[0] = p->error_code; /* l_int */
                *n_args = 1;
                break;
        }
@@ -1674,9 +1674,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_tgkill */
        case 234: {
                struct linux_tgkill_args *p = params;
-               iarg[0] = p->tgid; /* int */
-               iarg[1] = p->pid; /* int */
-               iarg[2] = p->sig; /* int */
+               iarg[0] = p->tgid; /* l_int */
+               iarg[1] = p->pid; /* l_int */
+               iarg[2] = p->sig; /* l_int */
                *n_args = 3;
                break;
        }
@@ -1741,10 +1741,10 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
        /* linux_waitid */
        case 247: {
                struct linux_waitid_args *p = params;
-               iarg[0] = p->idtype; /* int */
+               iarg[0] = p->idtype; /* l_int */
                iarg[1] = p->id; /* l_pid_t */
                uarg[2] = (intptr_t) p->info; /* l_siginfo_t * */
-               iarg[3] = p->options; /* int */
+               iarg[3] = p->options; /* l_int */
                uarg[4] = (intptr_t) p->rusage; /* struct rusage * */
                *n_args = 5;
                break;
@@ -2619,10 +2619,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "caddr_t";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 2:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -3036,10 +3036,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 40:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 2:
                        p = "l_long *";
@@ -3366,7 +3366,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 60:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -4356,10 +4356,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 140:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -4763,10 +4763,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 200:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -4789,10 +4789,10 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "void *";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 2:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 3:
                        p = "struct l_timespec *";
@@ -4801,7 +4801,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "void *";
                        break;
                case 5:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -4875,7 +4875,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 218:
                switch(ndx) {
                case 0:
-                       p = "int *";
+                       p = "l_int *";
                        break;
                default:
                        break;
@@ -4888,7 +4888,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 221:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
                        p = "l_loff_t";
@@ -4897,7 +4897,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "l_size_t";
                        break;
                case 3:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -5033,7 +5033,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 231:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -5081,13 +5081,13 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 234:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 2:
-                       p = "int";
+                       p = "l_int";
                        break;
                default:
                        break;
@@ -5140,7 +5140,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
        case 247:
                switch(ndx) {
                case 0:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 1:
                        p = "l_pid_t";
@@ -5149,7 +5149,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "l_siginfo_t *";
                        break;
                case 3:
-                       p = "int";
+                       p = "l_int";
                        break;
                case 4:
                        p = "struct rusage *";

Modified: stable/11/sys/amd64/linux32/linux32_machdep.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_machdep.c       Sun Apr 28 14:11:21 
2019        (r346837)
+++ stable/11/sys/amd64/linux32/linux32_machdep.c       Sun Apr 28 14:16:00 
2019        (r346838)
@@ -255,7 +255,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                struct linux_semop_args a;
 
                a.semid = args->arg1;
-               a.tsops = args->ptr;
+               a.tsops = PTRIN(args->ptr);
                a.nsops = args->arg2;
                return (linux_semop(td, &a));
        }
@@ -274,7 +274,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                a.semid = args->arg1;
                a.semnum = args->arg2;
                a.cmd = args->arg3;
-               error = copyin(args->ptr, &a.arg, sizeof(a.arg));
+               error = copyin(PTRIN(args->ptr), &a.arg, sizeof(a.arg));
                if (error)
                        return (error);
                return (linux_semctl(td, &a));
@@ -283,7 +283,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                struct linux_msgsnd_args a;
 
                a.msqid = args->arg1;
-               a.msgp = args->ptr;
+               a.msgp = PTRIN(args->ptr);
                a.msgsz = args->arg2;
                a.msgflg = args->arg3;
                return (linux_msgsnd(td, &a));
@@ -300,13 +300,13 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
 
                        if (args->ptr == 0)
                                return (EINVAL);
-                       error = copyin(args->ptr, &tmp, sizeof(tmp));
+                       error = copyin(PTRIN(args->ptr), &tmp, sizeof(tmp));
                        if (error)
                                return (error);
                        a.msgp = PTRIN(tmp.msgp);
                        a.msgtyp = tmp.msgtyp;
                } else {
-                       a.msgp = args->ptr;
+                       a.msgp = PTRIN(args->ptr);
                        a.msgtyp = args->arg5;
                }
                return (linux_msgrcv(td, &a));
@@ -323,22 +323,29 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
 
                a.msqid = args->arg1;
                a.cmd = args->arg2;
-               a.buf = args->ptr;
+               a.buf = PTRIN(args->ptr);
                return (linux_msgctl(td, &a));
        }
        case LINUX_SHMAT: {
                struct linux_shmat_args a;
+               l_uintptr_t addr;
+               int error;
 
                a.shmid = args->arg1;
-               a.shmaddr = args->ptr;
+               a.shmaddr = PTRIN(args->ptr);
                a.shmflg = args->arg2;
-               a.raddr = PTRIN((l_uint)args->arg3);
-               return (linux_shmat(td, &a));
+               error = linux_shmat(td, &a);
+               if (error != 0)
+                       return (error);
+               addr = td->td_retval[0];
+               error = copyout(&addr, PTRIN(args->arg3), sizeof(addr));
+               td->td_retval[0] = 0;
+               return (error);
        }
        case LINUX_SHMDT: {
                struct linux_shmdt_args a;
 
-               a.shmaddr = args->ptr;
+               a.shmaddr = PTRIN(args->ptr);
                return (linux_shmdt(td, &a));
        }
        case LINUX_SHMGET: {
@@ -354,7 +361,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
 
                a.shmid = args->arg1;
                a.cmd = args->arg2;
-               a.buf = args->ptr;
+               a.buf = PTRIN(args->ptr);
                return (linux_shmctl(td, &a));
        }
        default:

Modified: stable/11/sys/amd64/linux32/linux32_proto.h
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_proto.h Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/amd64/linux32/linux32_proto.h Sun Apr 28 14:16:00 2019        
(r346838)
@@ -368,9 +368,9 @@ struct linux_ipc_args {
        char what_l_[PADL_(l_uint)]; l_uint what; char what_r_[PADR_(l_uint)];
        char arg1_l_[PADL_(l_int)]; l_int arg1; char arg1_r_[PADR_(l_int)];
        char arg2_l_[PADL_(l_int)]; l_int arg2; char arg2_r_[PADR_(l_int)];
-       char arg3_l_[PADL_(l_int)]; l_int arg3; char arg3_r_[PADR_(l_int)];
-       char ptr_l_[PADL_(void *)]; void * ptr; char ptr_r_[PADR_(void *)];
-       char arg5_l_[PADL_(l_long)]; l_long arg5; char arg5_r_[PADR_(l_long)];
+       char arg3_l_[PADL_(l_uint)]; l_uint arg3; char arg3_r_[PADR_(l_uint)];
+       char ptr_l_[PADL_(l_uintptr_t)]; l_uintptr_t ptr; char 
ptr_r_[PADR_(l_uintptr_t)];
+       char arg5_l_[PADL_(l_uint)]; l_uint arg5; char arg5_r_[PADR_(l_uint)];
 };
 struct linux_sigreturn_args {
        char sfp_l_[PADL_(struct l_sigframe *)]; struct l_sigframe * sfp; char 
sfp_r_[PADR_(struct l_sigframe *)];

Modified: stable/11/sys/amd64/linux32/linux32_systrace_args.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_systrace_args.c Sun Apr 28 14:11:21 
2019        (r346837)
+++ stable/11/sys/amd64/linux32/linux32_systrace_args.c Sun Apr 28 14:16:00 
2019        (r346838)
@@ -785,9 +785,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
                iarg[0] = p->what; /* l_uint */
                iarg[1] = p->arg1; /* l_int */
                iarg[2] = p->arg2; /* l_int */
-               iarg[3] = p->arg3; /* l_int */
-               uarg[4] = (intptr_t) p->ptr; /* void * */
-               iarg[5] = p->arg5; /* l_long */
+               iarg[3] = p->arg3; /* l_uint */
+               iarg[4] = p->ptr; /* l_uintptr_t */
+               iarg[5] = p->arg5; /* l_uint */
                *n_args = 6;
                break;
        }
@@ -3894,13 +3894,13 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "l_int";
                        break;
                case 3:
-                       p = "l_int";
+                       p = "l_uint";
                        break;
                case 4:
-                       p = "void *";
+                       p = "l_uintptr_t";
                        break;
                case 5:
-                       p = "l_long";
+                       p = "l_uint";
                        break;
                default:
                        break;

Modified: stable/11/sys/amd64/linux32/syscalls.master
==============================================================================
--- stable/11/sys/amd64/linux32/syscalls.master Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/amd64/linux32/syscalls.master Sun Apr 28 14:16:00 2019        
(r346838)
@@ -213,8 +213,8 @@
 115    AUE_SWAPOFF     STD     { int linux_swapoff(void); }
 116    AUE_NULL        STD     { int linux_sysinfo(struct l_sysinfo *info); }
 117    AUE_NULL        STD     { int linux_ipc(l_uint what, l_int arg1, \
-                                   l_int arg2, l_int arg3, void *ptr, \
-                                   l_long arg5); }
+                                   l_int arg2, l_uint arg3, l_uintptr_t ptr, \
+                                   l_uint arg5); }
 118    AUE_FSYNC       NOPROTO { int fsync(int fd); }
 119    AUE_SIGRETURN   STD     { int linux_sigreturn( \
                                    struct l_sigframe *sfp); }

Modified: stable/11/sys/compat/linux/linux_ipc.c
==============================================================================
--- stable/11/sys/compat/linux/linux_ipc.c      Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/compat/linux/linux_ipc.c      Sun Apr 28 14:16:00 2019        
(r346838)
@@ -785,23 +785,11 @@ linux_shmat(struct thread *td, struct linux_shmat_args
                void *shmaddr;
                int shmflg;
        } */ bsd_args;
-       int error;
-#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
-       l_uintptr_t addr;
-#endif
 
        bsd_args.shmid = args->shmid;
        bsd_args.shmaddr = PTRIN(args->shmaddr);
        bsd_args.shmflg = args->shmflg;
-       if ((error = sys_shmat(td, &bsd_args)))
-               return (error);
-#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
-       addr = td->td_retval[0];
-       if ((error = copyout(&addr, PTRIN(args->raddr), sizeof(addr))))
-               return (error);
-       td->td_retval[0] = 0;
-#endif
-       return (0);
+       return (sys_shmat(td, &bsd_args));
 }
 
 int

Modified: stable/11/sys/compat/linux/linux_ipc.h
==============================================================================
--- stable/11/sys/compat/linux/linux_ipc.h      Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/compat/linux/linux_ipc.h      Sun Apr 28 14:16:00 2019        
(r346838)
@@ -141,7 +141,6 @@ struct linux_shmat_args
        l_int           shmid;
        char            *shmaddr;
        l_int           shmflg;
-       l_ulong         *raddr;
 };
 
 struct linux_shmctl_args

Modified: stable/11/sys/i386/linux/linux_machdep.c
==============================================================================
--- stable/11/sys/i386/linux/linux_machdep.c    Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/i386/linux/linux_machdep.c    Sun Apr 28 14:16:00 2019        
(r346838)
@@ -133,7 +133,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                struct linux_semop_args a;
 
                a.semid = args->arg1;
-               a.tsops = args->ptr;
+               a.tsops = PTRIN(args->ptr);
                a.nsops = args->arg2;
                return (linux_semop(td, &a));
        }
@@ -152,7 +152,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                a.semid = args->arg1;
                a.semnum = args->arg2;
                a.cmd = args->arg3;
-               error = copyin(args->ptr, &a.arg, sizeof(a.arg));
+               error = copyin(PTRIN(args->ptr), &a.arg, sizeof(a.arg));
                if (error)
                        return (error);
                return (linux_semctl(td, &a));
@@ -161,7 +161,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                struct linux_msgsnd_args a;
 
                a.msqid = args->arg1;
-               a.msgp = args->ptr;
+               a.msgp = PTRIN(args->ptr);
                a.msgsz = args->arg2;
                a.msgflg = args->arg3;
                return (linux_msgsnd(td, &a));
@@ -176,15 +176,15 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
                        struct l_ipc_kludge tmp;
                        int error;
 
-                       if (args->ptr == NULL)
+                       if (args->ptr == 0)
                                return (EINVAL);
-                       error = copyin(args->ptr, &tmp, sizeof(tmp));
+                       error = copyin(PTRIN(args->ptr), &tmp, sizeof(tmp));
                        if (error)
                                return (error);
-                       a.msgp = tmp.msgp;
+                       a.msgp = PTRIN(tmp.msgp);
                        a.msgtyp = tmp.msgtyp;
                } else {
-                       a.msgp = args->ptr;
+                       a.msgp = PTRIN(args->ptr);
                        a.msgtyp = args->arg5;
                }
                return (linux_msgrcv(td, &a));
@@ -201,22 +201,29 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
 
                a.msqid = args->arg1;
                a.cmd = args->arg2;
-               a.buf = args->ptr;
+               a.buf = PTRIN(args->ptr);
                return (linux_msgctl(td, &a));
        }
        case LINUX_SHMAT: {
                struct linux_shmat_args a;
+               l_uintptr_t addr;
+               int error;
 
                a.shmid = args->arg1;
-               a.shmaddr = args->ptr;
+               a.shmaddr = PTRIN(args->ptr);
                a.shmflg = args->arg2;
-               a.raddr = (l_ulong *)args->arg3;
-               return (linux_shmat(td, &a));
+               error = linux_shmat(td, &a);
+               if (error != 0)
+                       return (error);
+               addr = td->td_retval[0];
+               error = copyout(&addr, PTRIN(args->arg3), sizeof(addr));
+               td->td_retval[0] = 0;
+               return (error);
        }
        case LINUX_SHMDT: {
                struct linux_shmdt_args a;
 
-               a.shmaddr = args->ptr;
+               a.shmaddr = PTRIN(args->ptr);
                return (linux_shmdt(td, &a));
        }
        case LINUX_SHMGET: {
@@ -232,7 +239,7 @@ linux_ipc(struct thread *td, struct linux_ipc_args *ar
 
                a.shmid = args->arg1;
                a.cmd = args->arg2;
-               a.buf = args->ptr;
+               a.buf = PTRIN(args->ptr);
                return (linux_shmctl(td, &a));
        }
        default:

Modified: stable/11/sys/i386/linux/linux_proto.h
==============================================================================
--- stable/11/sys/i386/linux/linux_proto.h      Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/i386/linux/linux_proto.h      Sun Apr 28 14:16:00 2019        
(r346838)
@@ -371,9 +371,9 @@ struct linux_ipc_args {
        char what_l_[PADL_(l_uint)]; l_uint what; char what_r_[PADR_(l_uint)];
        char arg1_l_[PADL_(l_int)]; l_int arg1; char arg1_r_[PADR_(l_int)];
        char arg2_l_[PADL_(l_int)]; l_int arg2; char arg2_r_[PADR_(l_int)];
-       char arg3_l_[PADL_(l_int)]; l_int arg3; char arg3_r_[PADR_(l_int)];
-       char ptr_l_[PADL_(void *)]; void * ptr; char ptr_r_[PADR_(void *)];
-       char arg5_l_[PADL_(l_long)]; l_long arg5; char arg5_r_[PADR_(l_long)];
+       char arg3_l_[PADL_(l_uint)]; l_uint arg3; char arg3_r_[PADR_(l_uint)];
+       char ptr_l_[PADL_(l_uintptr_t)]; l_uintptr_t ptr; char 
ptr_r_[PADR_(l_uintptr_t)];
+       char arg5_l_[PADL_(l_uint)]; l_uint arg5; char arg5_r_[PADR_(l_uint)];
 };
 struct linux_sigreturn_args {
        char sfp_l_[PADL_(struct l_sigframe *)]; struct l_sigframe * sfp; char 
sfp_r_[PADR_(struct l_sigframe *)];

Modified: stable/11/sys/i386/linux/linux_systrace_args.c
==============================================================================
--- stable/11/sys/i386/linux/linux_systrace_args.c      Sun Apr 28 14:11:21 
2019        (r346837)
+++ stable/11/sys/i386/linux/linux_systrace_args.c      Sun Apr 28 14:16:00 
2019        (r346838)
@@ -814,9 +814,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
                iarg[0] = p->what; /* l_uint */
                iarg[1] = p->arg1; /* l_int */
                iarg[2] = p->arg2; /* l_int */
-               iarg[3] = p->arg3; /* l_int */
-               uarg[4] = (intptr_t) p->ptr; /* void * */
-               iarg[5] = p->arg5; /* l_long */
+               iarg[3] = p->arg3; /* l_uint */
+               iarg[4] = p->ptr; /* l_uintptr_t */
+               iarg[5] = p->arg5; /* l_uint */
                *n_args = 6;
                break;
        }
@@ -4012,13 +4012,13 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
                        p = "l_int";
                        break;
                case 3:
-                       p = "l_int";
+                       p = "l_uint";
                        break;
                case 4:
-                       p = "void *";
+                       p = "l_uintptr_t";
                        break;
                case 5:
-                       p = "l_long";
+                       p = "l_uint";
                        break;
                default:
                        break;

Modified: stable/11/sys/i386/linux/syscalls.master
==============================================================================
--- stable/11/sys/i386/linux/syscalls.master    Sun Apr 28 14:11:21 2019        
(r346837)
+++ stable/11/sys/i386/linux/syscalls.master    Sun Apr 28 14:16:00 2019        
(r346838)
@@ -214,8 +214,8 @@
 115    AUE_SWAPOFF     STD     { int linux_swapoff(void); }
 116    AUE_NULL        STD     { int linux_sysinfo(struct l_sysinfo *info); }
 117    AUE_NULL        STD     { int linux_ipc(l_uint what, l_int arg1, \
-                                   l_int arg2, l_int arg3, void *ptr, \
-                                   l_long arg5); }
+                                   l_int arg2, l_uint arg3, l_uintptr_t ptr, \
+                                   l_uint arg5); }
 118    AUE_FSYNC       NOPROTO { int fsync(int fd); }
 119    AUE_SIGRETURN   STD     { int linux_sigreturn( \
                                    struct l_sigframe *sfp); }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to