Search
lxdream.org :: lxdream/src/sh4/sh4trans.h
lxdream 0.9.1
released Jun 29
Download Now
filename src/sh4/sh4trans.h
changeset 905:4c17ebd9ef5e
prev835:2381ddfd3fdd
next926:68f3e0fe02f1
author nkeynes
date Thu Dec 11 23:26:03 2008 +0000 (15 years ago)
permissions -rw-r--r--
last change Disable the generational translation cache - I've got no evidence that it
actually helps performance, and it simplifies things to get rid of it (in
particular, translated code doesn't have to worry about being moved now).
file annotate diff log raw
nkeynes@359
     1
/**
nkeynes@586
     2
 * $Id$
nkeynes@359
     3
 * 
nkeynes@359
     4
 * SH4->x86 translation module
nkeynes@359
     5
 *
nkeynes@359
     6
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@359
     7
 *
nkeynes@359
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@359
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@359
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@359
    11
 * (at your option) any later version.
nkeynes@359
    12
 *
nkeynes@359
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@359
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@359
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@359
    16
 * GNU General Public License for more details.
nkeynes@359
    17
 */
nkeynes@359
    18
nkeynes@736
    19
#ifndef lxdream_sh4trans_H
nkeynes@736
    20
#define lxdream_sh4trans_H 1
nkeynes@736
    21
nkeynes@586
    22
#include "sh4/xltcache.h"
nkeynes@359
    23
#include "dream.h"
nkeynes@359
    24
#include "mem.h"
nkeynes@359
    25
nkeynes@736
    26
#ifdef __cplusplus
nkeynes@736
    27
extern "C" {
nkeynes@736
    28
#endif
nkeynes@736
    29
nkeynes@707
    30
/** Maximum size of a translated instruction, in bytes. Current worst case seems
nkeynes@707
    31
 * to be a BF/S followed by one of the long FMOVs.
nkeynes@359
    32
 */
nkeynes@835
    33
#define MAX_INSTRUCTION_SIZE 512
nkeynes@410
    34
/** Maximum size of the translation epilogue (current real size is 116 bytes, so
nkeynes@410
    35
 * allows a little room
nkeynes@410
    36
 */
nkeynes@410
    37
#define EPILOGUE_SIZE 128
nkeynes@586
    38
nkeynes@586
    39
/** Maximum number of recovery records for a translated block (2048 based on
nkeynes@586
    40
 * 1 record per SH4 instruction in a 4K page).
nkeynes@586
    41
 */
nkeynes@733
    42
#define MAX_RECOVERY_SIZE 2049
nkeynes@586
    43
nkeynes@359
    44
/**
nkeynes@359
    45
 */
nkeynes@359
    46
uint32_t sh4_xlat_run_slice( uint32_t nanosecs );
nkeynes@359
    47
nkeynes@359
    48
/**
nkeynes@586
    49
 * Return true if translated code is currently running
nkeynes@586
    50
 */
nkeynes@586
    51
gboolean sh4_xlat_is_running();
nkeynes@586
    52
nkeynes@586
    53
/**
nkeynes@669
    54
 * Initialize the translation engine (if required). Note xlat cache
nkeynes@669
    55
 * must already be initialized.
nkeynes@669
    56
 */
nkeynes@669
    57
void sh4_xlat_init();
nkeynes@669
    58
nkeynes@669
    59
/**
nkeynes@359
    60
 * Translate the specified block of code starting from the specified start
nkeynes@359
    61
 * address until the first branch/jump instruction.
nkeynes@359
    62
 */
nkeynes@359
    63
void *sh4_translate_basic_block( sh4addr_t start );
nkeynes@359
    64
nkeynes@669
    65
/**
nkeynes@669
    66
 * Add a recovery record for the current code generation position, with the
nkeynes@669
    67
 * specified instruction count
nkeynes@669
    68
 */
nkeynes@669
    69
void sh4_translate_add_recovery( uint32_t icount );
nkeynes@586
    70
nkeynes@359
    71
extern uint8_t *xlat_output;
nkeynes@586
    72
extern struct xlat_recovery_record xlat_recovery[MAX_RECOVERY_SIZE];
nkeynes@604
    73
extern xlat_cache_block_t xlat_current_block;
nkeynes@586
    74
extern uint32_t xlat_recovery_posn;
nkeynes@359
    75
nkeynes@526
    76
/******************************************************************************
nkeynes@526
    77
 * Code generation - these methods must be provided by the
nkeynes@526
    78
 * actual code gen (eg sh4x86.c) 
nkeynes@526
    79
 ******************************************************************************/
nkeynes@359
    80
nkeynes@527
    81
#define TARGET_X86 1
nkeynes@527
    82
nkeynes@669
    83
void sh4_translate_init( void );
nkeynes@408
    84
void sh4_translate_begin_block( sh4addr_t pc );
nkeynes@526
    85
uint32_t sh4_translate_instruction( sh4addr_t pc );
nkeynes@359
    86
void sh4_translate_end_block( sh4addr_t pc );
nkeynes@593
    87
uint32_t sh4_translate_end_block_size();
nkeynes@669
    88
void sh4_translate_emit_breakpoint( sh4vma_t pc );
nkeynes@586
    89
nkeynes@586
    90
typedef void (*unwind_thunk_t)(void);
nkeynes@586
    91
nkeynes@586
    92
/**
nkeynes@586
    93
 * From within the translator, (typically called from MMU exception handling routines)
nkeynes@586
    94
 * immediately exit the current translation block (performing cleanup as necessary) and
nkeynes@586
    95
 * return to sh4_xlat_run_slice(). Effectively a fast longjmp w/ xlat recovery.
nkeynes@586
    96
 *
nkeynes@586
    97
 * Note: The correct working of this method depends on the translator anticipating the
nkeynes@586
    98
 * exception and generating the appropriate recovery block(s) - currently this means 
nkeynes@586
    99
 * that it should ONLY be called from within the context of a memory read or write.
nkeynes@586
   100
 *
nkeynes@586
   101
 * @param is_completion If TRUE, exit after completing the current instruction (effectively),
nkeynes@586
   102
 *   otherwise abort the current instruction with no effect. 
nkeynes@586
   103
 * @param thunk A function to execute after perform xlat recovery, but before returning
nkeynes@586
   104
 * to run_slice. If NULL, control returns directly.
nkeynes@586
   105
 * @return This method never returns. 
nkeynes@586
   106
 */
nkeynes@586
   107
void sh4_translate_unwind_stack( gboolean is_completion, unwind_thunk_t thunk );
nkeynes@586
   108
nkeynes@586
   109
/**
nkeynes@740
   110
 * Called when doing a break out of the translator - finalizes the system state up to
nkeynes@740
   111
 * the end of the current instruction.
nkeynes@586
   112
 */
nkeynes@740
   113
void sh4_translate_exit_recover( );
nkeynes@591
   114
nkeynes@591
   115
/**
nkeynes@669
   116
 * From within the translator, exit the current block at the end of the 
nkeynes@740
   117
 * current instruction, flush the translation cache (completely) 
nkeynes@740
   118
 * @return TRUE to perform a vm-exit/continue after the flush
nkeynes@669
   119
 */
nkeynes@740
   120
gboolean sh4_translate_flush_cache( void );
nkeynes@669
   121
nkeynes@669
   122
/**
nkeynes@591
   123
 * Support function called from the translator when a breakpoint is hit.
nkeynes@591
   124
 * Either returns immediately (to skip the breakpoint), or aborts the current
nkeynes@591
   125
 * cycle and never returns.
nkeynes@591
   126
 */
nkeynes@905
   127
void FASTCALL sh4_translate_breakpoint_hit( sh4vma_t pc );
nkeynes@736
   128
nkeynes@736
   129
#ifdef __cplusplus
nkeynes@736
   130
}
nkeynes@736
   131
#endif
nkeynes@736
   132
nkeynes@760
   133
#endif /* !lxdream_sh4trans_H */
.