diff options
author | jchandra <jchandra@FreeBSD.org> | 2010-10-05 05:49:38 +0000 |
---|---|---|
committer | jchandra <jchandra@FreeBSD.org> | 2010-10-05 05:49:38 +0000 |
commit | 71fb5fea95d648b5af444d43dc9096a02bd37a1a (patch) | |
tree | e6ba25946cce3028ca41817da10efe2c23aeec81 | |
parent | 07c7ca7c366d860131106658c7d6bc84e0e1738c (diff) | |
download | FreeBSD-src-71fb5fea95d648b5af444d43dc9096a02bd37a1a.zip FreeBSD-src-71fb5fea95d648b5af444d43dc9096a02bd37a1a.tar.gz |
Fix asm for XKPHYS read for o32, constriants needed for input registers
that are clobbered. Fixes a crash when compiled without DEBUG
-rw-r--r-- | sys/mips/rmi/rmi_mips_exts.h | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/sys/mips/rmi/rmi_mips_exts.h b/sys/mips/rmi/rmi_mips_exts.h index 9f5f6aa..fb2f886 100644 --- a/sys/mips/rmi/rmi_mips_exts.h +++ b/sys/mips/rmi/rmi_mips_exts.h @@ -39,7 +39,7 @@ #define CPU_BLOCKID_MMU 4 #define CPU_BLOCKID_PRF 5 -#define LSU_CERRLOG_REGID 9 +#define LSU_CERRLOG_REGID 9 #if defined(__mips_n64) || defined(__mips_n32) static __inline uint64_t @@ -481,14 +481,15 @@ xlr_paddr_lw(uint64_t paddr) __asm__ __volatile__( ".set push \n\t" ".set mips64 \n\t" - "dsll32 %1, %1, 0 \n\t" - "dsll32 %2, %2, 0 \n\t" /* get rid of the */ - "dsrl32 %2, %2, 0 \n\t" /* sign extend */ - "or %0, %1, %2 \n\t" - "lw %0, 0(%0) \n\t" + "dsll32 $8, %1, 0 \n\t" + "dsll32 $9, %2, 0 \n\t" /* get rid of the */ + "dsrl32 $9, $9, 0 \n\t" /* sign extend */ + "or $9, $8, $8 \n\t" + "lw %0, 0($9) \n\t" ".set pop \n" - : "=&r"(val) - : "r"(addrh), "r"(addrl)); + : "=r"(val) + : "r"(addrh), "r"(addrl) + : "$8", "$9"); return (val); } @@ -505,14 +506,14 @@ xlr_paddr_ld(uint64_t paddr) __asm__ __volatile__( ".set push \n\t" ".set mips64 \n\t" - "dsll32 %2, %2, 0 \n\t" - "dsll32 %3, %3, 0 \n\t" /* get rid of the */ - "dsrl32 %3, %3, 0 \n\t" /* sign extend */ - "or %0, %2, %3 \n\t" + "dsll32 %0, %2, 0 \n\t" + "dsll32 %1, %3, 0 \n\t" /* get rid of the */ + "dsrl32 %1, %1, 0 \n\t" /* sign extend */ + "or %0, %0, %1 \n\t" "lw %1, 4(%0) \n\t" "lw %0, 0(%0) \n\t" ".set pop \n" - : "=&r"(valh), "=r"(vall) + : "=&r"(valh), "=&r"(vall) : "r"(addrh), "r"(addrl)); return (((uint64_t)valh << 32) | vall); |