int
 copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
 {
-       unsigned long tmp;
+       compat_uptr_t addr;
        int err;
 
        if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
                        err |= __get_user(to->si_uid, &from->si_uid);
                        break;
                      case __SI_FAULT >> 16:
-                       err |= __get_user(tmp, &from->si_addr);
-                       to->si_addr = (void __user *) tmp;
+                       err |= __get_user(addr, &from->si_addr);
+                       to->si_addr = compat_ptr(addr);
                        break;
                      case __SI_POLL >> 16:
                        err |= __get_user(to->si_band, &from->si_band);
 int
 copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
 {
-       unsigned int addr;
+       compat_uptr_t addr;
+       compat_int_t val;
        int err;
 
        if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
                        err |= __put_user(from->si_uid, &to->si_uid);
                        break;
                case __SI_FAULT >> 16:
-                       /* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */
-                       err |= __put_user(from->_sifields._pad[0], &to->si_addr);
+                       addr = ptr_to_compat(from->si_addr);
+                       err |= __put_user(addr, &to->si_addr);
                        break;
                case __SI_POLL >> 16:
                        err |= __put_user(from->si_band, &to->si_band);
                case __SI_TIMER >> 16:
                        err |= __put_user(from->si_tid, &to->si_tid);
                        err |= __put_user(from->si_overrun, &to->si_overrun);
-                       addr = (unsigned long) from->si_ptr;
-                       err |= __put_user(addr, &to->si_ptr);
+                       val = (compat_int_t)from->si_int;
+                       err |= __put_user(val, &to->si_int);
                        break;
                case __SI_RT >> 16:     /* Not generated by the kernel as of now.  */
                case __SI_MESGQ >> 16:
                        err |= __put_user(from->si_uid, &to->si_uid);
                        err |= __put_user(from->si_pid, &to->si_pid);
-                       addr = (unsigned long) from->si_ptr;
-                       err |= __put_user(addr, &to->si_ptr);
+                       val = (compat_int_t)from->si_int;
+                       err |= __put_user(val, &to->si_int);
                        break;
                }
        }