diff options
Diffstat (limited to 'arch/mips/kernel')
| -rw-r--r-- | arch/mips/kernel/cps-vec.S | 12 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 21 | ||||
| -rw-r--r-- | arch/mips/kernel/octeon_switch.S | 26 | ||||
| -rw-r--r-- | arch/mips/kernel/r2300_switch.S | 28 | ||||
| -rw-r--r-- | arch/mips/kernel/scall32-o32.S | 41 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-64.S | 40 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-n32.S | 21 | ||||
| -rw-r--r-- | arch/mips/kernel/scall64-o32.S | 21 | ||||
| -rw-r--r-- | arch/mips/kernel/setup.c | 10 | ||||
| -rw-r--r-- | arch/mips/kernel/smp.c | 2 | 
10 files changed, 83 insertions, 139 deletions
| diff --git a/arch/mips/kernel/cps-vec.S b/arch/mips/kernel/cps-vec.S index 9f71c06aebf6..209ded16806b 100644 --- a/arch/mips/kernel/cps-vec.S +++ b/arch/mips/kernel/cps-vec.S @@ -39,6 +39,7 @@  	 mfc0	\dest, CP0_CONFIG, 3  	andi	\dest, \dest, MIPS_CONF3_MT  	beqz	\dest, \nomt +	 nop  	.endm  .section .text.cps-vec @@ -223,10 +224,9 @@ LEAF(excep_ejtag)  	END(excep_ejtag)  LEAF(mips_cps_core_init) -#ifdef CONFIG_MIPS_MT +#ifdef CONFIG_MIPS_MT_SMP  	/* Check that the core implements the MT ASE */  	has_mt	t0, 3f -	 nop  	.set	push  	.set	mips64r2 @@ -310,8 +310,9 @@ LEAF(mips_cps_boot_vpes)  	PTR_ADDU t0, t0, t1  	/* Calculate this VPEs ID. If the core doesn't support MT use 0 */ +	li	t9, 0 +#ifdef CONFIG_MIPS_MT_SMP  	has_mt	ta2, 1f -	 li	t9, 0  	/* Find the number of VPEs present in the core */  	mfc0	t1, CP0_MVPCONF0 @@ -330,6 +331,7 @@ LEAF(mips_cps_boot_vpes)  	/* Retrieve the VPE ID from EBase.CPUNum */  	mfc0	t9, $15, 1  	and	t9, t9, t1 +#endif  1:	/* Calculate a pointer to this VPEs struct vpe_boot_config */  	li	t1, VPEBOOTCFG_SIZE @@ -337,7 +339,7 @@ LEAF(mips_cps_boot_vpes)  	PTR_L	ta3, COREBOOTCFG_VPECONFIG(t0)  	PTR_ADDU v0, v0, ta3 -#ifdef CONFIG_MIPS_MT +#ifdef CONFIG_MIPS_MT_SMP  	/* If the core doesn't support MT then return */  	bnez	ta2, 1f @@ -451,7 +453,7 @@ LEAF(mips_cps_boot_vpes)  2:	.set	pop -#endif /* CONFIG_MIPS_MT */ +#endif /* CONFIG_MIPS_MT_SMP */  	/* Return */  	jr	ra diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 571a8e6ea5bd..09a51d091941 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -410,16 +410,18 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, int enable)  static inline unsigned int decode_config0(struct cpuinfo_mips *c)  {  	unsigned int config0; -	int isa; +	int isa, mt;  	config0 = read_c0_config();  	/*  	 * Look for Standard TLB or Dual VTLB and FTLB  	 */ -	if ((((config0 & MIPS_CONF_MT) >> 7) == 1) || -	    (((config0 & MIPS_CONF_MT) >> 7) == 4)) +	mt = config0 & MIPS_CONF_MT; +	if (mt == MIPS_CONF_MT_TLB)  		c->options |= MIPS_CPU_TLB; +	else if (mt == MIPS_CONF_MT_FTLB) +		c->options |= MIPS_CPU_TLB | MIPS_CPU_FTLB;  	isa = (config0 & MIPS_CONF_AT) >> 13;  	switch (isa) { @@ -559,15 +561,18 @@ static inline unsigned int decode_config4(struct cpuinfo_mips *c)  	if (cpu_has_tlb) {  		if (((config4 & MIPS_CONF4_IE) >> 29) == 2)  			c->options |= MIPS_CPU_TLBINV; +  		/* -		 * This is a bit ugly. R6 has dropped that field from -		 * config4 and the only valid configuration is VTLB+FTLB so -		 * set a good value for mmuextdef for that case. +		 * R6 has dropped the MMUExtDef field from config4. +		 * On R6 the fields always describe the FTLB, and only if it is +		 * present according to Config.MT.  		 */ -		if (cpu_has_mips_r6) +		if (!cpu_has_mips_r6) +			mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF; +		else if (cpu_has_ftlb)  			mmuextdef = MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT;  		else -			mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF; +			mmuextdef = 0;  		switch (mmuextdef) {  		case MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT: diff --git a/arch/mips/kernel/octeon_switch.S b/arch/mips/kernel/octeon_switch.S index 423ae83af1fb..3375745b9198 100644 --- a/arch/mips/kernel/octeon_switch.S +++ b/arch/mips/kernel/octeon_switch.S @@ -18,7 +18,7 @@  	.set pop  /*   * task_struct *resume(task_struct *prev, task_struct *next, - *		       struct thread_info *next_ti, int usedfpu) + *		       struct thread_info *next_ti)   */  	.align	7  	LEAF(resume) @@ -28,30 +28,6 @@  	cpu_save_nonscratch a0  	LONG_S	ra, THREAD_REG31(a0) -	/* -	 * check if we need to save FPU registers -	 */ -	.set push -	.set noreorder -	beqz	a3, 1f -	 PTR_L	t3, TASK_THREAD_INFO(a0) -	.set pop - -	/* -	 * clear saved user stack CU1 bit -	 */ -	LONG_L	t0, ST_OFF(t3) -	li	t1, ~ST0_CU1 -	and	t0, t0, t1 -	LONG_S	t0, ST_OFF(t3) - -	.set push -	.set arch=mips64r2 -	fpu_save_double a0 t0 t1		# c0_status passed in t0 -						# clobbers t1 -	.set pop -1: -  #if CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE > 0  	/* Check if we need to store CVMSEG state */  	dmfc0	t0, $11,7	/* CvmMemCtl */ diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 5087a4b72e6b..ac27ef7d4d0e 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S @@ -31,18 +31,8 @@  #define ST_OFF (_THREAD_SIZE - 32 - PT_SIZE + PT_STATUS)  /* - * FPU context is saved iff the process has used it's FPU in the current - * time slice as indicated by TIF_USEDFPU.  In any case, the CU1 bit for user - * space STATUS register should be 0, so that a process *always* starts its - * userland with FPU disabled after each context switch. - * - * FPU will be enabled as soon as the process accesses FPU again, through - * do_cpu() trap. - */ - -/*   * task_struct *resume(task_struct *prev, task_struct *next, - *		       struct thread_info *next_ti, int usedfpu) + *		       struct thread_info *next_ti)   */  LEAF(resume)  	mfc0	t1, CP0_STATUS @@ -50,22 +40,6 @@ LEAF(resume)  	cpu_save_nonscratch a0  	sw	ra, THREAD_REG31(a0) -	beqz	a3, 1f - -	PTR_L	t3, TASK_THREAD_INFO(a0) - -	/* -	 * clear saved user stack CU1 bit -	 */ -	lw	t0, ST_OFF(t3) -	li	t1, ~ST0_CU1 -	and	t0, t0, t1 -	sw	t0, ST_OFF(t3) - -	fpu_save_single a0, t0			# clobbers t0 - -1: -  #if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)  	PTR_LA	t8, __stack_chk_guard  	LONG_L	t9, TASK_STACK_CANARY(a1) diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 4cc13508d967..65a74e4f0f45 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S @@ -36,16 +36,8 @@ NESTED(handle_sys, PT_SIZE, sp)  	lw	t1, PT_EPC(sp)		# skip syscall on return  	subu	v0, v0, __NR_O32_Linux	# check syscall number -	sltiu	t0, v0, __NR_O32_Linux_syscalls + 1  	addiu	t1, 4			# skip to next instruction  	sw	t1, PT_EPC(sp) -	beqz	t0, illegal_syscall - -	sll	t0, v0, 2 -	la	t1, sys_call_table -	addu	t1, t0 -	lw	t2, (t1)		# syscall routine -	beqz	t2, illegal_syscall  	sw	a3, PT_R26(sp)		# save a3 for syscall restarting @@ -96,6 +88,16 @@ loads_done:  	li	t1, _TIF_WORK_SYSCALL_ENTRY  	and	t0, t1  	bnez	t0, syscall_trace_entry # -> yes +syscall_common: +	sltiu	t0, v0, __NR_O32_Linux_syscalls + 1 +	beqz	t0, illegal_syscall + +	sll	t0, v0, 2 +	la	t1, sys_call_table +	addu	t1, t0 +	lw	t2, (t1)		# syscall routine + +	beqz	t2, illegal_syscall  	jalr	t2			# Do The Real Thing (TM) @@ -116,7 +118,7 @@ o32_syscall_exit:  syscall_trace_entry:  	SAVE_STATIC -	move	s0, t2 +	move	s0, v0  	move	a0, sp  	/* @@ -129,27 +131,18 @@ syscall_trace_entry:  1:	jal	syscall_trace_enter -	bltz	v0, 2f			# seccomp failed? Skip syscall +	bltz	v0, 1f			# seccomp failed? Skip syscall + +	move	v0, s0			# restore syscall -	move	t0, s0  	RESTORE_STATIC  	lw	a0, PT_R4(sp)		# Restore argument registers  	lw	a1, PT_R5(sp)  	lw	a2, PT_R6(sp)  	lw	a3, PT_R7(sp) -	jalr	t0 - -	li	t0, -EMAXERRNO - 1	# error? -	sltu	t0, t0, v0 -	sw	t0, PT_R7(sp)		# set error flag -	beqz	t0, 1f - -	lw	t1, PT_R2(sp)		# syscall number -	negu	v0			# error -	sw	t1, PT_R0(sp)		# save it for syscall restarting -1:	sw	v0, PT_R2(sp)		# result +	j	syscall_common -2:	j	syscall_exit +1:	j	syscall_exit  /* ------------------------------------------------------------------------ */ @@ -599,3 +592,5 @@ EXPORT(sys_call_table)  	PTR	sys_memfd_create  	PTR	sys_bpf				/* 4355 */  	PTR	sys_execveat +	PTR	sys_userfaultfd +	PTR	sys_membarrier diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index a6f6b762c47a..e732981cf99f 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S @@ -39,18 +39,11 @@ NESTED(handle_sys64, PT_SIZE, sp)  	.set	at  #endif -	dsubu	t0, v0, __NR_64_Linux	# check syscall number -	sltiu	t0, t0, __NR_64_Linux_syscalls + 1  #if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)  	ld	t1, PT_EPC(sp)		# skip syscall on return  	daddiu	t1, 4			# skip to next instruction  	sd	t1, PT_EPC(sp)  #endif -	beqz	t0, illegal_syscall - -	dsll	t0, v0, 3		# offset into table -	ld	t2, (sys_call_table - (__NR_64_Linux * 8))(t0) -					# syscall routine  	sd	a3, PT_R26(sp)		# save a3 for syscall restarting @@ -59,6 +52,17 @@ NESTED(handle_sys64, PT_SIZE, sp)  	and	t0, t1, t0  	bnez	t0, syscall_trace_entry +syscall_common: +	dsubu	t2, v0, __NR_64_Linux +	sltiu   t0, t2, __NR_64_Linux_syscalls + 1 +	beqz	t0, illegal_syscall + +	dsll	t0, t2, 3		# offset into table +	dla	t2, sys_call_table +	daddu	t0, t2, t0 +	ld	t2, (t0)		# syscall routine +	beqz	t2, illegal_syscall +  	jalr	t2			# Do The Real Thing (TM)  	li	t0, -EMAXERRNO - 1	# error? @@ -78,14 +82,14 @@ n64_syscall_exit:  syscall_trace_entry:  	SAVE_STATIC -	move	s0, t2 +	move	s0, v0  	move	a0, sp  	move	a1, v0  	jal	syscall_trace_enter -	bltz	v0, 2f			# seccomp failed? Skip syscall +	bltz	v0, 1f			# seccomp failed? Skip syscall -	move	t0, s0 +	move	v0, s0  	RESTORE_STATIC  	ld	a0, PT_R4(sp)		# Restore argument registers  	ld	a1, PT_R5(sp) @@ -93,19 +97,9 @@ syscall_trace_entry:  	ld	a3, PT_R7(sp)  	ld	a4, PT_R8(sp)  	ld	a5, PT_R9(sp) -	jalr	t0 - -	li	t0, -EMAXERRNO - 1	# error? -	sltu	t0, t0, v0 -	sd	t0, PT_R7(sp)		# set error flag -	beqz	t0, 1f - -	ld	t1, PT_R2(sp)		# syscall number -	dnegu	v0			# error -	sd	t1, PT_R0(sp)		# save it for syscall restarting -1:	sd	v0, PT_R2(sp)		# result +	j	syscall_common -2:	j	syscall_exit +1:	j	syscall_exit  illegal_syscall:  	/* This also isn't a 64-bit syscall, throw an error.  */ @@ -436,4 +430,6 @@ EXPORT(sys_call_table)  	PTR	sys_memfd_create  	PTR	sys_bpf				/* 5315 */  	PTR	sys_execveat +	PTR	sys_userfaultfd +	PTR	sys_membarrier  	.size	sys_call_table,.-sys_call_table diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 4b2010654c46..c79484397584 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S @@ -52,6 +52,7 @@ NESTED(handle_sysn32, PT_SIZE, sp)  	and	t0, t1, t0  	bnez	t0, n32_syscall_trace_entry +syscall_common:  	jalr	t2			# Do The Real Thing (TM)  	li	t0, -EMAXERRNO - 1	# error? @@ -75,9 +76,9 @@ n32_syscall_trace_entry:  	move	a1, v0  	jal	syscall_trace_enter -	bltz	v0, 2f			# seccomp failed? Skip syscall +	bltz	v0, 1f			# seccomp failed? Skip syscall -	move	t0, s0 +	move	t2, s0  	RESTORE_STATIC  	ld	a0, PT_R4(sp)		# Restore argument registers  	ld	a1, PT_R5(sp) @@ -85,19 +86,9 @@ n32_syscall_trace_entry:  	ld	a3, PT_R7(sp)  	ld	a4, PT_R8(sp)  	ld	a5, PT_R9(sp) -	jalr	t0 +	j	syscall_common -	li	t0, -EMAXERRNO - 1	# error? -	sltu	t0, t0, v0 -	sd	t0, PT_R7(sp)		# set error flag -	beqz	t0, 1f - -	ld	t1, PT_R2(sp)		# syscall number -	dnegu	v0			# error -	sd	t1, PT_R0(sp)		# save it for syscall restarting -1:	sd	v0, PT_R2(sp)		# result - -2:	j	syscall_exit +1:	j	syscall_exit  not_n32_scall:  	/* This is not an n32 compatibility syscall, pass it on to @@ -429,4 +420,6 @@ EXPORT(sysn32_call_table)  	PTR	sys_memfd_create  	PTR	sys_bpf  	PTR	compat_sys_execveat		/* 6320 */ +	PTR	sys_userfaultfd +	PTR	sys_membarrier  	.size	sysn32_call_table,.-sysn32_call_table diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index f543ff4feef9..6369cfd390c6 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S @@ -87,6 +87,7 @@ loads_done:  	and	t0, t1, t0  	bnez	t0, trace_a_syscall +syscall_common:  	jalr	t2			# Do The Real Thing (TM)  	li	t0, -EMAXERRNO - 1	# error? @@ -130,9 +131,9 @@ trace_a_syscall:  1:	jal	syscall_trace_enter -	bltz	v0, 2f			# seccomp failed? Skip syscall +	bltz	v0, 1f			# seccomp failed? Skip syscall -	move	t0, s0 +	move	t2, s0  	RESTORE_STATIC  	ld	a0, PT_R4(sp)		# Restore argument registers  	ld	a1, PT_R5(sp) @@ -142,19 +143,9 @@ trace_a_syscall:  	ld	a5, PT_R9(sp)  	ld	a6, PT_R10(sp)  	ld	a7, PT_R11(sp)		# For indirect syscalls -	jalr	t0 +	j	syscall_common -	li	t0, -EMAXERRNO - 1	# error? -	sltu	t0, t0, v0 -	sd	t0, PT_R7(sp)		# set error flag -	beqz	t0, 1f - -	ld	t1, PT_R2(sp)		# syscall number -	dnegu	v0			# error -	sd	t1, PT_R0(sp)		# save it for syscall restarting -1:	sd	v0, PT_R2(sp)		# result - -2:	j	syscall_exit +1:	j	syscall_exit  /* ------------------------------------------------------------------------ */ @@ -584,4 +575,6 @@ EXPORT(sys32_call_table)  	PTR	sys_memfd_create  	PTR	sys_bpf				/* 4355 */  	PTR	compat_sys_execveat +	PTR	sys_userfaultfd +	PTR	sys_membarrier  	.size	sys32_call_table,.-sys32_call_table diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index 35b8316002f8..479515109e5b 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -338,7 +338,7 @@ static void __init bootmem_init(void)  		if (end <= reserved_end)  			continue;  #ifdef CONFIG_BLK_DEV_INITRD -		/* mapstart should be after initrd_end */ +		/* Skip zones before initrd and initrd itself */  		if (initrd_end && end <= (unsigned long)PFN_UP(__pa(initrd_end)))  			continue;  #endif @@ -371,6 +371,14 @@ static void __init bootmem_init(void)  		max_low_pfn = PFN_DOWN(HIGHMEM_START);  	} +#ifdef CONFIG_BLK_DEV_INITRD +	/* +	 * mapstart should be after initrd_end +	 */ +	if (initrd_end) +		mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end))); +#endif +  	/*  	 * Initialize the boot-time allocator with low memory only.  	 */ diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index a31896c33716..bd4385a8e6e8 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c @@ -42,6 +42,7 @@  #include <asm/mmu_context.h>  #include <asm/time.h>  #include <asm/setup.h> +#include <asm/maar.h>  cpumask_t cpu_callin_map;		/* Bitmask of started secondaries */ @@ -157,6 +158,7 @@ asmlinkage void start_secondary(void)  	mips_clockevent_init();  	mp_ops->init_secondary();  	cpu_report(); +	maar_init();  	/*  	 * XXX parity protection should be folded in here when it's converted |