From fd8f4948fe9454ec1cc6cb8a33c4992f6145c43d Mon Sep 17 00:00:00 2001 From: Joern Rennecke Date: Fri, 11 Oct 2002 15:31:28 +0000 Subject: [PATCH] gcc uses trap 33 for profiling, but the simulator didn't support it. This patch fixes the gcc.dg/nest.c failures for sh-elf. Fri Oct 11 16:22:28 2002 J"orn Rennecke * interp.c (trap): Return int. Take extra parameter for address of the trap instruction. Changed all callers. Add case 33 for profiling. * gencode.c (trapa): Handle trap 33 using the trap function. Add read of vector for generic traps. --- sim/sh/ChangeLog | 8 ++++++++ sim/sh/gencode.c | 33 ++++++++++----------------------- sim/sh/interp.c | 19 +++++++++++++++---- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/sim/sh/ChangeLog b/sim/sh/ChangeLog index ec58759508..60b41f7c55 100644 --- a/sim/sh/ChangeLog +++ b/sim/sh/ChangeLog @@ -1,3 +1,11 @@ +Fri Oct 11 16:22:28 2002 J"orn Rennecke + + * interp.c (trap): Return int. Take extra parameter for address + of the trap instruction. Changed all callers. + Add case 33 for profiling. + * gencode.c (trapa): Handle trap 33 using the trap function. + Add read of vector for generic traps. + Wed Jul 17 19:36:38 2002 J"orn Rennecke * Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h. diff --git a/sim/sh/gencode.c b/sim/sh/gencode.c index ba6ee4c1bc..8e2445a7e1 100644 --- a/sim/sh/gencode.c +++ b/sim/sh/gencode.c @@ -577,7 +577,7 @@ op tab[] = }, { "", "nm", "mac.l @+,@+", "0000nnnnmmmm1111", - "trap (255,R0,memory,maskl,maskw, endianw);", + "trap (255, R0, PC, memory, maskl, maskw, endianw);", "/* FIXME: mac.l support */", }, @@ -951,8 +951,7 @@ op tab[] = }, { "", "", "sleep", "0000000000011011", - "nip = PC;", - "trap (0xc3, R0, memory, maskl, maskw, endianw);", + "nip += trap (0xc3, R0, PC, memory, maskl, maskw, endianw);", }, { "n", "", "stc ,", "0000nnnnmmmm0010", @@ -1029,37 +1028,25 @@ op tab[] = }, { "0", "", "trapa #", "11000011i8*1....", -#if 0 - /* SH-[12] */ "long imm = 0xff & i;", - "if (i==0xc3)", - " PC-=2;", - "if (i<20||i==34||i==0xc3)", - " trap(i,R,memory,maskl,maskw,endianw);", + "if (i < 20 || i == 33 || i == 34 || i == 0xc3)", + " nip += trap (i, R, PC, memory, maskl, maskw,endianw);", +#if 0 "else {", + /* SH-[12] */ " R[15]-=4;", - " WLAT(R[15],GET_SR());", + " WLAT (R[15], GET_SR());", " R[15]-=4;", - " WLAT(R[15],PC+2);", - " PC=RLAT(VBR+(imm<<2))-2;", - "}", + " WLAT (R[15], PH2T (PC + 2));", #else - "if (i == 0xc3)", - " {", - " nip = PC;", - " trap (i, R, memory, maskl, maskw,endianw);", - " }", - "else if (i < 20 || i==34 || i==0xc3)", - " trap (i, R, memory, maskl, maskw,endianw);", "else if (!SR_BL) {", - " /* FIXME: TRA = (imm << 2); */", " SSR = GET_SR();", " SPC = PH2T (PC + 2);", " SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);", " /* FIXME: EXPEVT = 0x00000160; */", - " SET_NIP (PT2H (VBR + 0x00000100));", - "}", #endif + " SET_NIP (PT2H (RLAT (VBR + (imm<<2))));", + "}", }, { "", "mn", "tst ,", "0010nnnnmmmm1000", diff --git a/sim/sh/interp.c b/sim/sh/interp.c index 2f5d1d37d5..8c2f3598a5 100644 --- a/sim/sh/interp.c +++ b/sim/sh/interp.c @@ -954,12 +954,14 @@ strnswap (str, len) while (start < end); } -/* Simulate a monitor trap, put the result into r0 and errno into r1 */ +/* Simulate a monitor trap, put the result into r0 and errno into r1 + return offset by which to adjust pc. */ -static void -trap (i, regs, memory, maskl, maskw, endianw) +static int +trap (i, regs, insn_ptr, memory, maskl, maskw, endianw) int i; int *regs; + unsigned char *insn_ptr; unsigned char *memory; { switch (i) @@ -971,6 +973,13 @@ trap (i, regs, memory, maskl, maskw, endianw) raise_exception (SIGQUIT); break; case 3: /* FIXME: for backwards compat, should be removed */ + case 33: + { + unsigned int countp = * (unsigned int *) (insn_ptr + 4); + + WLAT (countp, RLAT (countp) + 1); + return 6; + } case 34: { extern int errno; @@ -1154,9 +1163,11 @@ trap (i, regs, memory, maskl, maskw, endianw) case 0xc3: case 255: raise_exception (SIGTRAP); + if (i == 0xc3) + return -2; break; } - + return 0; } void