93 lines
2.4 KiB
C
93 lines
2.4 KiB
C
/******************************************************************************
|
|
* Copyright (c) 2004, 2008 IBM Corporation
|
|
* All rights reserved.
|
|
* This program and the accompanying materials
|
|
* are made available under the terms of the BSD License
|
|
* which accompanies this distribution, and is available at
|
|
* http://www.opensource.org/licenses/bsd-license.php
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial implementation
|
|
*****************************************************************************/
|
|
|
|
#include <stdint.h>
|
|
#include <rtas.h>
|
|
#include "rtas_table.h"
|
|
|
|
|
|
//#define _RTAS_TRACE
|
|
//#define _RTAS_COUNT_CALLS
|
|
|
|
|
|
#ifdef _RTAS_COUNT_CALLS
|
|
int rtas_callcount[0x40] __attribute__((aligned (16)));
|
|
#endif
|
|
|
|
/* rtas_config is used to store the run-time configuration flags (which are
|
|
* provided by SLOF during instantiate-rtas) */
|
|
long rtas_config;
|
|
|
|
|
|
/* Prototype */
|
|
void rtas_call (rtas_args_t *rtas_args);
|
|
|
|
|
|
/*
|
|
Function: rtas_call
|
|
Input:
|
|
rtas_args: pointer to RTAS arguments structure
|
|
Output:
|
|
|
|
Decription: Handle RTAS call. This C function is called
|
|
from the asm function rtas_entry.
|
|
*/
|
|
|
|
void
|
|
rtas_call (rtas_args_t *rtas_args)
|
|
{
|
|
int idx;
|
|
|
|
#ifdef _RTAS_COUNT_CALLS
|
|
/* Count how often every RTAS function is called. */
|
|
if (rtas_args->token < (int)(sizeof(rtas_callcount)/sizeof(rtas_callcount[0]))) {
|
|
static int callcount_initialized = 0;
|
|
/* If the array is used the first time, we have to set all entries to 0 */
|
|
if (!callcount_initialized) {
|
|
unsigned int i;
|
|
callcount_initialized = 1;
|
|
for (i = 0; i < sizeof(rtas_callcount)/sizeof(rtas_callcount[0]); i++)
|
|
rtas_callcount[i] = 0;
|
|
}
|
|
/* Increment the counter of the RTAS call */
|
|
rtas_callcount[rtas_args->token] += 1;
|
|
}
|
|
#endif
|
|
|
|
#ifdef _RTAS_TRACE
|
|
unsigned int parCnt = rtas_args->nargs;
|
|
unsigned int *pInt = rtas_args->args;
|
|
printf("\n\r*** rtas_call=0x%x", rtas_args->token);
|
|
#ifdef _RTAS_COUNT_CALLS
|
|
printf(" count=0x%x", rtas_callcount[rtas_args->token]);
|
|
#endif
|
|
printf(" len=0x%x", parCnt);
|
|
printf("\n\r ");
|
|
while(parCnt--) {
|
|
printf("0x%x ", *pInt++);
|
|
}
|
|
#endif
|
|
|
|
idx = rtas_args->token - 1;
|
|
|
|
/* Check if there's a function for the token: */
|
|
if (idx >= 0 && idx < rtas_func_tab_size
|
|
&& rtas_func_tab[idx].func != NULL) {
|
|
/* Now jump to the RTAS function: */
|
|
rtas_func_tab[idx].func(rtas_args);
|
|
}
|
|
else {
|
|
/* We didn't find a function - return error code: */
|
|
rtas_args->args[rtas_args->nargs] = -1;
|
|
}
|
|
|
|
}
|