xref: /kvm-unit-tests/lib/powerpc/asm/processor.h (revision d4c8e725478d05179b23be44fc61357a92da4912)
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;
20*d4c8e725SNicholas 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 
25875ebbc7SNicholas Piggin static inline uint64_t mfspr(int nr)
26875ebbc7SNicholas Piggin {
27875ebbc7SNicholas Piggin 	uint64_t ret;
28875ebbc7SNicholas Piggin 
29875ebbc7SNicholas Piggin 	asm volatile("mfspr %0,%1" : "=r"(ret) : "i"(nr) : "memory");
30875ebbc7SNicholas Piggin 
31875ebbc7SNicholas Piggin 	return ret;
32875ebbc7SNicholas Piggin }
33875ebbc7SNicholas Piggin 
34875ebbc7SNicholas Piggin static inline void mtspr(int nr, uint64_t val)
35875ebbc7SNicholas Piggin {
36875ebbc7SNicholas Piggin 	asm volatile("mtspr %0,%1" : : "i"(nr), "r"(val) : "memory");
37875ebbc7SNicholas Piggin }
38875ebbc7SNicholas Piggin 
39875ebbc7SNicholas Piggin static inline uint64_t mfmsr(void)
40875ebbc7SNicholas Piggin {
41875ebbc7SNicholas Piggin 	uint64_t msr;
42875ebbc7SNicholas Piggin 
43875ebbc7SNicholas Piggin 	asm volatile ("mfmsr %[msr]" : [msr] "=r" (msr) :: "memory");
44875ebbc7SNicholas Piggin 
45875ebbc7SNicholas Piggin 	return msr;
46875ebbc7SNicholas Piggin }
47875ebbc7SNicholas Piggin 
48875ebbc7SNicholas Piggin static inline void mtmsr(uint64_t msr)
49875ebbc7SNicholas Piggin {
50875ebbc7SNicholas Piggin 	asm volatile ("mtmsrd %[msr]" :: [msr] "r" (msr) : "memory");
51875ebbc7SNicholas Piggin }
52875ebbc7SNicholas Piggin 
53c76b0d0aSNicholas Piggin static inline void local_irq_enable(void)
54c76b0d0aSNicholas Piggin {
55c76b0d0aSNicholas Piggin 	unsigned long msr;
56c76b0d0aSNicholas Piggin 
57c76b0d0aSNicholas Piggin 	asm volatile(
58c76b0d0aSNicholas Piggin "		mfmsr	%0		\n \
59c76b0d0aSNicholas Piggin 		ori	%0,%0,%1	\n \
60c76b0d0aSNicholas Piggin 		mtmsrd	%0,1		"
61c76b0d0aSNicholas Piggin 		: "=r"(msr) : "i"(MSR_EE): "memory");
62c76b0d0aSNicholas Piggin }
63c76b0d0aSNicholas Piggin 
64c76b0d0aSNicholas Piggin static inline void local_irq_disable(void)
65c76b0d0aSNicholas Piggin {
66c76b0d0aSNicholas Piggin 	unsigned long msr;
67c76b0d0aSNicholas Piggin 
68c76b0d0aSNicholas Piggin 	asm volatile(
69c76b0d0aSNicholas Piggin "		mfmsr	%0		\n \
70c76b0d0aSNicholas Piggin 		andc	%0,%0,%1	\n \
71c76b0d0aSNicholas Piggin 		mtmsrd	%0,1		"
72c76b0d0aSNicholas Piggin 		: "=r"(msr) : "r"(MSR_EE): "memory");
73c76b0d0aSNicholas Piggin }
74c76b0d0aSNicholas Piggin 
75610c5a9cSNicholas Piggin /*
76610c5a9cSNicholas Piggin  * This returns true on PowerNV / OPAL machines which run in hypervisor
77610c5a9cSNicholas Piggin  * mode. False on pseries / PAPR machines that run in guest mode.
78610c5a9cSNicholas Piggin  */
79610c5a9cSNicholas Piggin static inline bool machine_is_powernv(void)
80610c5a9cSNicholas Piggin {
81610c5a9cSNicholas Piggin 	return cpu_has_hv;
82610c5a9cSNicholas Piggin }
83610c5a9cSNicholas Piggin 
84610c5a9cSNicholas Piggin /*
85610c5a9cSNicholas Piggin  * This returns true on pseries / PAPR / KVM machines which run under a
86610c5a9cSNicholas Piggin  * hypervisor or QEMU pseries machine. False for PowerNV / OPAL.
87610c5a9cSNicholas Piggin  */
88610c5a9cSNicholas Piggin static inline bool machine_is_pseries(void)
89610c5a9cSNicholas Piggin {
90610c5a9cSNicholas Piggin 	return !machine_is_powernv();
91610c5a9cSNicholas Piggin }
92610c5a9cSNicholas Piggin 
93610c5a9cSNicholas Piggin void enable_mcheck(void);
94610c5a9cSNicholas Piggin void disable_mcheck(void);
95610c5a9cSNicholas Piggin 
966842bc34SLaurent Vivier #endif /* _ASMPOWERPC_PROCESSOR_H_ */
97