windhoek_driver.hpp
00001 #if !defined(__WINDHOEK_DRIVER_HPP__)
00002 #define __WINDHOEK_DRIVER_HPP__
00003
00004
00005
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
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
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
00058 control(disk_name + " control DS", 1 << 12),
00059
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
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
00094
00095 virtual int open_device(void);
00096 virtual int close_device(void);
00097
00098
00099
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
00108