Index: pcpu.h =================================================================== RCS file: /vol/ncvs/src/sys/i386/include/pcpu.h,v retrieving revision 1.36 diff -u -r1.36 pcpu.h --- pcpu.h 27 Jun 2003 21:50:52 -0000 1.36 +++ pcpu.h 28 Jul 2003 01:37:57 -0000 @@ -96,23 +96,32 @@ __pcpu_type(name) __result; \ \ if (sizeof(__result) == 1) { \ - u_char __b; \ + union { \ + u_char __b; \ + __pcpu_type(name) __r; \ + } __u; \ __asm __volatile("movb %%fs:%1,%0" \ - : "=r" (__b) \ + : "=r" (__u.__b) \ : "m" (*(u_char *)(__pcpu_offset(name)))); \ - __result = *(__pcpu_type(name) *)&__b; \ + __result = __u.__r; \ } else if (sizeof(__result) == 2) { \ - u_short __w; \ + union { \ + u_short __w; \ + __pcpu_type(name) __r; \ + } __u; \ __asm __volatile("movw %%fs:%1,%0" \ - : "=r" (__w) \ + : "=r" (__u.__w) \ : "m" (*(u_short *)(__pcpu_offset(name)))); \ - __result = *(__pcpu_type(name) *)&__w; \ + __result = __u.__r; \ } else if (sizeof(__result) == 4) { \ - u_int __i; \ + union { \ + u_int __i; \ + __pcpu_type(name) __r; \ + } __u; \ __asm __volatile("movl %%fs:%1,%0" \ - : "=r" (__i) \ + : "=r" (__u.__i) \ : "m" (*(u_int *)(__pcpu_offset(name)))); \ - __result = *(__pcpu_type(name) *)&__i; \ + __result = __u.__r; \ } else { \ __result = *__PCPU_PTR(name); \ } \ @@ -127,23 +136,32 @@ __pcpu_type(name) __val = (val); \ \ if (sizeof(__val) == 1) { \ - u_char __b; \ - __b = *(u_char *)&__val; \ + union { \ + u_char __b; \ + __pcpu_type(name) __v; \ + } __u; \ + __u.__v = __val; \ __asm __volatile("movb %1,%%fs:%0" \ : "=m" (*(u_char *)(__pcpu_offset(name))) \ - : "r" (__b)); \ + : "r" (__u.__b)); \ } else if (sizeof(__val) == 2) { \ - u_short __w; \ - __w = *(u_short *)&__val; \ + union { \ + u_short __w; \ + __pcpu_type(name) __v; \ + } __u; \ + __u.__v = __val; \ __asm __volatile("movw %1,%%fs:%0" \ : "=m" (*(u_short *)(__pcpu_offset(name))) \ - : "r" (__w)); \ + : "r" (__u.__w)); \ } else if (sizeof(__val) == 4) { \ - u_int __i; \ - __i = *(u_int *)&__val; \ + union { \ + u_int __i; \ + __pcpu_type(name) __v; \ + } __u; \ + __u.__v = __val; \ __asm __volatile("movl %1,%%fs:%0" \ : "=m" (*(u_int *)(__pcpu_offset(name))) \ - : "r" (__i)); \ + : "r" (__u.__i)); \ } else { \ *__PCPU_PTR(name) = __val; \ } \