Search
lxdream.org :: lxdream/src/syscall.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/syscall.c
changeset 102:844a3f2a76ff
next561:533f6b478071
next586:2a3ba82cf243
author nkeynes
date Sun Nov 04 05:07:49 2007 +0000 (16 years ago)
permissions -rw-r--r--
last change Test for presence of linux/cdrom.h at configure time, and only build the
linux driver if it's found successfully
file annotate diff log raw
nkeynes@102
     1
/**
nkeynes@102
     2
 * $Id: syscall.c,v 1.1 2006-03-13 12:38:34 nkeynes Exp $
nkeynes@102
     3
 * 
nkeynes@102
     4
 * Routines to add hook functions that are callable from the SH4
nkeynes@102
     5
 *
nkeynes@102
     6
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@102
     7
 *
nkeynes@102
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@102
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@102
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@102
    11
 * (at your option) any later version.
nkeynes@102
    12
 *
nkeynes@102
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@102
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@102
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@102
    16
 * GNU General Public License for more details.
nkeynes@102
    17
 */
nkeynes@102
    18
nkeynes@102
    19
#include "dream.h"
nkeynes@102
    20
#include "mem.h"
nkeynes@102
    21
#include "syscall.h"
nkeynes@102
    22
#include "sh4/sh4core.h"
nkeynes@102
    23
nkeynes@102
    24
nkeynes@102
    25
struct syscall_hook {
nkeynes@102
    26
    syscall_hook_func_t hook;
nkeynes@102
    27
    sh4addr_t vector;
nkeynes@102
    28
} syscall_hooks[256];
nkeynes@102
    29
nkeynes@102
    30
void syscall_add_hook( uint32_t hook_id, syscall_hook_func_t hook ) 
nkeynes@102
    31
{
nkeynes@102
    32
    hook_id &= 0xFF;
nkeynes@102
    33
    if( syscall_hooks[hook_id].hook != NULL )
nkeynes@102
    34
	WARN( "Overwriting existing hook %02X", hook_id );
nkeynes@102
    35
    syscall_hooks[hook_id].hook = hook;
nkeynes@102
    36
    syscall_hooks[hook_id].vector = 0;
nkeynes@102
    37
}
nkeynes@102
    38
nkeynes@102
    39
void syscall_add_hook_vector( uint32_t hook_id, uint32_t vector_addr,
nkeynes@102
    40
			      syscall_hook_func_t hook )
nkeynes@102
    41
{
nkeynes@102
    42
    hook_id &= 0xFF;
nkeynes@102
    43
    syscall_add_hook( hook_id, hook );
nkeynes@102
    44
    syscall_hooks[hook_id].vector = vector_addr;
nkeynes@102
    45
    sh4_write_long( vector_addr, 0xFFFFFF00 + hook_id );
nkeynes@102
    46
}
nkeynes@102
    47
nkeynes@102
    48
void syscall_invoke( uint32_t hook_id )
nkeynes@102
    49
{
nkeynes@102
    50
    hook_id &= 0xFF;
nkeynes@102
    51
    syscall_hook_func_t hook = syscall_hooks[hook_id].hook;
nkeynes@102
    52
    if( hook == NULL ) {
nkeynes@102
    53
	WARN( "Invoked non-existent hook %02X", hook_id );
nkeynes@102
    54
    } else {
nkeynes@102
    55
	hook(hook_id);
nkeynes@102
    56
    }
nkeynes@102
    57
}
nkeynes@102
    58
nkeynes@102
    59
void syscall_repatch_vectors( )
nkeynes@102
    60
{
nkeynes@102
    61
    int i;
nkeynes@102
    62
    for( i=0; i<256; i++ ) {
nkeynes@102
    63
	if( syscall_hooks[i].hook != NULL &&
nkeynes@102
    64
	    syscall_hooks[i].vector != 0 ) {
nkeynes@102
    65
	    sh4_write_long( syscall_hooks[i].vector, 0xFFFFFF00 + i );
nkeynes@102
    66
	}
nkeynes@102
    67
    }
nkeynes@102
    68
}
.