|
|
1.1 ! root 1: /****************************************************************************** ! 2: * Copyright (c) 2004, 2008 IBM Corporation ! 3: * All rights reserved. ! 4: * This program and the accompanying materials ! 5: * are made available under the terms of the BSD License ! 6: * which accompanies this distribution, and is available at ! 7: * http://www.opensource.org/licenses/bsd-license.php ! 8: * ! 9: * Contributors: ! 10: * IBM Corporation - initial implementation ! 11: *****************************************************************************/ ! 12: ! 13: #include <stdint.h> ! 14: #include <rtas.h> ! 15: #include "rtas_table.h" ! 16: ! 17: ! 18: //#define _RTAS_TRACE ! 19: //#define _RTAS_COUNT_CALLS ! 20: ! 21: ! 22: #ifdef _RTAS_COUNT_CALLS ! 23: int rtas_callcount[0x40] __attribute__((aligned (16))); ! 24: #endif ! 25: ! 26: /* rtas_config is used to store the run-time configuration flags (which are ! 27: * provided by SLOF during instantiate-rtas) */ ! 28: long rtas_config; ! 29: ! 30: ! 31: /* ! 32: Function: rtas_call ! 33: Input: ! 34: rtas_args: pointer to RTAS arguments structure ! 35: Output: ! 36: ! 37: Decription: Handle RTAS call. This C function is called ! 38: from the asm function rtas_entry. ! 39: */ ! 40: ! 41: void ! 42: rtas_call (rtas_args_t *rtas_args) ! 43: { ! 44: int idx; ! 45: ! 46: #ifdef _RTAS_COUNT_CALLS ! 47: /* Count how often every RTAS function is called. */ ! 48: if (rtas_args->token < (int)(sizeof(rtas_callcount)/sizeof(rtas_callcount[0]))) { ! 49: static int callcount_initialized = 0; ! 50: /* If the array is used the first time, we have to set all entries to 0 */ ! 51: if (!callcount_initialized) { ! 52: unsigned int i; ! 53: callcount_initialized = 1; ! 54: for (i = 0; i < sizeof(rtas_callcount)/sizeof(rtas_callcount[0]); i++) ! 55: rtas_callcount[i] = 0; ! 56: } ! 57: /* Increment the counter of the RTAS call */ ! 58: rtas_callcount[rtas_args->token] += 1; ! 59: } ! 60: #endif ! 61: ! 62: #ifdef _RTAS_TRACE ! 63: unsigned int parCnt = rtas_args->nargs; ! 64: unsigned int *pInt = rtas_args->args; ! 65: printf("\n\r*** rtas_call=0x%x", rtas_args->token); ! 66: #ifdef _RTAS_COUNT_CALLS ! 67: printf(" count=0x%x", rtas_callcount[rtas_args->token]); ! 68: #endif ! 69: printf(" len=0x%x", parCnt); ! 70: printf("\n\r "); ! 71: while(parCnt--) { ! 72: printf("0x%x ", *pInt++); ! 73: } ! 74: #endif ! 75: ! 76: idx = rtas_args->token - 1; ! 77: ! 78: /* Check if there's a function for the token: */ ! 79: if (idx >= 0 && idx < rtas_func_tab_size ! 80: && rtas_func_tab[idx].func != NULL) { ! 81: /* Now jump to the RTAS function: */ ! 82: rtas_func_tab[idx].func(rtas_args); ! 83: } ! 84: else { ! 85: /* We didn't find a function - return error code: */ ! 86: rtas_args->args[rtas_args->nargs] = -1; ! 87: } ! 88: ! 89: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.