nkeynes@561: /** nkeynes@561: * $Id$ nkeynes@561: * nkeynes@561: * Translation cache test functions nkeynes@561: * nkeynes@561: * Copyright (c) 2005 Nathan Keynes. nkeynes@561: * nkeynes@561: * This program is free software; you can redistribute it and/or modify nkeynes@561: * it under the terms of the GNU General Public License as published by nkeynes@561: * the Free Software Foundation; either version 2 of the License, or nkeynes@561: * (at your option) any later version. nkeynes@561: * nkeynes@561: * This program is distributed in the hope that it will be useful, nkeynes@561: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@561: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@561: * GNU General Public License for more details. nkeynes@561: */ nkeynes@561: nkeynes@363: #include nkeynes@363: #include "sh4/xltcache.h" nkeynes@363: #include "dreamcast.h" nkeynes@363: nkeynes@363: extern xlat_cache_block_t xlat_new_cache; nkeynes@363: extern xlat_cache_block_t xlat_new_cache_ptr; nkeynes@363: extern xlat_cache_block_t xlat_temp_cache; nkeynes@363: extern xlat_cache_block_t xlat_temp_cache_ptr; nkeynes@363: nkeynes@363: /** nkeynes@363: * Test initial allocations from the new cache nkeynes@363: */ nkeynes@363: void test_initial() nkeynes@363: { nkeynes@363: int i; nkeynes@363: xlat_cache_block_t block = xlat_start_block( 0x0C008000 ); nkeynes@363: assert( block->active == 1 ); nkeynes@363: assert( block->size == XLAT_NEW_CACHE_SIZE - (2*sizeof(struct xlat_cache_block)) ); nkeynes@363: memset( block->code, 0xB5, 8192 ); nkeynes@515: xlat_commit_block( 8192, 100 ); nkeynes@363: assert( block->active == 1 ); nkeynes@363: assert( block->size == 8192 ); nkeynes@363: nkeynes@363: int size = XLAT_NEW_CACHE_SIZE - (4*sizeof(struct xlat_cache_block)) - 8192 - 4096; nkeynes@363: xlat_cache_block_t block2 = xlat_start_block( 0x0C009000 ); nkeynes@363: assert( block2->active == 1 ); nkeynes@363: assert( block2->size == XLAT_NEW_CACHE_SIZE - (3*sizeof(struct xlat_cache_block)) - 8192 ); nkeynes@363: memset( block2->code, 0x6D, size ); nkeynes@515: xlat_commit_block( size, 200 ); nkeynes@363: assert( block2->active == 1 ); nkeynes@363: assert( block2->size == size ); nkeynes@363: nkeynes@363: void *addr = xlat_get_code( 0x0C008000 ); nkeynes@363: assert( addr == &block->code ); nkeynes@363: addr = xlat_get_code( 0x0C009000 ); nkeynes@363: assert( addr == &block2->code ); nkeynes@363: addr = xlat_get_code( 0x0C008002 ); nkeynes@363: assert( addr == NULL ); nkeynes@363: nkeynes@363: xlat_cache_block_t block3 = xlat_start_block( 0x0D009800 ); nkeynes@363: assert( block3->active == 1 ); nkeynes@363: assert( block3->size == 4096 ); nkeynes@363: memset( block3->code, 0x9C, 4096 ); nkeynes@515: xlat_cache_block_t block3a = xlat_extend_block(8192); nkeynes@363: assert( block3a != block3 ); nkeynes@363: assert( block3a == block ); nkeynes@363: assert( block3a->active == 1 ); nkeynes@363: assert( block3a->size = 8192 ); nkeynes@363: assert( block3->active == 0 ); nkeynes@363: assert( block3->size == 4096 ); nkeynes@363: for( i=0; i<4096; i++ ) { nkeynes@363: assert( block3a->code[i] == 0x9C ); nkeynes@363: } nkeynes@363: for( i=4096; i<8192; i++ ) { nkeynes@363: assert( block3a->code[i] == 0xB5 ); nkeynes@363: } nkeynes@515: xlat_commit_block(6142, 432); nkeynes@363: addr = xlat_get_code( 0x0D009800 ); nkeynes@363: assert( addr == &block3a->code ); nkeynes@363: /* check promoted block in temp cache */ nkeynes@363: addr = xlat_get_code( 0x0C008000 ); nkeynes@363: assert( addr == &xlat_temp_cache->code ); nkeynes@363: assert( xlat_temp_cache->active == 1 ); nkeynes@363: assert( xlat_temp_cache->size == 8192 ); nkeynes@363: for( i=0; i<8192; i++ ) { nkeynes@363: assert( xlat_temp_cache->code[i] == 0xB5 ); nkeynes@363: } nkeynes@363: } nkeynes@363: nkeynes@363: int main() nkeynes@363: { nkeynes@363: xlat_cache_init(); nkeynes@363: xlat_check_integrity(); nkeynes@363: nkeynes@363: test_initial(); nkeynes@363: return 0; nkeynes@363: }