version 1.1.1.1, 2008/06/03 10:38:41 |
version 1.1.1.1.2.1, 2008/08/13 17:12:23 |
|
|
/* #define DEBUG_RAMDISK 1 */ |
/* #define DEBUG_RAMDISK 1 */ |
|
|
#ifdef DEBUG_RAMDISK |
#ifdef DEBUG_RAMDISK |
#define rd_printf(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args) |
#define DPRINTF(a) printf a |
#else |
#else |
#define rd_printf(fmt...) do {} while (0) |
#define DPRINTF(a) |
#endif |
#endif |
|
|
/* Block size */ |
/* Block size */ |
#define BSIZE 512 |
#define BSIZE 512 |
|
|
static int ramdisk_read(device_t dev, char *buf, size_t *nbyte, int blkno); |
static int ramdisk_read(device_t, char *, size_t *, int); |
static int ramdisk_write(device_t dev, char *buf, size_t *nbyte, int blkno); |
static int ramdisk_write(device_t, char *, size_t *, int); |
static int ramdisk_init(void); |
static int ramdisk_init(void); |
|
|
/* |
/* |
|
|
/* init */ ramdisk_init, |
/* init */ ramdisk_init, |
}; |
}; |
|
|
|
/* |
|
* Device I/O table |
|
*/ |
static struct devio ramdisk_io = { |
static struct devio ramdisk_io = { |
/* open */ NULL, |
/* open */ NULL, |
/* close */ NULL, |
/* close */ NULL, |
|
|
void *kbuf; |
void *kbuf; |
size_t nr_read; |
size_t nr_read; |
|
|
rd_printf("read buf=%x nbyte=%d blkno=%x\n", buf, *nbyte, blkno); |
DPRINTF(("ramdisk_read: buf=%x nbyte=%d blkno=%x\n", |
|
buf, *nbyte, blkno)); |
|
|
/* Check overrun */ |
/* Check overrun */ |
if ((size_t)blkno * BSIZE > img_size) { |
if ((size_t)blkno * BSIZE > img_size) { |
rd_printf("Overrun!\n"); |
DPRINTF(("ramdisk_read: overrun!\n")); |
return EIO; |
return EIO; |
} |
} |
nr_read = *nbyte; |
nr_read = *nbyte; |
|
|
return 0; |
return 0; |
} |
} |
|
|
/* |
|
* Data written to this device is discarded. |
|
*/ |
|
static int |
static int |
ramdisk_write(device_t dev, char *buf, size_t *nbyte, int blkno) |
ramdisk_write(device_t dev, char *buf, size_t *nbyte, int blkno) |
{ |
{ |
void *kbuf; |
void *kbuf; |
size_t nr_write; |
size_t nr_write; |
|
|
rd_printf("write buf=%x nbyte=%d blkno=%x\n", buf, *nbyte, blkno); |
DPRINTF(("ramdisk_write: buf=%x nbyte=%d blkno=%x\n", |
|
buf, *nbyte, blkno)); |
|
|
/* Check overrun */ |
/* Check overrun */ |
if ((size_t)blkno * BSIZE > img_size) |
if ((size_t)blkno * BSIZE > img_size) |
|
|
img_size = rd->size; |
img_size = rd->size; |
if (img_size == 0) |
if (img_size == 0) |
return -1; |
return -1; |
printk("RAM disk at 0x%08x (%dK bytes)\n", img_start, img_size/1024); |
#ifdef DEBUG |
|
printf("RAM disk at 0x%08x (%dK bytes)\n", img_start, img_size/1024); |
|
#endif |
/* Create device object */ |
/* Create device object */ |
ramdisk_dev = device_create(&ramdisk_io, "ram0", DF_BLK); |
ramdisk_dev = device_create(&ramdisk_io, "ram0", DF_BLK); |
ASSERT(ramdisk_dev); |
ASSERT(ramdisk_dev); |