Skip to content

Commit

Permalink
MN10300: Extract the displacement from an insn correctly in misalignm…
Browse files Browse the repository at this point in the history
…ent fixup

Extract the displacement from an MN10300 instruction correctly in the
misalignment fixup handler.

The code should extract the displacement in LSB order, not MSB order.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
David Howells authored and Linus Torvalds committed Nov 12, 2008
1 parent ee6e740 commit b308bf3
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions arch/mn10300/mm/misalignment.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@
#endif

static int misalignment_addr(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp,
unsigned opcode, unsigned long disp,
void **_address, unsigned long **_postinc);

static int misalignment_reg(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp,
unsigned opcode, unsigned long disp,
unsigned long **_register);

static const unsigned Dreg_index[] = {
Expand Down Expand Up @@ -304,13 +304,13 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
const struct exception_table_entry *fixup;
const struct mn10300_opcode *pop;
unsigned long *registers = (unsigned long *) regs;
unsigned long data, *store, *postinc;
unsigned long data, *store, *postinc, disp;
mm_segment_t seg;
siginfo_t info;
uint32_t opcode, disp, noc, xo, xm;
uint32_t opcode, noc, xo, xm;
uint8_t *pc, byte;
void *address;
unsigned tmp, npop;
unsigned tmp, npop, dispsz, loop;

kdebug("==>misalignment({pc=%lx})", regs->pc);

Expand Down Expand Up @@ -445,17 +445,17 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)

/* grab the extra displacement (note it's LSB first) */
disp = 0;
tmp = format_tbl[pop->format].dispsz >> 3;
while (tmp > 0) {
tmp--;
disp <<= 8;

dispsz = format_tbl[pop->format].dispsz;
for (loop = 0; loop < dispsz; loop += 8) {
pc++;
if (__get_user(byte, pc) != 0)
goto fetch_error;
disp |= byte;
disp |= byte << loop;
kdebug("{%p} disp[%02x]=%02x", pc, loop, byte);
}

kdebug("disp=%lx", disp);

set_fs(KERNEL_XDS);
if (fixup || regs->epsw & EPSW_nSL)
set_fs(seg);
Expand Down Expand Up @@ -538,7 +538,7 @@ asmlinkage void misalignment(struct pt_regs *regs, enum exception_code code)
* determine the address that was being accessed
*/
static int misalignment_addr(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp,
unsigned opcode, unsigned long disp,
void **_address, unsigned long **_postinc)
{
unsigned long *postinc = NULL, address = 0, tmp;
Expand Down Expand Up @@ -644,7 +644,7 @@ static int misalignment_addr(unsigned long *registers, unsigned params,
* determine the register that is acting as source/dest
*/
static int misalignment_reg(unsigned long *registers, unsigned params,
unsigned opcode, unsigned disp,
unsigned opcode, unsigned long disp,
unsigned long **_register)
{
params &= 0x7fffffff;
Expand Down

0 comments on commit b308bf3

Please sign in to comment.