diff options
author | Yang Zhang <yang.z.zhang@intel.com> | 2015-08-28 09:58:54 +0800 |
---|---|---|
committer | Yang Zhang <yang.z.zhang@intel.com> | 2015-09-01 12:44:00 +0800 |
commit | e44e3482bdb4d0ebde2d8b41830ac2cdb07948fb (patch) | |
tree | 66b09f592c55df2878107a468a91d21506104d3f /qemu/roms/SLOF/rtas/rtas_call.c | |
parent | 9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 (diff) |
Add qemu 2.4.0
Change-Id: Ic99cbad4b61f8b127b7dc74d04576c0bcbaaf4f5
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Diffstat (limited to 'qemu/roms/SLOF/rtas/rtas_call.c')
-rw-r--r-- | qemu/roms/SLOF/rtas/rtas_call.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/rtas/rtas_call.c b/qemu/roms/SLOF/rtas/rtas_call.c new file mode 100644 index 000000000..8c7532c01 --- /dev/null +++ b/qemu/roms/SLOF/rtas/rtas_call.c @@ -0,0 +1,93 @@ +/****************************************************************************** + * 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; + } + +} |