Convert line endings to LF

In r33670 the svn:eol-style property was dropped, which took care of
locally converting the line endings to the user's native style.
While most files use Unix-style LF line endings, some files have
Windows-style CR LF line endings.

Assure that the following r37262 directories use Unix-style line endings:

src/system/boot/
src/system/boot/arch/
src/system/boot/arch/ppc/
src/system/boot/loader/
src/system/boot/loader/net/
src/system/boot/platform/
src/system/boot/platform/openfirmware/
src/system/boot/platform/openfirmware/arch/
src/system/boot/platform/openfirmware/arch/ppc/
src/system/kernel/
src/system/kernel/arch/
src/system/kernel/arch/ppc/
src/system/kernel/platform/
src/system/kernel/platform/openfirmware/
headers/private/kernel/
headers/private/kernel/arch/
headers/private/kernel/arch/ppc/
headers/private/kernel/platform/
headers/private/kernel/platform/openfirmware/
headers/private/kernel/boot/
headers/private/kernel/boot/net/
headers/private/kernel/boot/platform/
headers/private/kernel/boot/platform/openfirmware/

This avoids patches containing irrelevant lines unintentionally converted.

No functional changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37265 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Andreas Färber
2010-06-26 17:38:03 +00:00
parent 5317b5f385
commit 04ec719a70
12 changed files with 1179 additions and 1179 deletions
+79 -79
View File
@@ -1,79 +1,79 @@
/* /*
* Copyright 2008, François Revol <[email protected]>. * Copyright 2008, François Revol <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#ifndef _BOOT_FILE_MAP_DISK_H #ifndef _BOOT_FILE_MAP_DISK_H
#define _BOOT_FILE_MAP_DISK_H #define _BOOT_FILE_MAP_DISK_H
#include <boot/vfs.h> #include <boot/vfs.h>
#include <boot/partitions.h> #include <boot/partitions.h>
#define FMAP_FOLDER_NAME "BEOS" #define FMAP_FOLDER_NAME "BEOS"
#define FMAP_IMAGE_NAME "IMAGE.BE" #define FMAP_IMAGE_NAME "IMAGE.BE"
//#define FMAP_FOLDER_NAME "HAIKU" //#define FMAP_FOLDER_NAME "HAIKU"
//#define FMAP_IMAGE_NAME "IMAGE.BFS" //#define FMAP_IMAGE_NAME "IMAGE.BFS"
#define FMAP_MAX_RUNS 128 #define FMAP_MAX_RUNS 128
struct file_map_run { struct file_map_run {
off_t offset; off_t offset;
off_t block; off_t block;
off_t len; off_t len;
}; };
struct file_map_boot_item { struct file_map_boot_item {
int32 block_size; int32 block_size;
int32 num_runs; int32 num_runs;
struct file_map_run runs[FMAP_MAX_RUNS]; struct file_map_run runs[FMAP_MAX_RUNS];
}; };
#ifdef _BOOT_MODE #ifdef _BOOT_MODE
class FileMap { class FileMap {
public: public:
FileMap(); FileMap();
~FileMap(); ~FileMap();
void AddRun(off_t offset, off_t block, off_t len); void AddRun(off_t offset, off_t block, off_t len);
private: private:
struct file_map_run fRuns[FMAP_MAX_RUNS]; struct file_map_run fRuns[FMAP_MAX_RUNS];
}; };
class FileMapDisk : public Node { class FileMapDisk : public Node {
public: public:
FileMapDisk(); FileMapDisk();
virtual ~FileMapDisk(); virtual ~FileMapDisk();
status_t Init(Node *node/*Partition *partition, FileMap *map, off_t imageSize*/); status_t Init(Node *node/*Partition *partition, FileMap *map, off_t imageSize*/);
virtual status_t Open(void **_cookie, int mode); virtual status_t Open(void **_cookie, int mode);
virtual status_t Close(void *cookie); virtual status_t Close(void *cookie);
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer,
size_t bufferSize); size_t bufferSize);
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer,
size_t bufferSize); size_t bufferSize);
virtual status_t GetName(char *nameBuffer, size_t bufferSize) const; virtual status_t GetName(char *nameBuffer, size_t bufferSize) const;
virtual status_t GetFileMap(struct file_map_run *runs, int32 *count); virtual status_t GetFileMap(struct file_map_run *runs, int32 *count);
virtual off_t Size() const; virtual off_t Size() const;
static FileMapDisk *FindAnyFileMapDisk(Directory *volume); static FileMapDisk *FindAnyFileMapDisk(Directory *volume);
status_t RegisterFileMapBootItem(); status_t RegisterFileMapBootItem();
private: private:
Node *fNode; Node *fNode;
/* /*
Partition *fPartition; Partition *fPartition;
FileMap *fMap; FileMap *fMap;
off_t fImageSize; off_t fImageSize;
*/ */
}; };
#endif // _BOOT_MODE #endif // _BOOT_MODE
#endif // _BOOT_FILE_MAP_DISK_H #endif // _BOOT_FILE_MAP_DISK_H
+28 -28
View File
@@ -1,28 +1,28 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef KERNEL_BOOT_ARCH_H #ifndef KERNEL_BOOT_ARCH_H
#define KERNEL_BOOT_ARCH_H #define KERNEL_BOOT_ARCH_H
#include <SupportDefs.h> #include <SupportDefs.h>
#include <boot/elf.h> #include <boot/elf.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* ELF support */ /* ELF support */
extern status_t boot_arch_elf_relocate_rel(struct preloaded_image *image, extern status_t boot_arch_elf_relocate_rel(struct preloaded_image *image,
struct Elf32_Rel *rel, int rel_len); struct Elf32_Rel *rel, int rel_len);
extern status_t boot_arch_elf_relocate_rela(struct preloaded_image *image, extern status_t boot_arch_elf_relocate_rela(struct preloaded_image *image,
struct Elf32_Rela *rel, int rel_len); struct Elf32_Rela *rel, int rel_len);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* KERNEL_BOOT_ARCH_H */ #endif /* KERNEL_BOOT_ARCH_H */
+54 -54
View File
@@ -1,54 +1,54 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#ifndef _BOOT_REMOTE_DISK_H #ifndef _BOOT_REMOTE_DISK_H
#define _BOOT_REMOTE_DISK_H #define _BOOT_REMOTE_DISK_H
#include <boot/vfs.h> #include <boot/vfs.h>
#include <boot/net/NetDefs.h> #include <boot/net/NetDefs.h>
#include <boot/net/RemoteDiskDefs.h> #include <boot/net/RemoteDiskDefs.h>
class UDPPacket; class UDPPacket;
class UDPSocket; class UDPSocket;
class RemoteDisk : public Node { class RemoteDisk : public Node {
public: public:
RemoteDisk(); RemoteDisk();
~RemoteDisk(); ~RemoteDisk();
status_t Init(ip_addr_t serverAddress, uint16 serverPort, off_t imageSize); status_t Init(ip_addr_t serverAddress, uint16 serverPort, off_t imageSize);
virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer, virtual ssize_t ReadAt(void *cookie, off_t pos, void *buffer,
size_t bufferSize); size_t bufferSize);
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer,
size_t bufferSize); size_t bufferSize);
virtual status_t GetName(char *nameBuffer, size_t bufferSize) const; virtual status_t GetName(char *nameBuffer, size_t bufferSize) const;
virtual off_t Size() const; virtual off_t Size() const;
ip_addr_t ServerIPAddress() const; ip_addr_t ServerIPAddress() const;
uint16 ServerPort() const; uint16 ServerPort() const;
static RemoteDisk *FindAnyRemoteDisk(); static RemoteDisk *FindAnyRemoteDisk();
private: private:
ssize_t _ReadFromPacket(off_t &pos, uint8 *&buffer, size_t &bufferSize); ssize_t _ReadFromPacket(off_t &pos, uint8 *&buffer, size_t &bufferSize);
static status_t _SendRequest(UDPSocket *socket, ip_addr_t serverAddress, static status_t _SendRequest(UDPSocket *socket, ip_addr_t serverAddress,
uint16 serverPort, remote_disk_header *request, size_t size, uint16 serverPort, remote_disk_header *request, size_t size,
uint8 expectedReply, UDPPacket **packet); uint8 expectedReply, UDPPacket **packet);
status_t _SendRequest(remote_disk_header *request, size_t size, status_t _SendRequest(remote_disk_header *request, size_t size,
uint8 expectedReply, UDPPacket **packet); uint8 expectedReply, UDPPacket **packet);
private: private:
ip_addr_t fServerAddress; ip_addr_t fServerAddress;
uint16 fServerPort; uint16 fServerPort;
off_t fImageSize; off_t fImageSize;
uint64 fRequestID; uint64 fRequestID;
UDPSocket *fSocket; UDPSocket *fSocket;
UDPPacket *fPacket; UDPPacket *fPacket;
}; };
#endif // _BOOT_REMOTE_DISK_H #endif // _BOOT_REMOTE_DISK_H
@@ -1,64 +1,64 @@
/* /*
* Copyright 2005-2007, Ingo Weinhold <[email protected]>. * Copyright 2005-2007, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#ifndef _BOOT_REMOTE_DISK_DEFS_H #ifndef _BOOT_REMOTE_DISK_DEFS_H
#define _BOOT_REMOTE_DISK_DEFS_H #define _BOOT_REMOTE_DISK_DEFS_H
#include <inttypes.h> #include <inttypes.h>
enum { enum {
REMOTE_DISK_SERVER_PORT = 8765, REMOTE_DISK_SERVER_PORT = 8765,
REMOTE_DISK_BLOCK_SIZE = 1024, REMOTE_DISK_BLOCK_SIZE = 1024,
}; };
enum { enum {
// requests // requests
REMOTE_DISK_HELLO_REQUEST = 0, REMOTE_DISK_HELLO_REQUEST = 0,
// port: client port // port: client port
REMOTE_DISK_READ_REQUEST = 1, REMOTE_DISK_READ_REQUEST = 1,
// port: client port // port: client port
// offset: byte offset of data to read // offset: byte offset of data to read
// size: number of bytes to read (server might serve more, though) // size: number of bytes to read (server might serve more, though)
REMOTE_DISK_WRITE_REQUEST = 2, REMOTE_DISK_WRITE_REQUEST = 2,
// port: client port // port: client port
// offset: byte offset of data to write // offset: byte offset of data to write
// size: number of bytes to write // size: number of bytes to write
// data: the data // data: the data
// replies // replies
REMOTE_DISK_HELLO_REPLY = 3, REMOTE_DISK_HELLO_REPLY = 3,
// offset: disk size // offset: disk size
REMOTE_DISK_READ_REPLY = 4, // port unused REMOTE_DISK_READ_REPLY = 4, // port unused
// offset: byte offset of read data // offset: byte offset of read data
// size: number of bytes of data read; < 0 => error // size: number of bytes of data read; < 0 => error
// data: read data // data: read data
REMOTE_DISK_WRITE_REPLY = 5, // port, data unused REMOTE_DISK_WRITE_REPLY = 5, // port, data unused
// offset: byte offset of data written // offset: byte offset of data written
// size: number of bytes of data written; < 0 => error // size: number of bytes of data written; < 0 => error
}; };
// errors // errors
enum { enum {
REMOTE_DISK_IO_ERROR = -1, REMOTE_DISK_IO_ERROR = -1,
REMOTE_DISK_BAD_REQUEST = -2, REMOTE_DISK_BAD_REQUEST = -2,
}; };
struct remote_disk_header { struct remote_disk_header {
uint64_t offset; uint64_t offset;
uint64_t request_id; uint64_t request_id;
int16_t size; int16_t size;
uint16_t port; uint16_t port;
uint8_t command; uint8_t command;
uint8_t data[0]; uint8_t data[0];
} __attribute__ ((__packed__)); } __attribute__ ((__packed__));
#endif // _BOOT_REMOTE_DISK_DEFS_H #endif // _BOOT_REMOTE_DISK_DEFS_H
@@ -1,22 +1,22 @@
/* /*
* Copyright 2005-2006, Ingo Weinhold <[email protected]>. * Copyright 2005-2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#ifndef _KERNEL_OPEN_FIRMWARE_DEVICES_H #ifndef _KERNEL_OPEN_FIRMWARE_DEVICES_H
#define _KERNEL_OPEN_FIRMWARE_DEVICES_H #define _KERNEL_OPEN_FIRMWARE_DEVICES_H
#include <SupportDefs.h> #include <SupportDefs.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
status_t of_get_next_device(int *_cookie, int root, const char *type, status_t of_get_next_device(int *_cookie, int root, const char *type,
char *path, size_t pathSize); char *path, size_t pathSize);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif
#endif /* _KERNEL_OPEN_FIRMWARE_DEVICES_H */ #endif /* _KERNEL_OPEN_FIRMWARE_DEVICES_H */
+189 -189
View File
@@ -1,189 +1,189 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include <boot/FileMapDisk.h> #include <boot/FileMapDisk.h>
#include <boot_item.h> #include <boot_item.h>
#include <new> #include <new>
#include <endian.h> #include <endian.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <OS.h> #include <OS.h>
#include <SupportDefs.h> #include <SupportDefs.h>
//#define TRACE_FILEMAPDISK //#define TRACE_FILEMAPDISK
#ifdef TRACE_FILEMAPDISK #ifdef TRACE_FILEMAPDISK
# define TRACE(x) dprintf x # define TRACE(x) dprintf x
#else #else
# define TRACE(x) ; # define TRACE(x) ;
#endif #endif
// constructor // constructor
FileMapDisk::FileMapDisk() FileMapDisk::FileMapDisk()
{ {
} }
// destructor // destructor
FileMapDisk::~FileMapDisk() FileMapDisk::~FileMapDisk()
{ {
} }
// Init // Init
status_t status_t
FileMapDisk::Init(Node *node/*, Partition *partition, FileMap *map, off_t imageSize*/) FileMapDisk::Init(Node *node/*, Partition *partition, FileMap *map, off_t imageSize*/)
{ {
TRACE(("FileMapDisk::FileMapDisk(%p)\n", node)); TRACE(("FileMapDisk::FileMapDisk(%p)\n", node));
fNode = node; fNode = node;
/* /*
fPartition = partition; fPartition = partition;
fMap = map; fMap = map;
fImageSize = imageSize; fImageSize = imageSize;
// create and bind socket // create and bind socket
fSocket = new(nothrow) UDPSocket; fSocket = new(nothrow) UDPSocket;
if (!fSocket) if (!fSocket)
return B_NO_MEMORY; return B_NO_MEMORY;
status_t error = fSocket->Bind(INADDR_ANY, 6666); status_t error = fSocket->Bind(INADDR_ANY, 6666);
if (error != B_OK) if (error != B_OK)
return error; return error;
*/ */
return B_OK; return B_OK;
} }
status_t status_t
FileMapDisk::Open(void **_cookie, int mode) FileMapDisk::Open(void **_cookie, int mode)
{ {
TRACE(("FileMapDisk::Open(, 0x%08x)\n", mode)); TRACE(("FileMapDisk::Open(, 0x%08x)\n", mode));
if (!fNode) if (!fNode)
return B_NO_INIT; return B_NO_INIT;
return fNode->Open(_cookie, mode); return fNode->Open(_cookie, mode);
} }
status_t status_t
FileMapDisk::Close(void *cookie) FileMapDisk::Close(void *cookie)
{ {
TRACE(("FileMapDisk::Close(%p)\n", cookie)); TRACE(("FileMapDisk::Close(%p)\n", cookie));
if (!fNode) if (!fNode)
return B_NO_INIT; return B_NO_INIT;
return fNode->Close(cookie); return fNode->Close(cookie);
} }
// ReadAt // ReadAt
ssize_t ssize_t
FileMapDisk::ReadAt(void *cookie, off_t pos, void *_buffer, FileMapDisk::ReadAt(void *cookie, off_t pos, void *_buffer,
size_t bufferSize) size_t bufferSize)
{ {
TRACE(("FileMapDisk::ReadAt(%p, %lld, , %ld)\n", cookie, pos, bufferSize)); TRACE(("FileMapDisk::ReadAt(%p, %lld, , %ld)\n", cookie, pos, bufferSize));
if (!fNode) if (!fNode)
return B_NO_INIT; return B_NO_INIT;
return fNode->ReadAt(cookie, pos, _buffer, bufferSize); return fNode->ReadAt(cookie, pos, _buffer, bufferSize);
} }
// WriteAt // WriteAt
ssize_t ssize_t
FileMapDisk::WriteAt(void */*cookie*/, off_t pos, const void *buffer, FileMapDisk::WriteAt(void */*cookie*/, off_t pos, const void *buffer,
size_t bufferSize) size_t bufferSize)
{ {
// Not needed in the boot loader. // Not needed in the boot loader.
return B_PERMISSION_DENIED; return B_PERMISSION_DENIED;
} }
// GetName // GetName
status_t status_t
FileMapDisk::GetName(char *nameBuffer, size_t bufferSize) const FileMapDisk::GetName(char *nameBuffer, size_t bufferSize) const
{ {
const char *prefix = "FileMapDisk:"; const char *prefix = "FileMapDisk:";
if (!nameBuffer) if (!nameBuffer)
return B_BAD_VALUE; return B_BAD_VALUE;
snprintf(nameBuffer, bufferSize, prefix); snprintf(nameBuffer, bufferSize, prefix);
if (bufferSize > strlen(prefix) && fNode) if (bufferSize > strlen(prefix) && fNode)
return fNode->GetName(nameBuffer + strlen(prefix), return fNode->GetName(nameBuffer + strlen(prefix),
bufferSize - strlen(prefix)); bufferSize - strlen(prefix));
return B_OK; return B_OK;
} }
status_t status_t
FileMapDisk::GetFileMap(struct file_map_run *runs, int32 *count) FileMapDisk::GetFileMap(struct file_map_run *runs, int32 *count)
{ {
return fNode->GetFileMap(runs, count); return fNode->GetFileMap(runs, count);
} }
off_t off_t
FileMapDisk::Size() const FileMapDisk::Size() const
{ {
if (!fNode) if (!fNode)
return B_NO_INIT; return B_NO_INIT;
return fNode->Size(); return fNode->Size();
} }
FileMapDisk * FileMapDisk *
FileMapDisk::FindAnyFileMapDisk(Directory *volume) FileMapDisk::FindAnyFileMapDisk(Directory *volume)
{ {
TRACE(("FileMapDisk::FindAnyFileMapDisk(%p)\n", volume)); TRACE(("FileMapDisk::FindAnyFileMapDisk(%p)\n", volume));
Node *node; Node *node;
status_t error; status_t error;
if (!volume) if (!volume)
return NULL; return NULL;
//XXX: check lower/mixed case as well //XXX: check lower/mixed case as well
Node *dirnode; Node *dirnode;
Directory *dir; Directory *dir;
dirnode = volume->Lookup(FMAP_FOLDER_NAME, true); dirnode = volume->Lookup(FMAP_FOLDER_NAME, true);
if (!dirnode || !S_ISDIR(dirnode->Type())) if (!dirnode || !S_ISDIR(dirnode->Type()))
return NULL; return NULL;
dir = (Directory *)dirnode; dir = (Directory *)dirnode;
node = dir->Lookup(FMAP_IMAGE_NAME, true); node = dir->Lookup(FMAP_IMAGE_NAME, true);
if (!node) if (!node)
return NULL; return NULL;
// create a FileMapDisk object // create a FileMapDisk object
FileMapDisk *disk = new(nothrow) FileMapDisk; FileMapDisk *disk = new(nothrow) FileMapDisk;
if (disk) { if (disk) {
error = disk->Init(node); error = disk->Init(node);
if (error != B_OK) { if (error != B_OK) {
delete disk; delete disk;
disk = NULL; disk = NULL;
} }
} }
return disk; return disk;
} }
status_t status_t
FileMapDisk::RegisterFileMapBootItem() FileMapDisk::RegisterFileMapBootItem()
{ {
return B_ERROR; return B_ERROR;
struct file_map_boot_item *item; struct file_map_boot_item *item;
item = (struct file_map_boot_item *)malloc(sizeof(struct file_map_boot_item)); item = (struct file_map_boot_item *)malloc(sizeof(struct file_map_boot_item));
item->num_runs = FMAP_MAX_RUNS; item->num_runs = FMAP_MAX_RUNS;
status_t err; status_t err;
err = GetFileMap(item->runs, &item->num_runs); err = GetFileMap(item->runs, &item->num_runs);
if (err < B_OK) if (err < B_OK)
return err; return err;
// err = add_boot_item("file_map_disk", item, sizeof(struct file_map_boot_item)); // err = add_boot_item("file_map_disk", item, sizeof(struct file_map_boot_item));
err = B_ERROR; err = B_ERROR;
return err; return err;
} }
+313 -313
View File
@@ -1,313 +1,313 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include <boot/net/RemoteDisk.h> #include <boot/net/RemoteDisk.h>
#include <new> #include <new>
#include <endian.h> #include <endian.h>
#include <stdio.h> #include <stdio.h>
#include <OS.h> #include <OS.h>
#include <SupportDefs.h> #include <SupportDefs.h>
#include <boot/net/UDP.h> #include <boot/net/UDP.h>
static const bigtime_t kRequestTimeout = 100000LL; static const bigtime_t kRequestTimeout = 100000LL;
#if __BYTE_ORDER == __LITTLE_ENDIAN #if __BYTE_ORDER == __LITTLE_ENDIAN
static inline static inline
uint64_t swap_uint64(uint64_t data) uint64_t swap_uint64(uint64_t data)
{ {
return ((data & 0xff) << 56) return ((data & 0xff) << 56)
| ((data & 0xff00) << 40) | ((data & 0xff00) << 40)
| ((data & 0xff0000) << 24) | ((data & 0xff0000) << 24)
| ((data & 0xff000000) << 8) | ((data & 0xff000000) << 8)
| ((data >> 8) & 0xff000000) | ((data >> 8) & 0xff000000)
| ((data >> 24) & 0xff0000) | ((data >> 24) & 0xff0000)
| ((data >> 40) & 0xff00) | ((data >> 40) & 0xff00)
| ((data >> 56) & 0xff); | ((data >> 56) & 0xff);
} }
#define host_to_net64(data) swap_uint64(data) #define host_to_net64(data) swap_uint64(data)
#define net_to_host64(data) swap_uint64(data) #define net_to_host64(data) swap_uint64(data)
#endif #endif
#if __BYTE_ORDER == __BIG_ENDIAN #if __BYTE_ORDER == __BIG_ENDIAN
#define host_to_net64(data) (data) #define host_to_net64(data) (data)
#define net_to_host64(data) (data) #define net_to_host64(data) (data)
#endif #endif
#undef htonll #undef htonll
#undef ntohll #undef ntohll
#define htonll(data) host_to_net64(data) #define htonll(data) host_to_net64(data)
#define ntohll(data) net_to_host64(data) #define ntohll(data) net_to_host64(data)
// constructor // constructor
RemoteDisk::RemoteDisk() RemoteDisk::RemoteDisk()
: fServerAddress(INADDR_ANY), : fServerAddress(INADDR_ANY),
fServerPort(0), fServerPort(0),
fImageSize(0), fImageSize(0),
fRequestID(0), fRequestID(0),
fSocket(NULL), fSocket(NULL),
fPacket(NULL) fPacket(NULL)
{ {
} }
// destructor // destructor
RemoteDisk::~RemoteDisk() RemoteDisk::~RemoteDisk()
{ {
delete fSocket; delete fSocket;
delete fPacket; delete fPacket;
} }
// Init // Init
status_t status_t
RemoteDisk::Init(ip_addr_t serverAddress, uint16 serverPort, off_t imageSize) RemoteDisk::Init(ip_addr_t serverAddress, uint16 serverPort, off_t imageSize)
{ {
fServerAddress = serverAddress; fServerAddress = serverAddress;
fServerPort = serverPort; fServerPort = serverPort;
fImageSize = imageSize; fImageSize = imageSize;
// create and bind socket // create and bind socket
fSocket = new(nothrow) UDPSocket; fSocket = new(nothrow) UDPSocket;
if (!fSocket) if (!fSocket)
return B_NO_MEMORY; return B_NO_MEMORY;
status_t error = fSocket->Bind(INADDR_ANY, 6666); status_t error = fSocket->Bind(INADDR_ANY, 6666);
if (error != B_OK) if (error != B_OK)
return error; return error;
return B_OK; return B_OK;
} }
// ReadAt // ReadAt
ssize_t ssize_t
RemoteDisk::ReadAt(void */*cookie*/, off_t pos, void *_buffer, RemoteDisk::ReadAt(void */*cookie*/, off_t pos, void *_buffer,
size_t bufferSize) size_t bufferSize)
{ {
if (!fSocket) if (!fSocket)
return B_NO_INIT; return B_NO_INIT;
uint8 *buffer = (uint8*)_buffer; uint8 *buffer = (uint8*)_buffer;
if (!buffer || pos < 0) if (!buffer || pos < 0)
return B_BAD_VALUE; return B_BAD_VALUE;
if (bufferSize == 0) if (bufferSize == 0)
return 0; return 0;
// Check whether the current packet already contains the beginning of the // Check whether the current packet already contains the beginning of the
// data to read. // data to read.
ssize_t bytesRead = _ReadFromPacket(pos, buffer, bufferSize); ssize_t bytesRead = _ReadFromPacket(pos, buffer, bufferSize);
// If there still remains something to be read, we need to get it from the // If there still remains something to be read, we need to get it from the
// server. // server.
status_t error = B_OK; status_t error = B_OK;
while (bufferSize > 0) { while (bufferSize > 0) {
// prepare request // prepare request
remote_disk_header request; remote_disk_header request;
request.offset = htonll(pos); request.offset = htonll(pos);
uint32 toRead = min_c(bufferSize, REMOTE_DISK_BLOCK_SIZE); uint32 toRead = min_c(bufferSize, REMOTE_DISK_BLOCK_SIZE);
request.size = htons(toRead); request.size = htons(toRead);
request.command = REMOTE_DISK_READ_REQUEST; request.command = REMOTE_DISK_READ_REQUEST;
// send request // send request
UDPPacket *packet; UDPPacket *packet;
error = _SendRequest(&request, sizeof(request), REMOTE_DISK_READ_REPLY, error = _SendRequest(&request, sizeof(request), REMOTE_DISK_READ_REPLY,
&packet); &packet);
if (error != B_OK) if (error != B_OK)
break; break;
// check for errors // check for errors
int16 packetSize = ntohs(((remote_disk_header*)packet->Data())->size); int16 packetSize = ntohs(((remote_disk_header*)packet->Data())->size);
if (packetSize < 0) { if (packetSize < 0) {
if (packetSize == REMOTE_DISK_IO_ERROR) if (packetSize == REMOTE_DISK_IO_ERROR)
error = B_IO_ERROR; error = B_IO_ERROR;
else if (packetSize == REMOTE_DISK_BAD_REQUEST) else if (packetSize == REMOTE_DISK_BAD_REQUEST)
error = B_BAD_VALUE; error = B_BAD_VALUE;
break; break;
} }
// make the reply packet the current packet // make the reply packet the current packet
delete fPacket; delete fPacket;
fPacket = packet; fPacket = packet;
// read from the packet // read from the packet
size_t packetBytesRead = _ReadFromPacket(pos, buffer, bufferSize); size_t packetBytesRead = _ReadFromPacket(pos, buffer, bufferSize);
if (packetBytesRead == 0) if (packetBytesRead == 0)
break; break;
bytesRead += packetBytesRead; bytesRead += packetBytesRead;
} }
// only return an error, when we were not able to read anything at all // only return an error, when we were not able to read anything at all
return (bytesRead == 0 ? error : bytesRead); return (bytesRead == 0 ? error : bytesRead);
} }
// WriteAt // WriteAt
ssize_t ssize_t
RemoteDisk::WriteAt(void */*cookie*/, off_t pos, const void *buffer, RemoteDisk::WriteAt(void */*cookie*/, off_t pos, const void *buffer,
size_t bufferSize) size_t bufferSize)
{ {
// Not needed in the boot loader. // Not needed in the boot loader.
return B_PERMISSION_DENIED; return B_PERMISSION_DENIED;
} }
// GetName // GetName
status_t status_t
RemoteDisk::GetName(char *nameBuffer, size_t bufferSize) const RemoteDisk::GetName(char *nameBuffer, size_t bufferSize) const
{ {
if (!nameBuffer) if (!nameBuffer)
return B_BAD_VALUE; return B_BAD_VALUE;
snprintf(nameBuffer, bufferSize, "RemoteDisk:%ld.%ld.%ld.%ld:%hd", snprintf(nameBuffer, bufferSize, "RemoteDisk:%ld.%ld.%ld.%ld:%hd",
(fServerAddress >> 24) & 0xff, (fServerAddress >> 16) & 0xff, (fServerAddress >> 24) & 0xff, (fServerAddress >> 16) & 0xff,
(fServerAddress >> 8) & 0xff, fServerAddress & 0xff, fServerPort); (fServerAddress >> 8) & 0xff, fServerAddress & 0xff, fServerPort);
return B_OK; return B_OK;
} }
// Size // Size
off_t off_t
RemoteDisk::Size() const RemoteDisk::Size() const
{ {
return fImageSize; return fImageSize;
} }
ip_addr_t ip_addr_t
RemoteDisk::ServerIPAddress() const RemoteDisk::ServerIPAddress() const
{ {
return fServerAddress; return fServerAddress;
} }
uint16 uint16
RemoteDisk::ServerPort() const RemoteDisk::ServerPort() const
{ {
return fServerPort; return fServerPort;
} }
// FindAnyRemoteDisk // FindAnyRemoteDisk
RemoteDisk * RemoteDisk *
RemoteDisk::FindAnyRemoteDisk() RemoteDisk::FindAnyRemoteDisk()
{ {
// create a socket and bind it // create a socket and bind it
UDPSocket socket; UDPSocket socket;
status_t error = socket.Bind(INADDR_ANY, 6665); status_t error = socket.Bind(INADDR_ANY, 6665);
if (error != B_OK) { if (error != B_OK) {
printf("RemoteDisk::GetAnyRemoteDisk(): Failed to bind socket.\n"); printf("RemoteDisk::GetAnyRemoteDisk(): Failed to bind socket.\n");
return NULL; return NULL;
} }
// prepare request // prepare request
remote_disk_header request; remote_disk_header request;
request.command = REMOTE_DISK_HELLO_REQUEST; request.command = REMOTE_DISK_HELLO_REQUEST;
// send request // send request
UDPPacket *packet; UDPPacket *packet;
error = _SendRequest(&socket, INADDR_BROADCAST, REMOTE_DISK_SERVER_PORT, error = _SendRequest(&socket, INADDR_BROADCAST, REMOTE_DISK_SERVER_PORT,
&request, sizeof(request), REMOTE_DISK_HELLO_REPLY, &packet); &request, sizeof(request), REMOTE_DISK_HELLO_REPLY, &packet);
if (error != B_OK) { if (error != B_OK) {
printf("RemoteDisk::GetAnyRemoteDisk(): Got no server reply.\n"); printf("RemoteDisk::GetAnyRemoteDisk(): Got no server reply.\n");
return NULL; return NULL;
} }
remote_disk_header *reply = (remote_disk_header*)packet->Data(); remote_disk_header *reply = (remote_disk_header*)packet->Data();
// create a RemoteDisk object // create a RemoteDisk object
RemoteDisk *remoteDisk = new(nothrow) RemoteDisk; RemoteDisk *remoteDisk = new(nothrow) RemoteDisk;
if (remoteDisk) { if (remoteDisk) {
error = remoteDisk->Init(packet->SourceAddress(), ntohs(reply->port), error = remoteDisk->Init(packet->SourceAddress(), ntohs(reply->port),
ntohll(reply->offset)); ntohll(reply->offset));
if (error != B_OK) { if (error != B_OK) {
delete remoteDisk; delete remoteDisk;
remoteDisk = NULL; remoteDisk = NULL;
} }
} }
delete packet; delete packet;
return remoteDisk; return remoteDisk;
} }
// _ReadFromPacket // _ReadFromPacket
ssize_t ssize_t
RemoteDisk::_ReadFromPacket(off_t &pos, uint8 *&buffer, size_t &bufferSize) RemoteDisk::_ReadFromPacket(off_t &pos, uint8 *&buffer, size_t &bufferSize)
{ {
if (!fPacket) if (!fPacket)
return 0; return 0;
remote_disk_header *header = (remote_disk_header*)fPacket->Data(); remote_disk_header *header = (remote_disk_header*)fPacket->Data();
uint64 packetOffset = ntohll(header->offset); uint64 packetOffset = ntohll(header->offset);
uint32 packetSize = ntohs(header->size); uint32 packetSize = ntohs(header->size);
if (packetOffset > (uint64)pos || packetOffset + packetSize <= (uint64)pos) if (packetOffset > (uint64)pos || packetOffset + packetSize <= (uint64)pos)
return 0; return 0;
// we do indeed have some bytes already // we do indeed have some bytes already
size_t toCopy = size_t(packetOffset + packetSize - (uint64)pos); size_t toCopy = size_t(packetOffset + packetSize - (uint64)pos);
if (toCopy > bufferSize) if (toCopy > bufferSize)
toCopy = bufferSize; toCopy = bufferSize;
memcpy(buffer, header->data + (pos - packetOffset), toCopy); memcpy(buffer, header->data + (pos - packetOffset), toCopy);
pos += toCopy; pos += toCopy;
buffer += toCopy; buffer += toCopy;
bufferSize -= toCopy; bufferSize -= toCopy;
return toCopy; return toCopy;
} }
// _SendRequest // _SendRequest
status_t status_t
RemoteDisk::_SendRequest(UDPSocket *socket, ip_addr_t serverAddress, RemoteDisk::_SendRequest(UDPSocket *socket, ip_addr_t serverAddress,
uint16 serverPort, remote_disk_header *request, size_t size, uint16 serverPort, remote_disk_header *request, size_t size,
uint8 expectedReply, UDPPacket **_packet) uint8 expectedReply, UDPPacket **_packet)
{ {
request->port = htons(socket->Port()); request->port = htons(socket->Port());
// try sending the request 3 times at most // try sending the request 3 times at most
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
// send request // send request
status_t error = socket->Send(serverAddress, serverPort, request, size); status_t error = socket->Send(serverAddress, serverPort, request, size);
if (error != B_OK) if (error != B_OK)
return error; return error;
// receive reply // receive reply
bigtime_t timeout = system_time() + kRequestTimeout; bigtime_t timeout = system_time() + kRequestTimeout;
do { do {
UDPPacket *packet; UDPPacket *packet;
error = socket->Receive(&packet, timeout - system_time()); error = socket->Receive(&packet, timeout - system_time());
if (error == B_OK) { if (error == B_OK) {
// got something; check, if it is looks good // got something; check, if it is looks good
if (packet->DataSize() >= sizeof(remote_disk_header)) { if (packet->DataSize() >= sizeof(remote_disk_header)) {
remote_disk_header *reply remote_disk_header *reply
= (remote_disk_header*)packet->Data(); = (remote_disk_header*)packet->Data();
if (reply->request_id == request->request_id if (reply->request_id == request->request_id
&& reply->command == expectedReply) { && reply->command == expectedReply) {
*_packet = packet; *_packet = packet;
return B_OK; return B_OK;
} }
} }
// reply not OK // reply not OK
delete packet; delete packet;
} else if (error != B_TIMED_OUT && error != B_WOULD_BLOCK) } else if (error != B_TIMED_OUT && error != B_WOULD_BLOCK)
return error; return error;
} while (timeout > system_time()); } while (timeout > system_time());
} }
// no reply // no reply
return B_ERROR; return B_ERROR;
} }
// _SendRequest // _SendRequest
status_t status_t
RemoteDisk::_SendRequest(remote_disk_header *request, size_t size, RemoteDisk::_SendRequest(remote_disk_header *request, size_t size,
uint8 expectedReply, UDPPacket **packet) uint8 expectedReply, UDPPacket **packet)
{ {
request->request_id = fRequestID++; request->request_id = fRequestID++;
return _SendRequest(fSocket, fServerAddress, fServerPort, request, size, return _SendRequest(fSocket, fServerAddress, fServerPort, request, size,
expectedReply, packet); expectedReply, packet);
} }
@@ -1,114 +1,114 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include <boot/platform/openfirmware/platform_arch.h> #include <boot/platform/openfirmware/platform_arch.h>
#include <stdio.h> #include <stdio.h>
#include <KernelExport.h> #include <KernelExport.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <boot/stage2.h> #include <boot/stage2.h>
#include <kernel.h> #include <kernel.h>
#include <platform/openfirmware/devices.h> #include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h> #include <platform/openfirmware/openfirmware.h>
#define TRACE_CPU #define TRACE_CPU
#ifdef TRACE_CPU #ifdef TRACE_CPU
# define TRACE(x) dprintf x # define TRACE(x) dprintf x
#else #else
# define TRACE(x) ; # define TRACE(x) ;
#endif #endif
status_t status_t
boot_arch_cpu_init(void) boot_arch_cpu_init(void)
{ {
// iterate through the "/cpus" node to find all CPUs // iterate through the "/cpus" node to find all CPUs
int cpus = of_finddevice("/cpus"); int cpus = of_finddevice("/cpus");
if (cpus == OF_FAILED) { if (cpus == OF_FAILED) {
printf("boot_arch_cpu_init(): Failed to open \"/cpus\"!\n"); printf("boot_arch_cpu_init(): Failed to open \"/cpus\"!\n");
return B_ERROR; return B_ERROR;
} }
char cpuPath[256]; char cpuPath[256];
int cookie = 0; int cookie = 0;
int cpuCount = 0; int cpuCount = 0;
while (of_get_next_device(&cookie, cpus, "cpu", cpuPath, while (of_get_next_device(&cookie, cpus, "cpu", cpuPath,
sizeof(cpuPath)) == B_OK) { sizeof(cpuPath)) == B_OK) {
TRACE(("found CPU: %s\n", cpuPath)); TRACE(("found CPU: %s\n", cpuPath));
// For the first CPU get the frequencies of CPU, bus, and time base. // For the first CPU get the frequencies of CPU, bus, and time base.
// We assume they are the same for all CPUs. // We assume they are the same for all CPUs.
if (cpuCount == 0) { if (cpuCount == 0) {
int cpu = of_finddevice(cpuPath); int cpu = of_finddevice(cpuPath);
if (cpu == OF_FAILED) { if (cpu == OF_FAILED) {
printf("boot_arch_cpu_init: Failed get CPU device node!\n"); printf("boot_arch_cpu_init: Failed get CPU device node!\n");
return B_ERROR; return B_ERROR;
} }
// TODO: Does encode-int really encode quadlet (32 bit numbers) // TODO: Does encode-int really encode quadlet (32 bit numbers)
// only? // only?
int32 clockFrequency; int32 clockFrequency;
if (of_getprop(cpu, "clock-frequency", &clockFrequency, 4) if (of_getprop(cpu, "clock-frequency", &clockFrequency, 4)
== OF_FAILED) { == OF_FAILED) {
printf("boot_arch_cpu_init: Failed to get CPU clock " printf("boot_arch_cpu_init: Failed to get CPU clock "
"frequency!\n"); "frequency!\n");
return B_ERROR; return B_ERROR;
} }
int32 busFrequency; int32 busFrequency;
if (of_getprop(cpu, "bus-frequency", &busFrequency, 4) if (of_getprop(cpu, "bus-frequency", &busFrequency, 4)
== OF_FAILED) { == OF_FAILED) {
printf("boot_arch_cpu_init: Failed to get bus clock " printf("boot_arch_cpu_init: Failed to get bus clock "
"frequency!\n"); "frequency!\n");
return B_ERROR; return B_ERROR;
} }
int32 timeBaseFrequency; int32 timeBaseFrequency;
if (of_getprop(cpu, "timebase-frequency", &timeBaseFrequency, 4) if (of_getprop(cpu, "timebase-frequency", &timeBaseFrequency, 4)
== OF_FAILED) { == OF_FAILED) {
printf("boot_arch_cpu_init: Failed to get time base " printf("boot_arch_cpu_init: Failed to get time base "
"frequency!\n"); "frequency!\n");
return B_ERROR; return B_ERROR;
} }
gKernelArgs.arch_args.cpu_frequency = clockFrequency; gKernelArgs.arch_args.cpu_frequency = clockFrequency;
gKernelArgs.arch_args.bus_frequency = busFrequency; gKernelArgs.arch_args.bus_frequency = busFrequency;
gKernelArgs.arch_args.time_base_frequency = timeBaseFrequency; gKernelArgs.arch_args.time_base_frequency = timeBaseFrequency;
TRACE((" CPU clock frequency: %ld\n", clockFrequency)); TRACE((" CPU clock frequency: %ld\n", clockFrequency));
TRACE((" bus clock frequency: %ld\n", busFrequency)); TRACE((" bus clock frequency: %ld\n", busFrequency));
TRACE((" time base frequency: %ld\n", timeBaseFrequency)); TRACE((" time base frequency: %ld\n", timeBaseFrequency));
} }
cpuCount++; cpuCount++;
} }
if (cpuCount == 0) { if (cpuCount == 0) {
printf("boot_arch_cpu_init(): Found no CPUs!\n"); printf("boot_arch_cpu_init(): Found no CPUs!\n");
return B_ERROR; return B_ERROR;
} }
gKernelArgs.num_cpus = cpuCount; gKernelArgs.num_cpus = cpuCount;
// allocate the kernel stacks (the memory stuff is already initialized // allocate the kernel stacks (the memory stuff is already initialized
// at this point) // at this point)
addr_t stack = (addr_t)arch_mmu_allocate((void*)0x80000000, addr_t stack = (addr_t)arch_mmu_allocate((void*)0x80000000,
cpuCount * (KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE), cpuCount * (KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE),
B_READ_AREA | B_WRITE_AREA, false); B_READ_AREA | B_WRITE_AREA, false);
if (!stack) { if (!stack) {
printf("boot_arch_cpu_init(): Failed to allocate kernel stack(s)!\n"); printf("boot_arch_cpu_init(): Failed to allocate kernel stack(s)!\n");
return B_NO_MEMORY; return B_NO_MEMORY;
} }
for (int i = 0; i < cpuCount; i++) { for (int i = 0; i < cpuCount; i++) {
gKernelArgs.cpu_kstack[i].start = stack; gKernelArgs.cpu_kstack[i].start = stack;
gKernelArgs.cpu_kstack[i].size = KERNEL_STACK_SIZE gKernelArgs.cpu_kstack[i].size = KERNEL_STACK_SIZE
+ KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE; + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
stack += KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE; stack += KERNEL_STACK_SIZE + KERNEL_STACK_GUARD_PAGES * B_PAGE_SIZE;
} }
return B_OK; return B_OK;
} }
@@ -1,29 +1,29 @@
/* /*
* Copyright 2006, Ingo Weinhold <[email protected]>. * Copyright 2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include "real_time_clock.h" #include "real_time_clock.h"
#include <stdio.h> #include <stdio.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <boot/stage2.h> #include <boot/stage2.h>
#include <platform/openfirmware/devices.h> #include <platform/openfirmware/devices.h>
#include <platform/openfirmware/openfirmware.h> #include <platform/openfirmware/openfirmware.h>
status_t status_t
init_real_time_clock(void) init_real_time_clock(void)
{ {
// find RTC // find RTC
int rtcCookie = 0; int rtcCookie = 0;
if (of_get_next_device(&rtcCookie, 0, "rtc", if (of_get_next_device(&rtcCookie, 0, "rtc",
gKernelArgs.platform_args.rtc_path, gKernelArgs.platform_args.rtc_path,
sizeof(gKernelArgs.platform_args.rtc_path)) != B_OK) { sizeof(gKernelArgs.platform_args.rtc_path)) != B_OK) {
printf("init_real_time_clock(): Found no RTC device!"); printf("init_real_time_clock(): Found no RTC device!");
return B_ERROR; return B_ERROR;
} }
return B_OK; return B_OK;
} }
@@ -1,21 +1,21 @@
/* /*
* Copyright 2006, Ingo Weinhold <[email protected]>. * Copyright 2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#ifndef OPENFIRMWARE_REAL_TIME_CLOCK_H #ifndef OPENFIRMWARE_REAL_TIME_CLOCK_H
#define OPENFIRMWARE_REAL_TIME_CLOCK_H #define OPENFIRMWARE_REAL_TIME_CLOCK_H
#include <SupportDefs.h> #include <SupportDefs.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
status_t init_real_time_clock(void); status_t init_real_time_clock(void);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif
#endif /* OPENFIRMWARE_REAL_TIME_CLOCK_H */ #endif /* OPENFIRMWARE_REAL_TIME_CLOCK_H */
@@ -1,15 +1,15 @@
/* /*
* Copyright 2005, Ingo Weinhold <[email protected]>. * Copyright 2005, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include <OS.h> #include <OS.h>
#include <platform/openfirmware/openfirmware.h> #include <platform/openfirmware/openfirmware.h>
bigtime_t bigtime_t
system_time(void) system_time(void)
{ {
int result = of_milliseconds(); int result = of_milliseconds();
return (result == OF_FAILED ? 0 : bigtime_t(result) * 1000); return (result == OF_FAILED ? 0 : bigtime_t(result) * 1000);
} }
+251 -251
View File
@@ -1,251 +1,251 @@
/* /*
* Copyright 2006, Ingo Weinhold <[email protected]>. * Copyright 2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include <arch_platform.h> #include <arch_platform.h>
#include <new> #include <new>
#include <KernelExport.h> #include <KernelExport.h>
#include <boot/kernel_args.h> #include <boot/kernel_args.h>
#include <platform/openfirmware/openfirmware.h> #include <platform/openfirmware/openfirmware.h>
#include <real_time_clock.h> #include <real_time_clock.h>
#include <util/kernel_cpp.h> #include <util/kernel_cpp.h>
static PPCPlatform *sPPCPlatform; static PPCPlatform *sPPCPlatform;
// constructor // constructor
PPCPlatform::PPCPlatform(ppc_platform_type platformType) PPCPlatform::PPCPlatform(ppc_platform_type platformType)
: fPlatformType(platformType) : fPlatformType(platformType)
{ {
} }
// destructor // destructor
PPCPlatform::~PPCPlatform() PPCPlatform::~PPCPlatform()
{ {
} }
// Default // Default
PPCPlatform * PPCPlatform *
PPCPlatform::Default() PPCPlatform::Default()
{ {
return sPPCPlatform; return sPPCPlatform;
} }
// #pragma mark - Open Firmware // #pragma mark - Open Firmware
namespace BPrivate { namespace BPrivate {
class PPCOpenFirmware : public PPCPlatform { class PPCOpenFirmware : public PPCPlatform {
public: public:
PPCOpenFirmware(); PPCOpenFirmware();
virtual ~PPCOpenFirmware(); virtual ~PPCOpenFirmware();
virtual status_t Init(struct kernel_args *kernelArgs); virtual status_t Init(struct kernel_args *kernelArgs);
virtual status_t InitSerialDebug(struct kernel_args *kernelArgs); virtual status_t InitSerialDebug(struct kernel_args *kernelArgs);
virtual status_t InitPostVM(struct kernel_args *kernelArgs); virtual status_t InitPostVM(struct kernel_args *kernelArgs);
virtual status_t InitRTC(struct kernel_args *kernelArgs, virtual status_t InitRTC(struct kernel_args *kernelArgs,
struct real_time_data *data); struct real_time_data *data);
virtual char SerialDebugGetChar(); virtual char SerialDebugGetChar();
virtual void SerialDebugPutChar(char c); virtual void SerialDebugPutChar(char c);
virtual void SetHardwareRTC(uint32 seconds); virtual void SetHardwareRTC(uint32 seconds);
virtual uint32 GetHardwareRTC(); virtual uint32 GetHardwareRTC();
virtual void ShutDown(bool reboot); virtual void ShutDown(bool reboot);
private: private:
int fInput; int fInput;
int fOutput; int fOutput;
int fRTC; int fRTC;
}; };
} // namespace BPrivate } // namespace BPrivate
using BPrivate::PPCOpenFirmware; using BPrivate::PPCOpenFirmware;
// OF debugger commands // OF debugger commands
// debug_command_of_exit // debug_command_of_exit
static int static int
debug_command_of_exit(int argc, char **argv) debug_command_of_exit(int argc, char **argv)
{ {
of_exit(); of_exit();
kprintf("of_exit() failed!\n"); kprintf("of_exit() failed!\n");
return 0; return 0;
} }
// debug_command_of_enter // debug_command_of_enter
static int static int
debug_command_of_enter(int argc, char **argv) debug_command_of_enter(int argc, char **argv)
{ {
of_call_client_function("enter", 0, 0); of_call_client_function("enter", 0, 0);
return 0; return 0;
} }
// constructor // constructor
PPCOpenFirmware::PPCOpenFirmware() PPCOpenFirmware::PPCOpenFirmware()
: PPCPlatform(PPC_PLATFORM_OPEN_FIRMWARE), : PPCPlatform(PPC_PLATFORM_OPEN_FIRMWARE),
fInput(-1), fInput(-1),
fOutput(-1), fOutput(-1),
fRTC(-1) fRTC(-1)
{ {
} }
// destructor // destructor
PPCOpenFirmware::~PPCOpenFirmware() PPCOpenFirmware::~PPCOpenFirmware()
{ {
} }
// Init // Init
status_t status_t
PPCOpenFirmware::Init(struct kernel_args *kernelArgs) PPCOpenFirmware::Init(struct kernel_args *kernelArgs)
{ {
return of_init( return of_init(
(int(*)(void*))kernelArgs->platform_args.openfirmware_entry); (int(*)(void*))kernelArgs->platform_args.openfirmware_entry);
} }
// InitSerialDebug // InitSerialDebug
status_t status_t
PPCOpenFirmware::InitSerialDebug(struct kernel_args *kernelArgs) PPCOpenFirmware::InitSerialDebug(struct kernel_args *kernelArgs)
{ {
if (of_getprop(gChosen, "stdin", &fInput, sizeof(int)) == OF_FAILED) if (of_getprop(gChosen, "stdin", &fInput, sizeof(int)) == OF_FAILED)
return B_ERROR; return B_ERROR;
if (of_getprop(gChosen, "stdout", &fOutput, sizeof(int)) == OF_FAILED) if (of_getprop(gChosen, "stdout", &fOutput, sizeof(int)) == OF_FAILED)
return B_ERROR; return B_ERROR;
return B_OK; return B_OK;
} }
// InitPostVM // InitPostVM
status_t status_t
PPCOpenFirmware::InitPostVM(struct kernel_args *kernelArgs) PPCOpenFirmware::InitPostVM(struct kernel_args *kernelArgs)
{ {
add_debugger_command("of_exit", &debug_command_of_exit, add_debugger_command("of_exit", &debug_command_of_exit,
"Exit to the Open Firmware prompt. No way to get back into the OS!"); "Exit to the Open Firmware prompt. No way to get back into the OS!");
add_debugger_command("of_enter", &debug_command_of_enter, add_debugger_command("of_enter", &debug_command_of_enter,
"Enter a subordinate Open Firmware interpreter. Quitting it returns " "Enter a subordinate Open Firmware interpreter. Quitting it returns "
"to KDL."); "to KDL.");
return B_OK; return B_OK;
} }
// InitRTC // InitRTC
status_t status_t
PPCOpenFirmware::InitRTC(struct kernel_args *kernelArgs, PPCOpenFirmware::InitRTC(struct kernel_args *kernelArgs,
struct real_time_data *data) struct real_time_data *data)
{ {
// open RTC // open RTC
fRTC = of_open(kernelArgs->platform_args.rtc_path); fRTC = of_open(kernelArgs->platform_args.rtc_path);
if (fRTC == OF_FAILED) { if (fRTC == OF_FAILED) {
dprintf("PPCOpenFirmware::InitRTC(): Failed open RTC device!\n"); dprintf("PPCOpenFirmware::InitRTC(): Failed open RTC device!\n");
return B_ERROR; return B_ERROR;
} }
return B_OK; return B_OK;
} }
// DebugSerialGetChar // DebugSerialGetChar
char char
PPCOpenFirmware::SerialDebugGetChar() PPCOpenFirmware::SerialDebugGetChar()
{ {
int key; int key;
if (of_interpret("key", 0, 1, &key) == OF_FAILED) if (of_interpret("key", 0, 1, &key) == OF_FAILED)
return 0; return 0;
return (char)key; return (char)key;
} }
// DebugSerialPutChar // DebugSerialPutChar
void void
PPCOpenFirmware::SerialDebugPutChar(char c) PPCOpenFirmware::SerialDebugPutChar(char c)
{ {
if (c == '\n') if (c == '\n')
of_write(fOutput, "\r\n", 2); of_write(fOutput, "\r\n", 2);
else else
of_write(fOutput, &c, 1); of_write(fOutput, &c, 1);
} }
// SetHardwareRTC // SetHardwareRTC
void void
PPCOpenFirmware::SetHardwareRTC(uint32 seconds) PPCOpenFirmware::SetHardwareRTC(uint32 seconds)
{ {
struct tm t; struct tm t;
rtc_secs_to_tm(seconds, &t); rtc_secs_to_tm(seconds, &t);
t.tm_year += RTC_EPOCH_BASE_YEAR; t.tm_year += RTC_EPOCH_BASE_YEAR;
t.tm_mon++; t.tm_mon++;
if (of_call_method(fRTC, "set-time", 6, 0, t.tm_year, t.tm_mon, t.tm_mday, if (of_call_method(fRTC, "set-time", 6, 0, t.tm_year, t.tm_mon, t.tm_mday,
t.tm_hour, t.tm_min, t.tm_sec) == OF_FAILED) { t.tm_hour, t.tm_min, t.tm_sec) == OF_FAILED) {
dprintf("PPCOpenFirmware::SetHardwareRTC(): Failed to set RTC!\n"); dprintf("PPCOpenFirmware::SetHardwareRTC(): Failed to set RTC!\n");
} }
} }
// GetHardwareRTC // GetHardwareRTC
uint32 uint32
PPCOpenFirmware::GetHardwareRTC() PPCOpenFirmware::GetHardwareRTC()
{ {
struct tm t; struct tm t;
if (of_call_method(fRTC, "get-time", 0, 6, &t.tm_year, &t.tm_mon, if (of_call_method(fRTC, "get-time", 0, 6, &t.tm_year, &t.tm_mon,
&t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec) == OF_FAILED) { &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec) == OF_FAILED) {
dprintf("PPCOpenFirmware::GetHardwareRTC(): Failed to get RTC!\n"); dprintf("PPCOpenFirmware::GetHardwareRTC(): Failed to get RTC!\n");
return 0; return 0;
} }
t.tm_year -= RTC_EPOCH_BASE_YEAR; t.tm_year -= RTC_EPOCH_BASE_YEAR;
t.tm_mon--; t.tm_mon--;
return rtc_tm_to_secs(&t); return rtc_tm_to_secs(&t);
} }
// ShutDown // ShutDown
void void
PPCOpenFirmware::ShutDown(bool reboot) PPCOpenFirmware::ShutDown(bool reboot)
{ {
if (reboot) { if (reboot) {
of_interpret("reset-all", 0, 0); of_interpret("reset-all", 0, 0);
} else { } else {
// not standardized, so it might fail // not standardized, so it might fail
of_interpret("shut-down", 0, 0); of_interpret("shut-down", 0, 0);
} }
} }
// # pragma mark - // # pragma mark -
// static buffer for constructing the actual PPCPlatform // static buffer for constructing the actual PPCPlatform
static char *sPPCPlatformBuffer[sizeof(PPCOpenFirmware)]; static char *sPPCPlatformBuffer[sizeof(PPCOpenFirmware)];
status_t status_t
arch_platform_init(struct kernel_args *kernelArgs) arch_platform_init(struct kernel_args *kernelArgs)
{ {
// only OpenFirmware supported for now // only OpenFirmware supported for now
if (true) if (true)
sPPCPlatform = new(sPPCPlatformBuffer) PPCOpenFirmware; sPPCPlatform = new(sPPCPlatformBuffer) PPCOpenFirmware;
return sPPCPlatform->Init(kernelArgs); return sPPCPlatform->Init(kernelArgs);
} }
status_t status_t
arch_platform_init_post_vm(struct kernel_args *kernelArgs) arch_platform_init_post_vm(struct kernel_args *kernelArgs)
{ {
return sPPCPlatform->InitPostVM(kernelArgs); return sPPCPlatform->InitPostVM(kernelArgs);
} }
status_t status_t
arch_platform_init_post_thread(struct kernel_args *kernelArgs) arch_platform_init_post_thread(struct kernel_args *kernelArgs)
{ {
return B_OK; return B_OK;
} }