* Turned the kernel platform support from a library into an object.

* Moved the Open Firmware function platform_get_next_device() from
  the boot loader into the kernel (renamed to of_get_next_device()).



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16101 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2006-01-26 15:06:59 +00:00
parent f970e0066a
commit f602da2b72
10 changed files with 127 additions and 117 deletions
@@ -0,0 +1,22 @@
/*
* Copyright 2005-2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef _KERNEL_OPEN_FIRMWARE_DEVICES_H
#define _KERNEL_OPEN_FIRMWARE_DEVICES_H
#include <SupportDefs.h>
#ifdef __cplusplus
extern "C" {
#endif
status_t of_get_next_device(int *_cookie, int root, const char *type,
char *path, size_t pathSize);
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* _KERNEL_OPEN_FIRMWARE_DEVICES_H */
@@ -17,6 +17,7 @@ KernelMergeObject boot_platform_openfirmware.o :
video.cpp
openfirmware.c
openfirmware_devices.cpp
# generic
text_menu.cpp
@@ -26,7 +27,7 @@ KernelMergeObject boot_platform_openfirmware.o :
SEARCH on [ FGristFiles text_menu.cpp ]
= [ FDirName $(HAIKU_TOP) src system boot platform generic ] ;
SEARCH on [ FGristFiles openfirmware.c ]
SEARCH on [ FGristFiles openfirmware.c openfirmware_devices.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel platform openfirmware ] ;
SubInclude HAIKU_TOP src system boot platform openfirmware arch ;
@@ -12,10 +12,9 @@
#include <boot/kernel_args.h>
#include <boot/stage2.h>
#include <kernel.h>
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include "devices.h"
#define TRACE_CPU
#ifdef TRACE_CPU
# define TRACE(x) dprintf x
@@ -37,7 +36,7 @@ boot_arch_cpu_init(void)
char cpuPath[256];
int cookie = 0;
int cpuCount = 0;
while (platform_get_next_device(&cookie, cpus, "cpu", cpuPath,
while (of_get_next_device(&cookie, cpus, "cpu", cpuPath,
sizeof(cpuPath)) == B_OK) {
TRACE(("found CPU: %s\n", cpuPath));
@@ -3,7 +3,6 @@
* Distributed under the terms of the MIT License.
*/
#include "devices.h"
#include "Handle.h"
#include "machine.h"
@@ -13,6 +12,7 @@
#include <boot/stage2.h>
#include <boot/net/NetStack.h>
#include <boot/net/RemoteDisk.h>
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include <util/kernel_cpp.h>
@@ -22,88 +22,6 @@
char sBootPath[192];
/** Gets all device types of the specified type by doing a
* depth-first search of the OpenFirmware device tree.
* If a root != 0 is given, the function only traverses the subtree spanned
* by the root (inclusively). Otherwise the whole device tree is searched.
*
* The cookie has to be initialized to zero.
*/
status_t
platform_get_next_device(int *_cookie, int root, const char *type, char *path,
size_t pathSize)
{
int node = *_cookie;
while (true) {
int next;
if (node == 0) {
// node is NULL, meaning that this is the initial function call.
// If a root was supplied, we take that, otherwise the device tree
// root.
if (root != 0)
node = root;
else
node = of_peer(0);
if (node == OF_FAILED)
return B_ERROR;
if (node == 0)
return B_ENTRY_NOT_FOUND;
// We want to visit the root first.
next = node;
} else
next = of_child(node);
if (next == OF_FAILED)
return B_ERROR;
if (next == 0) {
// no child node found
next = of_peer(node);
if (next == OF_FAILED)
return B_ERROR;
while (next == 0) {
// no peer node found, we are using the device
// tree itself as our search stack
next = of_parent(node);
if (next == OF_FAILED)
return B_ERROR;
if (next == root || next == 0) {
// We have searched the whole device tree
return B_ENTRY_NOT_FOUND;
}
// look into the next tree
node = next;
next = of_peer(node);
}
}
*_cookie = node = next;
char nodeType[16];
int length;
if (of_getprop(node, "device_type", nodeType, sizeof(nodeType)) == OF_FAILED
|| strcmp(nodeType, type)
|| (length = of_package_to_path(node, path, pathSize - 1)) == OF_FAILED)
continue;
path[length] = '\0';
return B_OK;
}
}
// #pragma mark -
status_t
platform_get_boot_device(struct stage2_args *args, Node **_device)
{
@@ -229,7 +147,7 @@ platform_add_block_devices(stage2_args *args, NodeList *devicesList)
int cookie = 0;
char path[256];
status_t status;
while ((status = platform_get_next_device(&cookie, 0, "block", path,
while ((status = of_get_next_device(&cookie, 0, "block", path,
sizeof(path))) == B_OK) {
if (!strcmp(path, sBootPath)) {
// don't add the boot device twice
@@ -1,22 +0,0 @@
/*
* Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef OPENFIRMWARE_DEVICES_H
#define OPENFIRMWARE_DEVICES_H
#include <SupportDefs.h>
#ifdef __cplusplus
extern "C" {
#endif
status_t platform_get_next_device(int *_cookie, int root, const char *type,
char *path, size_t pathSize);
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* OPENFIRMWARE_DEVICES_H */
@@ -9,16 +9,15 @@
#include <boot/kernel_args.h>
#include <boot/stage2.h>
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include "devices.h"
status_t
init_real_time_clock(void)
{
// find RTC
int rtcCookie = 0;
if (platform_get_next_device(&rtcCookie, 0, "rtc",
if (of_get_next_device(&rtcCookie, 0, "rtc",
gKernelArgs.platform_args.rtc_path,
sizeof(gKernelArgs.platform_args.rtc_path)) != B_OK) {
printf("init_real_time_clock(): Found no RTC device!");
+2 -2
View File
@@ -63,7 +63,7 @@ KernelLd kernel_$(TARGET_ARCH) :
kernel_debug.o
lib$(TARGET_ARCH).a
lib$(TARGET_BOOT_PLATFORM).a
kernel_platform_$(TARGET_BOOT_PLATFORM).o
linkhack.so
@@ -92,7 +92,7 @@ KernelLd kernel.so :
kernel_debug.o
lib$(TARGET_ARCH).a
lib$(TARGET_BOOT_PLATFORM).a
kernel_platform_$(TARGET_BOOT_PLATFORM).o
linkhack.so
+1 -1
View File
@@ -3,6 +3,6 @@ SubDir HAIKU_TOP src system kernel platform bios_ia32 ;
SubDirCcFlags $(TARGET_KERNEL_PIC_CCFLAGS) ;
SubDirC++Flags $(TARGET_KERNEL_PIC_CCFLAGS) ;
KernelStaticLibrary libbios_ia32.a :
KernelMergeObject kernel_platform_bios_ia32.o :
platform.cpp
;
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src system kernel platform openfirmware ;
SubDirCcFlags $(TARGET_KERNEL_PIC_CCFLAGS) ;
SubDirC++Flags $(TARGET_KERNEL_PIC_CCFLAGS) ;
KernelStaticLibrary libopenfirmware.a :
KernelMergeObject kernel_platform_openfirmware.o :
openfirmware.c
openfirmware_devices.cpp
;
@@ -0,0 +1,92 @@
/*
* Copyright 2003-2005, Axel Dörfler, [email protected]. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h>
#include <util/kernel_cpp.h>
#include <string.h>
/** Gets all device types of the specified type by doing a
* depth-first search of the OpenFirmware device tree.
* If a root != 0 is given, the function only traverses the subtree spanned
* by the root (inclusively). Otherwise the whole device tree is searched.
*
* The cookie has to be initialized to zero.
*/
status_t
of_get_next_device(int *_cookie, int root, const char *type, char *path,
size_t pathSize)
{
int node = *_cookie;
while (true) {
int next;
if (node == 0) {
// node is NULL, meaning that this is the initial function call.
// If a root was supplied, we take that, otherwise the device tree
// root.
if (root != 0)
node = root;
else
node = of_peer(0);
if (node == OF_FAILED)
return B_ERROR;
if (node == 0)
return B_ENTRY_NOT_FOUND;
// We want to visit the root first.
next = node;
} else
next = of_child(node);
if (next == OF_FAILED)
return B_ERROR;
if (next == 0) {
// no child node found
next = of_peer(node);
if (next == OF_FAILED)
return B_ERROR;
while (next == 0) {
// no peer node found, we are using the device
// tree itself as our search stack
next = of_parent(node);
if (next == OF_FAILED)
return B_ERROR;
if (next == root || next == 0) {
// We have searched the whole device tree
return B_ENTRY_NOT_FOUND;
}
// look into the next tree
node = next;
next = of_peer(node);
}
}
*_cookie = node = next;
char nodeType[16];
int length;
if (of_getprop(node, "device_type", nodeType, sizeof(nodeType))
== OF_FAILED
|| strcmp(nodeType, type)
|| (length = of_package_to_path(node, path, pathSize - 1))
== OF_FAILED) {
continue;
}
path[length] = '\0';
return B_OK;
}
}