diff options
Diffstat (limited to 'arch/sparc/kernel/kstack.h')
| -rw-r--r-- | arch/sparc/kernel/kstack.h | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/sparc/kernel/kstack.h b/arch/sparc/kernel/kstack.h index 5247283d1c0..53dfb92e09f 100644 --- a/arch/sparc/kernel/kstack.h +++ b/arch/sparc/kernel/kstack.h @@ -61,4 +61,23 @@ check_magic:  } +static inline __attribute__((always_inline)) void *set_hardirq_stack(void) +{ +	void *orig_sp, *sp = hardirq_stack[smp_processor_id()]; + +	__asm__ __volatile__("mov %%sp, %0" : "=r" (orig_sp)); +	if (orig_sp < sp || +	    orig_sp > (sp + THREAD_SIZE)) { +		sp += THREAD_SIZE - 192 - STACK_BIAS; +		__asm__ __volatile__("mov %0, %%sp" : : "r" (sp)); +	} + +	return orig_sp; +} + +static inline __attribute__((always_inline)) void restore_hardirq_stack(void *orig_sp) +{ +	__asm__ __volatile__("mov %0, %%sp" : : "r" (orig_sp)); +} +  #endif /* _KSTACK_H */  |