/****************************************************************************** * 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 #include #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; } }