File indexing completed on 2025-05-11 08:24:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifdef HAVE_CONFIG_H
0015 #include "config.h"
0016 #endif
0017
0018
0019 #if !defined(RTEMS_RAMDISK_TRACE)
0020 #define RTEMS_RAMDISK_TRACE 0
0021 #endif
0022
0023 #include <stdlib.h>
0024 #include <errno.h>
0025 #include <string.h>
0026
0027 #if RTEMS_RAMDISK_TRACE
0028 #include <stdio.h>
0029 #endif
0030
0031 #include <rtems.h>
0032 #include <rtems/ramdisk.h>
0033
0034 #if RTEMS_RAMDISK_TRACE
0035 static void
0036 rtems_ramdisk_printf (const ramdisk *rd, const char *format, ...)
0037 {
0038 if (rd->trace)
0039 {
0040 va_list args;
0041 va_start (args, format);
0042 printf ("ramdisk:");
0043 vprintf (format, args);
0044 printf ("\n");
0045 }
0046 }
0047 #endif
0048
0049 static int
0050 ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
0051 {
0052 uint8_t *from = rd->area;
0053 uint32_t i;
0054 rtems_blkdev_sg_buffer *sg;
0055
0056 #if RTEMS_RAMDISK_TRACE
0057 rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
0058 req->bufs[0].block, req->bufnum);
0059 #endif
0060
0061 for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
0062 {
0063 #if RTEMS_RAMDISK_TRACE
0064 rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
0065 i, sg->block, sg->length, sg->block * rd->block_size,
0066 from + (sg->block * rd->block_size));
0067 #endif
0068 memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
0069 }
0070 rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
0071 return 0;
0072 }
0073
0074 static int
0075 ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
0076 {
0077 uint8_t *to = rd->area;
0078 uint32_t i;
0079 rtems_blkdev_sg_buffer *sg;
0080
0081 #if RTEMS_RAMDISK_TRACE
0082 rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
0083 req->bufs[0].block, req->bufnum);
0084 #endif
0085 for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
0086 {
0087 #if RTEMS_RAMDISK_TRACE
0088 rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
0089 i, sg->block, sg->length, sg->block * rd->block_size,
0090 to + (sg->block * rd->block_size));
0091 #endif
0092 memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
0093 }
0094 rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
0095 return 0;
0096 }
0097
0098 int
0099 ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
0100 {
0101 struct ramdisk *rd = rtems_disk_get_driver_data(dd);
0102
0103 switch (req)
0104 {
0105 case RTEMS_BLKIO_REQUEST:
0106 {
0107 rtems_blkdev_request *r = argp;
0108
0109 switch (r->req)
0110 {
0111 case RTEMS_BLKDEV_REQ_READ:
0112 return ramdisk_read(rd, r);
0113
0114 case RTEMS_BLKDEV_REQ_WRITE:
0115 return ramdisk_write(rd, r);
0116
0117 default:
0118 errno = EINVAL;
0119 return -1;
0120 }
0121 break;
0122 }
0123
0124 case RTEMS_BLKIO_DELETED:
0125 if (rd->free_at_delete_request) {
0126 ramdisk_free(rd);
0127 }
0128 break;
0129
0130 default:
0131 return rtems_blkdev_ioctl (dd, req, argp);
0132 break;
0133 }
0134
0135 errno = EINVAL;
0136 return -1;
0137 }