You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ramdisk.c 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <gpxe/blockdev.h>
  19. #include <gpxe/ramdisk.h>
  20. /**
  21. * @file
  22. *
  23. * RAM disks
  24. *
  25. */
  26. static inline __attribute__ (( always_inline )) struct ramdisk *
  27. block_to_ramdisk ( struct block_device *blockdev ) {
  28. return container_of ( blockdev, struct ramdisk, blockdev );
  29. }
  30. /**
  31. * Read block
  32. *
  33. * @v blockdev Block device
  34. * @v block Block number
  35. * @v count Block count
  36. * @v buffer Data buffer
  37. * @ret rc Return status code
  38. */
  39. static int ramdisk_read ( struct block_device *blockdev, uint64_t block,
  40. unsigned long count, userptr_t buffer ) {
  41. struct ramdisk *ramdisk = block_to_ramdisk ( blockdev );
  42. unsigned long offset = ( block * blockdev->blksize );
  43. unsigned long length = ( count * blockdev->blksize );
  44. DBGC ( ramdisk, "RAMDISK %p reading [%lx,%lx)\n",
  45. ramdisk, offset, length );
  46. memcpy_user ( buffer, 0, ramdisk->data, offset, length );
  47. return 0;
  48. }
  49. /**
  50. * Write block
  51. *
  52. * @v blockdev Block device
  53. * @v block Block number
  54. * @v count Block count
  55. * @v buffer Data buffer
  56. * @ret rc Return status code
  57. */
  58. static int ramdisk_write ( struct block_device *blockdev, uint64_t block,
  59. unsigned long count, userptr_t buffer ) {
  60. struct ramdisk *ramdisk = block_to_ramdisk ( blockdev );
  61. unsigned long offset = ( block * blockdev->blksize );
  62. unsigned long length = ( count * blockdev->blksize );
  63. DBGC ( ramdisk, "RAMDISK %p writing [%lx,%lx)\n",
  64. ramdisk, offset, length );
  65. memcpy_user ( ramdisk->data, offset, buffer, 0, length );
  66. return 0;
  67. }
  68. int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
  69. unsigned int blksize ) {
  70. if ( ! blksize )
  71. blksize = 512;
  72. ramdisk->data = data;
  73. ramdisk->blockdev.read = ramdisk_read;
  74. ramdisk->blockdev.write = ramdisk_write;
  75. ramdisk->blockdev.blksize = blksize;
  76. ramdisk->blockdev.blocks = ( len / blksize );
  77. return 0;
  78. }