svn commit: r277539 - head/sys/powerpc/ofw
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Thu Jan 22 22:04:44 UTC 2015
Author: nwhitehorn
Date: Thu Jan 22 22:04:43 2015
New Revision: 277539
URL: https://svnweb.freebsd.org/changeset/base/277539
Log:
Allow use of a pre-instantiated RTAS as well as a self-instantiated one. This
lets the kernel boot on RTAS-based systems by being kexec'ed from Linux.
Modified:
head/sys/powerpc/ofw/rtas.c
Modified: head/sys/powerpc/ofw/rtas.c
==============================================================================
--- head/sys/powerpc/ofw/rtas.c Thu Jan 22 21:41:41 2015 (r277538)
+++ head/sys/powerpc/ofw/rtas.c Thu Jan 22 22:04:43 2015 (r277539)
@@ -86,12 +86,6 @@ rtas_setup(void *junk)
return;
}
OF_package_to_path(rtas, path, sizeof(path));
- rtasi = OF_open(path);
- if (rtasi == 0) {
- rtas = 0;
- printf("Error initializing RTAS: could not open node\n");
- return;
- }
mtx_init(&rtas_mtx, "RTAS", NULL, MTX_SPIN);
@@ -110,7 +104,7 @@ rtas_setup(void *junk)
* It must be 4KB-aligned and not cross a 256 MB boundary.
*/
- OF_getprop(rtas, "rtas-size", &rtas_size, sizeof(rtas_size));
+ OF_getencprop(rtas, "rtas-size", &rtas_size, sizeof(rtas_size));
rtas_size = round_page(rtas_size);
rtas_bounce_virt = contigmalloc(rtas_size + PAGE_SIZE, M_RTAS, 0, 0,
ulmin(platform_real_maxaddr(), BUS_SPACE_MAXADDR_32BIT),
@@ -125,15 +119,32 @@ rtas_setup(void *junk)
* Instantiate RTAS. We always use the 32-bit version.
*/
- result = OF_call_method("instantiate-rtas", rtasi, 1, 1,
- (cell_t)rtas_private_data, &rtas_ptr);
- OF_close(rtasi);
-
- if (result != 0) {
- rtas = 0;
- rtas_ptr = 0;
- printf("Error initializing RTAS (%d)\n", result);
- return;
+ if (OF_hasprop(rtas, "linux,rtas-entry") &&
+ OF_hasprop(rtas, "linux,rtas-base")) {
+ OF_getencprop(rtas, "linux,rtas-base", &rtas_ptr,
+ sizeof(rtas_ptr));
+ rtas_private_data = rtas_ptr;
+ OF_getencprop(rtas, "linux,rtas-entry", &rtas_ptr,
+ sizeof(rtas_ptr));
+ } else {
+ rtasi = OF_open(path);
+ if (rtasi == 0) {
+ rtas = 0;
+ printf("Error initializing RTAS: could not open "
+ "node\n");
+ return;
+ }
+
+ result = OF_call_method("instantiate-rtas", rtasi, 1, 1,
+ (cell_t)rtas_private_data, &rtas_ptr);
+ OF_close(rtasi);
+
+ if (result != 0) {
+ rtas = 0;
+ rtas_ptr = 0;
+ printf("Error initializing RTAS (%d)\n", result);
+ return;
+ }
}
rtas_entry = (uintptr_t)(rtas_ptr);
@@ -252,7 +263,7 @@ rtas_token_lookup(const char *method)
if (!rtas_exists())
return (-1);
- if (OF_getprop(rtas, method, &token, sizeof(token)) == -1)
+ if (OF_getencprop(rtas, method, &token, sizeof(token)) == -1)
return (-1);
return (token);
More information about the svn-src-all
mailing list