memory_image.hpp
00001 #if !defined(__MEMORY_IMAGE_HPP__)
00002 #define __MEMORY_IMAGE_HPP__
00003
00004
00005
00006
00007 #include "block_driver_base.hpp"
00008
00012 struct memory_image : public block_driver_base, private noncopyable
00013 {
00014 protected:
00015 const l4_sector_t size;
00016 uint8_t * const data;
00017
00018 public:
00019
00020
00021
00022 inline memory_image(l4_sector_t size=MIN_SECTOR_NUMBER, const state_flags flags=0)
00023 : block_driver_base(L4VMM_DRIVER" memory image", flags),
00024 size((size < MIN_SECTOR_NUMBER) ? MIN_SECTOR_NUMBER : size),
00025 data(new uint8_t[this->size * SECTOR_SIZE])
00026 {
00027 if (data) memset(data, 0, this->size * SECTOR_SIZE);
00028 else log::error("%s:\n cannot allocate memory for "l4_sector_fmt" sectors\n",
00029 name(), size);
00030
00031 this->flags.clear(FLUSHABLE);
00032 this->flags.set(READY, data != nullptr);
00033 }
00034
00035 virtual inline ~memory_image(void)
00036 {
00037 delete[] data;
00038 }
00039
00040
00041
00042
00043 virtual inline l4_sector_t sectors(void) const
00044 {
00045 return is(READY) ? size : 0;
00046 }
00047
00048 virtual inline int read_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00049 {
00050 if (!is(READY)) return -L4_ENOTAVAIL;
00051 if (sector+number > size) return -L4_EINVAL;
00052 memcpy(buffer, data + sector * SECTOR_SIZE, number * SECTOR_SIZE);
00053 return 0;
00054 }
00055
00056 virtual inline int write_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00057 {
00058 if (!is(READY)) return -L4_ENOTAVAIL;
00059 if (sector+number > size) return -L4_EINVAL;
00060 memcpy(data + sector * SECTOR_SIZE, buffer, number * SECTOR_SIZE);
00061 return 0;
00062 }
00063 };
00064
00065 #endif
00066
00067
00068