|
@@ -365,15 +365,21 @@ do_alignment_ldrhstrh(unsigned long addr, unsigned long instr, struct pt_regs *r
|
|
|
user:
|
|
|
if (LDST_L_BIT(instr)) {
|
|
|
unsigned long val;
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
+
|
|
|
get16t_unaligned_check(val, addr);
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
|
|
|
/* signed half-word? */
|
|
|
if (instr & 0x40)
|
|
|
val = (signed long)((signed short) val);
|
|
|
|
|
|
regs->uregs[rd] = val;
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
put16t_unaligned_check(regs->uregs[rd], addr);
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
+ }
|
|
|
|
|
|
return TYPE_LDST;
|
|
|
|
|
@@ -420,14 +426,21 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
|
|
|
|
|
|
user:
|
|
|
if (load) {
|
|
|
- unsigned long val;
|
|
|
+ unsigned long val, val2;
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
+
|
|
|
get32t_unaligned_check(val, addr);
|
|
|
+ get32t_unaligned_check(val2, addr + 4);
|
|
|
+
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
+
|
|
|
regs->uregs[rd] = val;
|
|
|
- get32t_unaligned_check(val, addr + 4);
|
|
|
- regs->uregs[rd2] = val;
|
|
|
+ regs->uregs[rd2] = val2;
|
|
|
} else {
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
put32t_unaligned_check(regs->uregs[rd], addr);
|
|
|
put32t_unaligned_check(regs->uregs[rd2], addr + 4);
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
}
|
|
|
|
|
|
return TYPE_LDST;
|
|
@@ -458,10 +471,15 @@ do_alignment_ldrstr(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
|
|
trans:
|
|
|
if (LDST_L_BIT(instr)) {
|
|
|
unsigned int val;
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
get32t_unaligned_check(val, addr);
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
regs->uregs[rd] = val;
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
put32t_unaligned_check(regs->uregs[rd], addr);
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
+ }
|
|
|
return TYPE_LDST;
|
|
|
|
|
|
fault:
|
|
@@ -531,6 +549,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
|
|
#endif
|
|
|
|
|
|
if (user_mode(regs)) {
|
|
|
+ unsigned int __ua_flags = uaccess_save_and_enable();
|
|
|
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
|
|
|
regbits >>= 1, rd += 1)
|
|
|
if (regbits & 1) {
|
|
@@ -542,6 +561,7 @@ do_alignment_ldmstm(unsigned long addr, unsigned long instr, struct pt_regs *reg
|
|
|
put32t_unaligned_check(regs->uregs[rd], eaddr);
|
|
|
eaddr += 4;
|
|
|
}
|
|
|
+ uaccess_restore(__ua_flags);
|
|
|
} else {
|
|
|
for (regbits = REGMASK_BITS(instr), rd = 0; regbits;
|
|
|
regbits >>= 1, rd += 1)
|