Hi, Once again a sysmips() patch. This time the exception fixup code is broken -- it never returns (well, it probably returns *somewhere* via a following fixup entry). Also for whatever reason the R3k code is missing. The following patch fixes it. While I was at it, I modified contraints a bit and replaced some of embedded "\t" chars with tabs (the code was completely unreadable before -- now it should be a bit better, as much as embedded asm can be). The R3k variant works fine for me. I was unable to thest the ll/sc one, but the semantics should be unchanged, i.e. if it worked before, so it will now. The patch should go into Linus' tree as well. Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.5-20010627-sysmips-1 diff -up --recursive --new-file linux-mips-2.4.5-20010627.macro/arch/mips/kernel/sysmips.c linux-mips-2.4.5-20010627/arch/mips/kernel/sysmips.c --- linux-mips-2.4.5-20010627.macro/arch/mips/kernel/sysmips.c Mon Apr 9 04:25:42 2001 +++ linux-mips-2.4.5-20010627/arch/mips/kernel/sysmips.c Wed Jul 4 22:07:30 2001 @@ -75,33 +75,41 @@ sys_sysmips(int cmd, int arg1, int arg2, } case MIPS_ATOMIC_SET: { -#ifdef CONFIG_CPU_HAS_LLSC - unsigned int tmp; + unsigned int tmp1; p = (int *) arg1; errno = verify_area(VERIFY_WRITE, p, sizeof(*p)); if (errno) return errno; - errno = 0; - __asm__(".set\tpush\t\t\t# sysmips(MIPS_ATOMIC, ...)\n\t" - ".set\tmips2\n\t" - ".set\tnoat\n\t" - "1:\tll\t%0, %4\n\t" - "move\t$1, %3\n\t" - "2:\tsc\t$1, %1\n\t" - "beqz\t$1, 1b\n\t" - ".set\tpop\n\t" - ".section\t.fixup,\"ax\"\n" - "3:\tli\t%2, 1\t\t\t# error\n\t" +#ifdef CONFIG_CPU_HAS_LLSC + __asm__(".set push \t\t# sysmips(MIPS_ATOMIC, ...)\n\t" + ".set mips2\n" + "1:\n\t" + "ll %0, %5\n\t" + "move %3, %4\n" + "2:\n\t" + "sc %3, %1\n\t" + "beqz %3, 1b\n" + "3:\n\t" + ".set pop\n\t" + ".section .fixup,\"ax\"\n" + "4:\n\t" + "li %2, 1 \t\t# error\n\t" + "j 3b\n\t" ".previous\n\t" - ".section\t__ex_table,\"a\"\n\t" - ".word\t1b, 3b\n\t" - ".word\t2b, 3b\n\t" + ".section __ex_table,\"a\"\n\t" + ".word 1b, 4b\n\t" + ".word 2b, 4b\n\t" ".previous\n\t" - : "=&r" (tmp), "=o" (* (u32 *) p), "=r" (errno) - : "r" (arg2), "o" (* (u32 *) p), "2" (errno) - : "$1"); + : "=&r" (tmp), "=R" (*p), "=r" (errno), "=&r" (tmp1) + : "r" (arg2), "1" (*p), "2" (0)); +#else + save_and_cli(tmp1); + errno = __get_user(tmp, p); + errno |= __put_user(arg2, p); + restore_flags(tmp1); +#endif if (errno) return -EFAULT; @@ -119,9 +127,6 @@ sys_sysmips(int cmd, int arg1, int arg2, : /* No outputs */ : "r" (&cmd)); /* Unreached */ -#else - printk("sys_sysmips(MIPS_ATOMIC_SET, ...) not ready for !CONFIG_CPU_HAS_LLSC\n"); -#endif } case MIPS_FIXADE: