16842bc34SLaurent Vivier #ifndef _ASMPOWERPC_PROCESSOR_H_ 26842bc34SLaurent Vivier #define _ASMPOWERPC_PROCESSOR_H_ 36842bc34SLaurent Vivier 4f4d8d939SSuraj Jitindar Singh #include <libcflat.h> 56842bc34SLaurent Vivier #include <asm/ptrace.h> 69c5e1913SNicholas Piggin #include <asm/reg.h> 76842bc34SLaurent Vivier 86842bc34SLaurent Vivier #ifndef __ASSEMBLY__ 96842bc34SLaurent Vivier void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void *); 106842bc34SLaurent Vivier void do_handle_exception(struct pt_regs *regs); 116842bc34SLaurent Vivier #endif /* __ASSEMBLY__ */ 126842bc34SLaurent Vivier 13851ef516SNicholas Piggin extern bool host_is_tcg; 14851ef516SNicholas Piggin extern bool host_is_kvm; 15851ef516SNicholas Piggin 16610c5a9cSNicholas Piggin extern bool cpu_has_hv; 1700af1c84SNicholas Piggin extern bool cpu_has_power_mce; 1800af1c84SNicholas Piggin extern bool cpu_has_siar; 19cd27b4baSNicholas Piggin extern bool cpu_has_heai; 20d4c8e725SNicholas Piggin extern bool cpu_has_radix; 2100af1c84SNicholas Piggin extern bool cpu_has_prefix; 2200af1c84SNicholas Piggin extern bool cpu_has_sc_lev; 23c76b0d0aSNicholas Piggin extern bool cpu_has_pause_short; 24610c5a9cSNicholas Piggin 25*93c847c1SNicholas Piggin bool in_usermode(void); 26*93c847c1SNicholas Piggin 27875ebbc7SNicholas Piggin static inline uint64_t mfspr(int nr) 28875ebbc7SNicholas Piggin { 29875ebbc7SNicholas Piggin uint64_t ret; 30875ebbc7SNicholas Piggin 31875ebbc7SNicholas Piggin asm volatile("mfspr %0,%1" : "=r"(ret) : "i"(nr) : "memory"); 32875ebbc7SNicholas Piggin 33875ebbc7SNicholas Piggin return ret; 34875ebbc7SNicholas Piggin } 35875ebbc7SNicholas Piggin 36875ebbc7SNicholas Piggin static inline void mtspr(int nr, uint64_t val) 37875ebbc7SNicholas Piggin { 38875ebbc7SNicholas Piggin asm volatile("mtspr %0,%1" : : "i"(nr), "r"(val) : "memory"); 39875ebbc7SNicholas Piggin } 40875ebbc7SNicholas Piggin 41875ebbc7SNicholas Piggin static inline uint64_t mfmsr(void) 42875ebbc7SNicholas Piggin { 43875ebbc7SNicholas Piggin uint64_t msr; 44875ebbc7SNicholas Piggin 45875ebbc7SNicholas Piggin asm volatile ("mfmsr %[msr]" : [msr] "=r" (msr) :: "memory"); 46875ebbc7SNicholas Piggin 47875ebbc7SNicholas Piggin return msr; 48875ebbc7SNicholas Piggin } 49875ebbc7SNicholas Piggin 50875ebbc7SNicholas Piggin static inline void mtmsr(uint64_t msr) 51875ebbc7SNicholas Piggin { 52875ebbc7SNicholas Piggin asm volatile ("mtmsrd %[msr]" :: [msr] "r" (msr) : "memory"); 53875ebbc7SNicholas Piggin } 54875ebbc7SNicholas Piggin 55c76b0d0aSNicholas Piggin static inline void local_irq_enable(void) 56c76b0d0aSNicholas Piggin { 57c76b0d0aSNicholas Piggin unsigned long msr; 58c76b0d0aSNicholas Piggin 59*93c847c1SNicholas Piggin assert(!in_usermode()); 60*93c847c1SNicholas Piggin 61c76b0d0aSNicholas Piggin asm volatile( 62c76b0d0aSNicholas Piggin " mfmsr %0 \n \ 63c76b0d0aSNicholas Piggin ori %0,%0,%1 \n \ 64c76b0d0aSNicholas Piggin mtmsrd %0,1 " 65c76b0d0aSNicholas Piggin : "=r"(msr) : "i"(MSR_EE): "memory"); 66c76b0d0aSNicholas Piggin } 67c76b0d0aSNicholas Piggin 68c76b0d0aSNicholas Piggin static inline void local_irq_disable(void) 69c76b0d0aSNicholas Piggin { 70c76b0d0aSNicholas Piggin unsigned long msr; 71c76b0d0aSNicholas Piggin 72*93c847c1SNicholas Piggin assert(!in_usermode()); 73*93c847c1SNicholas Piggin 74c76b0d0aSNicholas Piggin asm volatile( 75c76b0d0aSNicholas Piggin " mfmsr %0 \n \ 76c76b0d0aSNicholas Piggin andc %0,%0,%1 \n \ 77c76b0d0aSNicholas Piggin mtmsrd %0,1 " 78c76b0d0aSNicholas Piggin : "=r"(msr) : "r"(MSR_EE): "memory"); 79c76b0d0aSNicholas Piggin } 80c76b0d0aSNicholas Piggin 81610c5a9cSNicholas Piggin /* 82610c5a9cSNicholas Piggin * This returns true on PowerNV / OPAL machines which run in hypervisor 83610c5a9cSNicholas Piggin * mode. False on pseries / PAPR machines that run in guest mode. 84610c5a9cSNicholas Piggin */ 85610c5a9cSNicholas Piggin static inline bool machine_is_powernv(void) 86610c5a9cSNicholas Piggin { 87610c5a9cSNicholas Piggin return cpu_has_hv; 88610c5a9cSNicholas Piggin } 89610c5a9cSNicholas Piggin 90610c5a9cSNicholas Piggin /* 91610c5a9cSNicholas Piggin * This returns true on pseries / PAPR / KVM machines which run under a 92610c5a9cSNicholas Piggin * hypervisor or QEMU pseries machine. False for PowerNV / OPAL. 93610c5a9cSNicholas Piggin */ 94610c5a9cSNicholas Piggin static inline bool machine_is_pseries(void) 95610c5a9cSNicholas Piggin { 96610c5a9cSNicholas Piggin return !machine_is_powernv(); 97610c5a9cSNicholas Piggin } 98610c5a9cSNicholas Piggin 99610c5a9cSNicholas Piggin void enable_mcheck(void); 100610c5a9cSNicholas Piggin void disable_mcheck(void); 101610c5a9cSNicholas Piggin 102*93c847c1SNicholas Piggin void enter_usermode(void); 103*93c847c1SNicholas Piggin void exit_usermode(void); 104*93c847c1SNicholas Piggin 1056842bc34SLaurent Vivier #endif /* _ASMPOWERPC_PROCESSOR_H_ */ 106