--- upstream/dynamips-0.2.6-RC1/dev_ram.c 2007/10/06 16:03:58 2 +++ upstream/dynamips-0.2.7/dev_ram.c 2007/10/06 16:29:14 10 @@ -1,6 +1,8 @@ /* - * Cisco C7200 (Predator) RAM emulation + * Cisco router simulation platform. * Copyright (c) 2006 Christophe Fillot. All rights reserved. + * + * RAM emulation. */ #include @@ -10,7 +12,8 @@ #include #include -#include "mips64.h" +#include "cpu.h" +#include "vm.h" #include "dynamips.h" #include "memory.h" #include "device.h" @@ -20,6 +23,7 @@ vm_obj_t vm_obj; struct vdevice *dev; char *filename; + int delete_file; }; /* Shutdown a RAM device */ @@ -31,7 +35,7 @@ free(d->dev); /* Remove filename used to virtualize RAM */ - if (d->filename) { + if (d->filename && d->delete_file) { unlink(d->filename); free(d->filename); } @@ -42,7 +46,8 @@ } /* Initialize a RAM zone */ -int dev_ram_init(vm_instance_t *vm,char *name,int use_mmap, +int dev_ram_init(vm_instance_t *vm,char *name,int use_mmap,int delete_file, + char *alternate_name,int sparse, m_uint64_t paddr,m_uint32_t len) { struct ram_data *d; @@ -54,22 +59,70 @@ } memset(d,0,sizeof(*d)); + d->delete_file = delete_file; vm_object_init(&d->vm_obj); d->vm_obj.name = name; d->vm_obj.data = d; d->vm_obj.shutdown = (vm_shutdown_t)dev_ram_shutdown; - if (use_mmap && !(d->filename = vm_build_filename(vm,name))) { - fprintf(stderr,"RAM: unable to create filename.\n"); - goto err_filename; + if (use_mmap) { + if (!alternate_name) + d->filename = vm_build_filename(vm,name); + else + d->filename = strdup(alternate_name); + + if (!d->filename) { + fprintf(stderr,"RAM: unable to create filename.\n"); + goto err_filename; + } } - if (!(d->dev = dev_create_ram(vm,name,d->filename,paddr,len))) { + if (!(d->dev = dev_create_ram(vm,name,sparse,d->filename,paddr,len))) { fprintf(stderr,"RAM: unable to create device.\n"); goto err_dev_create; } + vm_object_add(vm,&d->vm_obj); + return(0); + + err_dev_create: + free(d->filename); + err_filename: + free(d); + return(-1); +} + +/* Initialize a ghosted RAM zone */ +int dev_ram_ghost_init(vm_instance_t *vm,char *name,int sparse,char *filename, + m_uint64_t paddr,m_uint32_t len) +{ + struct ram_data *d; + + /* allocate the private data structure */ + if (!filename || !(d = malloc(sizeof(*d)))) { + fprintf(stderr,"RAM_ghost: unable to create device.\n"); + return(-1); + } + + memset(d,0,sizeof(*d)); + d->delete_file = FALSE; + + if (!(d->filename = strdup(filename))) + goto err_filename; + + vm_object_init(&d->vm_obj); + d->vm_obj.name = name; + d->vm_obj.data = d; + d->vm_obj.shutdown = (vm_shutdown_t)dev_ram_shutdown; + + if (!(d->dev = dev_create_ghost_ram(vm,name,sparse,d->filename, + paddr,len))) + { + fprintf(stderr,"RAM_ghost: unable to create device.\n"); + goto err_dev_create; + } + vm_object_add(vm,&d->vm_obj); return(0);