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
8*0cc3a351SSean Christopherson #ifndef __ASSEMBLER__
96842bc34SLaurent Vivier void handle_exception(int trap, void (*func)(struct pt_regs *, void *), void *);
106842bc34SLaurent Vivier void do_handle_exception(struct pt_regs *regs);
11*0cc3a351SSean Christopherson #endif /* __ASSEMBLER__ */
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
2593c847c1SNicholas Piggin bool in_usermode(void);
2693c847c1SNicholas Piggin
mfspr(int nr)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
mtspr(int nr,uint64_t val)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
mfmsr(void)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
mtmsr(uint64_t msr)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
local_irq_enable(void)55c76b0d0aSNicholas Piggin static inline void local_irq_enable(void)
56c76b0d0aSNicholas Piggin {
57c76b0d0aSNicholas Piggin unsigned long msr;
58c76b0d0aSNicholas Piggin
5993c847c1SNicholas Piggin assert(!in_usermode());
6093c847c1SNicholas 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
local_irq_disable(void)68c76b0d0aSNicholas Piggin static inline void local_irq_disable(void)
69c76b0d0aSNicholas Piggin {
70c76b0d0aSNicholas Piggin unsigned long msr;
71c76b0d0aSNicholas Piggin
7293c847c1SNicholas Piggin assert(!in_usermode());
7393c847c1SNicholas 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 */
machine_is_powernv(void)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 */
machine_is_pseries(void)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
10293c847c1SNicholas Piggin void enter_usermode(void);
10393c847c1SNicholas Piggin void exit_usermode(void);
10493c847c1SNicholas Piggin
1056842bc34SLaurent Vivier #endif /* _ASMPOWERPC_PROCESSOR_H_ */
106