X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=arch%2Fsparc%2Fkernel%2Fkstack.h;h=53dfb92e09fb5b1a0b37e8f393fa6e3c6b0f3329;hb=ec687886de00e1e63f3d821ccade9a61590408ed;hp=5247283d1c03e57c94d40ebfea4074cdf7db3100;hpb=232486e1e9f34889424b68ee6270440b554479a2;p=safe%2Fjmp%2Flinux-2.6 diff --git a/arch/sparc/kernel/kstack.h b/arch/sparc/kernel/kstack.h index 5247283..53dfb92 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 */