/[dynamips]/trunk/dev_remote.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/dev_remote.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

upstream/dynamips-0.2.7/dev_remote.c revision 10 by dpavlin, Sat Oct 6 16:29:14 2007 UTC upstream/dynamips-0.2.8-RC1/dev_remote.c revision 11 by dpavlin, Sat Oct 6 16:33:40 2007 UTC
# Line 34  Line 34 
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    
# Line 155  void *dev_remote_control_access(cpu_gen_ Line 166  void *dev_remote_control_access(cpu_gen_
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 */
# Line 198  void *dev_remote_control_access(cpu_gen_ Line 211  void *dev_remote_control_access(cpu_gen_
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 */
# Line 234  void *dev_remote_control_access(cpu_gen_ Line 228  void *dev_remote_control_access(cpu_gen_
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;

Legend:
Removed from v.10  
changed lines
  Added in v.11

  ViewVC Help
Powered by ViewVC 1.1.26