Overview   API Reference  

memory_image.hpp

00001 #if !defined(__MEMORY_IMAGE_HPP__)
00002 #define __MEMORY_IMAGE_HPP__
00003 
00004 //
00005 // local includes
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     // constructor & destructor
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     // medium functions
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 // ***** end of source ***** //
00068 

L4vmm Reference Manual, written by Mario Schwalbe  © 2006-2008