From owner-p4-projects@FreeBSD.ORG Sat Nov 11 00:37:18 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 75EFC16A412; Sat, 11 Nov 2006 00:37:18 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 24EE916A417 for ; Sat, 11 Nov 2006 00:37:18 +0000 (UTC) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id EE73343D5D for ; Sat, 11 Nov 2006 00:37:17 +0000 (GMT) (envelope-from jkim@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kAB0bHhd064328 for ; Sat, 11 Nov 2006 00:37:17 GMT (envelope-from jkim@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kAB0bHT1064325 for perforce@freebsd.org; Sat, 11 Nov 2006 00:37:17 GMT (envelope-from jkim@freebsd.org) Date: Sat, 11 Nov 2006 00:37:17 GMT Message-Id: <200611110037.kAB0bHT1064325@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jkim@freebsd.org using -f From: Jung-uk Kim To: Perforce Change Reviews Cc: Subject: PERFORCE change 109712 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Nov 2006 00:37:18 -0000 http://perforce.freebsd.org/chv.cgi?CH=109712 Change 109712 by jkim@jkim_hammer on 2006/11/11 00:37:12 Fix 32-bit msgsnd/msgrcv emulation for amd64 while I am here. Tested with 32-bit binary of src/tools/regression/sysvmsg/msgtest. Affected files ... .. //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_misc.c#4 edit .. //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_proto.h#8 edit .. //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_syscall.h#8 edit .. //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_syscalls.c#8 edit .. //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_sysent.c#8 edit .. //depot/projects/linuxolator/src/sys/compat/freebsd32/syscalls.master#8 edit Differences ... ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_misc.c#4 (text+ko) ==== @@ -91,6 +91,10 @@ #include #include +/* XXX This should not be here. */ +int do_msgsnd(struct thread *, struct msgsnd_args *, size_t); +int do_msgrcv(struct thread *, struct msgrcv_args *, size_t); + CTASSERT(sizeof(struct timeval32) == 8); CTASSERT(sizeof(struct timespec32) == 8); CTASSERT(sizeof(struct statfs32) == 256); @@ -1335,10 +1339,57 @@ int freebsd32_msgsys(struct thread *td, struct freebsd32_msgsys_args *uap) { - /* - * Vector through to msgsys if it is loaded. - */ - return sysent[SYS_msgsys].sy_call(td, uap); + switch (uap->which) { + case 2: + return (freebsd32_msgsnd(td, + (struct freebsd32_msgsnd_args *)&uap->a2)); + break; + case 3: + return (freebsd32_msgrcv(td, + (struct freebsd32_msgrcv_args *)&uap->a2)); + break; + default: + /* + * Vector through to msgsys if it is loaded. + */ + return (sysent[SYS_msgsys].sy_call(td, uap)); + break; + } +} + +int +freebsd32_msgsnd(struct thread *td, struct freebsd32_msgsnd_args *uap) +{ + struct msgsnd_args ap; + + if (sysent[SYS_msgsnd].sy_call == (sy_call_t *)lkmnosys || + sysent[SYS_msgsnd].sy_call == (sy_call_t *)lkmressys) + return (nosys(td, (struct nosys_args *)uap)); + + ap.msqid = uap->msqid; + ap.msgp = PTRIN(uap->msgp); + ap.msgsz = uap->msgsz; + ap.msgflg = uap->msgflg; + + return (do_msgsnd(td, &ap, sizeof(int32_t))); +} + +int +freebsd32_msgrcv(struct thread *td, struct freebsd32_msgrcv_args *uap) +{ + struct msgrcv_args ap; + + if (sysent[SYS_msgrcv].sy_call == (sy_call_t *)lkmnosys || + sysent[SYS_msgrcv].sy_call == (sy_call_t *)lkmressys) + return (nosys(td, (struct nosys_args *)uap)); + + ap.msqid = uap->msqid; + ap.msgp = PTRIN(uap->msgp); + ap.msgsz = uap->msgsz; + ap.msgtyp = uap->msgtyp; + ap.msgflg = uap->msgflg; + + return (do_msgrcv(td, &ap, sizeof(int32_t))); } int ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_proto.h#8 (text+ko) ==== @@ -203,6 +203,19 @@ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; char tptr_l_[PADL_(struct timeval32 *)]; struct timeval32 * tptr; char tptr_r_[PADR_(struct timeval32 *)]; }; +struct freebsd32_msgsnd_args { + char msqid_l_[PADL_(int)]; int msqid; char msqid_r_[PADR_(int)]; + char msgp_l_[PADL_(void *)]; void * msgp; char msgp_r_[PADR_(void *)]; + char msgsz_l_[PADL_(size_t)]; size_t msgsz; char msgsz_r_[PADR_(size_t)]; + char msgflg_l_[PADL_(int)]; int msgflg; char msgflg_r_[PADR_(int)]; +}; +struct freebsd32_msgrcv_args { + char msqid_l_[PADL_(int)]; int msqid; char msqid_r_[PADR_(int)]; + char msgp_l_[PADL_(void *)]; void * msgp; char msgp_r_[PADR_(void *)]; + char msgsz_l_[PADL_(size_t)]; size_t msgsz; char msgsz_r_[PADR_(size_t)]; + char msgtyp_l_[PADL_(long)]; long msgtyp; char msgtyp_r_[PADR_(long)]; + char msgflg_l_[PADL_(int)]; int msgflg; char msgflg_r_[PADR_(int)]; +}; struct freebsd32_shmctl_args { char shmid_l_[PADL_(int)]; int shmid; char shmid_r_[PADR_(int)]; char cmd_l_[PADL_(int)]; int cmd; char cmd_r_[PADR_(int)]; @@ -339,6 +352,8 @@ int freebsd32_ftruncate(struct thread *, struct freebsd32_ftruncate_args *); int freebsd32_sysctl(struct thread *, struct freebsd32_sysctl_args *); int freebsd32_futimes(struct thread *, struct freebsd32_futimes_args *); +int freebsd32_msgsnd(struct thread *, struct freebsd32_msgsnd_args *); +int freebsd32_msgrcv(struct thread *, struct freebsd32_msgrcv_args *); int freebsd32_shmctl(struct thread *, struct freebsd32_shmctl_args *); int freebsd32_clock_gettime(struct thread *, struct freebsd32_clock_gettime_args *); int freebsd32_clock_settime(struct thread *, struct freebsd32_clock_settime_args *); @@ -481,6 +496,8 @@ #define FREEBSD32_SYS_AUE_freebsd32_ftruncate AUE_FTRUNCATE #define FREEBSD32_SYS_AUE_freebsd32_sysctl AUE_SYSCTL #define FREEBSD32_SYS_AUE_freebsd32_futimes AUE_FUTIMES +#define FREEBSD32_SYS_AUE_freebsd32_msgsnd AUE_MSGSND +#define FREEBSD32_SYS_AUE_freebsd32_msgrcv AUE_MSGRCV #define FREEBSD32_SYS_AUE_freebsd32_shmctl AUE_SHMCTL #define FREEBSD32_SYS_AUE_freebsd32_clock_gettime AUE_NULL #define FREEBSD32_SYS_AUE_freebsd32_clock_settime AUE_CLOCK_SETTIME ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_syscall.h#8 (text+ko) ==== @@ -195,8 +195,8 @@ #define FREEBSD32_SYS_semop 222 #define FREEBSD32_SYS_msgctl 224 #define FREEBSD32_SYS_msgget 225 -#define FREEBSD32_SYS_msgsnd 226 -#define FREEBSD32_SYS_msgrcv 227 +#define FREEBSD32_SYS_freebsd32_msgsnd 226 +#define FREEBSD32_SYS_freebsd32_msgrcv 227 #define FREEBSD32_SYS_shmat 228 #define FREEBSD32_SYS_freebsd32_shmctl 229 #define FREEBSD32_SYS_shmdt 230 ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_syscalls.c#8 (text+ko) ==== @@ -233,8 +233,8 @@ "#223", /* 223 = semconfig */ "msgctl", /* 224 = msgctl */ "msgget", /* 225 = msgget */ - "msgsnd", /* 226 = msgsnd */ - "msgrcv", /* 227 = msgrcv */ + "freebsd32_msgsnd", /* 226 = freebsd32_msgsnd */ + "freebsd32_msgrcv", /* 227 = freebsd32_msgrcv */ "shmat", /* 228 = shmat */ "freebsd32_shmctl", /* 229 = freebsd32_shmctl */ "shmdt", /* 230 = shmdt */ ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/freebsd32_sysent.c#8 (text+ko) ==== @@ -258,8 +258,8 @@ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 }, /* 223 = semconfig */ { AS(msgctl_args), (sy_call_t *)msgctl, AUE_MSGCTL, NULL, 0, 0 }, /* 224 = msgctl */ { AS(msgget_args), (sy_call_t *)msgget, AUE_MSGGET, NULL, 0, 0 }, /* 225 = msgget */ - { AS(msgsnd_args), (sy_call_t *)msgsnd, AUE_MSGSND, NULL, 0, 0 }, /* 226 = msgsnd */ - { AS(msgrcv_args), (sy_call_t *)msgrcv, AUE_MSGRCV, NULL, 0, 0 }, /* 227 = msgrcv */ + { AS(freebsd32_msgsnd_args), (sy_call_t *)freebsd32_msgsnd, AUE_MSGSND, NULL, 0, 0 }, /* 226 = freebsd32_msgsnd */ + { AS(freebsd32_msgrcv_args), (sy_call_t *)freebsd32_msgrcv, AUE_MSGRCV, NULL, 0, 0 }, /* 227 = freebsd32_msgrcv */ { AS(shmat_args), (sy_call_t *)shmat, AUE_SHMAT, NULL, 0, 0 }, /* 228 = shmat */ { AS(freebsd32_shmctl_args), (sy_call_t *)freebsd32_shmctl, AUE_SHMCTL, NULL, 0, 0 }, /* 229 = freebsd32_shmctl */ { AS(shmdt_args), (sy_call_t *)shmdt, AUE_SHMDT, NULL, 0, 0 }, /* 230 = shmdt */ ==== //depot/projects/linuxolator/src/sys/compat/freebsd32/syscalls.master#8 (text+ko) ==== @@ -406,9 +406,9 @@ 224 AUE_MSGCTL NOPROTO { int msgctl(int msqid, int cmd, \ struct msqid_ds *buf); } 225 AUE_MSGGET NOPROTO { int msgget(key_t key, int msgflg); } -226 AUE_MSGSND NOPROTO { int msgsnd(int msqid, void *msgp, \ +226 AUE_MSGSND STD { int freebsd32_msgsnd(int msqid, void *msgp, \ size_t msgsz, int msgflg); } -227 AUE_MSGRCV NOPROTO { int msgrcv(int msqid, void *msgp, \ +227 AUE_MSGRCV STD { int freebsd32_msgrcv(int msqid, void *msgp, \ size_t msgsz, long msgtyp, int msgflg); } 228 AUE_SHMAT NOPROTO { int shmat(int shmid, void *shmaddr, \ int shmflg); }