filename | src/sh4/xltcache.c |
changeset | 407:d24ab36150c4 |
prev | 400:049d72a7a229 |
next | 410:5f8413358e7f |
author | nkeynes |
date | Fri Sep 28 07:27:20 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Change block signature to return pointer to next block (if known) Rewrite block-exit code |
file | annotate | diff | log | raw |
1.1 --- a/src/sh4/xltcache.c Thu Sep 20 08:35:04 2007 +00001.2 +++ b/src/sh4/xltcache.c Fri Sep 28 07:27:20 2007 +00001.3 @@ -1,5 +1,5 @@1.4 /**1.5 - * $Id: xltcache.c,v 1.5 2007-09-20 08:35:04 nkeynes Exp $1.6 + * $Id: xltcache.c,v 1.6 2007-09-28 07:26:35 nkeynes Exp $1.7 *1.8 * Translation cache management. This part is architecture independent.1.9 *1.10 @@ -197,18 +197,31 @@1.12 void *xlat_get_code( sh4addr_t address )1.13 {1.14 + void *result;1.15 void **page = xlat_lut[XLAT_LUT_PAGE(address)];1.16 + if( page != NULL ) {1.17 + result = (void *)(((uint32_t)page[XLAT_LUT_ENTRY(address)]) & 0xFFFFFFFC);1.18 + }1.19 + return result;1.20 +}1.21 +1.22 +void **xlat_get_lut_entry( sh4addr_t address )1.23 +{1.24 + void **page = xlat_lut[XLAT_LUT_PAGE(address)];1.25 +1.26 + /* Add the LUT entry for the block */1.27 if( page == NULL ) {1.28 - return NULL;1.29 + xlat_lut[XLAT_LUT_PAGE(address)] = page =1.30 + mmap( NULL, XLAT_LUT_PAGE_SIZE, PROT_READ|PROT_WRITE,1.31 + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0 );1.32 + memset( page, 0, XLAT_LUT_PAGE_SIZE );1.33 }1.34 - void *result = page[XLAT_LUT_ENTRY(address)];1.35 - if( result == ((void *)(1)) ) {1.36 - return NULL;1.37 - } else {1.38 - return result;1.39 - }1.40 +1.41 + return &page[XLAT_LUT_ENTRY(address)];1.42 }1.44 +1.45 +1.46 uint32_t xlat_get_block_size( void *block )1.47 {1.48 xlat_cache_block_t xlt = (xlat_cache_block_t)(((char *)block)-sizeof(struct xlat_cache_block));1.49 @@ -223,6 +236,7 @@1.50 */1.51 static inline xlat_cache_block_t xlat_cut_block( xlat_cache_block_t block, int cutsize )1.52 {1.53 + cutsize = (cutsize + 3) & 0xFFFFFFFC; // force word alignment1.54 if( block->size > cutsize + MIN_TOTAL_SIZE ) {1.55 int oldsize = block->size;1.56 block->size = cutsize;
.