e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# All rights reserved.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync# See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncimport sys
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncimport apiutil
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncapiutil.CopyrightC()
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncprint """
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* DO NOT EDIT - THIS FILE AUTOMATICALLY GENERATED BY dispatch.py SCRIPT */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_spu.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_string.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic SPUGenericFunction __findFunc( char *name, SPU *spu )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SPUNamedFunctionTable *temp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (spu == NULL)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (temp = spu->function_table->table ; temp->name != NULL ; temp++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!crStrcmp( name, temp->name ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return temp->fn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return __findFunc( name, spu->superSPU );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This function is not public outside the loader SPU.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern void __buildDispatch( SPU *spu );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid __buildDispatch( SPU *spu )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{"""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynckeys = apiutil.GetDispatchedFunctions(sys.argv[1]+"/APIspec.txt")
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncfor func_name in keys:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync print '\tspu->dispatch_table.%s = (%sFunc_t) __findFunc( "%s", spu );' % (func_name,func_name,func_name)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncprint '}'
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncprint """
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Public function:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Search a SPU named function table for a specific function. Return
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * a pointer to it or NULL if not found.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncSPUGenericFunction crSPUFindFunction( const SPUNamedFunctionTable *table, const char *fname )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const SPUNamedFunctionTable *temp;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (temp = table ; temp->name != NULL ; temp++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!crStrcmp( fname, temp->name ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return temp->fn;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Public function:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Initializes the pointers in an SPUDispatchTable by looking for functions
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * in an SPUNamedFunctionTable.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * It doesn't know anything about SPUs and SPU inheritance.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crSPUInitDispatch( SPUDispatchTable *dispatch, const SPUNamedFunctionTable *table )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{"""
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncfor func_name in keys:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync print '\tdispatch->%s = (%sFunc_t) crSPUFindFunction(table, "%s");' % (func_name, func_name, func_name)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncprint '}'
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncprint """
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Generic no-op function
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int NopFunction(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning("Calling generic no-op function in dispatch.c");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Scan the given dispatch table for NULL pointers. Hook in the generic
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * no-op function wherever we find a NULL pointer.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crSPUInitDispatchNops(SPUDispatchTable *table)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This is a bit tricky. We walk over all the function pointers in
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the SPUDispatchTable struct, checking for NULL and setting NULL
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * pointers to point to NopFunction().
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * But we have to stop when we get to the copyList pointer!
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync const int numEntries = (void **) &(table->copyList) - (void **) &(table->Accum);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync void **ptr = (void **) table;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < numEntries; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ptr[i] == NULL) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*printf("!!!!!!!Warning entry[%d] = NULL\n", i);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ptr[i] = (void *)NopFunction;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync"""