patch-2.4.21 linux-2.4.21/include/asm-sparc/system.h
Next file: linux-2.4.21/include/asm-sparc/uaccess.h
Previous file: linux-2.4.21/include/asm-sparc/sbus.h
Back to the patch index
Back to the overall index
- Lines: 81
- Date:
2003-06-13 07:51:38.000000000 -0700
- Orig file:
linux-2.4.20/include/asm-sparc/system.h
- Orig date:
2001-10-30 15:08:11.000000000 -0800
diff -urN linux-2.4.20/include/asm-sparc/system.h linux-2.4.21/include/asm-sparc/system.h
@@ -109,15 +109,14 @@
* - Anton
*/
#define switch_to(prev, next, last) do { \
- __label__ here; \
- register unsigned long task_pc asm("o7"); \
extern struct task_struct *current_set[NR_CPUS]; \
SWITCH_ENTER \
SWITCH_DO_LAZY_FPU \
next->active_mm->cpu_vm_mask |= (1 << smp_processor_id()); \
- task_pc = ((unsigned long) &&here) - 0x8; \
__asm__ __volatile__( \
+ "sethi %%hi(here - 0x8), %%o7\n\t" \
"mov %%g6, %%g3\n\t" \
+ "or %%o7, %%lo(here - 0x8), %%o7\n\t" \
"rd %%psr, %%g4\n\t" \
"std %%sp, [%%g6 + %4]\n\t" \
"rd %%wim, %%g5\n\t" \
@@ -132,6 +131,7 @@
"wr %%g4, 0x20, %%psr\n\t" \
"nop\n\t" \
"nop\n\t" \
+ "nop\n\t" /* LEON needs this: load to %sp depends on CWP. */ \
"ldd [%%g6 + %4], %%sp\n\t" \
"wr %%g5, 0x0, %%wim\n\t" \
"ldd [%%sp + 0x00], %%l0\n\t" \
@@ -140,16 +140,16 @@
"nop\n\t" \
"nop\n\t" \
"jmpl %%o7 + 0x8, %%g0\n\t" \
- " mov %%g3, %0\n\t" \
+ " mov %%g3, %0\n" \
+ "here:\n" \
: "=&r" (last) \
: "r" (&(current_set[hard_smp_processor_id()])), "r" (next), \
"i" ((const unsigned long)(&((struct task_struct *)0)->thread.kpsr)), \
- "i" ((const unsigned long)(&((struct task_struct *)0)->thread.ksp)), \
- "r" (task_pc) \
- : "g1", "g2", "g3", "g4", "g5", "g7", "l0", "l1", \
+ "i" ((const unsigned long)(&((struct task_struct *)0)->thread.ksp)) \
+ : "g1", "g2", "g3", "g4", "g5", "g7", "l0", "l1", "l3", \
"l4", "l5", "l6", "l7", "i0", "i1", "i2", "i3", "i4", "i5", "o0", "o1", "o2", \
- "o3"); \
-here:; } while(0)
+ "o3", "o7"); \
+ } while(0)
/*
* Changing the IRQ level on the Sparc.
@@ -241,12 +241,31 @@
return retval;
}
+extern __inline__ unsigned long read_psr_and_sti(void)
+{
+ unsigned long retval;
+
+ __asm__ __volatile__(
+ "rd %%psr, %0\n\t"
+ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */
+ "andn %0, %1, %%g1\n\t"
+ "wr %%g1, 0x0, %%psr\n\t"
+ "nop; nop; nop\n\t"
+ : "=r" (retval)
+ : "i" (PSR_PIL)
+ : "g1", "memory");
+
+ return retval;
+}
+
#define __save_flags(flags) ((flags) = getipl())
#define __save_and_cli(flags) ((flags) = read_psr_and_cli())
+#define __save_and_sti(flags) ((flags) = read_psr_and_sti())
#define __restore_flags(flags) setipl((flags))
#define local_irq_disable() __cli()
#define local_irq_enable() __sti()
#define local_irq_save(flags) __save_and_cli(flags)
+#define local_irq_set(flags) __save_and_sti(flags)
#define local_irq_restore(flags) __restore_flags(flags)
#ifdef CONFIG_SMP
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)