@@ -36,7 +36,7 @@ static void avr_set_pc(struct uc_struct *uc, uint64_t address)
36
36
set_pc ((CPUAVRState * )uc -> cpu -> env_ptr , address );
37
37
}
38
38
39
- void avr_reg_reset (struct uc_struct * uc )
39
+ static void reg_reset (struct uc_struct * uc )
40
40
{
41
41
}
42
42
@@ -45,126 +45,130 @@ void avr_reg_reset(struct uc_struct *uc)
45
45
#define GET_RAMP (reg ) GET_BYTE(env->glue(ramp,reg), 2)
46
46
#define SET_RAMP (reg , val ) SET_BYTE(env->glue(ramp,reg), 2, val)
47
47
48
- static void reg_read (CPUAVRState * env , unsigned int regid , void * value )
48
+ DEFAULT_VISIBILITY
49
+ uc_err reg_read (void * _env , int mode , unsigned int regid , void * value ,
50
+ size_t * size )
49
51
{
52
+ CPUAVRState * const env = _env ;
53
+ uc_err ret = UC_ERR_ARG ;
54
+
50
55
switch (regid ) {
51
56
case UC_AVR_REG_PC :
57
+ CHECK_REG_TYPE (uint32_t );
52
58
* (uint32_t * )value = get_pc (env );
53
59
break ;
54
60
case UC_AVR_REG_SP :
61
+ CHECK_REG_TYPE (uint32_t );
55
62
* (uint32_t * )value = env -> sp ;
56
63
break ;
57
64
58
65
case UC_AVR_REG_RAMPD :
66
+ CHECK_REG_TYPE (uint8_t );
59
67
* (uint8_t * )value = GET_RAMP (D );
60
68
break ;
61
69
case UC_AVR_REG_RAMPX :
70
+ CHECK_REG_TYPE (uint8_t );
62
71
* (uint8_t * )value = GET_RAMP (X );
63
72
break ;
64
73
case UC_AVR_REG_RAMPY :
74
+ CHECK_REG_TYPE (uint8_t );
65
75
* (uint8_t * )value = GET_RAMP (Y );
66
76
break ;
67
77
case UC_AVR_REG_RAMPZ :
78
+ CHECK_REG_TYPE (uint8_t );
68
79
* (uint8_t * )value = GET_RAMP (Z );
69
80
break ;
70
81
case UC_AVR_REG_EIND :
82
+ CHECK_REG_TYPE (uint8_t );
71
83
* (uint8_t * )value = GET_BYTE (env -> eind , 2 );
72
84
break ;
73
85
case UC_AVR_REG_SPL :
86
+ CHECK_REG_TYPE (uint8_t );
74
87
* (uint8_t * )value = GET_BYTE (env -> sp , 0 );
75
88
break ;
76
89
case UC_AVR_REG_SPH :
90
+ CHECK_REG_TYPE (uint8_t );
77
91
* (uint8_t * )value = GET_BYTE (env -> sp , 1 );
78
92
break ;
79
93
case UC_AVR_REG_SREG :
94
+ CHECK_REG_TYPE (uint8_t );
80
95
* (uint8_t * )value = cpu_get_sreg (env );
81
96
break ;
82
97
83
98
default : {
84
99
uint64_t v = 0 ;
85
100
if (regid >= UC_AVR_REG_R0 && regid <= UC_AVR_REG_R31 ) {
101
+ CHECK_REG_TYPE (uint8_t );
86
102
* (int8_t * )value = (int8_t )env -> r [regid - UC_AVR_REG_R0 ];
87
103
}
88
104
else if (regid >= UC_AVR_REG_R0W && regid <= UC_AVR_REG_R30W ) {
89
105
const uint32_t * const r = & env -> r [regid - UC_AVR_REG_R0W ];
90
106
for (int k = 0 ; k < 2 ; k ++ )
91
107
SET_BYTE (v , k , (r [k ] & 0xff ));
108
+ CHECK_REG_TYPE (uint16_t );
92
109
* (int16_t * )value = (int16_t )v ;
93
110
}
94
111
else if (regid >= UC_AVR_REG_R0D && regid <= UC_AVR_REG_R28D ) {
95
112
const uint32_t * const r = & env -> r [regid - UC_AVR_REG_R0D ];
96
113
for (int k = 0 ; k < 4 ; k ++ )
97
114
SET_BYTE (v , k , (r [k ] & 0xff ));
115
+ CHECK_REG_TYPE (uint32_t );
98
116
* (int32_t * )value = (int32_t )v ;
99
117
}
100
118
break ;
101
119
}
102
120
}
121
+ return ret ;
103
122
}
104
123
105
- int avr_reg_read (struct uc_struct * uc , unsigned int * regs , void * * vals ,
106
- int count )
124
+ DEFAULT_VISIBILITY
125
+ uc_err reg_write (void * _env , int mode , unsigned int regid , const void * value ,
126
+ size_t * size , int * setpc )
107
127
{
108
- CPUAVRState * env = & ( AVR_CPU ( uc -> cpu ) -> env ) ;
109
- int i ;
128
+ CPUAVRState * const env = _env ;
129
+ uc_err ret = UC_ERR_ARG ;
110
130
111
- for (i = 0 ; i < count ; i ++ ) {
112
- unsigned int regid = regs [i ];
113
- void * value = vals [i ];
114
- reg_read (env , regid , value );
115
- }
116
-
117
- return 0 ;
118
- }
119
-
120
- int avr_context_reg_read (struct uc_context * uc , unsigned int * regs ,
121
- void * * vals , int count )
122
- {
123
- CPUAVRState * env = (CPUAVRState * )uc -> data ;
124
- int i ;
125
-
126
- for (i = 0 ; i < count ; i ++ ) {
127
- unsigned int regid = regs [i ];
128
- void * value = vals [i ];
129
- reg_read (env , regid , value );
130
- }
131
-
132
- return 0 ;
133
- }
134
-
135
- static void reg_write (CPUAVRState * env , unsigned int regid ,
136
- const void * value )
137
- {
138
131
switch (regid ) {
139
132
case UC_AVR_REG_PC :
133
+ CHECK_REG_TYPE (uint32_t );
140
134
set_pc (env , * (uint32_t * )value );
135
+ * setpc = 1 ;
141
136
break ;
142
137
case UC_AVR_REG_SP :
138
+ CHECK_REG_TYPE (uint32_t );
143
139
env -> sp = * (uint32_t * )value ;
144
140
break ;
145
141
146
142
case UC_AVR_REG_RAMPD :
143
+ CHECK_REG_TYPE (uint8_t );
147
144
SET_RAMP (D , * (uint8_t * )value );
148
145
break ;
149
146
case UC_AVR_REG_RAMPX :
147
+ CHECK_REG_TYPE (uint8_t );
150
148
SET_RAMP (X , * (uint8_t * )value );
151
149
break ;
152
150
case UC_AVR_REG_RAMPY :
151
+ CHECK_REG_TYPE (uint8_t );
153
152
SET_RAMP (Y , * (uint8_t * )value );
154
153
break ;
155
154
case UC_AVR_REG_RAMPZ :
155
+ CHECK_REG_TYPE (uint8_t );
156
156
SET_RAMP (Z , * (uint8_t * )value );
157
157
break ;
158
158
case UC_AVR_REG_EIND :
159
+ CHECK_REG_TYPE (uint8_t );
159
160
SET_BYTE (env -> eind , 2 , * (uint8_t * )value );
160
161
break ;
161
162
case UC_AVR_REG_SPL :
163
+ CHECK_REG_TYPE (uint8_t );
162
164
SET_BYTE (env -> sp , 0 , * (uint8_t * )value );
163
165
break ;
164
166
case UC_AVR_REG_SPH :
167
+ CHECK_REG_TYPE (uint8_t );
165
168
SET_BYTE (env -> sp , 1 , * (uint8_t * )value );
166
169
break ;
167
170
case UC_AVR_REG_SREG :
171
+ CHECK_REG_TYPE (uint8_t );
168
172
cpu_set_sreg (env , * (uint8_t * )value );
169
173
break ;
170
174
@@ -176,58 +180,27 @@ static void reg_write(CPUAVRState *env, unsigned int regid,
176
180
v = * (uint8_t * )value ;
177
181
r = & env -> r [regid - UC_AVR_REG_R0 ];
178
182
rlen = 1 ;
183
+ CHECK_REG_TYPE (uint8_t );
179
184
}
180
185
else if (regid >= UC_AVR_REG_R0W && regid <= UC_AVR_REG_R30W ) {
181
186
v = * (uint16_t * )value ;
182
187
r = & env -> r [regid - UC_AVR_REG_R0W ];
183
188
rlen = 2 ;
189
+ CHECK_REG_TYPE (uint16_t );
184
190
}
185
191
else if (regid >= UC_AVR_REG_R0D && regid <= UC_AVR_REG_R28D ) {
186
192
v = * (uint32_t * )value ;
187
193
r = & env -> r [regid - UC_AVR_REG_R0D ];
188
194
rlen = 4 ;
195
+ CHECK_REG_TYPE (uint32_t );
189
196
}
190
197
if (r && rlen > 0 ) {
191
198
for (int k = 0 ; k < rlen ; k ++ )
192
199
r [k ] = GET_BYTE (v , k );
193
200
}
194
201
}
195
202
}
196
- }
197
-
198
- int avr_reg_write (struct uc_struct * uc , unsigned int * regs ,
199
- void * const * vals , int count )
200
- {
201
- CPUAVRState * env = & (AVR_CPU (uc -> cpu )-> env );
202
- int i ;
203
-
204
- for (i = 0 ; i < count ; i ++ ) {
205
- unsigned int regid = regs [i ];
206
- void * value = vals [i ];
207
- reg_write (env , regid , value );
208
- if (regid == UC_AVR_REG_PC ) {
209
- // force to quit execution and flush TB
210
- uc -> quit_request = true;
211
- uc_emu_stop (uc );
212
- }
213
- }
214
-
215
- return 0 ;
216
- }
217
-
218
- int avr_context_reg_write (struct uc_context * uc , unsigned int * regs ,
219
- void * const * vals , int count )
220
- {
221
- CPUAVRState * env = (CPUAVRState * )uc -> data ;
222
- int i ;
223
-
224
- for (i = 0 ; i < count ; i ++ ) {
225
- unsigned int regid = regs [i ];
226
- const void * value = vals [i ];
227
- reg_write (env , regid , value );
228
- }
229
-
230
- return 0 ;
203
+ return ret ;
231
204
}
232
205
233
206
static int avr_cpus_init (struct uc_struct * uc , const char * cpu_model )
@@ -286,11 +259,12 @@ static MemoryRegion *avr_memory_map_ptr(struct uc_struct *uc, hwaddr begin, size
286
259
return mr ;
287
260
}
288
261
289
- void avr_uc_init (struct uc_struct * uc )
262
+ DEFAULT_VISIBILITY
263
+ void uc_init (struct uc_struct * uc )
290
264
{
291
- uc -> reg_read = avr_reg_read ;
292
- uc -> reg_write = avr_reg_write ;
293
- uc -> reg_reset = avr_reg_reset ;
265
+ uc -> reg_read = reg_read ;
266
+ uc -> reg_write = reg_write ;
267
+ uc -> reg_reset = reg_reset ;
294
268
uc -> set_pc = avr_set_pc ;
295
269
uc -> get_pc = avr_get_pc ;
296
270
uc -> cpus_init = avr_cpus_init ;
0 commit comments