00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __segment_h
00009 #define __segment_h
00010
00011 #include <system/config.h>
00012 #include <mmu.h>
00013
00014 __BEGIN_SYS
00015
00016 class Segment
00017 {
00018 private:
00019 typedef Traits<Segment> Traits;
00020 static const Type_Id TYPE = Type<Segment>::TYPE;
00021
00022 typedef MMU::Chunk Chunk;
00023 typedef MMU::Flags Flags;
00024 typedef CPU::Phy_Addr Phy_Addr;
00025
00026 public:
00027 Segment(unsigned int bytes, Flags flags = Flags::APP)
00028 : _chunk(bytes, flags)
00029 {
00030 db<Segment>(TRC) << "Segment(bytes=" << bytes
00031 << ",flags=" << flags << ")\n";
00032 }
00033 Segment(Phy_Addr phy_addr, unsigned int bytes, Flags flags = Flags::APP)
00034 : _chunk(phy_addr, bytes, flags | Flags::IO)
00035
00036
00037 {
00038 db<Segment>(TRC) << "Segment(bytes=" << bytes
00039 << ",phy_addr=" << phy_addr
00040 << ",flags=" << flags << ")\n";
00041 }
00042 ~Segment() {
00043 db<Segment>(TRC) << "~Segment()\n";
00044 }
00045
00046 unsigned int size() const { return _chunk.size(); }
00047 Phy_Addr phy_address() const { return _chunk.phy_address(); }
00048
00049 int resize(int amount) { return _chunk.resize(amount); }
00050
00051 const Chunk & chunk() const { return _chunk; }
00052
00053 static int init(System_Info * si);
00054
00055 private:
00056 Chunk _chunk;
00057 };
00058
00059 __END_SYS
00060
00061 #endif
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071