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