# HG changeset patch # User nkeynes # Date 1324592417 -36000 # Node ID 01ae5cbad4c8440802cb6ab422007a9b6eac343c # Parent 5502572ce192e4c38764cee16765d340b3a51a76 Move the exception exit macros up to sh4core.h --- a/src/sh4/mmu.c Thu Dec 22 18:10:36 2011 +1000 +++ b/src/sh4/mmu.c Fri Dec 23 08:20:17 2011 +1000 @@ -27,13 +27,6 @@ #include "mem.h" #include "mmu.h" -#define RAISE_TLB_ERROR(code, vpn) sh4_raise_tlb_exception(code, vpn) -#define RAISE_MEM_ERROR(code, vpn) \ - MMIO_WRITE(MMU, TEA, vpn); \ - MMIO_WRITE(MMU, PTEH, ((MMIO_READ(MMU, PTEH) & 0x000003FF) | (vpn&0xFFFFFC00))); \ - sh4_raise_exception(code); -#define RAISE_TLB_MULTIHIT_ERROR(vpn) sh4_raise_tlb_multihit(vpn) - /* An entry is a 1K entry if it's one of the mmu_utlb_1k_pages entries */ #define IS_1K_PAGE_ENTRY(ent) ( ((uintptr_t)(((struct utlb_1k_entry *)ent) - &mmu_utlb_1k_pages[0])) < UTLB_ENTRY_COUNT ) @@ -1198,13 +1191,6 @@ } /********************** TLB Direct-Access Regions ***************************/ -#ifdef HAVE_FRAME_ADDRESS -#define EXCEPTION_EXIT() do{ *(((void * volatile *)__builtin_frame_address(0))+1) = exc; } while(0) -#else -#define EXCEPTION_EXIT() sh4_core_exit(CORE_EXIT_EXCEPTION) -#endif - - #define ITLB_ENTRY(addr) ((addr>>7)&0x03) int32_t FASTCALL mmu_itlb_addr_read( sh4addr_t addr ) @@ -1326,7 +1312,7 @@ if( itlb == -2 || utlb == -2 ) { RAISE_TLB_MULTIHIT_ERROR(addr); /* FIXME: should this only be raised if TLB is enabled? */ - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return; } } else { @@ -1389,60 +1375,60 @@ static void FASTCALL address_error_read( sh4addr_t addr, void *exc ) { RAISE_MEM_ERROR(EXC_DATA_ADDR_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL address_error_read_for_write( sh4addr_t addr, void *exc ) { RAISE_MEM_ERROR(EXC_DATA_ADDR_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL address_error_read_burst( unsigned char *dest, sh4addr_t addr, void *exc ) { RAISE_MEM_ERROR(EXC_DATA_ADDR_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL address_error_write( sh4addr_t addr, uint32_t val, void *exc ) { RAISE_MEM_ERROR(EXC_DATA_ADDR_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL tlb_miss_read( sh4addr_t addr, void *exc ) { mmu_urc++; RAISE_TLB_ERROR(EXC_TLB_MISS_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL tlb_miss_read_for_write( sh4addr_t addr, void *exc ) { mmu_urc++; RAISE_TLB_ERROR(EXC_TLB_MISS_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL tlb_miss_read_burst( unsigned char *dest, sh4addr_t addr, void *exc ) { mmu_urc++; RAISE_TLB_ERROR(EXC_TLB_MISS_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL tlb_miss_write( sh4addr_t addr, uint32_t val, void *exc ) { mmu_urc++; RAISE_TLB_ERROR(EXC_TLB_MISS_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static int32_t FASTCALL tlb_protected_read( sh4addr_t addr, void *exc ) { mmu_urc++; RAISE_MEM_ERROR(EXC_TLB_PROT_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } @@ -1450,7 +1436,7 @@ { mmu_urc++; RAISE_MEM_ERROR(EXC_TLB_PROT_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } @@ -1458,7 +1444,7 @@ { mmu_urc++; RAISE_MEM_ERROR(EXC_TLB_PROT_READ, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } @@ -1466,41 +1452,41 @@ { mmu_urc++; RAISE_MEM_ERROR(EXC_TLB_PROT_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static void FASTCALL tlb_initial_write( sh4addr_t addr, uint32_t val, void *exc ) { mmu_urc++; RAISE_MEM_ERROR(EXC_INIT_PAGE_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } static int32_t FASTCALL tlb_initial_read_for_write( sh4addr_t addr, void *exc ) { mmu_urc++; RAISE_MEM_ERROR(EXC_INIT_PAGE_WRITE, addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } static int32_t FASTCALL tlb_multi_hit_read( sh4addr_t addr, void *exc ) { sh4_raise_tlb_multihit(addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } static int32_t FASTCALL tlb_multi_hit_read_burst( unsigned char *dest, sh4addr_t addr, void *exc ) { sh4_raise_tlb_multihit(addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); return 0; } static void FASTCALL tlb_multi_hit_write( sh4addr_t addr, uint32_t val, void *exc ) { sh4_raise_tlb_multihit(addr); - EXCEPTION_EXIT(); + SH4_EXCEPTION_EXIT(); } /** --- a/src/sh4/sh4core.h Thu Dec 22 18:10:36 2011 +1000 +++ b/src/sh4/sh4core.h Fri Dec 23 08:20:17 2011 +1000 @@ -242,6 +242,19 @@ void FASTCALL sh4_raise_tlb_multihit( sh4vma_t ); void FASTCALL sh4_accept_interrupt( void ); +#define RAISE_TLB_ERROR(code, vpn) sh4_raise_tlb_exception(code, vpn) +#define RAISE_MEM_ERROR(code, vpn) \ + MMIO_WRITE(MMU, TEA, vpn); \ + MMIO_WRITE(MMU, PTEH, ((MMIO_READ(MMU, PTEH) & 0x000003FF) | (vpn&0xFFFFFC00))); \ + sh4_raise_exception(code); +#define RAISE_TLB_MULTIHIT_ERROR(vpn) sh4_raise_tlb_multihit(vpn) + +#ifdef HAVE_FRAME_ADDRESS +#define SH4_EXCEPTION_EXIT() do{ *(((void * volatile *)__builtin_frame_address(0))+1) = exc; } while(0) +#else +#define SH4_EXCEPTION_EXIT() sh4_core_exit(CORE_EXIT_EXCEPTION) +#endif + /** * Helper method to update the SH4 registers for an exception, without * touching the MMU registers. Mainly for use in shadow mode. --- a/src/sh4/shadow.c Thu Dec 22 18:10:36 2011 +1000 +++ b/src/sh4/shadow.c Fri Dec 23 08:20:17 2011 +1000 @@ -31,10 +31,8 @@ #ifdef HAVE_FRAME_ADDRESS static FASTCALL __attribute__((noinline)) void *__first_arg(void *a, void *b) { return a; } #define INIT_EXCEPTIONS(label) goto *__first_arg(&&fnstart,&&label); fnstart: -#define EXCEPTION_EXIT(exc) do{ *(((void * volatile *)__builtin_frame_address(0))+1) = exc; } while(0) #else #define INIT_EXCEPTIONS(label) -#define EXCEPTION_EXIT(exc) sh4_core_exit(CORE_EXIT_EXCEPTION) #endif typedef enum { @@ -211,7 +209,7 @@ return rv; except: log_mem_op( READ_LONG, addr, rv, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL int32_t log_read_word( sh4addr_t addr, void *exc ) @@ -222,7 +220,7 @@ return rv; except: log_mem_op( READ_WORD, addr, rv, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL int32_t log_read_byte( sh4addr_t addr, void *exc ) @@ -233,7 +231,7 @@ return rv; except: log_mem_op( READ_BYTE, addr, rv, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL int32_t log_read_byte_for_write( sh4addr_t addr, void *exc ) @@ -244,7 +242,7 @@ return rv; except: log_mem_op( READ_BYTE_FOR_WRITE, addr, rv, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL void log_write_long( sh4addr_t addr, uint32_t val, void *exc ) @@ -257,7 +255,7 @@ except: if( !IS_STORE_QUEUE(addr) ) log_mem_op( WRITE_LONG, addr, val, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL void log_write_word( sh4addr_t addr, uint32_t val, void *exc ) @@ -270,7 +268,7 @@ except: if( !IS_STORE_QUEUE(addr) ) log_mem_op( WRITE_WORD, addr, val, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL void log_write_byte( sh4addr_t addr, uint32_t val, void *exc ) @@ -283,7 +281,7 @@ except: if( !IS_STORE_QUEUE(addr) ) log_mem_op( WRITE_BYTE, addr, val, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL void log_prefetch( sh4addr_t addr, void *exc ) @@ -294,7 +292,7 @@ return; except: log_mem_op( PREFETCH, addr, 0, 1 ); - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } static FASTCALL int32_t check_read_long( sh4addr_t addr, void *exc ) @@ -302,7 +300,7 @@ int except; int32_t value = check_mem_op( READ_LONG, addr, 0, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } return value; } @@ -312,7 +310,7 @@ int except; int32_t value = check_mem_op( READ_WORD, addr, 0, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } return value; } @@ -322,7 +320,7 @@ int except; int32_t value = check_mem_op( READ_BYTE, addr, 0, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } return value; } @@ -332,7 +330,7 @@ int except; int32_t value = check_mem_op( READ_BYTE_FOR_WRITE, addr, 0, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } return value; } @@ -343,7 +341,7 @@ int except; check_mem_op( WRITE_LONG, addr, value, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } } else { real_address_space[addr>>12]->write_long(addr, value); @@ -356,7 +354,7 @@ int except; check_mem_op( WRITE_WORD, addr, value, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } } else { real_address_space[addr>>12]->write_word(addr, value); @@ -369,7 +367,7 @@ int except; check_mem_op( WRITE_BYTE, addr, value, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } } else { real_address_space[addr>>12]->write_byte(addr, value); @@ -381,7 +379,7 @@ int except; check_mem_op( PREFETCH, addr, 0, &except ); if( except ) { - EXCEPTION_EXIT(exc); + SH4_EXCEPTION_EXIT(); } }