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()
38 mList.push_back(range);
42 bool kernel::io_port_manager::allocate(io_port
& ioport
,
43 libarch::ioport_t port
,
47 if (range.size == 0)return false;
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;
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;
83 void kernel::io_port_manager::free(io_port
& port
)
88 std::vector<io_port_range>::iterator end = mList.end();
89 std::vector<io_port_range>::iterator i = mList.begin();
91 if (range.port == ((*i).port + (*i).size))
93 (*i).size += range.size;
97 std::vector<io_port_range>::iterator i2 = mList.begin();
99 if ((*i2).port == (range.port + range.size))
103 (*i2).port = range.port;
104 (*i2).size += range.size;
108 (*i).size += (*i2).size;
116 mList.push_back(range);