cpufunc.h revision 192109
1/*- 2 * Copyright (c) 1998 Doug Rabson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/sys/powerpc/include/cpufunc.h 192109 2009-05-14 16:48:25Z raj $ 27 */ 28 29#ifndef _MACHINE_CPUFUNC_H_ 30#define _MACHINE_CPUFUNC_H_ 31 32/* 33 * Required for user-space atomic.h includes 34 */ 35static __inline void 36powerpc_mb(void) 37{ 38 39 __asm __volatile("eieio; sync" : : : "memory"); 40} 41 42#ifdef _KERNEL 43 44#include <sys/types.h> 45 46#include <machine/psl.h> 47#include <machine/spr.h> 48 49struct thread; 50 51#ifdef KDB 52void breakpoint(void); 53#else 54static __inline void 55breakpoint(void) 56{ 57 58 return; 59} 60#endif 61 62/* CPU register mangling inlines */ 63 64static __inline void 65mtmsr(register_t value) 66{ 67 68 __asm __volatile ("mtmsr %0; isync" :: "r"(value)); 69} 70 71static __inline register_t 72mfmsr(void) 73{ 74 register_t value; 75 76 __asm __volatile ("mfmsr %0" : "=r"(value)); 77 78 return (value); 79} 80 81static __inline void 82mtsrin(vm_offset_t va, register_t value) 83{ 84 85 __asm __volatile ("mtsrin %0,%1" :: "r"(value), "r"(va)); 86} 87 88static __inline register_t 89mfsrin(vm_offset_t va) 90{ 91 register_t value; 92 93 __asm __volatile ("mfsrin %0,%1" : "=r"(value) : "r"(va)); 94 95 return (value); 96} 97 98static __inline void 99mtdec(register_t value) 100{ 101 102 __asm __volatile ("mtdec %0" :: "r"(value)); 103} 104 105static __inline register_t 106mfdec(void) 107{ 108 register_t value; 109 110 __asm __volatile ("mfdec %0" : "=r"(value)); 111 112 return (value); 113} 114 115static __inline register_t 116mfpvr(void) 117{ 118 register_t value; 119 120 __asm __volatile ("mfpvr %0" : "=r"(value)); 121 122 return (value); 123} 124 125static __inline u_quad_t 126mftb(void) 127{ 128 u_quad_t tb; 129 uint32_t *tbup = (uint32_t *)&tb; 130 uint32_t *tblp = tbup + 1; 131 132 do { 133 *tbup = mfspr(TBR_TBU); 134 *tblp = mfspr(TBR_TBL); 135 } while (*tbup != mfspr(TBR_TBU)); 136 137 return (tb); 138} 139 140static __inline void 141mttb(u_quad_t time) 142{ 143 144 mtspr(TBR_TBWL, 0); 145 mtspr(TBR_TBWU, (uint32_t)(time >> 32)); 146 mtspr(TBR_TBWL, (uint32_t)(time & 0xffffffff)); 147} 148 149static __inline void 150eieio(void) 151{ 152 153 __asm __volatile ("eieio"); 154} 155 156static __inline void 157isync(void) 158{ 159 160 __asm __volatile ("isync"); 161} 162 163static __inline void 164powerpc_sync(void) 165{ 166 167 __asm __volatile ("sync"); 168} 169 170static __inline register_t 171intr_disable(void) 172{ 173 register_t msr; 174 175 msr = mfmsr(); 176 mtmsr(msr & ~PSL_EE); 177 return (msr); 178} 179 180static __inline void 181intr_restore(register_t msr) 182{ 183 184 mtmsr(msr); 185} 186 187static __inline struct pcpu * 188powerpc_get_pcpup(void) 189{ 190 struct pcpu *ret; 191 192 __asm __volatile("mfsprg %0, 0" : "=r"(ret)); 193 194 return(ret); 195} 196 197#endif /* _KERNEL */ 198 199#endif /* !_MACHINE_CPUFUNC_H_ */ 200