cpufunc.h revision 184486
190075Sobrien/*-
290075Sobrien * Copyright (c) 1998 Doug Rabson
390075Sobrien * All rights reserved.
490075Sobrien *
590075Sobrien * Redistribution and use in source and binary forms, with or without
690075Sobrien * modification, are permitted provided that the following conditions
790075Sobrien * are met:
890075Sobrien * 1. Redistributions of source code must retain the above copyright
990075Sobrien *    notice, this list of conditions and the following disclaimer.
1090075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1190075Sobrien *    notice, this list of conditions and the following disclaimer in the
1290075Sobrien *    documentation and/or other materials provided with the distribution.
1390075Sobrien *
1490075Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1590075Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1690075Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1790075Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1890075Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1990075Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2090075Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2190075Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2290075Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2390075Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2490075Sobrien * SUCH DAMAGE.
2590075Sobrien *
2690075Sobrien * $FreeBSD: head/sys/powerpc/include/cpufunc.h 184486 2008-10-30 21:02:00Z sobomax $
2790075Sobrien */
2890075Sobrien
2990075Sobrien#ifndef _MACHINE_CPUFUNC_H_
3090075Sobrien#define	_MACHINE_CPUFUNC_H_
3190075Sobrien
3290075Sobrien/*
3390075Sobrien * Required for user-space atomic.h includes
3490075Sobrien */
3590075Sobrienstatic __inline void
3690075Sobrienpowerpc_mb(void)
3790075Sobrien{
38132718Skan
39132718Skan	__asm __volatile("eieio; sync" : : : "memory");
4090075Sobrien}
4190075Sobrien
42117395Skan#ifdef _KERNEL
4390075Sobrien
44169689Skan#include <sys/types.h>
45117395Skan
4690075Sobrien#include <machine/psl.h>
47117395Skan#include <machine/spr.h>
4890075Sobrien
4990075Sobrienstruct thread;
5090075Sobrien
5190075Sobrien#ifdef KDB
5290075Sobrienvoid breakpoint(void);
5390075Sobrien#else
5490075Sobrienstatic __inline void
5590075Sobrienbreakpoint(void)
5690075Sobrien{
5790075Sobrien
5890075Sobrien	return;
5990075Sobrien}
6090075Sobrien#endif
6190075Sobrien
6290075Sobrien/* CPU register mangling inlines */
63117395Skan
64117395Skanstatic __inline void
65169689Skanmtmsr(register_t value)
66117395Skan{
67117395Skan
68117395Skan	__asm __volatile ("mtmsr %0; isync" :: "r"(value));
69117395Skan}
70117395Skan
71117395Skanstatic __inline register_t
72117395Skanmfmsr(void)
7390075Sobrien{
7490075Sobrien	register_t	value;
7590075Sobrien
7690075Sobrien	__asm __volatile ("mfmsr %0" : "=r"(value));
77169689Skan
78169689Skan	return (value);
79169689Skan}
8090075Sobrien
8190075Sobrienstatic __inline void
82132718Skanmtsrin(vm_offset_t va, register_t value)
83132718Skan{
84132718Skan
85132718Skan	__asm __volatile ("mtsrin %0,%1" :: "r"(value), "r"(va));
86132718Skan}
87132718Skan
88132718Skanstatic __inline register_t
89132718Skanmfsrin(vm_offset_t va)
90169689Skan{
91132718Skan	register_t	value;
92169689Skan
93132718Skan	__asm __volatile ("mfsrin %0,%1" : "=r"(value) : "r"(va));
94132718Skan
95132718Skan	return (value);
96132718Skan}
9790075Sobrien
98132718Skanstatic __inline void
99132718Skanmtdec(register_t value)
100132718Skan{
10190075Sobrien
102132718Skan	__asm __volatile ("mtdec %0" :: "r"(value));
103132718Skan}
104132718Skan
105132718Skanstatic __inline register_t
10690075Sobrienmfdec(void)
107117395Skan{
10890075Sobrien	register_t	value;
10990075Sobrien
11090075Sobrien	__asm __volatile ("mfdec %0" : "=r"(value));
11190075Sobrien
11290075Sobrien	return (value);
11390075Sobrien}
11490075Sobrien
11590075Sobrienstatic __inline register_t
11690075Sobrienmfpvr(void)
11790075Sobrien{
11890075Sobrien	register_t	value;
11990075Sobrien
12090075Sobrien	__asm __volatile ("mfpvr %0" : "=r"(value));
12190075Sobrien
12290075Sobrien	return (value);
12390075Sobrien}
12490075Sobrien
12590075Sobrienstatic __inline void
12690075Sobrieneieio(void)
12790075Sobrien{
12890075Sobrien
12990075Sobrien	__asm __volatile ("eieio");
13090075Sobrien}
13190075Sobrien
13290075Sobrienstatic __inline void
133103445Skanisync(void)
134110611Skan{
13590075Sobrien
13690075Sobrien	__asm __volatile ("isync");
13790075Sobrien}
13890075Sobrien
13990075Sobrienstatic __inline void
14090075Sobrienpowerpc_sync(void)
14190075Sobrien{
14290075Sobrien
14390075Sobrien	__asm __volatile ("sync");
14490075Sobrien}
14590075Sobrien
14690075Sobrienstatic __inline register_t
14790075Sobrienintr_disable(void)
14890075Sobrien{
149117395Skan	register_t	msr;
15090075Sobrien
15190075Sobrien	msr = mfmsr();
15290075Sobrien	mtmsr(msr & ~PSL_EE);
15390075Sobrien	return (msr);
15490075Sobrien}
155169689Skan
15690075Sobrienstatic __inline void
15790075Sobrienintr_restore(register_t msr)
158103445Skan{
15990075Sobrien
16090075Sobrien	mtmsr(msr);
16190075Sobrien}
16290075Sobrien
16390075Sobrienstatic __inline struct pcpu *
16490075Sobrienpowerpc_get_pcpup(void)
16590075Sobrien{
16690075Sobrien	struct pcpu	*ret;
16790075Sobrien
16890075Sobrien	__asm __volatile("mfsprg %0, 0" : "=r"(ret));
16990075Sobrien
17090075Sobrien	return(ret);
17190075Sobrien}
17290075Sobrien
17390075Sobrien#endif /* _KERNEL */
17490075Sobrien
17590075Sobrien#endif /* !_MACHINE_CPUFUNC_H_ */
17690075Sobrien