34 |
|
|
35 |
#define DEBUG_ACCESS 0 |
#define DEBUG_ACCESS 0 |
36 |
|
|
37 |
|
#define ROMMON_SET_VAR 0x01 |
38 |
|
#define ROMMON_GET_VAR 0x02 |
39 |
|
#define ROMMON_CLEAR_VAR_STAT 0x03 |
40 |
|
|
41 |
/* Remote control private data */ |
/* Remote control private data */ |
42 |
struct remote_data { |
struct remote_data { |
43 |
vm_obj_t vm_obj; |
vm_obj_t vm_obj; |
44 |
struct vdevice dev; |
struct vdevice dev; |
45 |
|
|
46 |
char buffer[512]; |
/* Console buffer */ |
47 |
u_int buf_pos; |
char con_buffer[512]; |
48 |
|
u_int con_buf_pos; |
49 |
|
|
50 |
|
/* ROMMON variables buffer */ |
51 |
|
char var_buffer[512]; |
52 |
|
u_int var_buf_pos; |
53 |
|
u_int var_status; |
54 |
|
|
55 |
|
/* Position for cookie reading */ |
56 |
u_int cookie_pos; |
u_int cookie_pos; |
57 |
}; |
}; |
58 |
|
|
166 |
case 0x038: |
case 0x038: |
167 |
if (op_type == MTS_WRITE) { |
if (op_type == MTS_WRITE) { |
168 |
len = physmem_strlen(vm,*data); |
len = physmem_strlen(vm,*data); |
169 |
if (len < sizeof(d->buffer)) { |
if (len < sizeof(d->con_buffer)) { |
170 |
physmem_copy_from_vm(vm,d->buffer,*data,len+1); |
physmem_copy_from_vm(vm,d->con_buffer,*data,len+1); |
171 |
vm_log(vm,"ROM",d->buffer); |
vm_log(vm,"ROM",d->con_buffer); |
172 |
} |
} |
173 |
} |
} |
174 |
break; |
break; |
175 |
|
|
176 |
/* Buffering */ |
/* Console Buffering */ |
177 |
case 0x03c: |
case 0x03c: |
178 |
if (d->buf_pos < (sizeof(d->buffer)-1)) { |
if (op_type == MTS_WRITE) { |
179 |
d->buffer[d->buf_pos++] = *data & 0xFF; |
if (d->con_buf_pos < (sizeof(d->con_buffer)-1)) { |
180 |
d->buffer[d->buf_pos] = 0; |
d->con_buffer[d->con_buf_pos++] = *data & 0xFF; |
181 |
|
d->con_buffer[d->con_buf_pos] = 0; |
182 |
if (d->buffer[d->buf_pos-1] == '\n') { |
|
183 |
vm_log(vm,"ROM","%s",d->buffer); |
if (d->con_buffer[d->con_buf_pos-1] == '\n') { |
184 |
d->buf_pos = 0; |
vm_log(vm,"ROM","%s",d->con_buffer); |
185 |
} |
d->con_buf_pos = 0; |
186 |
} else |
} |
187 |
d->buf_pos = 0; |
} else |
188 |
|
d->con_buf_pos = 0; |
189 |
|
} |
190 |
break; |
break; |
191 |
|
|
192 |
/* Console output */ |
/* Console output */ |
211 |
|
|
212 |
/* IO memory size for Smart-Init (C3600, others ?) */ |
/* IO memory size for Smart-Init (C3600, others ?) */ |
213 |
case 0x048: |
case 0x048: |
214 |
if (op_type == MTS_READ) { |
if (op_type == MTS_READ) |
215 |
switch(vm->type) { |
*data = vm->nm_iomem_size; |
|
case VM_TYPE_C3600: |
|
|
*data = VM_C3600(vm)->nm_iomem_size; |
|
|
break; |
|
|
case VM_TYPE_C2691: |
|
|
*data = VM_C2691(vm)->nm_iomem_size; |
|
|
break; |
|
|
case VM_TYPE_C3725: |
|
|
*data = VM_C3725(vm)->nm_iomem_size; |
|
|
break; |
|
|
case VM_TYPE_C3745: |
|
|
*data = VM_C3745(vm)->nm_iomem_size; |
|
|
break; |
|
|
case VM_TYPE_C2600: |
|
|
*data = VM_C2600(vm)->nm_iomem_size; |
|
|
break; |
|
|
default: |
|
|
*data = 0; |
|
|
} |
|
|
} |
|
216 |
break; |
break; |
217 |
|
|
218 |
/* Cookie position selector */ |
/* Cookie position selector */ |
228 |
if ((op_type == MTS_READ) && (d->cookie_pos < 64)) |
if ((op_type == MTS_READ) && (d->cookie_pos < 64)) |
229 |
*data = vm->chassis_cookie[d->cookie_pos]; |
*data = vm->chassis_cookie[d->cookie_pos]; |
230 |
break; |
break; |
231 |
|
|
232 |
|
/* ROMMON variable */ |
233 |
|
case 0x054: |
234 |
|
if (op_type == MTS_WRITE) { |
235 |
|
if (d->var_buf_pos < (sizeof(d->var_buffer)-1)) { |
236 |
|
d->var_buffer[d->var_buf_pos++] = *data & 0xFF; |
237 |
|
d->var_buffer[d->var_buf_pos] = 0; |
238 |
|
} else |
239 |
|
d->var_buf_pos = 0; |
240 |
|
} else { |
241 |
|
if (d->var_buf_pos < (sizeof(d->var_buffer)-1)) { |
242 |
|
*data = d->var_buffer[d->var_buf_pos++]; |
243 |
|
} else { |
244 |
|
d->var_buf_pos = 0; |
245 |
|
*data = 0; |
246 |
|
} |
247 |
|
} |
248 |
|
break; |
249 |
|
|
250 |
|
/* ROMMON variable command */ |
251 |
|
case 0x058: |
252 |
|
if (op_type == MTS_WRITE) { |
253 |
|
switch(*data & 0xFF) { |
254 |
|
case ROMMON_SET_VAR: |
255 |
|
d->var_status = rommon_var_add_str(&vm->rommon_vars, |
256 |
|
d->var_buffer); |
257 |
|
d->var_buf_pos = 0; |
258 |
|
break; |
259 |
|
case ROMMON_GET_VAR: |
260 |
|
d->var_status = rommon_var_get(&vm->rommon_vars, |
261 |
|
d->var_buffer, |
262 |
|
d->var_buffer, |
263 |
|
sizeof(d->var_buffer)); |
264 |
|
d->var_buf_pos = 0; |
265 |
|
break; |
266 |
|
case ROMMON_CLEAR_VAR_STAT: |
267 |
|
d->var_buf_pos = 0; |
268 |
|
break; |
269 |
|
default: |
270 |
|
d->var_status = -1; |
271 |
|
} |
272 |
|
} else { |
273 |
|
*data = d->var_status; |
274 |
|
} |
275 |
|
break; |
276 |
} |
} |
277 |
|
|
278 |
return NULL; |
return NULL; |