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 <joern.rennecke@superh.com> * 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.
This commit is contained in:
parent
6c381eeb71
commit
fd8f4948fe
3 changed files with 33 additions and 27 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
Fri Oct 11 16:22:28 2002 J"orn Rennecke <joern.rennecke@superh.com>
|
||||||
|
|
||||||
|
* 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 <joern.rennecke@superh.com>
|
Wed Jul 17 19:36:38 2002 J"orn Rennecke <joern.rennecke@superh.com>
|
||||||
|
|
||||||
* Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h.
|
* Makefile.in (interp.o): Depend on $(srcroot)/include/gdb/sim-sh.h.
|
||||||
|
|
|
@ -577,7 +577,7 @@ op tab[] =
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
|
{ "", "nm", "mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111",
|
||||||
"trap (255,R0,memory,maskl,maskw, endianw);",
|
"trap (255, R0, PC, memory, maskl, maskw, endianw);",
|
||||||
"/* FIXME: mac.l support */",
|
"/* FIXME: mac.l support */",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -951,8 +951,7 @@ op tab[] =
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "", "", "sleep", "0000000000011011",
|
{ "", "", "sleep", "0000000000011011",
|
||||||
"nip = PC;",
|
"nip += trap (0xc3, R0, PC, memory, maskl, maskw, endianw);",
|
||||||
"trap (0xc3, R0, memory, maskl, maskw, endianw);",
|
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "n", "", "stc <CREG_M>,<REG_N>", "0000nnnnmmmm0010",
|
{ "n", "", "stc <CREG_M>,<REG_N>", "0000nnnnmmmm0010",
|
||||||
|
@ -1029,37 +1028,25 @@ op tab[] =
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "0", "", "trapa #<imm>", "11000011i8*1....",
|
{ "0", "", "trapa #<imm>", "11000011i8*1....",
|
||||||
#if 0
|
|
||||||
/* SH-[12] */
|
|
||||||
"long imm = 0xff & i;",
|
"long imm = 0xff & i;",
|
||||||
"if (i==0xc3)",
|
"if (i < 20 || i == 33 || i == 34 || i == 0xc3)",
|
||||||
" PC-=2;",
|
" nip += trap (i, R, PC, memory, maskl, maskw,endianw);",
|
||||||
"if (i<20||i==34||i==0xc3)",
|
#if 0
|
||||||
" trap(i,R,memory,maskl,maskw,endianw);",
|
|
||||||
"else {",
|
"else {",
|
||||||
|
/* SH-[12] */
|
||||||
" R[15]-=4;",
|
" R[15]-=4;",
|
||||||
" WLAT(R[15],GET_SR());",
|
" WLAT (R[15], GET_SR());",
|
||||||
" R[15]-=4;",
|
" R[15]-=4;",
|
||||||
" WLAT(R[15],PC+2);",
|
" WLAT (R[15], PH2T (PC + 2));",
|
||||||
" PC=RLAT(VBR+(imm<<2))-2;",
|
|
||||||
"}",
|
|
||||||
#else
|
#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) {",
|
"else if (!SR_BL) {",
|
||||||
" /* FIXME: TRA = (imm << 2); */",
|
|
||||||
" SSR = GET_SR();",
|
" SSR = GET_SR();",
|
||||||
" SPC = PH2T (PC + 2);",
|
" SPC = PH2T (PC + 2);",
|
||||||
" SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);",
|
" SET_SR (GET_SR() | SR_MASK_MD | SR_MASK_BL | SR_MASK_RB);",
|
||||||
" /* FIXME: EXPEVT = 0x00000160; */",
|
" /* FIXME: EXPEVT = 0x00000160; */",
|
||||||
" SET_NIP (PT2H (VBR + 0x00000100));",
|
|
||||||
"}",
|
|
||||||
#endif
|
#endif
|
||||||
|
" SET_NIP (PT2H (RLAT (VBR + (imm<<2))));",
|
||||||
|
"}",
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000",
|
{ "", "mn", "tst <REG_M>,<REG_N>", "0010nnnnmmmm1000",
|
||||||
|
|
|
@ -954,12 +954,14 @@ strnswap (str, len)
|
||||||
while (start < end);
|
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
|
static int
|
||||||
trap (i, regs, memory, maskl, maskw, endianw)
|
trap (i, regs, insn_ptr, memory, maskl, maskw, endianw)
|
||||||
int i;
|
int i;
|
||||||
int *regs;
|
int *regs;
|
||||||
|
unsigned char *insn_ptr;
|
||||||
unsigned char *memory;
|
unsigned char *memory;
|
||||||
{
|
{
|
||||||
switch (i)
|
switch (i)
|
||||||
|
@ -971,6 +973,13 @@ trap (i, regs, memory, maskl, maskw, endianw)
|
||||||
raise_exception (SIGQUIT);
|
raise_exception (SIGQUIT);
|
||||||
break;
|
break;
|
||||||
case 3: /* FIXME: for backwards compat, should be removed */
|
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:
|
case 34:
|
||||||
{
|
{
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
@ -1154,9 +1163,11 @@ trap (i, regs, memory, maskl, maskw, endianw)
|
||||||
case 0xc3:
|
case 0xc3:
|
||||||
case 255:
|
case 255:
|
||||||
raise_exception (SIGTRAP);
|
raise_exception (SIGTRAP);
|
||||||
|
if (i == 0xc3)
|
||||||
|
return -2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue