Module Name: src
Committed By: tsutsui
Date: Wed May 25 15:17:21 UTC 2011
Modified Files:
src/sys/arch/m68k/fpe: fpu_calcea.c
Log Message:
KNF. No binary change.
To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/m68k/fpe/fpu_calcea.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/m68k/fpe/fpu_calcea.c
diff -u src/sys/arch/m68k/fpe/fpu_calcea.c:1.22 src/sys/arch/m68k/fpe/fpu_calcea.c:1.23
--- src/sys/arch/m68k/fpe/fpu_calcea.c:1.22 Sun Jun 6 04:50:07 2010
+++ src/sys/arch/m68k/fpe/fpu_calcea.c Wed May 25 15:17:21 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu_calcea.c,v 1.22 2010/06/06 04:50:07 mrg Exp $ */
+/* $NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $ */
/*
* Copyright (c) 1995 Gordon W. Ross
@@ -34,7 +34,7 @@
#include "opt_m68k_arch.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.22 2010/06/06 04:50:07 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu_calcea.c,v 1.23 2011/05/25 15:17:21 tsutsui Exp $");
#include <sys/param.h>
#include <sys/signal.h>
@@ -47,13 +47,11 @@
/*
* Prototypes of static functions
*/
-static int decode_ea6(struct frame *frame, struct instruction *insn,
- struct insn_ea *ea, int modreg);
-static int fetch_immed(struct frame *frame, struct instruction *insn,
- int *dst);
-static int fetch_disp(struct frame *frame, struct instruction *insn,
- int size, int *res);
-static int calc_ea(struct insn_ea *ea, char *ptr, char **eaddr);
+static int decode_ea6(struct frame *, struct instruction *,
+ struct insn_ea *, int);
+static int fetch_immed(struct frame *, struct instruction *, int *);
+static int fetch_disp(struct frame *, struct instruction *, int, int *);
+static int calc_ea(struct insn_ea *, char *, char **);
/*
* Helper routines for dealing with "effective address" values.
@@ -64,248 +62,253 @@
* Returns zero on success, else signal number.
*/
int
-fpu_decode_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea, int modreg)
+fpu_decode_ea(struct frame *frame, struct instruction *insn,
+ struct insn_ea *ea, int modreg)
{
- int sig;
+ int sig;
#ifdef DEBUG
- if (insn->is_datasize < 0) {
- panic("decode_ea: called with uninitialized datasize");
- }
+ if (insn->is_datasize < 0)
+ panic("decode_ea: called with uninitialized datasize");
#endif
- sig = 0;
+ sig = 0;
- /* Set the most common value here. */
- ea->ea_regnum = 8 + (modreg & 7);
+ /* Set the most common value here. */
+ ea->ea_regnum = 8 + (modreg & 7);
- if ((modreg & 060) == 0) {
- /* register direct */
- ea->ea_regnum = modreg & 0xf;
- ea->ea_flags = EA_DIRECT;
+ if ((modreg & 060) == 0) {
+ /* register direct */
+ ea->ea_regnum = modreg & 0xf;
+ ea->ea_flags = EA_DIRECT;
#ifdef DEBUG_FPE
- printf("decode_ea: register direct reg=%d\n", ea->ea_regnum);
+ printf("decode_ea: register direct reg=%d\n", ea->ea_regnum);
#endif
- } else if ((modreg & 077) == 074) {
- /* immediate */
- ea->ea_flags = EA_IMMED;
- sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
+ } else if ((modreg & 077) == 074) {
+ /* immediate */
+ ea->ea_flags = EA_IMMED;
+ sig = fetch_immed(frame, insn, &ea->ea_immed[0]);
#ifdef DEBUG_FPE
- printf("decode_ea: immediate size=%d\n", insn->is_datasize);
+ printf("decode_ea: immediate size=%d\n", insn->is_datasize);
#endif
- }
- /*
- * rest of the address modes need to be separately
- * handled for the LC040 and the others.
- */
+ }
+ /*
+ * rest of the address modes need to be separately
+ * handled for the LC040 and the others.
+ */
#if 0 /* XXX */
- else if (frame->f_format == 4 && frame->f_fmt4.f_fa) {
- /* LC040 */
- ea->ea_flags = EA_FRAME_EA;
- ea->ea_fea = frame->f_fmt4.f_fa;
-#ifdef DEBUG_FPE
- printf("decode_ea: 68LC040 - in-frame EA (%p) size %d\n",
- (void *)ea->ea_fea, insn->is_datasize);
-#endif
- if ((modreg & 070) == 030) {
- /* postincrement mode */
- ea->ea_flags |= EA_POSTINCR;
- } else if ((modreg & 070) == 040) {
- /* predecrement mode */
- ea->ea_flags |= EA_PREDECR;
+ else if (frame->f_format == 4 && frame->f_fmt4.f_fa) {
+ /* LC040 */
+ ea->ea_flags = EA_FRAME_EA;
+ ea->ea_fea = frame->f_fmt4.f_fa;
+#ifdef DEBUG_FPE
+ printf("decode_ea: 68LC040 - in-frame EA (%p) size %d\n",
+ (void *)ea->ea_fea, insn->is_datasize);
+#endif
+ if ((modreg & 070) == 030) {
+ /* postincrement mode */
+ ea->ea_flags |= EA_POSTINCR;
+ } else if ((modreg & 070) == 040) {
+ /* predecrement mode */
+ ea->ea_flags |= EA_PREDECR;
#ifdef M68060
#if defined(M68020) || defined(M68030) || defined(M68040)
- if (cputype == CPU_68060)
+ if (cputype == CPU_68060)
#endif
- if (insn->is_datasize == 12)
- ea->ea_fea -= 8;
+ if (insn->is_datasize == 12)
+ ea->ea_fea -= 8;
#endif
+ }
}
- }
#endif /* XXX */
- else {
- /* 020/030 */
- switch (modreg & 070) {
+ else {
+ /* 020/030 */
+ switch (modreg & 070) {
- case 020: /* (An) */
- ea->ea_flags = 0;
+ case 020: /* (An) */
+ ea->ea_flags = 0;
#ifdef DEBUG_FPE
- printf("decode_ea: register indirect reg=%d\n", ea->ea_regnum);
+ printf("decode_ea: register indirect reg=%d\n",
+ ea->ea_regnum);
#endif
- break;
+ break;
- case 030: /* (An)+ */
- ea->ea_flags = EA_POSTINCR;
+ case 030: /* (An)+ */
+ ea->ea_flags = EA_POSTINCR;
#ifdef DEBUG_FPE
- printf("decode_ea: reg indirect postincrement reg=%d\n",
- ea->ea_regnum);
+ printf("decode_ea: reg indirect postincrement reg=%d\n",
+ ea->ea_regnum);
#endif
- break;
+ break;
- case 040: /* -(An) */
- ea->ea_flags = EA_PREDECR;
+ case 040: /* -(An) */
+ ea->ea_flags = EA_PREDECR;
#ifdef DEBUG_FPE
- printf("decode_ea: reg indirect predecrement reg=%d\n",
- ea->ea_regnum);
+ printf("decode_ea: reg indirect predecrement reg=%d\n",
+ ea->ea_regnum);
#endif
- break;
+ break;
- case 050: /* (d16,An) */
- ea->ea_flags = EA_OFFSET;
- sig = fetch_disp(frame, insn, 1, &ea->ea_offset);
+ case 050: /* (d16,An) */
+ ea->ea_flags = EA_OFFSET;
+ sig = fetch_disp(frame, insn, 1, &ea->ea_offset);
#ifdef DEBUG_FPE
- printf("decode_ea: reg indirect with displacement reg=%d\n",
- ea->ea_regnum);
+ printf("decode_ea: reg indirect with displacement "
+ "reg=%d\n", ea->ea_regnum);
#endif
- break;
+ break;
- case 060: /* (d8,An,Xn) */
- ea->ea_flags = EA_INDEXED;
- sig = decode_ea6(frame, insn, ea, modreg);
- break;
+ case 060: /* (d8,An,Xn) */
+ ea->ea_flags = EA_INDEXED;
+ sig = decode_ea6(frame, insn, ea, modreg);
+ break;
- case 070: /* misc. */
- ea->ea_regnum = (modreg & 7);
- switch (modreg & 7) {
+ case 070: /* misc. */
+ ea->ea_regnum = (modreg & 7);
+ switch (modreg & 7) {
- case 0: /* (xxxx).W */
- ea->ea_flags = EA_ABS;
- sig = fetch_disp(frame, insn, 1, &ea->ea_absaddr);
+ case 0: /* (xxxx).W */
+ ea->ea_flags = EA_ABS;
+ sig = fetch_disp(frame, insn, 1,
+ &ea->ea_absaddr);
#ifdef DEBUG_FPE
- printf("decode_ea: absolute address (word)\n");
+ printf("decode_ea: absolute address (word)\n");
#endif
- break;
+ break;
- case 1: /* (xxxxxxxx).L */
- ea->ea_flags = EA_ABS;
- sig = fetch_disp(frame, insn, 2, &ea->ea_absaddr);
+ case 1: /* (xxxxxxxx).L */
+ ea->ea_flags = EA_ABS;
+ sig = fetch_disp(frame, insn, 2,
+ &ea->ea_absaddr);
#ifdef DEBUG_FPE
- printf("decode_ea: absolute address (long)\n");
+ printf("decode_ea: absolute address (long)\n");
#endif
- break;
+ break;
- case 2: /* (d16,PC) */
- ea->ea_flags = EA_PC_REL | EA_OFFSET;
- sig = fetch_disp(frame, insn, 1, &ea->ea_absaddr);
+ case 2: /* (d16,PC) */
+ ea->ea_flags = EA_PC_REL | EA_OFFSET;
+ sig = fetch_disp(frame, insn, 1,
+ &ea->ea_absaddr);
#ifdef DEBUG_FPE
- printf("decode_ea: pc relative word displacement\n");
+ printf("decode_ea: pc relative word "
+ "displacement\n");
#endif
- break;
+ break;
- case 3: /* (d8,PC,Xn) */
- ea->ea_flags = EA_PC_REL | EA_INDEXED;
- sig = decode_ea6(frame, insn, ea, modreg);
- break;
+ case 3: /* (d8,PC,Xn) */
+ ea->ea_flags = EA_PC_REL | EA_INDEXED;
+ sig = decode_ea6(frame, insn, ea, modreg);
+ break;
- case 4: /* #data */
- /* it should have been taken care of earlier */
- default:
+ case 4: /* #data */
+ /* it should have been taken care of earlier */
+ default:
#ifdef DEBUG_FPE
- printf("decode_ea: invalid addr mode (7,%d)\n", modreg & 7);
+ printf("decode_ea: invalid addr mode (7,%d)\n",
+ modreg & 7);
#endif
- return SIGILL;
- } /* switch for mode 7 */
- break;
- } /* switch mode */
- }
- ea->ea_moffs = 0;
+ return SIGILL;
+ }
+ break;
+ }
+ }
+ ea->ea_moffs = 0;
- return sig;
+ return sig;
}
/*
* Decode Mode=6 address modes
*/
static int
-decode_ea6(struct frame *frame, struct instruction *insn, struct insn_ea *ea, int modreg)
+decode_ea6(struct frame *frame, struct instruction *insn, struct insn_ea *ea,
+ int modreg)
{
- int extword, idx;
- int basedisp, outerdisp;
- int bd_size, od_size;
- int sig;
-
- extword = fusword((void *) (insn->is_pc + insn->is_advance));
- if (extword < 0) {
- return SIGSEGV;
- }
- insn->is_advance += 2;
-
- /* get register index */
- ea->ea_idxreg = (extword >> 12) & 0xf;
- idx = frame->f_regs[ea->ea_idxreg];
- if ((extword & 0x0800) == 0) {
- /* if word sized index, sign-extend */
- idx &= 0xffff;
- if (idx & 0x8000) {
- idx |= 0xffff0000;
- }
- }
- /* scale register index */
- idx <<= ((extword >>9) & 3);
-
- if ((extword & 0x100) == 0) {
- /* brief extension word - sign-extend the displacement */
- basedisp = (extword & 0xff);
- if (basedisp & 0x80) {
- basedisp |= 0xffffff00;
+ int extword, idx;
+ int basedisp, outerdisp;
+ int bd_size, od_size;
+ int sig;
+
+ extword = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (extword < 0) {
+ return SIGSEGV;
}
+ insn->is_advance += 2;
- ea->ea_basedisp = idx + basedisp;
- ea->ea_outerdisp = 0;
+ /* get register index */
+ ea->ea_idxreg = (extword >> 12) & 0xf;
+ idx = frame->f_regs[ea->ea_idxreg];
+ if ((extword & 0x0800) == 0) {
+ /* if word sized index, sign-extend */
+ idx &= 0xffff;
+ if (idx & 0x8000) {
+ idx |= 0xffff0000;
+ }
+ }
+ /* scale register index */
+ idx <<= ((extword >> 9) & 3);
+
+ if ((extword & 0x100) == 0) {
+ /* brief extension word - sign-extend the displacement */
+ basedisp = (extword & 0xff);
+ if (basedisp & 0x80) {
+ basedisp |= 0xffffff00;
+ }
+
+ ea->ea_basedisp = idx + basedisp;
+ ea->ea_outerdisp = 0;
#if DEBUG_FPE
- printf("decode_ea6: brief ext word idxreg=%d, basedisp=%08x\n",
- ea->ea_idxreg, ea->ea_basedisp);
+ printf("decode_ea6: brief ext word idxreg=%d, basedisp=%08x\n",
+ ea->ea_idxreg, ea->ea_basedisp);
#endif
- } else {
- /* full extension word */
- if (extword & 0x80) {
- ea->ea_flags |= EA_BASE_SUPPRSS;
- }
- bd_size = ((extword >> 4) & 3) - 1;
- od_size = (extword & 3) - 1;
- sig = fetch_disp(frame, insn, bd_size, &basedisp);
- if (sig) {
- return sig;
- }
- if (od_size >= 0) {
- ea->ea_flags |= EA_MEM_INDIR;
- }
- sig = fetch_disp(frame, insn, od_size, &outerdisp);
- if (sig) {
- return sig;
- }
-
- switch (extword & 0x44) {
- case 0: /* preindexed */
- ea->ea_basedisp = basedisp + idx;
- ea->ea_outerdisp = outerdisp;
- break;
- case 4: /* postindexed */
- ea->ea_basedisp = basedisp;
- ea->ea_outerdisp = outerdisp + idx;
- break;
- case 0x40: /* no index */
- ea->ea_basedisp = basedisp;
- ea->ea_outerdisp = outerdisp;
- break;
- default:
+ } else {
+ /* full extension word */
+ if (extword & 0x80) {
+ ea->ea_flags |= EA_BASE_SUPPRSS;
+ }
+ bd_size = ((extword >> 4) & 3) - 1;
+ od_size = (extword & 3) - 1;
+ sig = fetch_disp(frame, insn, bd_size, &basedisp);
+ if (sig)
+ return sig;
+ if (od_size >= 0)
+ ea->ea_flags |= EA_MEM_INDIR;
+ sig = fetch_disp(frame, insn, od_size, &outerdisp);
+ if (sig)
+ return sig;
+
+ switch (extword & 0x44) {
+ case 0: /* preindexed */
+ ea->ea_basedisp = basedisp + idx;
+ ea->ea_outerdisp = outerdisp;
+ break;
+ case 4: /* postindexed */
+ ea->ea_basedisp = basedisp;
+ ea->ea_outerdisp = outerdisp + idx;
+ break;
+ case 0x40: /* no index */
+ ea->ea_basedisp = basedisp;
+ ea->ea_outerdisp = outerdisp;
+ break;
+ default:
#ifdef DEBUG
- printf("decode_ea6: invalid indirect mode: ext word %04x\n",
- extword);
+ printf("decode_ea6: invalid indirect mode: "
+ "ext word %04x\n", extword);
#endif
- return SIGILL;
- break;
- }
+ return SIGILL;
+ break;
+ }
#if DEBUG_FPE
- printf("decode_ea6: full ext idxreg=%d, basedisp=%x, outerdisp=%x\n",
- ea->ea_idxreg, ea->ea_basedisp, ea->ea_outerdisp);
+ printf("decode_ea6: full ext idxreg=%d, basedisp=%x, "
+ "outerdisp=%x\n",
+ ea->ea_idxreg, ea->ea_basedisp, ea->ea_outerdisp);
#endif
- }
+ }
#if DEBUG_FPE
- printf("decode_ea6: regnum=%d, flags=%x\n",
- ea->ea_regnum, ea->ea_flags);
+ printf("decode_ea6: regnum=%d, flags=%x\n",
+ ea->ea_regnum, ea->ea_flags);
#endif
- return 0;
+ return 0;
}
/*
@@ -313,160 +316,163 @@
* Returns zero on success, else signal number.
*/
int
-fpu_load_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea, char *dst)
+fpu_load_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea,
+ char *dst)
{
- int *reg;
- char *src;
- int len, step;
- int sig;
+ int *reg;
+ char *src;
+ int len, step;
+ int sig;
#ifdef DIAGNOSTIC
- if (ea->ea_regnum & ~0xF) {
- panic("load_ea: bad regnum");
- }
+ if (ea->ea_regnum & ~0xF)
+ panic("load_ea: bad regnum");
#endif
#ifdef DEBUG_FPE
- printf("load_ea: frame at %p\n", frame);
+ printf("load_ea: frame at %p\n", frame);
#endif
- /* dst is always int or larger. */
- len = insn->is_datasize;
- if (len < 4) {
- dst += (4 - len);
- }
- step = (len == 1 && ea->ea_regnum == 15 /* sp */) ? 2 : len;
+ /* dst is always int or larger. */
+ len = insn->is_datasize;
+ if (len < 4)
+ dst += (4 - len);
+ step = (len == 1 && ea->ea_regnum == 15 /* sp */) ? 2 : len;
#if 0
- if (ea->ea_flags & EA_FRAME_EA) {
- /* Using LC040 frame EA */
+ if (ea->ea_flags & EA_FRAME_EA) {
+ /* Using LC040 frame EA */
#ifdef DEBUG_FPE
- if (ea->ea_flags & (EA_PREDECR|EA_POSTINCR)) {
- printf("load_ea: frame ea %08x w/r%d\n",
+ if (ea->ea_flags & (EA_PREDECR|EA_POSTINCR)) {
+ printf("load_ea: frame ea %08x w/r%d\n",
ea->ea_fea, ea->ea_regnum);
- } else {
- printf("load_ea: frame ea %08x\n", ea->ea_fea);
- }
+ } else {
+ printf("load_ea: frame ea %08x\n", ea->ea_fea);
+ }
+#endif
+ src = (char *)ea->ea_fea;
+ copyin(src + ea->ea_moffs, dst, len);
+ if (ea->ea_flags & EA_PREDECR) {
+ frame->f_regs[ea->ea_regnum] = ea->ea_fea;
+ ea->ea_fea -= step;
+ ea->ea_moffs = 0;
+ } else if (ea->ea_flags & EA_POSTINCR) {
+ ea->ea_fea += step;
+ frame->f_regs[ea->ea_regnum] = ea->ea_fea;
+ ea->ea_moffs = 0;
+ } else {
+ ea->ea_moffs += step;
+ }
+ /* That's it, folks */
+ } else
#endif
- src = (char *)ea->ea_fea;
- copyin(src + ea->ea_moffs, dst, len);
- if (ea->ea_flags & EA_PREDECR) {
- frame->f_regs[ea->ea_regnum] = ea->ea_fea;
- ea->ea_fea -= step;
- ea->ea_moffs = 0;
- } else if (ea->ea_flags & EA_POSTINCR) {
- ea->ea_fea += step;
- frame->f_regs[ea->ea_regnum] = ea->ea_fea;
- ea->ea_moffs = 0;
- } else {
- ea->ea_moffs += step;
- }
- /* That's it, folks */
- } else
-#endif
- if (ea->ea_flags & EA_DIRECT) {
- if (len > 4) {
+ if (ea->ea_flags & EA_DIRECT) {
+ if (len > 4) {
#ifdef DEBUG
- printf("load_ea: operand doesn't fit CPU reg\n");
+ printf("load_ea: operand doesn't fit CPU reg\n");
#endif
- return SIGILL;
- }
- if (ea->ea_moffs > 0) {
+ return SIGILL;
+ }
+ if (ea->ea_moffs > 0) {
#ifdef DEBUG
- printf("load_ea: more than one move from CPU reg\n");
+ printf("load_ea: more than one move from CPU reg\n");
#endif
- return SIGILL;
- }
- src = (char *)&frame->f_regs[ea->ea_regnum];
- /* The source is an int. */
- if (len < 4) {
- src += (4 - len);
+ return SIGILL;
+ }
+ src = (char *)&frame->f_regs[ea->ea_regnum];
+ /* The source is an int. */
+ if (len < 4) {
+ src += (4 - len);
#ifdef DEBUG_FPE
- printf("load_ea: short/byte opr - addr adjusted\n");
+ printf("load_ea: short/byte opr - addr adjusted\n");
#endif
- }
+ }
#ifdef DEBUG_FPE
- printf("load_ea: src %p\n", src);
+ printf("load_ea: src %p\n", src);
#endif
- memcpy(dst, src, len);
- } else if (ea->ea_flags & EA_IMMED) {
+ memcpy(dst, src, len);
+ } else if (ea->ea_flags & EA_IMMED) {
#ifdef DEBUG_FPE
- printf("load_ea: immed %08x%08x%08x size %d\n",
- ea->ea_immed[0], ea->ea_immed[1], ea->ea_immed[2], len);
+ printf("load_ea: immed %08x%08x%08x size %d\n",
+ ea->ea_immed[0], ea->ea_immed[1], ea->ea_immed[2], len);
#endif
- src = (char *)&ea->ea_immed[0];
- if (len < 4) {
- src += (4 - len);
+ src = (char *)&ea->ea_immed[0];
+ if (len < 4) {
+ src += (4 - len);
#ifdef DEBUG_FPE
- printf("load_ea: short/byte immed opr - addr adjusted\n");
+ printf("load_ea: short/byte immed opr - "
+ "addr adjusted\n");
#endif
- }
- memcpy(dst, src, len);
- } else if (ea->ea_flags & EA_ABS) {
+ }
+ memcpy(dst, src, len);
+ } else if (ea->ea_flags & EA_ABS) {
#ifdef DEBUG_FPE
- printf("load_ea: abs addr %08x\n", ea->ea_absaddr);
+ printf("load_ea: abs addr %08x\n", ea->ea_absaddr);
#endif
- src = (char *)ea->ea_absaddr;
- copyin(src, dst, len);
- } else /* register indirect */ {
- if (ea->ea_flags & EA_PC_REL) {
+ src = (char *)ea->ea_absaddr;
+ copyin(src, dst, len);
+ } else /* register indirect */ {
+ if (ea->ea_flags & EA_PC_REL) {
#ifdef DEBUG_FPE
- printf("load_ea: using PC\n");
+ printf("load_ea: using PC\n");
#endif
- reg = NULL;
- /* Grab the register contents. 4 is offset to the first
- extension word from the opcode */
- src = (char *)insn->is_pc + 4;
+ reg = NULL;
+ /*
+ * Grab the register contents. 4 is offset to the first
+ * extension word from the opcode
+ */
+ src = (char *)insn->is_pc + 4;
#ifdef DEBUG_FPE
- printf("load_ea: pc relative pc+4 = %p\n", src);
+ printf("load_ea: pc relative pc+4 = %p\n", src);
#endif
- } else /* not PC relative */ {
+ } else /* not PC relative */ {
#ifdef DEBUG_FPE
- printf("load_ea: using register %c%d\n",
- (ea->ea_regnum >= 8) ? 'a' : 'd', ea->ea_regnum & 7);
+ printf("load_ea: using register %c%d\n",
+ (ea->ea_regnum >= 8) ? 'a' : 'd', ea->ea_regnum & 7);
#endif
- /* point to the register */
- reg = &frame->f_regs[ea->ea_regnum];
+ /* point to the register */
+ reg = &frame->f_regs[ea->ea_regnum];
- if (ea->ea_flags & EA_PREDECR) {
+ if (ea->ea_flags & EA_PREDECR) {
#ifdef DEBUG_FPE
- printf("load_ea: predecr mode - reg decremented\n");
+ printf("load_ea: predecr mode - "
+ "reg decremented\n");
#endif
- *reg -= step;
- ea->ea_moffs = 0;
- }
+ *reg -= step;
+ ea->ea_moffs = 0;
+ }
- /* Grab the register contents. */
- src = (char *)*reg;
+ /* Grab the register contents. */
+ src = (char *)*reg;
#ifdef DEBUG_FPE
- printf("load_ea: reg indirect reg = %p\n", src);
+ printf("load_ea: reg indirect reg = %p\n", src);
#endif
- }
+ }
- sig = calc_ea(ea, src, &src);
- if (sig)
- return sig;
+ sig = calc_ea(ea, src, &src);
+ if (sig)
+ return sig;
- copyin(src + ea->ea_moffs, dst, len);
+ copyin(src + ea->ea_moffs, dst, len);
- /* do post-increment */
- if (ea->ea_flags & EA_POSTINCR) {
- if (ea->ea_flags & EA_PC_REL) {
+ /* do post-increment */
+ if (ea->ea_flags & EA_POSTINCR) {
+ if (ea->ea_flags & EA_PC_REL) {
#ifdef DEBUG
- printf("load_ea: tried to postincrement PC\n");
+ printf("load_ea: tried to postincrement PC\n");
#endif
- return SIGILL;
- }
- *reg += step;
- ea->ea_moffs = 0;
+ return SIGILL;
+ }
+ *reg += step;
+ ea->ea_moffs = 0;
#ifdef DEBUG_FPE
- printf("load_ea: postinc mode - reg incremented\n");
+ printf("load_ea: postinc mode - reg incremented\n");
#endif
- } else {
- ea->ea_moffs += len;
+ } else {
+ ea->ea_moffs += len;
+ }
}
- }
- return 0;
+ return 0;
}
/*
@@ -474,130 +480,130 @@
* Returns zero on success, else signal number.
*/
int
-fpu_store_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea, char *src)
+fpu_store_ea(struct frame *frame, struct instruction *insn, struct insn_ea *ea,
+ char *src)
{
- int *reg;
- char *dst;
- int len, step;
- int sig;
+ int *reg;
+ char *dst;
+ int len, step;
+ int sig;
#ifdef DIAGNOSTIC
- if (ea->ea_regnum & ~0xf) {
- panic("store_ea: bad regnum");
- }
+ if (ea->ea_regnum & ~0xf)
+ panic("store_ea: bad regnum");
#endif
- if (ea->ea_flags & (EA_IMMED|EA_PC_REL)) {
- /* not alterable address mode */
+ if (ea->ea_flags & (EA_IMMED|EA_PC_REL)) {
+ /* not alterable address mode */
#ifdef DEBUG
- printf("store_ea: not alterable address mode\n");
+ printf("store_ea: not alterable address mode\n");
#endif
- return SIGILL;
- }
-
- /* src is always int or larger. */
- len = insn->is_datasize;
- if (len < 4) {
- src += (4 - len);
- }
- step = (len == 1 && ea->ea_regnum == 15 /* sp */) ? 2 : len;
-
- if (ea->ea_flags & EA_FRAME_EA) {
- /* Using LC040 frame EA */
-#ifdef DEBUG_FPE
- if (ea->ea_flags & (EA_PREDECR|EA_POSTINCR)) {
- printf("store_ea: frame ea %08x w/r%d\n",
- ea->ea_fea, ea->ea_regnum);
- } else {
- printf("store_ea: frame ea %08x\n", ea->ea_fea);
- }
-#endif
- dst = (char *)ea->ea_fea;
- copyout(src, dst + ea->ea_moffs, len);
- if (ea->ea_flags & EA_PREDECR) {
- frame->f_regs[ea->ea_regnum] = ea->ea_fea;
- ea->ea_fea -= step;
- ea->ea_moffs = 0;
- } else if (ea->ea_flags & EA_POSTINCR) {
- ea->ea_fea += step;
- frame->f_regs[ea->ea_regnum] = ea->ea_fea;
- ea->ea_moffs = 0;
- } else {
- ea->ea_moffs += step;
+ return SIGILL;
}
- /* That's it, folks */
- } else if (ea->ea_flags & EA_ABS) {
-#ifdef DEBUG_FPE
- printf("store_ea: abs addr %08x\n", ea->ea_absaddr);
-#endif
- dst = (char *)ea->ea_absaddr;
- copyout(src, dst + ea->ea_moffs, len);
- ea->ea_moffs += len;
- } else if (ea->ea_flags & EA_DIRECT) {
- if (len > 4) {
+
+ /* src is always int or larger. */
+ len = insn->is_datasize;
+ if (len < 4)
+ src += (4 - len);
+ step = (len == 1 && ea->ea_regnum == 15 /* sp */) ? 2 : len;
+
+ if (ea->ea_flags & EA_FRAME_EA) {
+ /* Using LC040 frame EA */
+#ifdef DEBUG_FPE
+ if (ea->ea_flags & (EA_PREDECR|EA_POSTINCR)) {
+ printf("store_ea: frame ea %08x w/r%d\n",
+ ea->ea_fea, ea->ea_regnum);
+ } else {
+ printf("store_ea: frame ea %08x\n", ea->ea_fea);
+ }
+#endif
+ dst = (char *)ea->ea_fea;
+ copyout(src, dst + ea->ea_moffs, len);
+ if (ea->ea_flags & EA_PREDECR) {
+ frame->f_regs[ea->ea_regnum] = ea->ea_fea;
+ ea->ea_fea -= step;
+ ea->ea_moffs = 0;
+ } else if (ea->ea_flags & EA_POSTINCR) {
+ ea->ea_fea += step;
+ frame->f_regs[ea->ea_regnum] = ea->ea_fea;
+ ea->ea_moffs = 0;
+ } else {
+ ea->ea_moffs += step;
+ }
+ /* That's it, folks */
+ } else if (ea->ea_flags & EA_ABS) {
+#ifdef DEBUG_FPE
+ printf("store_ea: abs addr %08x\n", ea->ea_absaddr);
+#endif
+ dst = (char *)ea->ea_absaddr;
+ copyout(src, dst + ea->ea_moffs, len);
+ ea->ea_moffs += len;
+ } else if (ea->ea_flags & EA_DIRECT) {
+ if (len > 4) {
#ifdef DEBUG
- printf("store_ea: operand doesn't fit CPU reg\n");
+ printf("store_ea: operand doesn't fit CPU reg\n");
#endif
- return SIGILL;
- }
- if (ea->ea_moffs > 0) {
+ return SIGILL;
+ }
+ if (ea->ea_moffs > 0) {
#ifdef DEBUG
- printf("store_ea: more than one move to CPU reg\n");
+ printf("store_ea: more than one move to CPU reg\n");
#endif
- return SIGILL;
- }
- dst = (char*)&frame->f_regs[ea->ea_regnum];
- /* The destination is an int. */
- if (len < 4) {
- dst += (4 - len);
+ return SIGILL;
+ }
+ dst = (char *)&frame->f_regs[ea->ea_regnum];
+ /* The destination is an int. */
+ if (len < 4) {
+ dst += (4 - len);
#ifdef DEBUG_FPE
- printf("store_ea: short/byte opr - dst addr adjusted\n");
+ printf("store_ea: short/byte opr - "
+ "dst addr adjusted\n");
#endif
- }
+ }
#ifdef DEBUG_FPE
- printf("store_ea: dst %p\n", dst);
+ printf("store_ea: dst %p\n", dst);
#endif
- memcpy(dst, src, len);
- } else /* One of MANY indirect forms... */ {
+ memcpy(dst, src, len);
+ } else /* One of MANY indirect forms... */ {
#ifdef DEBUG_FPE
- printf("store_ea: using register %c%d\n",
- (ea->ea_regnum >= 8) ? 'a' : 'd', ea->ea_regnum & 7);
+ printf("store_ea: using register %c%d\n",
+ (ea->ea_regnum >= 8) ? 'a' : 'd', ea->ea_regnum & 7);
#endif
- /* point to the register */
- reg = &(frame->f_regs[ea->ea_regnum]);
+ /* point to the register */
+ reg = &(frame->f_regs[ea->ea_regnum]);
- /* do pre-decrement */
- if (ea->ea_flags & EA_PREDECR) {
+ /* do pre-decrement */
+ if (ea->ea_flags & EA_PREDECR) {
#ifdef DEBUG_FPE
- printf("store_ea: predecr mode - reg decremented\n");
+ printf("store_ea: predecr mode - reg decremented\n");
#endif
- *reg -= step;
- ea->ea_moffs = 0;
- }
+ *reg -= step;
+ ea->ea_moffs = 0;
+ }
- /* calculate the effective address */
- sig = calc_ea(ea, (char *)*reg, &dst);
- if (sig)
- return sig;
+ /* calculate the effective address */
+ sig = calc_ea(ea, (char *)*reg, &dst);
+ if (sig)
+ return sig;
#ifdef DEBUG_FPE
- printf("store_ea: dst addr=%p+%d\n", dst, ea->ea_moffs);
+ printf("store_ea: dst addr=%p+%d\n", dst, ea->ea_moffs);
#endif
- copyout(src, dst + ea->ea_moffs, len);
+ copyout(src, dst + ea->ea_moffs, len);
- /* do post-increment */
- if (ea->ea_flags & EA_POSTINCR) {
- *reg += step;
- ea->ea_moffs = 0;
+ /* do post-increment */
+ if (ea->ea_flags & EA_POSTINCR) {
+ *reg += step;
+ ea->ea_moffs = 0;
#ifdef DEBUG_FPE
- printf("store_ea: postinc mode - reg incremented\n");
+ printf("store_ea: postinc mode - reg incremented\n");
#endif
- } else {
- ea->ea_moffs += len;
+ } else {
+ ea->ea_moffs += len;
+ }
}
- }
- return 0;
+ return 0;
}
/*
@@ -606,68 +612,60 @@
static int
fetch_immed(struct frame *frame, struct instruction *insn, int *dst)
{
- int data, ext_bytes;
+ int data, ext_bytes;
- ext_bytes = insn->is_datasize;
+ ext_bytes = insn->is_datasize;
- if (0 < ext_bytes) {
- data = fusword((void *) (insn->is_pc + insn->is_advance));
- if (data < 0) {
- return SIGSEGV;
- }
- if (ext_bytes == 1) {
- /* sign-extend byte to long */
- data &= 0xff;
- if (data & 0x80) {
- data |= 0xffffff00;
- }
- } else if (ext_bytes == 2) {
- /* sign-extend word to long */
- data &= 0xffff;
- if (data & 0x8000) {
- data |= 0xffff0000;
- }
+ if (0 < ext_bytes) {
+ data = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (data < 0)
+ return SIGSEGV;
+ if (ext_bytes == 1) {
+ /* sign-extend byte to long */
+ data &= 0xff;
+ if (data & 0x80)
+ data |= 0xffffff00;
+ } else if (ext_bytes == 2) {
+ /* sign-extend word to long */
+ data &= 0xffff;
+ if (data & 0x8000)
+ data |= 0xffff0000;
+ }
+ insn->is_advance += 2;
+ dst[0] = data;
+ }
+ if (2 < ext_bytes) {
+ data = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (data < 0)
+ return SIGSEGV;
+ insn->is_advance += 2;
+ dst[0] <<= 16;
+ dst[0] |= data;
+ }
+ if (4 < ext_bytes) {
+ data = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (data < 0)
+ return SIGSEGV;
+ dst[1] = data << 16;
+ data = fusword((void *)(insn->is_pc + insn->is_advance + 2));
+ if (data < 0)
+ return SIGSEGV;
+ insn->is_advance += 4;
+ dst[1] |= data;
+ }
+ if (8 < ext_bytes) {
+ data = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (data < 0)
+ return SIGSEGV;
+ dst[2] = data << 16;
+ data = fusword((void *)(insn->is_pc + insn->is_advance + 2));
+ if (data < 0)
+ return SIGSEGV;
+ insn->is_advance += 4;
+ dst[2] |= data;
}
- insn->is_advance += 2;
- dst[0] = data;
- }
- if (2 < ext_bytes) {
- data = fusword((void *) (insn->is_pc + insn->is_advance));
- if (data < 0) {
- return SIGSEGV;
- }
- insn->is_advance += 2;
- dst[0] <<= 16;
- dst[0] |= data;
- }
- if (4 < ext_bytes) {
- data = fusword((void *) (insn->is_pc + insn->is_advance));
- if (data < 0) {
- return SIGSEGV;
- }
- dst[1] = data << 16;
- data = fusword((void *) (insn->is_pc + insn->is_advance + 2));
- if (data < 0) {
- return SIGSEGV;
- }
- insn->is_advance += 4;
- dst[1] |= data;
- }
- if (8 < ext_bytes) {
- data = fusword((void *) (insn->is_pc + insn->is_advance));
- if (data < 0) {
- return SIGSEGV;
- }
- dst[2] = data << 16;
- data = fusword((void *) (insn->is_pc + insn->is_advance + 2));
- if (data < 0) {
- return SIGSEGV;
- }
- insn->is_advance += 4;
- dst[2] |= data;
- }
- return 0;
+ return 0;
}
/*
@@ -676,36 +674,33 @@
static int
fetch_disp(struct frame *frame, struct instruction *insn, int size, int *res)
{
- int disp, word;
+ int disp, word;
- if (size == 1) {
- word = fusword((void *) (insn->is_pc + insn->is_advance));
- if (word < 0) {
- return SIGSEGV;
- }
- disp = word & 0xffff;
- if (disp & 0x8000) {
- /* sign-extend */
- disp |= 0xffff0000;
+ if (size == 1) {
+ word = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (word < 0)
+ return SIGSEGV;
+ disp = word & 0xffff;
+ if (disp & 0x8000) {
+ /* sign-extend */
+ disp |= 0xffff0000;
+ }
+ insn->is_advance += 2;
+ } else if (size == 2) {
+ word = fusword((void *)(insn->is_pc + insn->is_advance));
+ if (word < 0)
+ return SIGSEGV;
+ disp = word << 16;
+ word = fusword((void *)(insn->is_pc + insn->is_advance + 2));
+ if (word < 0)
+ return SIGSEGV;
+ disp |= (word & 0xffff);
+ insn->is_advance += 4;
+ } else {
+ disp = 0;
}
- insn->is_advance += 2;
- } else if (size == 2) {
- word = fusword((void *) (insn->is_pc + insn->is_advance));
- if (word < 0) {
- return SIGSEGV;
- }
- disp = word << 16;
- word = fusword((void *) (insn->is_pc + insn->is_advance + 2));
- if (word < 0) {
- return SIGSEGV;
- }
- disp |= (word & 0xffff);
- insn->is_advance += 4;
- } else {
- disp = 0;
- }
- *res = disp;
- return 0;
+ *res = disp;
+ return 0;
}
/*
@@ -719,55 +714,54 @@
/* ptr: base address (usually a register content) */
/* eaddr: pointer to result pointer */
{
- int data, word;
+ int data, word;
#if DEBUG_FPE
- printf("calc_ea: reg indirect (reg) = %p\n", ptr);
+ printf("calc_ea: reg indirect (reg) = %p\n", ptr);
#endif
- if (ea->ea_flags & EA_OFFSET) {
- /* apply the signed offset */
+ if (ea->ea_flags & EA_OFFSET) {
+ /* apply the signed offset */
#if DEBUG_FPE
- printf("calc_ea: offset %d\n", ea->ea_offset);
+ printf("calc_ea: offset %d\n", ea->ea_offset);
#endif
- ptr += ea->ea_offset;
- } else if (ea->ea_flags & EA_INDEXED) {
+ ptr += ea->ea_offset;
+ } else if (ea->ea_flags & EA_INDEXED) {
#if DEBUG_FPE
- printf("calc_ea: indexed mode\n");
+ printf("calc_ea: indexed mode\n");
#endif
- if (ea->ea_flags & EA_BASE_SUPPRSS) {
- /* base register is suppressed */
- ptr = (char *)ea->ea_basedisp;
- } else {
- ptr += ea->ea_basedisp;
- }
+ if (ea->ea_flags & EA_BASE_SUPPRSS) {
+ /* base register is suppressed */
+ ptr = (char *)ea->ea_basedisp;
+ } else {
+ ptr += ea->ea_basedisp;
+ }
- if (ea->ea_flags & EA_MEM_INDIR) {
+ if (ea->ea_flags & EA_MEM_INDIR) {
#if DEBUG_FPE
- printf("calc_ea: mem indir mode: basedisp=%08x, outerdisp=%08x\n",
- ea->ea_basedisp, ea->ea_outerdisp);
- printf("calc_ea: addr fetched from %p\n", ptr);
-#endif
- /* memory indirect modes */
- word = fusword(ptr);
- if (word < 0) {
- return SIGSEGV;
- }
- word <<= 16;
- data = fusword(ptr + 2);
- if (data < 0) {
- return SIGSEGV;
- }
- word |= data;
+ printf("calc_ea: mem indir mode: basedisp=%08x, "
+ "outerdisp=%08x\n",
+ ea->ea_basedisp, ea->ea_outerdisp);
+ printf("calc_ea: addr fetched from %p\n", ptr);
+#endif
+ /* memory indirect modes */
+ word = fusword(ptr);
+ if (word < 0)
+ return SIGSEGV;
+ word <<= 16;
+ data = fusword(ptr + 2);
+ if (data < 0)
+ return SIGSEGV;
+ word |= data;
#if DEBUG_FPE
- printf("calc_ea: fetched ptr 0x%08x\n", word);
+ printf("calc_ea: fetched ptr 0x%08x\n", word);
#endif
- ptr = (char *)word + ea->ea_outerdisp;
+ ptr = (char *)word + ea->ea_outerdisp;
+ }
}
- }
- *eaddr = ptr;
+ *eaddr = ptr;
- return 0;
+ return 0;
}