nkeynes@102: /** nkeynes@561: * $Id$ nkeynes@102: * nkeynes@102: * Routines to add hook functions that are callable from the SH4 nkeynes@102: * nkeynes@102: * Copyright (c) 2005 Nathan Keynes. nkeynes@102: * nkeynes@102: * This program is free software; you can redistribute it and/or modify nkeynes@102: * it under the terms of the GNU General Public License as published by nkeynes@102: * the Free Software Foundation; either version 2 of the License, or nkeynes@102: * (at your option) any later version. nkeynes@102: * nkeynes@102: * This program is distributed in the hope that it will be useful, nkeynes@102: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@102: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@102: * GNU General Public License for more details. nkeynes@102: */ nkeynes@102: nkeynes@102: #include "dream.h" nkeynes@102: #include "mem.h" nkeynes@102: #include "syscall.h" nkeynes@102: #include "sh4/sh4core.h" nkeynes@102: nkeynes@102: nkeynes@102: struct syscall_hook { nkeynes@102: syscall_hook_func_t hook; nkeynes@102: sh4addr_t vector; nkeynes@102: } syscall_hooks[256]; nkeynes@102: nkeynes@102: void syscall_add_hook( uint32_t hook_id, syscall_hook_func_t hook ) nkeynes@102: { nkeynes@102: hook_id &= 0xFF; nkeynes@102: if( syscall_hooks[hook_id].hook != NULL ) nkeynes@102: WARN( "Overwriting existing hook %02X", hook_id ); nkeynes@102: syscall_hooks[hook_id].hook = hook; nkeynes@102: syscall_hooks[hook_id].vector = 0; nkeynes@102: } nkeynes@102: nkeynes@102: void syscall_add_hook_vector( uint32_t hook_id, uint32_t vector_addr, nkeynes@102: syscall_hook_func_t hook ) nkeynes@102: { nkeynes@102: hook_id &= 0xFF; nkeynes@102: syscall_add_hook( hook_id, hook ); nkeynes@102: syscall_hooks[hook_id].vector = vector_addr; nkeynes@102: sh4_write_long( vector_addr, 0xFFFFFF00 + hook_id ); nkeynes@102: } nkeynes@102: nkeynes@102: void syscall_invoke( uint32_t hook_id ) nkeynes@102: { nkeynes@102: hook_id &= 0xFF; nkeynes@102: syscall_hook_func_t hook = syscall_hooks[hook_id].hook; nkeynes@102: if( hook == NULL ) { nkeynes@102: WARN( "Invoked non-existent hook %02X", hook_id ); nkeynes@102: } else { nkeynes@102: hook(hook_id); nkeynes@102: } nkeynes@102: } nkeynes@102: nkeynes@102: void syscall_repatch_vectors( ) nkeynes@102: { nkeynes@102: int i; nkeynes@102: for( i=0; i<256; i++ ) { nkeynes@102: if( syscall_hooks[i].hook != NULL && nkeynes@102: syscall_hooks[i].vector != 0 ) { nkeynes@102: sh4_write_long( syscall_hooks[i].vector, 0xFFFFFF00 + i ); nkeynes@102: } nkeynes@102: } nkeynes@102: }