MIPS: tlbex: Better debug output.
Pgtable bits are assigned dynamically depending on processor feature and statically based on kernel configuration. To make sense out of the disassembled TLB exception handlers a list of the actual assignments used for a particular configuration and hardware setup can be very useful. Output the actual TLB exception handlers in a format that simplifies their post processsing from dmesg output. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@@ -34,38 +34,72 @@
|
||||
*/
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
|
||||
|
||||
#define _PAGE_PRESENT (1<<6) /* implemented in software */
|
||||
#define _PAGE_READ (1<<7) /* implemented in software */
|
||||
#define _PAGE_WRITE (1<<8) /* implemented in software */
|
||||
#define _PAGE_ACCESSED (1<<9) /* implemented in software */
|
||||
#define _PAGE_MODIFIED (1<<10) /* implemented in software */
|
||||
#define _PAGE_FILE (1<<10) /* set:pagecache unset:swap */
|
||||
/*
|
||||
* The following bits are directly used by the TLB hardware
|
||||
*/
|
||||
#define _PAGE_R4KBUG (1 << 0) /* workaround for r4k bug */
|
||||
#define _PAGE_GLOBAL (1 << 0)
|
||||
#define _PAGE_VALID_SHIFT 1
|
||||
#define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
|
||||
#define _PAGE_SILENT_READ (1 << 1) /* synonym */
|
||||
#define _PAGE_DIRTY_SHIFT 2
|
||||
#define _PAGE_DIRTY (1 << _PAGE_DIRTY_SHIFT) /* The MIPS dirty bit */
|
||||
#define _PAGE_SILENT_WRITE (1 << 2)
|
||||
#define _CACHE_SHIFT 3
|
||||
#define _CACHE_MASK (7 << 3)
|
||||
|
||||
#define _PAGE_R4KBUG (1<<0) /* workaround for r4k bug */
|
||||
#define _PAGE_GLOBAL (1<<0)
|
||||
#define _PAGE_VALID (1<<1)
|
||||
#define _PAGE_SILENT_READ (1<<1) /* synonym */
|
||||
#define _PAGE_DIRTY (1<<2) /* The MIPS dirty bit */
|
||||
#define _PAGE_SILENT_WRITE (1<<2)
|
||||
#define _CACHE_SHIFT 3
|
||||
#define _CACHE_MASK (7<<3)
|
||||
/*
|
||||
* The following bits are implemented in software
|
||||
*
|
||||
* _PAGE_FILE semantics: set:pagecache unset:swap
|
||||
*/
|
||||
#define _PAGE_PRESENT_SHIFT 6
|
||||
#define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
|
||||
#define _PAGE_READ_SHIFT 7
|
||||
#define _PAGE_READ (1 << _PAGE_READ_SHIFT)
|
||||
#define _PAGE_WRITE_SHIFT 8
|
||||
#define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
|
||||
#define _PAGE_ACCESSED_SHIFT 9
|
||||
#define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
|
||||
#define _PAGE_MODIFIED_SHIFT 10
|
||||
#define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
|
||||
|
||||
#define _PAGE_FILE (1 << 10)
|
||||
|
||||
#elif defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
|
||||
|
||||
#define _PAGE_PRESENT (1<<0) /* implemented in software */
|
||||
#define _PAGE_READ (1<<1) /* implemented in software */
|
||||
#define _PAGE_WRITE (1<<2) /* implemented in software */
|
||||
#define _PAGE_ACCESSED (1<<3) /* implemented in software */
|
||||
#define _PAGE_MODIFIED (1<<4) /* implemented in software */
|
||||
#define _PAGE_FILE (1<<4) /* set:pagecache unset:swap */
|
||||
/*
|
||||
* The following are implemented by software
|
||||
*
|
||||
* _PAGE_FILE semantics: set:pagecache unset:swap
|
||||
*/
|
||||
#define _PAGE_PRESENT_SHIFT 0
|
||||
#define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
|
||||
#define _PAGE_READ_SHIFT 1
|
||||
#define _PAGE_READ (1 << _PAGE_READ_SHIFT)
|
||||
#define _PAGE_WRITE_SHIFT 2
|
||||
#define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
|
||||
#define _PAGE_ACCESSED_SHIFT 3
|
||||
#define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
|
||||
#define _PAGE_MODIFIED_SHIFT 4
|
||||
#define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
|
||||
#define _PAGE_FILE_SHIFT 4
|
||||
#define _PAGE_FILE (1 << _PAGE_FILE_SHIFT)
|
||||
|
||||
#define _PAGE_GLOBAL (1<<8)
|
||||
#define _PAGE_VALID (1<<9)
|
||||
#define _PAGE_SILENT_READ (1<<9) /* synonym */
|
||||
#define _PAGE_DIRTY (1<<10) /* The MIPS dirty bit */
|
||||
#define _PAGE_SILENT_WRITE (1<<10)
|
||||
#define _CACHE_UNCACHED (1<<11)
|
||||
#define _CACHE_MASK (1<<11)
|
||||
/*
|
||||
* And these are the hardware TLB bits
|
||||
*/
|
||||
#define _PAGE_GLOBAL_SHIFT 8
|
||||
#define _PAGE_GLOBAL (1 << _PAGE_GLOBAL_SHIFT)
|
||||
#define _PAGE_VALID_SHIFT 9
|
||||
#define _PAGE_VALID (1 << _PAGE_VALID_SHIFT)
|
||||
#define _PAGE_SILENT_READ (1 << _PAGE_VALID_SHIFT) /* synonym */
|
||||
#define _PAGE_DIRTY_SHIFT 10
|
||||
#define _PAGE_DIRTY (1 << _PAGE_DIRTY_SHIFT)
|
||||
#define _PAGE_SILENT_WRITE (1 << _PAGE_DIRTY_SHIFT)
|
||||
#define _CACHE_UNCACHED_SHIFT 11
|
||||
#define _CACHE_UNCACHED (1 << _CACHE_UNCACHED_SHIFT)
|
||||
#define _CACHE_MASK (1 << _CACHE_UNCACHED_SHIFT)
|
||||
|
||||
#else /* 'Normal' r4K case */
|
||||
/*
|
||||
@@ -76,22 +110,22 @@
|
||||
* which is more than we need right now.
|
||||
*/
|
||||
|
||||
/* implemented in software */
|
||||
/*
|
||||
* The following bits are implemented in software
|
||||
*
|
||||
* _PAGE_READ / _PAGE_READ_SHIFT should be unused if cpu_has_rixi.
|
||||
* _PAGE_FILE semantics: set:pagecache unset:swap
|
||||
*/
|
||||
#define _PAGE_PRESENT_SHIFT (0)
|
||||
#define _PAGE_PRESENT (1 << _PAGE_PRESENT_SHIFT)
|
||||
/* implemented in software, should be unused if cpu_has_rixi. */
|
||||
#define _PAGE_READ_SHIFT (cpu_has_rixi ? _PAGE_PRESENT_SHIFT : _PAGE_PRESENT_SHIFT + 1)
|
||||
#define _PAGE_READ ({BUG_ON(cpu_has_rixi); 1 << _PAGE_READ_SHIFT; })
|
||||
/* implemented in software */
|
||||
#define _PAGE_WRITE_SHIFT (_PAGE_READ_SHIFT + 1)
|
||||
#define _PAGE_WRITE (1 << _PAGE_WRITE_SHIFT)
|
||||
/* implemented in software */
|
||||
#define _PAGE_ACCESSED_SHIFT (_PAGE_WRITE_SHIFT + 1)
|
||||
#define _PAGE_ACCESSED (1 << _PAGE_ACCESSED_SHIFT)
|
||||
/* implemented in software */
|
||||
#define _PAGE_MODIFIED_SHIFT (_PAGE_ACCESSED_SHIFT + 1)
|
||||
#define _PAGE_MODIFIED (1 << _PAGE_MODIFIED_SHIFT)
|
||||
/* set:pagecache unset:swap */
|
||||
#define _PAGE_FILE (_PAGE_MODIFIED)
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
Reference in New Issue
Block a user