diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index a1deec7002d4..81e00b8b7d1a 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -499,6 +499,25 @@ __semctl(td, uap)
 		goto done2;
 	}
 
+	switch(cmd) {
+	case SEM_STAT:
+		if (semid < 0 || semid >= seminfo.semmsl)
+			return(EINVAL);
+		semaptr = &sema[semid];
+		if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 )
+			return(EINVAL);
+		if ((error = ipcperm(td, &semaptr->sem_perm, IPC_R)))
+			return(error);
+		if ((error = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
+			return(error);
+		error = copyout((caddr_t)semaptr, real_arg.buf,
+			sizeof(struct semid_ds));
+		rval = IXSEQ_TO_IPCID(semid,semaptr->sem_perm);
+		if (error == 0)
+			td->td_retval[0] = rval;
+		goto done2;
+	}
+
 	semid = IPCID_TO_IX(semid);
 	if (semid < 0 || semid >= seminfo.semmsl) {
 		error = EINVAL;
diff --git a/sys/sys/sem.h b/sys/sys/sem.h
index 736a805e4329..1bed0c31591e 100644
--- a/sys/sys/sem.h
+++ b/sys/sys/sem.h
@@ -58,6 +58,8 @@ union semun {
 #define GETZCNT	7	/* Return the value of semzcnt {READ} */
 #define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
 #define SETALL	9	/* Set semvals from arg.array {ALTER} */
+#define SEM_STAT 10	/* Like IPC_STAT but treats semid as sema-index */
+#define SEM_INFO 11 /* Like IPC_INFO but treats semid as sema-index */
 
 /*
  * Permissions