|
@@ -43,6 +43,8 @@
|
|
|
"\tldil L%%" #lbl ", %%r1\n" \
|
|
|
"\tldo R%%" #lbl "(%%r1), %%r1\n" \
|
|
|
"\tbv,n %%r0(%%r1)\n"
|
|
|
+/* If you use FIXUP_BRANCH, then you must list this clobber */
|
|
|
+#define FIXUP_BRANCH_CLOBBER "r1"
|
|
|
|
|
|
/* 1111 1100 0000 0000 0001 0011 1100 0000 */
|
|
|
#define OPCODE1(a,b,c) ((a)<<26|(b)<<12|(c)<<6)
|
|
@@ -157,7 +159,7 @@ static int emulate_ldh(struct pt_regs *regs, int toreg)
|
|
|
" .previous\n"
|
|
|
: "=r" (val), "=r" (ret)
|
|
|
: "0" (val), "r" (saddr), "r" (regs->isr)
|
|
|
- : "r20" );
|
|
|
+ : "r20", FIXUP_BRANCH_CLOBBER );
|
|
|
|
|
|
DPRINTF("val = 0x" RFMT "\n", val);
|
|
|
|
|
@@ -202,7 +204,7 @@ static int emulate_ldw(struct pt_regs *regs, int toreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (val), "=r" (ret)
|
|
|
: "0" (val), "r" (saddr), "r" (regs->isr)
|
|
|
- : "r19", "r20" );
|
|
|
+ : "r19", "r20", FIXUP_BRANCH_CLOBBER );
|
|
|
|
|
|
DPRINTF("val = 0x" RFMT "\n", val);
|
|
|
|
|
@@ -253,7 +255,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (val), "=r" (ret)
|
|
|
: "0" (val), "r" (saddr), "r" (regs->isr)
|
|
|
- : "r19", "r20" );
|
|
|
+ : "r19", "r20", FIXUP_BRANCH_CLOBBER );
|
|
|
#else
|
|
|
{
|
|
|
unsigned long valh=0,vall=0;
|
|
@@ -287,7 +289,7 @@ static int emulate_ldd(struct pt_regs *regs, int toreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (valh), "=r" (vall), "=r" (ret)
|
|
|
: "0" (valh), "1" (vall), "r" (saddr), "r" (regs->isr)
|
|
|
- : "r19", "r20" );
|
|
|
+ : "r19", "r20", FIXUP_BRANCH_CLOBBER );
|
|
|
val=((__u64)valh<<32)|(__u64)vall;
|
|
|
}
|
|
|
#endif
|
|
@@ -335,7 +337,7 @@ static int emulate_sth(struct pt_regs *regs, int frreg)
|
|
|
" .previous\n"
|
|
|
: "=r" (ret)
|
|
|
: "r" (val), "r" (regs->ior), "r" (regs->isr)
|
|
|
- : "r19" );
|
|
|
+ : "r19", FIXUP_BRANCH_CLOBBER );
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -389,7 +391,7 @@ static int emulate_stw(struct pt_regs *regs, int frreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (ret)
|
|
|
: "r" (val), "r" (regs->ior), "r" (regs->isr)
|
|
|
- : "r19", "r20", "r21", "r22", "r1" );
|
|
|
+ : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER );
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -450,7 +452,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (ret)
|
|
|
: "r" (val), "r" (regs->ior), "r" (regs->isr)
|
|
|
- : "r19", "r20", "r21", "r22", "r1" );
|
|
|
+ : "r19", "r20", "r21", "r22", "r1", FIXUP_BRANCH_CLOBBER );
|
|
|
#else
|
|
|
{
|
|
|
unsigned long valh=(val>>32),vall=(val&0xffffffffl);
|
|
@@ -495,7 +497,7 @@ static int emulate_std(struct pt_regs *regs, int frreg, int flop)
|
|
|
" .previous\n"
|
|
|
: "=r" (ret)
|
|
|
: "r" (valh), "r" (vall), "r" (regs->ior), "r" (regs->isr)
|
|
|
- : "r19", "r20", "r21", "r1" );
|
|
|
+ : "r19", "r20", "r21", "r1", FIXUP_BRANCH_CLOBBER );
|
|
|
}
|
|
|
#endif
|
|
|
|