Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Nov 2006 23:00:12 GMT
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 109706 for review
Message-ID:  <200611102300.kAAN0Cn1045678@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=109706

Change 109706 by jkim@jkim_hammer on 2006/11/10 22:59:53

	Add (ugly) 32-bit msgsnd/msgrcv support for amd64.
	msgp points to msghdr and msghdr contains msg_type, which is long.
	When we copyin/copyout, we copy the correct msg_type and advance msgp
	by msg_type size.
	
	This fixes LTP test cases msgget01, msgrcv01, msgrcv02, msgrcv04, and
	msgsnd03.
	
	Note: There is only one test case blocked in msgwait state after this
	      change, which seems to be arch-independent issue.

Affected files ...

.. //depot/projects/linuxolator/src/sys/compat/linux/linux_ipc.c#3 edit
.. //depot/projects/linuxolator/src/sys/kern/sysv_msg.c#5 edit

Differences ...

==== //depot/projects/linuxolator/src/sys/compat/linux/linux_ipc.c#3 (text+ko) ====

@@ -83,6 +83,10 @@
 	l_ulong swap_successes;
 };
 
+/* 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);
+
 static void
 bsd_to_linux_shminfo( struct shminfo *bpp, struct l_shminfo *lpp)
 {
@@ -586,7 +590,8 @@
     bsd_args.msgp = PTRIN(args->msgp);
     bsd_args.msgsz = args->msgsz;
     bsd_args.msgflg = args->msgflg;
-    return msgsnd(td, &bsd_args);
+
+    return (do_msgsnd(td, &bsd_args, sizeof(l_long)));
 }
 
 int
@@ -605,7 +610,8 @@
     bsd_args.msgsz = args->msgsz;
     bsd_args.msgtyp = args->msgtyp;
     bsd_args.msgflg = args->msgflg;
-    return msgrcv(td, &bsd_args);
+
+    return (do_msgrcv(td, &bsd_args, sizeof(l_long)));
 }
 
 int

==== //depot/projects/linuxolator/src/sys/kern/sysv_msg.c#5 (text+ko) ====

@@ -662,6 +662,11 @@
 	return (error);
 }
 
+union msgtyp {
+	long	mtype;
+	int32_t	mtype32;
+};
+
 #ifndef _SYS_SYSPROTO_H_
 struct msgsnd_args {
 	int	msqid;
@@ -671,14 +676,16 @@
 };
 #endif
 
-/*
- * MPSAFE
- */
+/* XXX This should not be here. */
+int do_msgsnd(struct thread *, struct msgsnd_args *, size_t);
+
 int
-msgsnd(td, uap)
+do_msgsnd(td, uap, mtsz)
 	struct thread *td;
 	register struct msgsnd_args *uap;
+	size_t mtsz;
 {
+	union msgtyp msgt;
 	int msqid = uap->msqid;
 	const void *user_msgp = uap->msgp;
 	size_t msgsz = uap->msgsz;
@@ -693,6 +700,9 @@
 	if (!jail_sysvipc_allowed && jailed(td->td_ucred))
 		return (ENOSYS);
 
+	if (mtsz != sizeof(msgt.mtype) && mtsz != sizeof(msgt.mtype32))
+		return (EINVAL);
+
 	mtx_lock(&msq_mtx);
 	msqid = IPCID_TO_IX(msqid);
 
@@ -875,8 +885,7 @@
 	 */
 
 	mtx_unlock(&msq_mtx);
-	if ((error = copyin(user_msgp, &msghdr->msg_type,
-	    sizeof(msghdr->msg_type))) != 0) {
+	if ((error = copyin(user_msgp, &msgt, mtsz)) != 0) {
 		mtx_lock(&msq_mtx);
 		DPRINTF(("error %d copying the message type\n", error));
 		msg_freehdr(msghdr);
@@ -884,8 +893,9 @@
 		wakeup(msqkptr);
 		goto done2;
 	}
+	msghdr->msg_type = (mtsz == sizeof(long)) ? msgt.mtype : msgt.mtype32;
 	mtx_lock(&msq_mtx);
-	user_msgp = (const char *)user_msgp + sizeof(msghdr->msg_type);
+	user_msgp = (const char *)user_msgp + mtsz;
 
 	/*
 	 * Validate the message type
@@ -995,6 +1005,17 @@
 	return (error);
 }
 
+/*
+ * MPSAFE
+ */
+int
+msgsnd(td, uap)
+	struct thread *td;
+	register struct msgsnd_args *uap;
+{
+	return (do_msgsnd(td, uap, sizeof(long)));
+}
+
 #ifndef _SYS_SYSPROTO_H_
 struct msgrcv_args {
 	int	msqid;
@@ -1005,14 +1026,16 @@
 };
 #endif
 
-/*
- * MPSAFE
- */
+/* XXX This should not be here. */
+int do_msgrcv(struct thread *, struct msgrcv_args *, size_t);
+
 int
-msgrcv(td, uap)
+do_msgrcv(td, uap, mtsz)
 	struct thread *td;
 	register struct msgrcv_args *uap;
+	size_t mtsz;
 {
+	union msgtyp msgt;
 	int msqid = uap->msqid;
 	void *user_msgp = uap->msgp;
 	size_t msgsz = uap->msgsz;
@@ -1030,6 +1053,9 @@
 	if (!jail_sysvipc_allowed && jailed(td->td_ucred))
 		return (ENOSYS);
 
+	if (mtsz != sizeof(msgt.mtype) && mtsz != sizeof(msgt.mtype32))
+		return (EINVAL);
+
 	msqid = IPCID_TO_IX(msqid);
 
 	if (msqid < 0 || msqid >= msginfo.msgmni) {
@@ -1226,8 +1252,11 @@
 	 */
 
 	mtx_unlock(&msq_mtx);
-	error = copyout(&(msghdr->msg_type), user_msgp,
-	    sizeof(msghdr->msg_type));
+	if (mtsz == sizeof(long))
+		msgt.mtype = msghdr->msg_type;
+	else
+		msgt.mtype32 = msghdr->msg_type;
+	error = copyout(&msgt, user_msgp, mtsz);
 	mtx_lock(&msq_mtx);
 	if (error != 0) {
 		DPRINTF(("error (%d) copying out message type\n", error));
@@ -1235,7 +1264,7 @@
 		wakeup(msqkptr);
 		goto done2;
 	}
-	user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
+	user_msgp = (char *)user_msgp + mtsz;
 
 	/*
 	 * Return the segments to the user
@@ -1280,6 +1309,17 @@
 	return (error);
 }
 
+/*
+ * MPSAFE
+ */
+int
+msgrcv(td, uap)
+	struct thread *td;
+	register struct msgrcv_args *uap;
+{
+	return (do_msgrcv(td, uap, sizeof(long)));
+}
+
 static int
 sysctl_msqids(SYSCTL_HANDLER_ARGS)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611102300.kAAN0Cn1045678>