# HG changeset patch # User nkeynes # Date 1190964395 0 # Node ID d24ab36150c47e38e688c10e3f1c52716abb3203 # Parent 9289b62f8f337a232146bd7d800971265cb4c103 Add xlat_get_lut_entry method Force blocks to be 32-bit aligned (slight optimization) --- a/src/sh4/xltcache.c Fri Sep 28 07:25:22 2007 +0000 +++ b/src/sh4/xltcache.c Fri Sep 28 07:26:35 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: xltcache.c,v 1.5 2007-09-20 08:35:04 nkeynes Exp $ + * $Id: xltcache.c,v 1.6 2007-09-28 07:26:35 nkeynes Exp $ * * Translation cache management. This part is architecture independent. * @@ -197,18 +197,31 @@ void *xlat_get_code( sh4addr_t address ) { + void *result; void **page = xlat_lut[XLAT_LUT_PAGE(address)]; + if( page != NULL ) { + result = (void *)(((uint32_t)page[XLAT_LUT_ENTRY(address)]) & 0xFFFFFFFC); + } + return result; +} + +void **xlat_get_lut_entry( sh4addr_t address ) +{ + void **page = xlat_lut[XLAT_LUT_PAGE(address)]; + + /* Add the LUT entry for the block */ if( page == NULL ) { - return NULL; + xlat_lut[XLAT_LUT_PAGE(address)] = page = + mmap( NULL, XLAT_LUT_PAGE_SIZE, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 ); + memset( page, 0, XLAT_LUT_PAGE_SIZE ); } - void *result = page[XLAT_LUT_ENTRY(address)]; - if( result == ((void *)(1)) ) { - return NULL; - } else { - return result; - } + + return &page[XLAT_LUT_ENTRY(address)]; } + + uint32_t xlat_get_block_size( void *block ) { xlat_cache_block_t xlt = (xlat_cache_block_t)(((char *)block)-sizeof(struct xlat_cache_block)); @@ -223,6 +236,7 @@ */ static inline xlat_cache_block_t xlat_cut_block( xlat_cache_block_t block, int cutsize ) { + cutsize = (cutsize + 3) & 0xFFFFFFFC; // force word alignment if( block->size > cutsize + MIN_TOTAL_SIZE ) { int oldsize = block->size; block->size = cutsize; --- a/src/sh4/xltcache.h Fri Sep 28 07:25:22 2007 +0000 +++ b/src/sh4/xltcache.h Fri Sep 28 07:26:35 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: xltcache.h,v 1.4 2007-09-20 08:35:04 nkeynes Exp $ + * $Id: xltcache.h,v 1.5 2007-09-28 07:26:35 nkeynes Exp $ * * Translation cache support (architecture independent) * @@ -69,6 +69,12 @@ void *xlat_get_code( sh4addr_t address ); /** + * Retrieve the address of the lookup table entry corresponding to the + * given SH4 address. + */ +void **xlat_get_lut_entry( sh4addr_t address ); + +/** * Retrieve the size of the code block starting at the specified pointer. If the * pointer is not a valid code block, the return value is undefined. */