- kdevelop3 project files
[lightOS.git] / kernel / io_port_manager.cpp
blobe3716c0d67b0c4583bbff723b6d7dca83972a883
1 /*
2 lightOS kernel
3 Copyright (C) 2008-2009 Jörg Pfähler
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <kernel/log.hpp>
20 #include <kernel/io_port_manager.hpp>
22 SINGLETON_INSTANCE(kernel::io_port_manager);
24 kernel::io_port_manager::io_port_manager()
28 kernel::io_port_manager::~io_port_manager()
32 void kernel::io_port_manager::init()
35 io_port_range range;
36 range.port = 0x0000;
37 range.size = 0x10000;
38 mList.push_back(range);
42 bool kernel::io_port_manager::allocate(io_port& ioport,
43 libarch::ioport_t port,
44 size_t size)
47 if (range.size == 0)return false;
49 LOCK(mLock);
51 std::vector<io_port_range>::iterator end = mList.end();
52 for (std::vector<io_port_range>::iterator i = mList.begin();i != end;i++)
53 if ((*i).port <= range.port &&
54 ((*i).port + (*i).size) >= (range.port + range.size))
56 if ((*i).port == range.port)
58 (*i).port += range.size;
59 (*i).size -= range.size;
61 else if (((*i).port + (*i).size) == (range.port + range.size))
63 (*i).size -= range.size;
65 else
67 io_port_range range2;
68 range2.port = range.port + range.size;
69 range2.size = ((*i).port + (*i).size) - range2.port;
70 mList.push_back(range2);
71 (*i).size = range.port - (*i).port;
73 UNLOCK(mLock);
74 return true;
77 UNLOCK(mLock);
80 return false;
83 void kernel::io_port_manager::free(io_port& port)
86 LOCK(mLock);
88 std::vector<io_port_range>::iterator end = mList.end();
89 std::vector<io_port_range>::iterator i = mList.begin();
90 for (;i != end;i++)
91 if (range.port == ((*i).port + (*i).size))
93 (*i).size += range.size;
94 break;
97 std::vector<io_port_range>::iterator i2 = mList.begin();
98 for (;i2 != end;i2++)
99 if ((*i2).port == (range.port + range.size))
101 if (i == end)
103 (*i2).port = range.port;
104 (*i2).size += range.size;
106 else
108 (*i).size += (*i2).size;
109 mList.erase(i2);
111 UNLOCK(mLock);
112 return;
115 if (i == end)
116 mList.push_back(range);
118 UNLOCK(mLock);