diff options
Diffstat (limited to 'include/asm-ppc/system.h')
-rw-r--r-- | include/asm-ppc/system.h | 89 |
1 files changed, 58 insertions, 31 deletions
diff --git a/include/asm-ppc/system.h b/include/asm-ppc/system.h index df527e474..11700eb41 100644 --- a/include/asm-ppc/system.h +++ b/include/asm-ppc/system.h @@ -1,40 +1,69 @@ #ifndef __PPC_SYSTEM_H #define __PPC_SYSTEM_H -#include <linux/delay.h> +#include <linux/kdev_t.h> +#include <asm/processor.h> #define mb() __asm__ __volatile__ ("sync" : : : "memory") #define __save_flags(flags) ({\ __asm__ __volatile__ ("mfmsr %0" : "=r" ((flags)) : : "memory"); }) -/* using Paul's in misc.S now -- Cort */ -extern void __restore_flags(unsigned long flags); +#define __save_and_cli(flags) ({__save_flags(flags);__cli();}) +extern __inline__ void __restore_flags(unsigned long flags) +{ + extern unsigned lost_interrupts; + extern void do_lost_interrupts(unsigned long); + + if ((flags & MSR_EE) && lost_interrupts != 0) { + do_lost_interrupts(flags); + } else { + __asm__ __volatile__ ("sync; mtmsr %0; isync" + : : "r" (flags) : "memory"); + } +} + + +#if 0 /* - #define __sti() _soft_sti(void) - #define __cli() _soft_cli(void) + * Gcc bug prevents us from using this inline func so for now + * it lives in misc.S */ +void __inline__ __restore_flags(unsigned long flags) +{ + extern unsigned lost_interrupts; + __asm__ __volatile__ ( + "andi. 0,%0,%2 \n\t" + "beq 2f \n\t" + "cmpi 0,%1,0 \n\t" + "bne do_lost_interrupts \n\t" + "2: sync \n\t" + "mtmsr %0 \n\t" + "isync \n\t" + : + : "r" (flags), "r"(lost_interrupts), "i" (1<<15)/*MSR_EE*/ + : "0", "cc"); +} +#endif + extern void __sti(void); extern void __cli(void); - -extern void _hard_sti(void); -extern void _hard_cli(void); -extern void _soft_sti(void); -extern void _soft_cli(void); extern int _disable_interrupts(void); extern void _enable_interrupts(int); +extern void print_backtrace(unsigned long *); +extern void show_regs(struct pt_regs * regs); extern void flush_instruction_cache(void); extern void hard_reset_now(void); extern void poweroff_now(void); -extern void find_scsi_boot(void); +/*extern void note_bootable_part(kdev_t, int);*/ extern int sd_find_target(void *, int); extern int _get_PVR(void); extern void via_cuda_init(void); +extern void pmac_nvram_init(void); extern void read_rtc_time(void); extern void pmac_find_display(void); extern void giveup_fpu(void); -extern void store_cache_range(unsigned long, unsigned long); extern void cvt_fd(float *from, double *to); extern void cvt_df(double *from, float *to); @@ -53,27 +82,29 @@ extern int do_signal(unsigned long oldmask, struct pt_regs *regs); extern void dump_regs(struct pt_regs *); #ifndef __SMP__ + #define cli() __cli() #define sti() __sti() #define save_flags(flags) __save_flags(flags) #define restore_flags(flags) __restore_flags(flags) -#else -#error need global cli/sti etc. defined for SMP -#endif +#else /* __SMP__ */ -#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) +extern void __global_cli(void); +extern void __global_sti(void); +extern unsigned long __global_save_flags(void); +extern void __global_restore_flags(unsigned long); +#define cli() __global_cli() +#define sti() __global_sti() +#define save_flags(x) ((x)=__global_save_flags()) +#define restore_flags(x) __global_restore_flags(x) -/* this guy lives in arch/ppc/kernel */ -extern inline unsigned long *xchg_u32(void *m, unsigned long val); +#endif /* !__SMP__ */ + +#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) -/* - * these guys don't exist. - * someone should create them. - * -- Cort - */ extern void *xchg_u64(void *ptr, unsigned long val); -extern int xchg_u8(char *m, char val); +extern void *xchg_u32(void *m, unsigned long val); /* * This function doesn't exist, so you'll get a linker error @@ -85,6 +116,9 @@ extern int xchg_u8(char *m, char val); */ extern void __xchg_called_with_bad_pointer(void); +#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) +#define tas(ptr) (xchg((ptr),1)) + static inline unsigned long __xchg(unsigned long x, void * ptr, int size) { switch (size) { @@ -99,13 +133,6 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size) } - - -extern inline int tas(char * m) -{ - return xchg_u8(m,1); -} - extern inline void * xchg_ptr(void * m, void * val) { return (void *) xchg_u32(m, (unsigned long) val); |