Commit c64c782e authored by John David Anglin's avatar John David Anglin Committed by Helge Deller

parisc: Don't hardcode assembler bit definitions in tmpalias code

Remove the hardcoded bit definitions in the tmpalias assembly code.
This makes it easy to change the size of the tmpalias region.

The alignment of the tmpalias region is reduced from 16 MB to 8 MB.
Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 1fc7db24
...@@ -9,12 +9,27 @@ ...@@ -9,12 +9,27 @@
* *
* All of the values in this file must be <4GB (because of assembly * All of the values in this file must be <4GB (because of assembly
* loading restrictions). If you place this region anywhere above * loading restrictions). If you place this region anywhere above
* __PAGE_OFFSET, you must adjust the memory map accordingly */ * __PAGE_OFFSET, you must adjust the memory map accordingly
*/
/* The alias region is used in kernel space to do copy/clear to or /*
* from areas congruently mapped with user space. It is 8MB large * The tmpalias region is used in kernel space to copy/clear/flush data
* and must be 16MB aligned */ * from pages congruently mapped with user space. It is comprised of
#define TMPALIAS_MAP_START ((__PAGE_OFFSET) - 16*1024*1024) * a pair regions. The size of these regions is determined by the largest
* cache aliasing boundary for machines that support equivalent aliasing.
*
* The c3750 with PA8700 processor returns an alias value of 11. This
* indicates that it has an alias boundary of 4 MB. It also supports
* non-equivalent aliasing without a performance penalty.
*
* Machines with PA8800/PA8900 processors return an alias value of 0.
* This indicates the alias boundary is unknown and may be larger than
* 16 MB. Non-equivalent aliasing is not supported.
*
* Here we assume the maximum alias boundary is 4 MB.
*/
#define TMPALIAS_SIZE_BITS 22 /* 4 MB */
#define TMPALIAS_MAP_START ((__PAGE_OFFSET) - (2 << TMPALIAS_SIZE_BITS))
#define FIXMAP_SIZE (FIX_BITMAP_COUNT << PAGE_SHIFT) #define FIXMAP_SIZE (FIX_BITMAP_COUNT << PAGE_SHIFT)
#define FIXMAP_START (TMPALIAS_MAP_START - FIXMAP_SIZE) #define FIXMAP_START (TMPALIAS_MAP_START - FIXMAP_SIZE)
......
...@@ -554,8 +554,9 @@ ...@@ -554,8 +554,9 @@
extrd,s \pte,63,25,\pte extrd,s \pte,63,25,\pte
.endm .endm
/* The alias region is an 8MB aligned 16MB to do clear and /* The alias region is comprised of a pair of 4 MB regions
* copy user pages at addresses congruent with the user * aligned to 8 MB. It is used to clear/copy/flush user pages
* using kernel virtual addresses congruent with the user
* virtual address. * virtual address.
* *
* To use the alias page, you set %r26 up with the to TLB * To use the alias page, you set %r26 up with the to TLB
...@@ -571,7 +572,7 @@ ...@@ -571,7 +572,7 @@
depdi 0,31,32,\tmp depdi 0,31,32,\tmp
#endif #endif
copy \va,\tmp1 copy \va,\tmp1
depi 0,31,23,\tmp1 depi_safe 0,31,TMPALIAS_SIZE_BITS+1,\tmp1
cmpb,COND(<>),n \tmp,\tmp1,\fault cmpb,COND(<>),n \tmp,\tmp1,\fault
mfctl %cr19,\tmp /* iir */ mfctl %cr19,\tmp /* iir */
/* get the opcode (first six bits) into \tmp */ /* get the opcode (first six bits) into \tmp */
...@@ -605,9 +606,9 @@ ...@@ -605,9 +606,9 @@
* Check "subtle" note in pacache.S re: r23/r26. * Check "subtle" note in pacache.S re: r23/r26.
*/ */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
extrd,u,*= \va,41,1,%r0 extrd,u,*= \va,63-TMPALIAS_SIZE_BITS,1,%r0
#else #else
extrw,u,= \va,9,1,%r0 extrw,u,= \va,31-TMPALIAS_SIZE_BITS,1,%r0
#endif #endif
or,COND(tr) %r23,%r0,\pte or,COND(tr) %r23,%r0,\pte
or %r26,%r0,\pte or %r26,%r0,\pte
......
...@@ -487,6 +487,8 @@ ENDPROC_CFI(copy_page_asm) ...@@ -487,6 +487,8 @@ ENDPROC_CFI(copy_page_asm)
* parisc chip designers that there will not ever be a parisc * parisc chip designers that there will not ever be a parisc
* chip with a larger alias boundary (Never say never :-) ). * chip with a larger alias boundary (Never say never :-) ).
* *
* Yah, what about the PA8800 and PA8900 processors?
*
* Subtle: the dtlb miss handlers support the temp alias region by * Subtle: the dtlb miss handlers support the temp alias region by
* "knowing" that if a dtlb miss happens within the temp alias * "knowing" that if a dtlb miss happens within the temp alias
* region it must have occurred while in clear_user_page. Since * region it must have occurred while in clear_user_page. Since
...@@ -545,17 +547,17 @@ ENTRY_CFI(copy_user_page_asm) ...@@ -545,17 +547,17 @@ ENTRY_CFI(copy_user_page_asm)
#endif #endif
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
convert_phys_for_tlb_insert20 %r23 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r23 /* convert phys addr to tlb insert format */
depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */ depd %r24,63,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
copy %r28, %r29 copy %r28, %r29
depdi 1, 41,1, %r29 /* Form aliased virtual address 'from' */ depdi 1, 63-TMPALIAS_SIZE_BITS,1, %r29 /* Form aliased virtual address 'from' */
#else #else
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
extrw,u %r23, 24,25, %r23 /* convert phys addr to tlb insert format */ extrw,u %r23, 24,25, %r23 /* convert phys addr to tlb insert format */
depw %r24, 31,22, %r28 /* Form aliased virtual address 'to' */ depw %r24, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
copy %r28, %r29 copy %r28, %r29
depwi 1, 9,1, %r29 /* Form aliased virtual address 'from' */ depwi 1, 31-TMPALIAS_SIZE_BITS,1, %r29 /* Form aliased virtual address 'from' */
#endif #endif
/* Purge any old translations */ /* Purge any old translations */
...@@ -691,11 +693,11 @@ ENTRY_CFI(clear_user_page_asm) ...@@ -691,11 +693,11 @@ ENTRY_CFI(clear_user_page_asm)
depdi 0, 31,32, %r28 /* clear any sign extension */ depdi 0, 31,32, %r28 /* clear any sign extension */
#endif #endif
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ depd %r25, 63,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
#else #else
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ depw %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
#endif #endif
...@@ -767,11 +769,11 @@ ENTRY_CFI(flush_dcache_page_asm) ...@@ -767,11 +769,11 @@ ENTRY_CFI(flush_dcache_page_asm)
depdi 0, 31,32, %r28 /* clear any sign extension */ depdi 0, 31,32, %r28 /* clear any sign extension */
#endif #endif
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ depd %r25, 63,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
#else #else
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ depw %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
#endif #endif
...@@ -826,11 +828,11 @@ ENTRY_CFI(purge_dcache_page_asm) ...@@ -826,11 +828,11 @@ ENTRY_CFI(purge_dcache_page_asm)
depdi 0, 31,32, %r28 /* clear any sign extension */ depdi 0, 31,32, %r28 /* clear any sign extension */
#endif #endif
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ depd %r25, 63,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
#else #else
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ depw %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
#endif #endif
...@@ -885,11 +887,11 @@ ENTRY_CFI(flush_icache_page_asm) ...@@ -885,11 +887,11 @@ ENTRY_CFI(flush_icache_page_asm)
depdi 0, 31,32, %r28 /* clear any sign extension */ depdi 0, 31,32, %r28 /* clear any sign extension */
#endif #endif
convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ depd %r25, 63,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */
#else #else
extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */
depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ depw %r25, 31,TMPALIAS_SIZE_BITS, %r28 /* Form aliased virtual address 'to' */
depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment