forked from mirrors/linux
		
	parisc: Add runtime check to prevent PA2.0 kernels on PA1.x machines
If a 32-bit kernel was compiled for PA2.0 CPUs, it won't be able to run on machines with PA1.x CPUs. Add a check and bail out early if a PA1.x machine is detected. Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
		
							parent
							
								
									d46c742f82
								
							
						
					
					
						commit
						591d2108f3
					
				
					 1 changed files with 42 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -22,7 +22,7 @@
 | 
			
		|||
#include <linux/init.h>
 | 
			
		||||
#include <linux/pgtable.h>
 | 
			
		||||
 | 
			
		||||
	.level	PA_ASM_LEVEL
 | 
			
		||||
	.level	1.1
 | 
			
		||||
 | 
			
		||||
	__INITDATA
 | 
			
		||||
ENTRY(boot_args)
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +70,47 @@ $bss_loop:
 | 
			
		|||
	stw,ma          %arg2,4(%r1)
 | 
			
		||||
	stw,ma          %arg3,4(%r1)
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_64BIT) && defined(CONFIG_PA20)
 | 
			
		||||
	/* This 32-bit kernel was compiled for PA2.0 CPUs. Check current CPU
 | 
			
		||||
	 * and halt kernel if we detect a PA1.x CPU. */
 | 
			
		||||
	ldi		32,%r10
 | 
			
		||||
	mtctl		%r10,%cr11
 | 
			
		||||
	.level 2.0
 | 
			
		||||
	mfctl,w		%cr11,%r10
 | 
			
		||||
	.level 1.1
 | 
			
		||||
	comib,<>,n	0,%r10,$cpu_ok
 | 
			
		||||
 | 
			
		||||
	load32		PA(msg1),%arg0
 | 
			
		||||
	ldi		msg1_end-msg1,%arg1
 | 
			
		||||
$iodc_panic:
 | 
			
		||||
	copy		%arg0, %r10
 | 
			
		||||
	copy		%arg1, %r11
 | 
			
		||||
	load32		PA(init_stack),%sp
 | 
			
		||||
#define MEM_CONS 0x3A0
 | 
			
		||||
	ldw		MEM_CONS+32(%r0),%arg0	// HPA
 | 
			
		||||
	ldi		ENTRY_IO_COUT,%arg1
 | 
			
		||||
	ldw		MEM_CONS+36(%r0),%arg2	// SPA
 | 
			
		||||
	ldw		MEM_CONS+8(%r0),%arg3	// layers
 | 
			
		||||
	load32		PA(__bss_start),%r1
 | 
			
		||||
	stw		%r1,-52(%sp)		// arg4
 | 
			
		||||
	stw		%r0,-56(%sp)		// arg5
 | 
			
		||||
	stw		%r10,-60(%sp)		// arg6 = ptr to text
 | 
			
		||||
	stw		%r11,-64(%sp)		// arg7 = len
 | 
			
		||||
	stw		%r0,-68(%sp)		// arg8
 | 
			
		||||
	load32		PA(.iodc_panic_ret), %rp
 | 
			
		||||
	ldw		MEM_CONS+40(%r0),%r1	// ENTRY_IODC
 | 
			
		||||
	bv,n		(%r1)
 | 
			
		||||
.iodc_panic_ret:
 | 
			
		||||
	b .				/* wait endless with ... */
 | 
			
		||||
	or		%r10,%r10,%r10	/* qemu idle sleep */
 | 
			
		||||
msg1:	.ascii "Can't boot kernel which was built for PA8x00 CPUs on this machine.\r\n"
 | 
			
		||||
msg1_end:
 | 
			
		||||
 | 
			
		||||
$cpu_ok:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	.level	PA_ASM_LEVEL
 | 
			
		||||
 | 
			
		||||
	/* Initialize startup VM. Just map first 16/32 MB of memory */
 | 
			
		||||
	load32		PA(swapper_pg_dir),%r4
 | 
			
		||||
	mtctl		%r4,%cr24	/* Initialize kernel root pointer */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue