diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 4a803c5a1ff7..612eb530f33f 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -96,19 +96,23 @@ void __show_regs(struct pt_regs *regs)  	unsigned long flags;  	char buf[64];  #ifndef CONFIG_CPU_V7M -	unsigned int domain; +	unsigned int domain, fs;  #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)) +	if (user_mode(regs)) {  		domain = DACR_UACCESS_ENABLE; -	else -		domain = *(unsigned int *)(regs + 1); +		fs = get_fs(); +	} else { +		domain = to_svc_pt_regs(regs)->dacr; +		fs = to_svc_pt_regs(regs)->addr_limit; +	}  #else  	domain = get_domain(); +	fs = get_fs();  #endif  #endif @@ -144,7 +148,7 @@ void __show_regs(struct pt_regs *regs)  		if ((domain & domain_mask(DOMAIN_USER)) ==  		    domain_val(DOMAIN_USER, DOMAIN_NOACCESS))  			segment = "none"; -		else if (get_fs() == get_ds()) +		else if (fs == get_ds())  			segment = "kernel";  		else  			segment = "user";  |