1d305ab35SAxel Dörfler/*
26328832fSAxel Dörfler * Copyright 2005-2008, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3d305ab35SAxel Dörfler * Distributed under the terms of the MIT License.
4d305ab35SAxel Dörfler */
5d305ab35SAxel Dörfler
6d305ab35SAxel Dörfler
7d305ab35SAxel Dörfler#include <boot_item.h>
8d305ab35SAxel Dörfler#include <util/DoublyLinkedList.h>
9d305ab35SAxel Dörfler#include <util/kernel_cpp.h>
10d305ab35SAxel Dörfler
11d305ab35SAxel Dörfler#include <string.h>
12d305ab35SAxel Dörfler
13d305ab35SAxel Dörfler
14d305ab35SAxel Dörfler// ToDo: the boot items are not supposed to be changed after kernel startup
15d305ab35SAxel Dörfler//		so no locking is done. So for now, we need to be careful with adding
16d305ab35SAxel Dörfler//		new items.
17d305ab35SAxel Dörfler
18d305ab35SAxel Dörflerstruct boot_item : public DoublyLinkedListLinkImpl<boot_item> {
19d305ab35SAxel Dörfler	const char	*name;
20d305ab35SAxel Dörfler	void		*data;
21d305ab35SAxel Dörfler	size_t		size;
22d305ab35SAxel Dörfler};
23d305ab35SAxel Dörfler
24d305ab35SAxel Dörflertypedef DoublyLinkedList<boot_item> ItemList;
25d305ab35SAxel Dörfler
26d305ab35SAxel Dörfler
27d305ab35SAxel Dörflerstatic ItemList sItemList;
28d305ab35SAxel Dörfler
29d305ab35SAxel Dörfler
30d305ab35SAxel Dörflerstatus_t
31d305ab35SAxel Dörfleradd_boot_item(const char *name, void *data, size_t size)
32d305ab35SAxel Dörfler{
3382029bdaSMarcus Overhagen	boot_item *item = new(nothrow) boot_item;
34d305ab35SAxel Dörfler	if (item == NULL)
35d305ab35SAxel Dörfler		return B_NO_MEMORY;
36d305ab35SAxel Dörfler
37d305ab35SAxel Dörfler	item->name = name;
38d305ab35SAxel Dörfler	item->data = data;
39d305ab35SAxel Dörfler	item->size = size;
40d305ab35SAxel Dörfler
41d305ab35SAxel Dörfler	sItemList.Add(item);
42d305ab35SAxel Dörfler	return B_OK;
43d305ab35SAxel Dörfler}
44d305ab35SAxel Dörfler
45d305ab35SAxel Dörfler
46d305ab35SAxel Dörflervoid *
476328832fSAxel Dörflerget_boot_item(const char *name, size_t *_size)
48d305ab35SAxel Dörfler{
49d305ab35SAxel Dörfler	if (name == NULL || name[0] == '\0')
50d305ab35SAxel Dörfler		return NULL;
51d305ab35SAxel Dörfler
52d305ab35SAxel Dörfler	// search item
53d305ab35SAxel Dörfler	for (ItemList::Iterator it = sItemList.GetIterator(); it.HasNext();) {
54d305ab35SAxel Dörfler		boot_item *item = it.Next();
55d305ab35SAxel Dörfler
566328832fSAxel Dörfler		if (!strcmp(name, item->name)) {
576328832fSAxel Dörfler			if (_size != NULL)
586328832fSAxel Dörfler				*_size = item->size;
596328832fSAxel Dörfler
60d305ab35SAxel Dörfler			return item->data;
616328832fSAxel Dörfler		}
62d305ab35SAxel Dörfler	}
63d305ab35SAxel Dörfler
64d305ab35SAxel Dörfler	return NULL;
65d305ab35SAxel Dörfler}
66d305ab35SAxel Dörfler
67a69e0ac3SAxel Dörfler
68a69e0ac3SAxel Dörflerstatus_t
69a69e0ac3SAxel Dörflerboot_item_init(void)
70a69e0ac3SAxel Dörfler{
71a69e0ac3SAxel Dörfler	new(&sItemList) ItemList;
72a69e0ac3SAxel Dörfler		// static initializers do not work in the kernel,
73a69e0ac3SAxel Dörfler		// so we have to do it here, manually
74a69e0ac3SAxel Dörfler
75a69e0ac3SAxel Dörfler	return B_OK;
76a69e0ac3SAxel Dörfler}