KSE: fuword/suword bugs on ia64

Marcel Moolenaar marcel at xcllnt.net
Fri Jun 27 23:35:06 PDT 2003


Ok,

I've started runtime testing and ran into ILP32/LP64 bugs. Attached
a patch that solve the first problems without affecting i386. The
patch is intended to illustrate the problem more than it suggest a
solution. I'm more than happy to test alternative solutions.
Note that the use of uint32_t instead of unsigned int is mostly
to mirror the use of fuword32/suword32...

FYI,

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel at xcllnt.net
-------------- next part --------------
Index: kern/kern_thread.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_thread.c,v
retrieving revision 1.145
diff -u -r1.145 kern_thread.c
--- kern/kern_thread.c	20 Jun 2003 09:12:12 -0000	1.145
+++ kern/kern_thread.c	28 Jun 2003 05:12:23 -0000
@@ -958,8 +958,8 @@
 
 	/* Exports clock ticks in kernel mode */
 	addr = (caddr_t)(&td->td_mailbox->tm_sticks);
-	temp = fuword(addr) + td->td_usticks;
-	if (suword(addr, temp)) {
+	temp = fuword32(addr) + td->td_usticks;
+	if (suword32(addr, temp)) {
 		error = EFAULT;
 		goto bad;
 	}
@@ -1096,7 +1096,7 @@
 		addr = (caddr_t)&tmbx->tm_sticks;
 	}
 	if (uticks) {
-		if (suword(addr, uticks+fuword(addr))) {
+		if (suword32(addr, uticks+fuword32(addr))) {
 			PROC_LOCK(p);
 			psignal(p, SIGSEGV);
 			PROC_UNLOCK(p);
@@ -1518,7 +1518,7 @@
 		KASSERT(ku, ("%s: no upcall owned", __func__));
 		KASSERT((ku->ku_owner == td), ("%s: wrong owner", __func__));
 		KASSERT(!TD_CAN_UNBIND(td), ("%s: can unbind", __func__));
-		ku->ku_mflags = fuword((void *)&ku->ku_mailbox->km_flags);
+		ku->ku_mflags = fuword32((void *)&ku->ku_mailbox->km_flags);
 		tmbx = (void *)fuword((void *)&ku->ku_mailbox->km_curthread);
 		if ((tmbx == NULL) || (tmbx == (void *)-1)) {
 			td->td_mailbox = NULL;
Index: sys/kse.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/kse.h,v
retrieving revision 1.15
diff -u -r1.15 kse.h
--- sys/kse.h	15 Jun 2003 12:51:26 -0000	1.15
+++ sys/kse.h	28 Jun 2003 05:12:37 -0000
@@ -57,9 +57,9 @@
 	unsigned int		tm_flags;	/* Thread flags */
 	struct kse_thr_mailbox	*tm_next;	/* Next thread in list */
 	void			*tm_udata;	/* For use by the UTS */
-	unsigned int		tm_uticks;
-	unsigned int		tm_sticks;
-	int			tm_spare[8];
+	uint32_t		tm_uticks;
+	uint32_t		tm_sticks;
+	uint32_t		tm_spare[8];
 };
 
 /*
@@ -73,7 +73,7 @@
 	struct kse_thr_mailbox	*km_curthread;	/* Currently running thread */
 	struct kse_thr_mailbox	*km_completed;	/* Threads back from kernel */
 	sigset_t		km_sigscaught;	/* Caught signals */
-	unsigned int		km_flags;	/* KSE flags */
+	uint32_t		km_flags;	/* KSE flags */
 	kse_func_t		*km_func;	/* UTS function */
 	stack_t			km_stack;	/* UTS context */
 	void			*km_udata;	/* For use by the UTS */


More information about the freebsd-threads mailing list