aboutsummaryrefslogtreecommitdiff
path: root/sim/fr30/traps.c
blob: 685235917529aab3dd626e569b7ed9916501767c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
// OBSOLETE /* fr30 exception, interrupt, and trap (EIT) support
// OBSOLETE    Copyright (C) 1998, 1999 Free Software Foundation, Inc.
// OBSOLETE    Contributed by Cygnus Solutions.
// OBSOLETE 
// OBSOLETE This file is part of the GNU simulators.
// OBSOLETE 
// OBSOLETE This program is free software; you can redistribute it and/or modify
// OBSOLETE it under the terms of the GNU General Public License as published by
// OBSOLETE the Free Software Foundation; either version 2, or (at your option)
// OBSOLETE any later version.
// OBSOLETE 
// OBSOLETE This program is distributed in the hope that it will be useful,
// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of
// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// OBSOLETE GNU General Public License for more details.
// OBSOLETE 
// OBSOLETE You should have received a copy of the GNU General Public License along
// OBSOLETE with this program; if not, write to the Free Software Foundation, Inc.,
// OBSOLETE 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
// OBSOLETE 
// OBSOLETE #include "sim-main.h"
// OBSOLETE #include "targ-vals.h"
// OBSOLETE #include "cgen-engine.h"
// OBSOLETE 
// OBSOLETE /* The semantic code invokes this for invalid (unrecognized) instructions.  */
// OBSOLETE 
// OBSOLETE SEM_PC
// OBSOLETE sim_engine_invalid_insn (SIM_CPU *current_cpu, IADDR cia, SEM_PC vpc)
// OBSOLETE {
// OBSOLETE   SIM_DESC sd = CPU_STATE (current_cpu);
// OBSOLETE 
// OBSOLETE #if 0
// OBSOLETE   if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
// OBSOLETE     {
// OBSOLETE       h_bsm_set (current_cpu, h_sm_get (current_cpu));
// OBSOLETE       h_bie_set (current_cpu, h_ie_get (current_cpu));
// OBSOLETE       h_bcond_set (current_cpu, h_cond_get (current_cpu));
// OBSOLETE       /* sm not changed */
// OBSOLETE       h_ie_set (current_cpu, 0);
// OBSOLETE       h_cond_set (current_cpu, 0);
// OBSOLETE 
// OBSOLETE       h_bpc_set (current_cpu, cia);
// OBSOLETE 
// OBSOLETE       sim_engine_restart (CPU_STATE (current_cpu), current_cpu, NULL,
// OBSOLETE 			  EIT_RSVD_INSN_ADDR);
// OBSOLETE     }
// OBSOLETE   else
// OBSOLETE #endif
// OBSOLETE     sim_engine_halt (sd, current_cpu, NULL, cia, sim_stopped, SIM_SIGILL);
// OBSOLETE   return vpc;
// OBSOLETE }
// OBSOLETE 
// OBSOLETE /* Process an address exception.  */
// OBSOLETE 
// OBSOLETE void
// OBSOLETE fr30_core_signal (SIM_DESC sd, SIM_CPU *current_cpu, sim_cia cia,
// OBSOLETE 		  unsigned int map, int nr_bytes, address_word addr,
// OBSOLETE 		  transfer_type transfer, sim_core_signals sig)
// OBSOLETE {
// OBSOLETE #if 0
// OBSOLETE   if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
// OBSOLETE     {
// OBSOLETE       h_bsm_set (current_cpu, h_sm_get (current_cpu));
// OBSOLETE       h_bie_set (current_cpu, h_ie_get (current_cpu));
// OBSOLETE       h_bcond_set (current_cpu, h_cond_get (current_cpu));
// OBSOLETE       /* sm not changed */
// OBSOLETE       h_ie_set (current_cpu, 0);
// OBSOLETE       h_cond_set (current_cpu, 0);
// OBSOLETE 
// OBSOLETE       h_bpc_set (current_cpu, cia);
// OBSOLETE 
// OBSOLETE       sim_engine_restart (CPU_STATE (current_cpu), current_cpu, NULL,
// OBSOLETE 			  EIT_ADDR_EXCP_ADDR);
// OBSOLETE     }
// OBSOLETE   else
// OBSOLETE #endif
// OBSOLETE     sim_core_signal (sd, current_cpu, cia, map, nr_bytes, addr,
// OBSOLETE 		     transfer, sig);
// OBSOLETE }
// OBSOLETE 
// OBSOLETE /* Read/write functions for system call interface.  */
// OBSOLETE 
// OBSOLETE static int
// OBSOLETE syscall_read_mem (host_callback *cb, struct cb_syscall *sc,
// OBSOLETE 		  unsigned long taddr, char *buf, int bytes)
// OBSOLETE {
// OBSOLETE   SIM_DESC sd = (SIM_DESC) sc->p1;
// OBSOLETE   SIM_CPU *cpu = (SIM_CPU *) sc->p2;
// OBSOLETE 
// OBSOLETE   return sim_core_read_buffer (sd, cpu, read_map, buf, taddr, bytes);
// OBSOLETE }
// OBSOLETE 
// OBSOLETE static int
// OBSOLETE syscall_write_mem (host_callback *cb, struct cb_syscall *sc,
// OBSOLETE 		   unsigned long taddr, const char *buf, int bytes)
// OBSOLETE {
// OBSOLETE   SIM_DESC sd = (SIM_DESC) sc->p1;
// OBSOLETE   SIM_CPU *cpu = (SIM_CPU *) sc->p2;
// OBSOLETE 
// OBSOLETE   return sim_core_write_buffer (sd, cpu, write_map, buf, taddr, bytes);
// OBSOLETE }
// OBSOLETE 
// OBSOLETE /* Subroutine of fr30_int to save the PS and PC and setup for INT and INTE.  */
// OBSOLETE 
// OBSOLETE static void
// OBSOLETE setup_int (SIM_CPU *current_cpu, PCADDR pc)
// OBSOLETE {
// OBSOLETE   USI ssp = fr30bf_h_dr_get (current_cpu, H_DR_SSP);
// OBSOLETE   USI ps = fr30bf_h_ps_get (current_cpu);
// OBSOLETE 
// OBSOLETE   ssp -= 4;
// OBSOLETE   SETMEMSI (current_cpu, pc, ssp, ps);
// OBSOLETE   ssp -= 4;
// OBSOLETE   SETMEMSI (current_cpu, pc, ssp, pc + 2);
// OBSOLETE   fr30bf_h_dr_set (current_cpu, H_DR_SSP, ssp);
// OBSOLETE   fr30bf_h_sbit_set (current_cpu, 0);
// OBSOLETE }
// OBSOLETE 
// OBSOLETE /* Trap support.
// OBSOLETE    The result is the pc address to continue at.
// OBSOLETE    Preprocessing like saving the various registers has already been done.  */
// OBSOLETE 
// OBSOLETE USI
// OBSOLETE fr30_int (SIM_CPU *current_cpu, PCADDR pc, int num)
// OBSOLETE {
// OBSOLETE   SIM_DESC sd = CPU_STATE (current_cpu);
// OBSOLETE   host_callback *cb = STATE_CALLBACK (sd);
// OBSOLETE 
// OBSOLETE #ifdef SIM_HAVE_BREAKPOINTS
// OBSOLETE   /* Check for breakpoints "owned" by the simulator first, regardless
// OBSOLETE      of --environment.  */
// OBSOLETE   if (num == TRAP_BREAKPOINT)
// OBSOLETE     {
// OBSOLETE       /* First try sim-break.c.  If it's a breakpoint the simulator "owns"
// OBSOLETE 	 it doesn't return.  Otherwise it returns and let's us try.  */
// OBSOLETE       sim_handle_breakpoint (sd, current_cpu, pc);
// OBSOLETE       /* Fall through.  */
// OBSOLETE     }
// OBSOLETE #endif
// OBSOLETE 
// OBSOLETE   if (STATE_ENVIRONMENT (sd) == OPERATING_ENVIRONMENT)
// OBSOLETE     {
// OBSOLETE       /* The new pc is the trap vector entry.
// OBSOLETE 	 We assume there's a branch there to some handler.  */
// OBSOLETE       USI new_pc;
// OBSOLETE       setup_int (current_cpu, pc);
// OBSOLETE       fr30bf_h_ibit_set (current_cpu, 0);
// OBSOLETE       new_pc = GETMEMSI (current_cpu, pc,
// OBSOLETE 			 fr30bf_h_dr_get (current_cpu, H_DR_TBR)
// OBSOLETE 			 + 1024 - ((num + 1) * 4));
// OBSOLETE       return new_pc;
// OBSOLETE     }
// OBSOLETE 
// OBSOLETE   switch (num)
// OBSOLETE     {
// OBSOLETE     case TRAP_SYSCALL :
// OBSOLETE       {
// OBSOLETE 	/* TODO: find out what the ABI for this is */
// OBSOLETE 	CB_SYSCALL s;
// OBSOLETE 
// OBSOLETE 	CB_SYSCALL_INIT (&s);
// OBSOLETE 	s.func = fr30bf_h_gr_get (current_cpu, 0);
// OBSOLETE 	s.arg1 = fr30bf_h_gr_get (current_cpu, 4);
// OBSOLETE 	s.arg2 = fr30bf_h_gr_get (current_cpu, 5);
// OBSOLETE 	s.arg3 = fr30bf_h_gr_get (current_cpu, 6);
// OBSOLETE 
// OBSOLETE 	if (s.func == TARGET_SYS_exit)
// OBSOLETE 	  {
// OBSOLETE 	    sim_engine_halt (sd, current_cpu, NULL, pc, sim_exited, s.arg1);
// OBSOLETE 	  }
// OBSOLETE 
// OBSOLETE 	s.p1 = (PTR) sd;
// OBSOLETE 	s.p2 = (PTR) current_cpu;
// OBSOLETE 	s.read_mem = syscall_read_mem;
// OBSOLETE 	s.write_mem = syscall_write_mem;
// OBSOLETE 	cb_syscall (cb, &s);
// OBSOLETE 	fr30bf_h_gr_set (current_cpu, 2, s.errcode); /* TODO: check this one */
// OBSOLETE 	fr30bf_h_gr_set (current_cpu, 4, s.result);
// OBSOLETE 	fr30bf_h_gr_set (current_cpu, 1, s.result2); /* TODO: check this one */
// OBSOLETE 	break;
// OBSOLETE       }
// OBSOLETE 
// OBSOLETE     case TRAP_BREAKPOINT:
// OBSOLETE       sim_engine_halt (sd, current_cpu, NULL, pc,
// OBSOLETE 		       sim_stopped, SIM_SIGTRAP);
// OBSOLETE       break;
// OBSOLETE 
// OBSOLETE     default :
// OBSOLETE       {
// OBSOLETE 	USI new_pc;
// OBSOLETE 	setup_int (current_cpu, pc);
// OBSOLETE 	fr30bf_h_ibit_set (current_cpu, 0);
// OBSOLETE 	new_pc = GETMEMSI (current_cpu, pc,
// OBSOLETE 			   fr30bf_h_dr_get (current_cpu, H_DR_TBR)
// OBSOLETE 			   + 1024 - ((num + 1) * 4));
// OBSOLETE 	return new_pc;
// OBSOLETE       }
// OBSOLETE     }
// OBSOLETE 
// OBSOLETE   /* Fake an "reti" insn.
// OBSOLETE      Since we didn't push anything to stack, all we need to do is
// OBSOLETE      update pc.  */
// OBSOLETE   return pc + 2;
// OBSOLETE }
// OBSOLETE 
// OBSOLETE USI
// OBSOLETE fr30_inte (SIM_CPU *current_cpu, PCADDR pc, int num)
// OBSOLETE {
// OBSOLETE   /* The new pc is the trap #9 vector entry.
// OBSOLETE      We assume there's a branch there to some handler.  */
// OBSOLETE   USI new_pc;
// OBSOLETE   setup_int (current_cpu, pc);
// OBSOLETE   fr30bf_h_ilm_set (current_cpu, 4);
// OBSOLETE   new_pc = GETMEMSI (current_cpu, pc,
// OBSOLETE 		     fr30bf_h_dr_get (current_cpu, H_DR_TBR)
// OBSOLETE 		     + 1024 - ((9 + 1) * 4));
// OBSOLETE   return new_pc;
// OBSOLETE }