PERFORCE change 100229 for review
John Baldwin
jhb at FreeBSD.org
Wed Jun 28 20:22:33 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100229
Change 100229 by jhb at jhb_mutex on 2006/06/28 20:22:10
Similar treatment to ibcs2_semsys() including using kern_semctl() to
axe more stackgap usage.
Affected files ...
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#10 edit
Differences ...
==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#10 (text+ko) ====
@@ -301,77 +301,100 @@
return;
}
-int
-ibcs2_semsys(td, uap)
- struct thread *td;
- struct ibcs2_semsys_args *uap;
+struct ibcs2_semctl_args {
+ int what;
+ int semid;
+ int semnum;
+ int cmd;
+ union semun arg;
+};
+
+static int
+ibcs2_semctl(struct thread *td, void *v)
{
+ struct ibcs2_semctl_args *uap = v;
+ struct ibcs2_semid_ds is;
+ struct semid_ds bs;
+ union semun semun;
int error;
- switch (uap->which) {
- case 0: /* semctl */
- switch(uap->a4) {
- case IBCS2_IPC_STAT:
- {
- struct ibcs2_semid_ds *isp;
- struct semid_ds *sp;
- union semun *sup, ssu;
- caddr_t sg = stackgap_init();
+ switch(uap->cmd) {
+ case IBCS2_IPC_STAT:
+ semun.buf = &bs;
+ error = kern_semctl(td, uap->semid, uap->semnum, IPC_STAT,
+ &semun, UIO_SYSSPACE);
+ if (error)
+ return (error);
+ cvt_semid2isemid(&bs, &is);
+ return (copyout(&is, uap->arg.buf, sizeof(is)));
+
+ case IBCS2_IPC_SET:
+ error = copyin(uap->arg.buf, &is, sizeof(is));
+ if (error)
+ return (error);
+ cvt_isemid2semid(&is, &bs);
+ semun.buf = &bs;
+ return (kern_semctl(td, uap->semid, uap->semnum, IPC_SET,
+ &semun, UIO_SYSSPACE));
+ }
+
+ return (kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &uap->arg,
+ UIO_USERSPACE));
+}
+
+struct ibcs2_semget_args {
+ int what;
+ int key;
+ int nsems;
+ int semflg;
+};
+static int
+ibcs2_semget(struct thread *td, void *v)
+{
+ struct ibcs2_semget_args *uap = v;
+ struct semget_args ap;
- ssu = (union semun) uap->a5;
- sp = stackgap_alloc(&sg, sizeof(struct semid_ds));
- sup = stackgap_alloc(&sg, sizeof(union semun));
- sup->buf = sp;
- uap->a5 = (int)sup;
- error = semsys(td, (struct semsys_args *)uap);
- if (!error) {
- uap->a5 = (int)ssu.buf;
- isp = stackgap_alloc(&sg, sizeof(*isp));
- cvt_semid2isemid(sp, isp);
- error = copyout((caddr_t)isp,
- (caddr_t)ssu.buf,
- sizeof(*isp));
- }
- return error;
- }
- case IBCS2_IPC_SET:
- {
- struct ibcs2_semid_ds *isp;
- struct semid_ds *sp;
- caddr_t sg = stackgap_init();
+ ap.key = uap->key;
+ ap.nsems = uap->nsems;
+ ap.semflg = uap->semflg;
+ return (semget(td, &ap));
+}
- isp = stackgap_alloc(&sg, sizeof(*isp));
- sp = stackgap_alloc(&sg, sizeof(*sp));
- error = copyin((caddr_t)uap->a5, (caddr_t)isp,
- sizeof(*isp));
- if (error)
- return error;
- cvt_isemid2semid(isp, sp);
- uap->a5 = (int)sp;
- return semsys(td, (struct semsys_args *)uap);
- }
- case IBCS2_SETVAL:
- {
- union semun *sp;
- caddr_t sg = stackgap_init();
+struct ibcs2_semop_args {
+ int what;
+ int semid;
+ struct sembuf *sops;
+ size_t nsops;
+};
- sp = stackgap_alloc(&sg, sizeof(*sp));
- sp->val = (int) uap->a5;
- uap->a5 = (int)sp;
- return semsys(td, (struct semsys_args *)uap);
- }
- }
+static int
+ibcs2_semop(struct thread *td, void *v)
+{
+ struct ibcs2_semop_args *uap = v;
+ struct semop_args ap;
- return semsys(td, (struct semsys_args *)uap);
+ ap.semid = uap->semid;
+ ap.sops = uap->sops;
+ ap.nsops = uap->nsops;
+ return (semop(td, &ap));
+}
- case 1: /* semget */
- return semsys(td, (struct semsys_args *)uap);
+int
+ibcs2_semsys(td, uap)
+ struct thread *td;
+ struct ibcs2_semsys_args *uap;
+{
- case 2: /* semop */
- return semsys(td, (struct semsys_args *)uap);
+ switch (uap->which) {
+ case 0:
+ return (ibcs2_semctl(td, uap));
+ case 1:
+ return (ibcs2_semget(td, uap));
+ case 2:
+ return (ibcs2_semop(td, uap));
}
- return EINVAL;
+ return (EINVAL);
}
More information about the p4-projects
mailing list