1*6bd9427eSkettenis /* $OpenBSD: cpufunc.h,v 1.11 2023/01/25 09:53:53 kettenis Exp $ */
2f6e57a87Skettenis
3f6e57a87Skettenis /*
4f6e57a87Skettenis * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
5f6e57a87Skettenis *
6f6e57a87Skettenis * Permission to use, copy, modify, and distribute this software for any
7f6e57a87Skettenis * purpose with or without fee is hereby granted, provided that the above
8f6e57a87Skettenis * copyright notice and this permission notice appear in all copies.
9f6e57a87Skettenis *
10f6e57a87Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11f6e57a87Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12f6e57a87Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13f6e57a87Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14f6e57a87Skettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15f6e57a87Skettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16f6e57a87Skettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f6e57a87Skettenis */
18f6e57a87Skettenis
19f6e57a87Skettenis #ifndef _MACHINE_CPUFUNC_H_
20f6e57a87Skettenis #define _MACHINE_CPUFUNC_H_
21f6e57a87Skettenis
22dfe2a243Skettenis static inline void
eieio(void)23dfe2a243Skettenis eieio(void)
24dfe2a243Skettenis {
25dfe2a243Skettenis __asm volatile ("eieio" ::: "memory");
26dfe2a243Skettenis }
27dfe2a243Skettenis
28dfe2a243Skettenis static inline void
isync(void)29dfe2a243Skettenis isync(void)
30dfe2a243Skettenis {
31dfe2a243Skettenis __asm volatile ("isync" ::: "memory");
32dfe2a243Skettenis }
33dfe2a243Skettenis
34dfe2a243Skettenis static inline void
ptesync(void)35dfe2a243Skettenis ptesync(void)
36dfe2a243Skettenis {
37dfe2a243Skettenis __asm volatile ("ptesync" ::: "memory");
38dfe2a243Skettenis }
39dfe2a243Skettenis
40dfe2a243Skettenis static inline void
sync(void)419c82a784Skettenis sync(void)
429c82a784Skettenis {
439c82a784Skettenis __asm volatile ("sync" ::: "memory");
449c82a784Skettenis }
459c82a784Skettenis
469c82a784Skettenis static inline void
slbia(void)47dfe2a243Skettenis slbia(void)
48dfe2a243Skettenis {
49dfe2a243Skettenis __asm volatile ("slbia");
50dfe2a243Skettenis }
51dfe2a243Skettenis
52dfe2a243Skettenis static inline void
slbie(uint64_t esid)53dfe2a243Skettenis slbie(uint64_t esid)
54dfe2a243Skettenis {
55dfe2a243Skettenis __asm volatile ("slbie %0" :: "r"(esid));
56dfe2a243Skettenis }
57dfe2a243Skettenis
58dfe2a243Skettenis static inline uint64_t
slbmfee(uint64_t entry)59dfe2a243Skettenis slbmfee(uint64_t entry)
60dfe2a243Skettenis {
61dfe2a243Skettenis uint64_t value;
62dfe2a243Skettenis __asm volatile ("slbmfee %0, %1" : "=r"(value) : "r"(entry));
63dfe2a243Skettenis return value;
64dfe2a243Skettenis }
65dfe2a243Skettenis
66dfe2a243Skettenis static inline void
slbmte(uint64_t slbv,uint64_t slbe)67dfe2a243Skettenis slbmte(uint64_t slbv, uint64_t slbe)
68dfe2a243Skettenis {
69dfe2a243Skettenis __asm volatile ("slbmte %0, %1" :: "r"(slbv), "r"(slbe));
70dfe2a243Skettenis }
71dfe2a243Skettenis
72dfe2a243Skettenis static inline void
tlbie(uint64_t ava)73dfe2a243Skettenis tlbie(uint64_t ava)
74dfe2a243Skettenis {
75dfe2a243Skettenis __asm volatile ("tlbie %0, %1" :: "r"(ava), "r"(0));
76dfe2a243Skettenis }
77dfe2a243Skettenis
78dfe2a243Skettenis static inline void
tlbiel(uint64_t ava)79dfe2a243Skettenis tlbiel(uint64_t ava)
80dfe2a243Skettenis {
81dfe2a243Skettenis __asm volatile ("tlbiel %0" :: "r"(ava));
82dfe2a243Skettenis }
83dfe2a243Skettenis
84dfe2a243Skettenis static inline void
tlbsync(void)85dfe2a243Skettenis tlbsync(void)
86dfe2a243Skettenis {
87dfe2a243Skettenis __asm volatile ("tlbsync" ::: "memory");
88dfe2a243Skettenis }
89dfe2a243Skettenis
90f6e57a87Skettenis static inline uint64_t
mfmsr(void)91f6e57a87Skettenis mfmsr(void)
92f6e57a87Skettenis {
93f6e57a87Skettenis uint64_t value;
94f6e57a87Skettenis __asm volatile ("mfmsr %0" : "=r"(value));
95f6e57a87Skettenis return value;
96f6e57a87Skettenis }
97f6e57a87Skettenis
98f6e57a87Skettenis static inline void
mtmsr(uint64_t value)99f6e57a87Skettenis mtmsr(uint64_t value)
100f6e57a87Skettenis {
101f6e57a87Skettenis __asm volatile ("mtmsr %0" :: "r"(value));
102f6e57a87Skettenis }
103f6e57a87Skettenis
104f6e57a87Skettenis static inline uint64_t
mftb(void)105dfe2a243Skettenis mftb(void)
106dfe2a243Skettenis {
107dfe2a243Skettenis uint64_t value;
108dfe2a243Skettenis __asm volatile ("mftb %0" : "=r"(value));
109dfe2a243Skettenis return value;
110dfe2a243Skettenis }
111dfe2a243Skettenis
112dfe2a243Skettenis static inline uint32_t
mfdsisr(void)113dfe2a243Skettenis mfdsisr(void)
114dfe2a243Skettenis {
115dfe2a243Skettenis uint32_t value;
116dfe2a243Skettenis __asm volatile ("mfdsisr %0" : "=r"(value));
117dfe2a243Skettenis return value;
118dfe2a243Skettenis }
119dfe2a243Skettenis
120dfe2a243Skettenis static inline uint64_t
mfdar(void)121dfe2a243Skettenis mfdar(void)
122dfe2a243Skettenis {
123dfe2a243Skettenis uint64_t value;
124dfe2a243Skettenis __asm volatile ("mfdar %0" : "=r"(value));
125dfe2a243Skettenis return value;
126dfe2a243Skettenis }
127dfe2a243Skettenis
128c1cbf458Skettenis static inline void
mtdec(uint32_t value)129c1cbf458Skettenis mtdec(uint32_t value)
130c1cbf458Skettenis {
131c1cbf458Skettenis __asm volatile ("mtdec %0" :: "r"(value));
132c1cbf458Skettenis }
133c1cbf458Skettenis
134c2b3d03cSkettenis static inline void
mtsdr1(uint64_t value)135c2b3d03cSkettenis mtsdr1(uint64_t value)
136c2b3d03cSkettenis {
137c2b3d03cSkettenis __asm volatile ("mtsdr1 %0" :: "r"(value));
138c2b3d03cSkettenis }
139c2b3d03cSkettenis
14094f240f4Skettenis static inline void
mtamr(uint64_t value)141*6bd9427eSkettenis mtamr(uint64_t value)
142*6bd9427eSkettenis {
143*6bd9427eSkettenis __asm volatile ("mtspr 29, %0" :: "r"(value));
144*6bd9427eSkettenis }
145*6bd9427eSkettenis
146*6bd9427eSkettenis static inline void
mtfscr(uint64_t value)14794f240f4Skettenis mtfscr(uint64_t value)
14894f240f4Skettenis {
14994f240f4Skettenis __asm volatile ("mtspr 153, %0" :: "r"(value));
15094f240f4Skettenis }
15194f240f4Skettenis
152*6bd9427eSkettenis static inline void
mtuamor(uint64_t value)153*6bd9427eSkettenis mtuamor(uint64_t value)
154*6bd9427eSkettenis {
155*6bd9427eSkettenis __asm volatile ("mtspr 157, %0" :: "r"(value));
156*6bd9427eSkettenis }
157*6bd9427eSkettenis
158381de2feSkettenis static inline uint32_t
mfpvr(void)159381de2feSkettenis mfpvr(void)
160381de2feSkettenis {
161381de2feSkettenis uint32_t value;
162381de2feSkettenis __asm volatile ("mfspr %0, 287" : "=r"(value));
163381de2feSkettenis return value;
164381de2feSkettenis }
165381de2feSkettenis
166dfe2a243Skettenis static inline uint64_t
mflpcr(void)167f6e57a87Skettenis mflpcr(void)
168f6e57a87Skettenis {
169f6e57a87Skettenis uint64_t value;
170f6e57a87Skettenis __asm volatile ("mfspr %0, 318" : "=r"(value));
171f6e57a87Skettenis return value;
172f6e57a87Skettenis }
173f6e57a87Skettenis
174f6e57a87Skettenis static inline void
mtlpcr(uint64_t value)175f6e57a87Skettenis mtlpcr(uint64_t value)
176f6e57a87Skettenis {
177f6e57a87Skettenis __asm volatile ("mtspr 318, %0" :: "r"(value));
178f6e57a87Skettenis }
179f6e57a87Skettenis
180196daab3Sgkoehler #define LPCR_PECE 0x000040000001f000UL
181c2b3d03cSkettenis #define LPCR_LPES 0x0000000000000008UL
182c2b3d03cSkettenis #define LPCR_HVICE 0x0000000000000002UL
183c2b3d03cSkettenis
184dfe2a243Skettenis static inline void
mtamor(uint64_t value)185*6bd9427eSkettenis mtamor(uint64_t value)
186*6bd9427eSkettenis {
187*6bd9427eSkettenis __asm volatile ("mtspr 349, %0" :: "r"(value));
188*6bd9427eSkettenis }
189*6bd9427eSkettenis
190*6bd9427eSkettenis static inline void
mtptcr(uint64_t value)191dfe2a243Skettenis mtptcr(uint64_t value)
192dfe2a243Skettenis {
193dfe2a243Skettenis __asm volatile ("mtspr 464, %0" :: "r"(value));
194dfe2a243Skettenis }
195f6e57a87Skettenis
196b286a873Sgkoehler static inline uint64_t
mfpmsr(void)197b286a873Sgkoehler mfpmsr(void)
198b286a873Sgkoehler {
199b286a873Sgkoehler uint64_t value;
200b286a873Sgkoehler __asm volatile ("mfspr %0, 853" : "=r"(value));
201b286a873Sgkoehler return value;
202b286a873Sgkoehler }
203b286a873Sgkoehler
204b286a873Sgkoehler static inline void
mtpmcr(uint64_t value)205b286a873Sgkoehler mtpmcr(uint64_t value)
206b286a873Sgkoehler {
207b286a873Sgkoehler __asm volatile ("mtspr 884, %0" :: "r"(value));
208b286a873Sgkoehler }
209b286a873Sgkoehler
2108c07258aSkettenis static inline uint32_t
mfpir(void)2118c07258aSkettenis mfpir(void)
2128c07258aSkettenis {
2138c07258aSkettenis uint32_t value;
2148c07258aSkettenis __asm volatile ("mfspr %0, 1023" : "=r"(value));
2158c07258aSkettenis return value;
2168c07258aSkettenis }
2178c07258aSkettenis
218f6e57a87Skettenis extern int cacheline_size;
219f6e57a87Skettenis
220f6e57a87Skettenis void __syncicache(void *, size_t);
221f6e57a87Skettenis
222f6e57a87Skettenis #endif /* _MACHINE_CPUFUNC_H_ */
223