openfirmware: adjust for 64bit
Sparcv9 runs Openboot in 64 bit mode, which means the cell size is 64bit. Use intptr_t where appropriate to make the open firmware calls work. Beware, some values are still 32bit, this matters for example for of_getprop, if you get 32bits into a 64bit variables it will be in the MSB of it (big endian only weakness...) and confuse things. See for example in console.cpp, where the input and output handles are retrieved as 32bit values. It seems wise to check the expected size when using of_getprop in these cases, instead of just checking for errors. Change-Id: Ie72ebc4afe7c6d7602a47478f0bfb6b8247004b8 Reviewed-on: https://review.haiku-os.org/c/1369 Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
status_t of_get_next_device(int *_cookie, int root, const char *type,
|
||||
status_t of_get_next_device(intptr_t *_cookie, intptr_t root, const char *type,
|
||||
char *path, size_t pathSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright 2003, Axel Dörfler, [email protected]. All rights reserved.
|
||||
* Copyright 2019, Adrien Destugues, [email protected]
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef OPEN_FIRMWARE_H
|
||||
@@ -13,7 +14,7 @@
|
||||
|
||||
|
||||
/* global device tree/properties access */
|
||||
extern int gChosen;
|
||||
extern intptr_t gChosen;
|
||||
|
||||
|
||||
template<typename AddressType>
|
||||
@@ -24,13 +25,13 @@ struct of_region {
|
||||
|
||||
struct of_arguments {
|
||||
const char *name;
|
||||
int num_args;
|
||||
int num_returns;
|
||||
int data[0];
|
||||
intptr_t num_args;
|
||||
intptr_t num_returns;
|
||||
intptr_t data[0];
|
||||
|
||||
#ifdef __cplusplus
|
||||
int &Argument(int index) { return data[index]; }
|
||||
int &ReturnValue(int index) { return data[num_args + index]; }
|
||||
intptr_t &Argument(int index) { return data[index]; }
|
||||
intptr_t &ReturnValue(int index) { return data[num_args + index]; }
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -39,43 +40,46 @@ struct of_arguments {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern status_t of_init(int (*openFirmwareEntry)(void *));
|
||||
extern status_t of_init(intptr_t (*openFirmwareEntry)(void *));
|
||||
|
||||
/* device tree functions */
|
||||
extern int of_finddevice(const char *device);
|
||||
extern int of_child(int node);
|
||||
extern int of_peer(int node);
|
||||
extern int of_parent(int node);
|
||||
extern int of_instance_to_path(int instance, char *pathBuffer, int bufferSize);
|
||||
extern int of_instance_to_package(int instance);
|
||||
extern int of_getprop(int package, const char *property, void *buffer,
|
||||
int bufferSize);
|
||||
extern int of_setprop(int package, const char *property, const void *buffer,
|
||||
int bufferSize);
|
||||
extern int of_nextprop(int package, const char *previousProperty,
|
||||
extern intptr_t of_finddevice(const char *device);
|
||||
extern intptr_t of_child(intptr_t node);
|
||||
extern intptr_t of_peer(intptr_t node);
|
||||
extern intptr_t of_parent(intptr_t node);
|
||||
extern intptr_t of_instance_to_path(uint32_t instance, char *pathBuffer,
|
||||
intptr_t bufferSize);
|
||||
extern intptr_t of_instance_to_package(uint32_t instance);
|
||||
extern intptr_t of_getprop(intptr_t package, const char *property, void *buffer,
|
||||
intptr_t bufferSize);
|
||||
extern intptr_t of_setprop(intptr_t package, const char *property, const void *buffer,
|
||||
intptr_t bufferSize);
|
||||
extern intptr_t of_nextprop(intptr_t package, const char *previousProperty,
|
||||
char *nextProperty);
|
||||
extern int of_getproplen(int package, const char *property);
|
||||
extern int of_package_to_path(int package, char *pathBuffer, int bufferSize);
|
||||
extern intptr_t of_getproplen(intptr_t package, const char *property);
|
||||
extern intptr_t of_package_to_path(intptr_t package, char *pathBuffer,
|
||||
intptr_t bufferSize);
|
||||
|
||||
/* I/O functions */
|
||||
extern int of_open(const char *nodeName);
|
||||
extern void of_close(int handle);
|
||||
extern int of_read(int handle, void *buffer, int bufferSize);
|
||||
extern int of_write(int handle, const void *buffer, int bufferSize);
|
||||
extern int of_seek(int handle, off_t pos);
|
||||
extern intptr_t of_open(const char *nodeName);
|
||||
extern void of_close(intptr_t handle);
|
||||
extern intptr_t of_read(intptr_t handle, void *buffer, intptr_t bufferSize);
|
||||
extern intptr_t of_write(intptr_t handle, const void *buffer, intptr_t bufferSize);
|
||||
extern intptr_t of_seek(intptr_t handle, off_t pos);
|
||||
|
||||
/* memory functions */
|
||||
extern int of_release(void *virtualAddress, int size);
|
||||
extern void *of_claim(void *virtualAddress, int size, int align);
|
||||
extern intptr_t of_release(void *virtualAddress, intptr_t size);
|
||||
extern void *of_claim(void *virtualAddress, intptr_t size, intptr_t align);
|
||||
|
||||
/* misc functions */
|
||||
extern int of_call_client_function(const char *method, int numArgs,
|
||||
int numReturns, ...);
|
||||
extern int of_interpret(const char *command, int numArgs, int numReturns, ...);
|
||||
extern int of_call_method(int handle, const char *method, int numArgs,
|
||||
int numReturns, ...);
|
||||
extern int of_test(const char *service);
|
||||
extern int of_milliseconds(void);
|
||||
extern intptr_t of_call_client_function(const char *method, intptr_t numArgs,
|
||||
intptr_t numReturns, ...);
|
||||
extern intptr_t of_interpret(const char *command, intptr_t numArgs,
|
||||
intptr_t numReturns, ...);
|
||||
extern intptr_t of_call_method(intptr_t handle, const char *method,
|
||||
intptr_t numArgs, intptr_t numReturns, ...);
|
||||
extern intptr_t of_test(const char *service);
|
||||
extern intptr_t of_milliseconds(void);
|
||||
extern void of_exit(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in New Issue
Block a user