Overview   API Reference  

windhoek_driver.hpp

00001 #if !defined(__WINDHOEK_DRIVER_HPP__)
00002 #define __WINDHOEK_DRIVER_HPP__
00003 
00004 //
00005 // L4 includes
00006 //
00007 #if L4VMM_BUILD_ENABLE_WINDHOEK
00008     #include <l4/windhoek/types.h>
00009 #else
00010     struct windhoek_device;
00011     struct windhoek_bio;
00012 #endif
00013 
00014 //
00015 // local includes
00016 //
00017 #include "block_driver_base.hpp"
00018 
00032 struct windhoek_driver : public block_driver_base, private noncopyable
00033 {
00034   protected:
00036     const string    disk_name;
00038     l4_threadid_t   server_id;
00040     int             handle;
00042     windhoek_device *device;
00044     l4_sector_t     size;
00046     dataspace control, data;
00048     l4_sector_t     data_size;
00049 
00050   public:
00051     //
00052     // constructor & destructor
00053     //
00054     inline windhoek_driver(const string &disk_name, const state_flags flags=0)
00055         : block_driver_base(string(L4VMM_DRIVER" windhoek disk ") + disk_name, flags),
00056           disk_name(disk_name), server_id(L4_INVALID_ID), handle(-1), device(nullptr), size(0),
00057           // one page should be enough for now
00058           control(disk_name + " control DS", 1 << 12),
00059           // without LBA48 address mode, the disk emulation is limited to 256 sectors (128kB)
00060           data(disk_name + " data DS", 1 << 17),
00061           data_size(data.size / SECTOR_SIZE)
00062     {
00063         if (open_device()) log::error("%s: disabled\n", name());
00064     }
00065 
00066     virtual inline ~windhoek_driver(void)
00067     {
00068         close_device();
00069     }
00070 
00071     //
00072     // block_driver: override medium functions
00073     //
00074     virtual inline l4_sector_t sectors(void) const
00075     {
00076         return is(READY) ? size : 0;
00077     }
00078 
00079     virtual inline int read_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00080     {
00081         return read_write_sectors(1, buffer, sector, number);
00082     }
00083 
00084     virtual inline int write_sectors(uint8_t *buffer, l4_sector_t sector, l4_sector_t number)
00085     {
00086         return read_write_sectors(0, buffer, sector, number);
00087     }
00088 
00089   protected:
00090     static l4_threadid_t get_windhoek_id(void);
00091 
00092     //
00093     // connection management functions
00094     //
00095     virtual int open_device(void);
00096     virtual int close_device(void);
00097 
00098     //
00099     // data transfer functions
00100     //
00101     int transfer_sectors(uint8_t read_write, l4_sector_t sector, l4_sector_t number);
00102     int read_write_sectors(uint8_t read_write, uint8_t *buffer, l4_sector_t sector, l4_sector_t number);
00103 };
00104 
00105 #endif
00106 
00107 // ***** end of source ***** //
00108 

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