nkeynes@931: /** nkeynes@931: * $Id$ nkeynes@931: * nkeynes@931: * MMU/TLB definitions. nkeynes@931: * nkeynes@931: * Copyright (c) 2005 Nathan Keynes. nkeynes@931: * nkeynes@931: * This program is free software; you can redistribute it and/or modify nkeynes@931: * it under the terms of the GNU General Public License as published by nkeynes@931: * the Free Software Foundation; either version 2 of the License, or nkeynes@931: * (at your option) any later version. nkeynes@931: * nkeynes@931: * This program is distributed in the hope that it will be useful, nkeynes@931: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@931: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@931: * GNU General Public License for more details. nkeynes@931: */ nkeynes@931: nkeynes@931: nkeynes@931: #ifndef lxdream_sh4_mmu_H nkeynes@931: #define lxdream_sh4_mmu_H 1 nkeynes@931: nkeynes@931: #include "lxdream.h" nkeynes@931: nkeynes@931: #ifdef __cplusplus nkeynes@931: extern "C" { nkeynes@931: #endif nkeynes@931: nkeynes@931: #define VMA_TO_EXT_ADDR(vma) ((vma)&0x1FFFFFFF) nkeynes@931: nkeynes@931: /************************** UTLB/ITLB Definitions ***************************/ nkeynes@939: /* mmucr register bits */ nkeynes@939: #define MMUCR_AT 0x00000001 /* Address Translation enabled */ nkeynes@939: #define MMUCR_TI 0x00000004 /* TLB invalidate (always read as 0) */ nkeynes@939: #define MMUCR_SV 0x00000100 /* Single Virtual mode=1 / multiple virtual=0 */ nkeynes@939: #define MMUCR_SQMD 0x00000200 /* Store queue mode bit (0=user, 1=priv only) */ nkeynes@939: #define MMUCR_URC 0x0000FC00 /* UTLB access counter */ nkeynes@939: #define MMUCR_URB 0x00FC0000 /* UTLB entry boundary */ nkeynes@939: #define MMUCR_LRUI 0xFC000000 /* Least recently used ITLB */ nkeynes@939: #define MMUCR_MASK 0xFCFCFF05 nkeynes@939: #define MMUCR_RMASK 0xFCFCFF01 /* Read mask */ nkeynes@939: nkeynes@939: #define IS_TLB_ENABLED() (MMIO_READ(MMU, MMUCR)&MMUCR_AT) nkeynes@939: #define IS_SV_ENABLED() (MMIO_READ(MMU,MMUCR)&MMUCR_SV) nkeynes@939: nkeynes@931: #define ITLB_ENTRY_COUNT 4 nkeynes@931: #define UTLB_ENTRY_COUNT 64 nkeynes@931: nkeynes@931: /* Entry address */ nkeynes@931: #define TLB_VALID 0x00000100 nkeynes@931: #define TLB_USERMODE 0x00000040 nkeynes@931: #define TLB_WRITABLE 0x00000020 nkeynes@931: #define TLB_USERWRITABLE (TLB_WRITABLE|TLB_USERMODE) nkeynes@931: #define TLB_SIZE_MASK 0x00000090 nkeynes@931: #define TLB_SIZE_1K 0x00000000 nkeynes@931: #define TLB_SIZE_4K 0x00000010 nkeynes@931: #define TLB_SIZE_64K 0x00000080 nkeynes@931: #define TLB_SIZE_1M 0x00000090 nkeynes@931: #define TLB_CACHEABLE 0x00000008 nkeynes@931: #define TLB_DIRTY 0x00000004 nkeynes@931: #define TLB_SHARE 0x00000002 nkeynes@931: #define TLB_WRITETHRU 0x00000001 nkeynes@931: nkeynes@931: #define MASK_1K 0xFFFFFC00 nkeynes@931: #define MASK_4K 0xFFFFF000 nkeynes@931: #define MASK_64K 0xFFFF0000 nkeynes@931: #define MASK_1M 0xFFF00000 nkeynes@931: nkeynes@931: struct itlb_entry { nkeynes@931: sh4addr_t vpn; // Virtual Page Number nkeynes@931: uint32_t asid; // Process ID nkeynes@931: uint32_t mask; nkeynes@931: sh4addr_t ppn; // Physical Page Number nkeynes@931: uint32_t flags; nkeynes@931: }; nkeynes@931: nkeynes@931: struct utlb_entry { nkeynes@931: sh4addr_t vpn; // Virtual Page Number nkeynes@931: uint32_t mask; // Page size mask nkeynes@931: uint32_t asid; // Process ID nkeynes@931: sh4addr_t ppn; // Physical Page Number nkeynes@931: uint32_t flags; nkeynes@939: uint32_t pcmcia; // extra pcmcia data - not used in this implementation nkeynes@931: }; nkeynes@931: nkeynes@939: #define TLB_FUNC_SIZE 48 nkeynes@939: nkeynes@939: struct utlb_page_entry { nkeynes@939: struct mem_region_fn fn; nkeynes@939: mem_region_fn_t user_fn; nkeynes@939: mem_region_fn_t target; nkeynes@939: unsigned char code[TLB_FUNC_SIZE*8]; nkeynes@931: }; nkeynes@939: nkeynes@939: struct utlb_1k_entry { nkeynes@939: struct mem_region_fn fn; nkeynes@939: struct mem_region_fn user_fn; nkeynes@939: struct mem_region_fn *subpages[4]; nkeynes@939: struct mem_region_fn *user_subpages[4]; nkeynes@939: unsigned char code[TLB_FUNC_SIZE*16]; nkeynes@939: }; nkeynes@939: nkeynes@939: void mmu_utlb_init_vtable( struct utlb_entry *ent, struct utlb_page_entry *page, gboolean writable ); nkeynes@939: void mmu_utlb_1k_init_vtable( struct utlb_1k_entry *ent ); nkeynes@939: nkeynes@939: extern uint32_t mmu_urc; nkeynes@939: extern uint32_t mmu_urb; nkeynes@931: nkeynes@931: #ifdef __cplusplus nkeynes@931: } nkeynes@931: #endif nkeynes@931: #endif /* !lxdream_sh4_mmu_H */