diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 56 | 
1 files changed, 40 insertions, 16 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index f192a2a41719..a3089bacb8d8 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -91,13 +91,6 @@ void arch_cpu_idle_exit(void)  	ledtrig_cpu(CPU_LED_IDLE_END);  } -#ifdef CONFIG_HOTPLUG_CPU -void arch_cpu_idle_dead(void) -{ -	cpu_die(); -} -#endif -  void __show_regs(struct pt_regs *regs)  {  	unsigned long flags; @@ -129,12 +122,36 @@ void __show_regs(struct pt_regs *regs)  	buf[4] = '\0';  #ifndef CONFIG_CPU_V7M -	printk("Flags: %s  IRQs o%s  FIQs o%s  Mode %s  ISA %s  Segment %s\n", -		buf, interrupts_enabled(regs) ? "n" : "ff", -		fast_interrupts_enabled(regs) ? "n" : "ff", -		processor_modes[processor_mode(regs)], -		isa_modes[isa_mode(regs)], -		get_fs() == get_ds() ? "kernel" : "user"); +	{ +		unsigned int domain = get_domain(); +		const char *segment; + +#ifdef CONFIG_CPU_SW_DOMAIN_PAN +		/* +		 * Get the domain register for the parent context. In user +		 * mode, we don't save the DACR, so lets use what it should +		 * be. For other modes, we place it after the pt_regs struct. +		 */ +		if (user_mode(regs)) +			domain = DACR_UACCESS_ENABLE; +		else +			domain = *(unsigned int *)(regs + 1); +#endif + +		if ((domain & domain_mask(DOMAIN_USER)) == +		    domain_val(DOMAIN_USER, DOMAIN_NOACCESS)) +			segment = "none"; +		else if (get_fs() == get_ds()) +			segment = "kernel"; +		else +			segment = "user"; + +		printk("Flags: %s  IRQs o%s  FIQs o%s  Mode %s  ISA %s  Segment %s\n", +			buf, interrupts_enabled(regs) ? "n" : "ff", +			fast_interrupts_enabled(regs) ? "n" : "ff", +			processor_modes[processor_mode(regs)], +			isa_modes[isa_mode(regs)], segment); +	}  #else  	printk("xPSR: %08lx\n", regs->ARM_cpsr);  #endif @@ -146,10 +163,9 @@ void __show_regs(struct pt_regs *regs)  		buf[0] = '\0';  #ifdef CONFIG_CPU_CP15_MMU  		{ -			unsigned int transbase, dac; +			unsigned int transbase, dac = get_domain();  			asm("mrc p15, 0, %0, c2, c0\n\t" -			    "mrc p15, 0, %1, c3, c0\n" -			    : "=r" (transbase), "=r" (dac)); +			    : "=r" (transbase));  			snprintf(buf, sizeof(buf), "  Table: %08x  DAC: %08x",  			  	transbase, dac);  		} @@ -210,6 +226,14 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,  	memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); +	/* +	 * Copy the initial value of the domain access control register +	 * from the current thread: thread->addr_limit will have been +	 * copied from the current thread via setup_thread_stack() in +	 * kernel/fork.c +	 */ +	thread->cpu_domain = get_domain(); +  	if (likely(!(p->flags & PF_KTHREAD))) {  		*childregs = *current_pt_regs();  		childregs->ARM_r0 = 0;  |