/[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

Annotation of /trunk/dev_remote.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (hide annotations)
Sat Oct 6 16:26:06 2007 UTC (16 years, 5 months ago) by dpavlin
Original Path: upstream/dynamips-0.2.7-RC3/dev_remote.c
File MIME type: text/plain
File size: 6732 byte(s)
dynamips-0.2.7-RC3

1 dpavlin 1 /*
2 dpavlin 7 * Cisco router simulation platform.
3 dpavlin 1 * Copyright (C) 2006 Christophe Fillot. All rights reserved.
4 dpavlin 7 *
5     * Remote control module.
6 dpavlin 1 */
7    
8     #include <stdio.h>
9     #include <stdlib.h>
10     #include <string.h>
11     #include <stdarg.h>
12     #include <unistd.h>
13     #include <time.h>
14     #include <errno.h>
15     #include <pthread.h>
16     #include <assert.h>
17    
18     #include "utils.h"
19 dpavlin 7 #include "cpu.h"
20     #include "vm.h"
21 dpavlin 1 #include "dynamips.h"
22     #include "memory.h"
23     #include "device.h"
24     #include "net.h"
25     #include "net_io.h"
26     #include "registry.h"
27     #include "ptask.h"
28     #include "dev_c7200.h"
29     #include "dev_c3600.h"
30 dpavlin 4 #include "dev_c2691.h"
31     #include "dev_c3725.h"
32     #include "dev_c3745.h"
33 dpavlin 7 #include "dev_c2600.h"
34 dpavlin 1
35     #define DEBUG_ACCESS 0
36    
37     /* Remote control private data */
38     struct remote_data {
39     vm_obj_t vm_obj;
40     struct vdevice dev;
41    
42     char buffer[512];
43     u_int buf_pos;
44 dpavlin 7
45     u_int cookie_pos;
46 dpavlin 1 };
47    
48     /*
49     * dev_remote_control_access()
50     */
51 dpavlin 7 void *dev_remote_control_access(cpu_gen_t *cpu,struct vdevice *dev,
52 dpavlin 1 m_uint32_t offset,u_int op_size,u_int op_type,
53     m_uint64_t *data)
54     {
55 dpavlin 7 vm_instance_t *vm = cpu->vm;
56 dpavlin 1 struct remote_data *d = dev->priv_data;
57 dpavlin 4 struct vdevice *storage_dev;
58 dpavlin 1 size_t len;
59    
60     if (op_type == MTS_READ)
61     *data = 0;
62    
63     #if DEBUG_ACCESS
64     if (op_type == MTS_READ) {
65 dpavlin 7 cpu_log(cpu,"REMOTE","reading reg 0x%x at pc=0x%llx\n",
66     offset,cpu_get_pc(cpu));
67 dpavlin 1 } else {
68     cpu_log(cpu,"REMOTE","writing reg 0x%x at pc=0x%llx, data=0x%llx\n",
69 dpavlin 7 offset,cpu_get_pc(cpu),*data);
70 dpavlin 1 }
71     #endif
72    
73     switch(offset) {
74     /* ROM Identification tag */
75     case 0x000:
76     if (op_type == MTS_READ)
77     *data = ROM_ID;
78     break;
79    
80     /* CPU ID */
81     case 0x004:
82     if (op_type == MTS_READ)
83     *data = cpu->id;
84     break;
85    
86     /* Display CPU registers */
87     case 0x008:
88     if (op_type == MTS_WRITE)
89 dpavlin 7 cpu->reg_dump(cpu);
90 dpavlin 1 break;
91    
92 dpavlin 7 /* Display CPU memory info */
93 dpavlin 1 case 0x00c:
94     if (op_type == MTS_WRITE)
95 dpavlin 7 cpu->mmu_dump(cpu);
96 dpavlin 1 break;
97    
98     /* Reserved/Unused */
99     case 0x010:
100     break;
101    
102     /* RAM size */
103     case 0x014:
104     if (op_type == MTS_READ)
105 dpavlin 7 *data = vm->ram_size;
106 dpavlin 1 break;
107    
108     /* ROM size */
109     case 0x018:
110     if (op_type == MTS_READ)
111 dpavlin 7 *data = vm->rom_size;
112 dpavlin 1 break;
113    
114     /* NVRAM size */
115     case 0x01c:
116     if (op_type == MTS_READ)
117 dpavlin 7 *data = vm->nvram_size;
118 dpavlin 1 break;
119    
120     /* IOMEM size */
121     case 0x020:
122     if (op_type == MTS_READ)
123 dpavlin 7 *data = vm->iomem_size;
124 dpavlin 1 break;
125    
126     /* Config Register */
127     case 0x024:
128     if (op_type == MTS_READ)
129 dpavlin 7 *data = vm->conf_reg;
130 dpavlin 1 break;
131    
132     /* ELF entry point */
133     case 0x028:
134     if (op_type == MTS_READ)
135 dpavlin 7 *data = vm->ios_entry_point;
136 dpavlin 1 break;
137    
138     /* ELF machine id */
139     case 0x02c:
140     if (op_type == MTS_READ)
141 dpavlin 7 *data = vm->elf_machine_id;
142 dpavlin 1 break;
143    
144     /* Restart IOS Image */
145     case 0x030:
146     /* not implemented */
147     break;
148    
149     /* Stop the virtual machine */
150     case 0x034:
151 dpavlin 7 vm->status = VM_STATUS_SHUTDOWN;
152 dpavlin 1 break;
153    
154     /* Debugging/Log message: /!\ physical address */
155     case 0x038:
156     if (op_type == MTS_WRITE) {
157 dpavlin 7 len = physmem_strlen(vm,*data);
158 dpavlin 1 if (len < sizeof(d->buffer)) {
159 dpavlin 7 physmem_copy_from_vm(vm,d->buffer,*data,len+1);
160     vm_log(vm,"ROM",d->buffer);
161 dpavlin 1 }
162     }
163     break;
164    
165     /* Buffering */
166     case 0x03c:
167     if (d->buf_pos < (sizeof(d->buffer)-1)) {
168     d->buffer[d->buf_pos++] = *data & 0xFF;
169     d->buffer[d->buf_pos] = 0;
170    
171     if (d->buffer[d->buf_pos-1] == '\n') {
172 dpavlin 7 vm_log(vm,"ROM","%s",d->buffer);
173 dpavlin 1 d->buf_pos = 0;
174     }
175     } else
176     d->buf_pos = 0;
177     break;
178    
179     /* Console output */
180     case 0x040:
181     if (op_type == MTS_WRITE)
182 dpavlin 7 vtty_put_char(vm->vtty_con,(char)*data);
183 dpavlin 1 break;
184    
185     /* NVRAM address */
186     case 0x044:
187     if (op_type == MTS_READ) {
188 dpavlin 7 if ((storage_dev = dev_get_by_name(vm,"nvram")))
189 dpavlin 4 *data = storage_dev->phys_addr;
190    
191 dpavlin 7 if ((storage_dev = dev_get_by_name(vm,"ssa")))
192 dpavlin 4 *data = storage_dev->phys_addr;
193 dpavlin 7
194     if (cpu->type == CPU_TYPE_MIPS64)
195     *data += MIPS_KSEG1_BASE;
196 dpavlin 1 }
197     break;
198    
199     /* IO memory size for Smart-Init (C3600, others ?) */
200     case 0x048:
201     if (op_type == MTS_READ) {
202 dpavlin 7 switch(vm->type) {
203 dpavlin 1 case VM_TYPE_C3600:
204 dpavlin 7 *data = VM_C3600(vm)->nm_iomem_size;
205 dpavlin 1 break;
206 dpavlin 4 case VM_TYPE_C2691:
207 dpavlin 7 *data = VM_C2691(vm)->nm_iomem_size;
208 dpavlin 4 break;
209     case VM_TYPE_C3725:
210 dpavlin 7 *data = VM_C3725(vm)->nm_iomem_size;
211 dpavlin 4 break;
212     case VM_TYPE_C3745:
213 dpavlin 7 *data = VM_C3745(vm)->nm_iomem_size;
214 dpavlin 4 break;
215 dpavlin 7 case VM_TYPE_C2600:
216     *data = VM_C2600(vm)->nm_iomem_size;
217     break;
218 dpavlin 1 default:
219     *data = 0;
220     }
221     }
222     break;
223 dpavlin 7
224     /* Cookie position selector */
225     case 0x04c:
226     if (op_type == MTS_READ)
227     *data = d->cookie_pos;
228     else
229     d->cookie_pos = *data;
230     break;
231 dpavlin 1
232 dpavlin 7 /* Cookie data */
233     case 0x050:
234     if ((op_type == MTS_READ) && (d->cookie_pos < 64))
235     *data = vm->chassis_cookie[d->cookie_pos];
236     break;
237 dpavlin 1 }
238    
239     return NULL;
240     }
241    
242     /* Shutdown a remote control device */
243     void dev_remote_control_shutdown(vm_instance_t *vm,struct remote_data *d)
244     {
245     if (d != NULL) {
246     dev_remove(vm,&d->dev);
247     free(d);
248     }
249     }
250    
251     /* remote control device */
252     int dev_remote_control_init(vm_instance_t *vm,m_uint64_t paddr,m_uint32_t len)
253     {
254     struct remote_data *d;
255    
256     if (!(d = malloc(sizeof(*d)))) {
257     fprintf(stderr,"Remote Control: unable to create device.\n");
258     return(-1);
259     }
260    
261     memset(d,0,sizeof(*d));
262    
263     vm_object_init(&d->vm_obj);
264     d->vm_obj.name = "remote_ctrl";
265     d->vm_obj.data = d;
266     d->vm_obj.shutdown = (vm_shutdown_t)dev_remote_control_shutdown;
267    
268     dev_init(&d->dev);
269     d->dev.name = "remote_ctrl";
270     d->dev.phys_addr = paddr;
271     d->dev.phys_len = len;
272     d->dev.handler = dev_remote_control_access;
273     d->dev.priv_data = d;
274    
275     /* Map this device to the VM */
276     vm_bind_device(vm,&d->dev);
277     vm_object_add(vm,&d->vm_obj);
278     return(0);
279     }

  ViewVC Help
Powered by ViewVC 1.1.26