There is bug in __copy_user (arch/mips*/lib/memcpy.S). Tested for 2.4.18 kernels, but versions 2.2, 2.4, and 2.5 for both mips and mips64 seems to have similar bug. For kernel 2.4.18 and mips __copy_user returns wrong value if len = 4...7 and dst isn't accessible. Other versions behave almost the same, just borders differ. For example, read(0,NULL,len), len=4...7 getsockopt/ioctl(fd, *GET*, NULL, sizeof(int)) returns success. Fortunately, they don't write to at address 0. The following patch seems to be OK for 2.4.18: less_than_4units: /* * rem = len % NBYTES */ beq rem, len, copy_bytes nop 1: EXC( LOAD t0, 0(src), l_exc) ADD src, src, NBYTES SUB len, len, NBYTES -EXC( STORE t0, 0(dst), s_exc) +EXC( STORE t0, 0(dst), s_exc_p1u) bne rem, len, 1b ADD dst, dst, NBYTES Any comments? Regards, Gleb.