cpufunc.h revision 201032
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/ia64/include/cpufunc.h 201032 2009-12-26 22:22:09Z marcel $ 27 */ 28 29#ifndef _MACHINE_CPUFUNC_H_ 30#define _MACHINE_CPUFUNC_H_ 31 32#ifdef _KERNEL 33 34#include <sys/types.h> 35#include <machine/ia64_cpu.h> 36#include <machine/vmparam.h> 37 38#ifndef _SYS_CDEFS_H_ 39#error this file needs sys/cdefs.h as a prerequisite 40#endif 41 42struct thread; 43 44#define IA64_FIXED_BREAK 0x84B5D 45 46#ifdef __GNUCLIKE_ASM 47 48static __inline void 49breakpoint(void) 50{ 51 __asm __volatile("break.m %0" :: "i"(IA64_FIXED_BREAK)); 52} 53 54#define HAVE_INLINE_FFS 55#define ffs(x) __builtin_ffs(x) 56 57#define __MEMIO_ADDR(x) (void*)(IA64_PHYS_TO_RR6(x)) 58extern void *ia64_ioport_address(u_int); 59#define __PIO_ADDR(x) ia64_ioport_address(x) 60 61/* 62 * I/O port reads with ia32 semantics. 63 */ 64static __inline uint8_t 65inb(unsigned int port) 66{ 67 uint8_t v; 68 69 ia64_mf(); 70 v = ia64_ld1(__PIO_ADDR(port)); 71 ia64_mf_a(); 72 ia64_mf(); 73 return (v); 74} 75 76static __inline uint16_t 77inw(unsigned int port) 78{ 79 uint16_t v; 80 81 ia64_mf(); 82 v = ia64_ld2(__PIO_ADDR(port)); 83 ia64_mf_a(); 84 ia64_mf(); 85 return (v); 86} 87 88static __inline uint32_t 89inl(unsigned int port) 90{ 91 uint32_t v; 92 93 ia64_mf(); 94 v = ia64_ld4(__PIO_ADDR(port)); 95 ia64_mf_a(); 96 ia64_mf(); 97 return (v); 98} 99 100static __inline void 101insb(unsigned int port, void *addr, size_t count) 102{ 103 uint8_t *buf = addr; 104 while (count--) 105 *buf++ = inb(port); 106} 107 108static __inline void 109insw(unsigned int port, void *addr, size_t count) 110{ 111 uint16_t *buf = addr; 112 while (count--) 113 *buf++ = inw(port); 114} 115 116static __inline void 117insl(unsigned int port, void *addr, size_t count) 118{ 119 uint32_t *buf = addr; 120 while (count--) 121 *buf++ = inl(port); 122} 123 124static __inline void 125outb(unsigned int port, uint8_t data) 126{ 127 128 ia64_mf(); 129 ia64_st1(__PIO_ADDR(port), data); 130 ia64_mf_a(); 131 ia64_mf(); 132} 133 134static __inline void 135outw(unsigned int port, uint16_t data) 136{ 137 138 ia64_mf(); 139 ia64_st2(__PIO_ADDR(port), data); 140 ia64_mf_a(); 141 ia64_mf(); 142} 143 144static __inline void 145outl(unsigned int port, uint32_t data) 146{ 147 148 ia64_mf(); 149 ia64_st4(__PIO_ADDR(port), data); 150 ia64_mf_a(); 151 ia64_mf(); 152} 153 154static __inline void 155outsb(unsigned int port, const void *addr, size_t count) 156{ 157 const uint8_t *buf = addr; 158 while (count--) 159 outb(port, *buf++); 160} 161 162static __inline void 163outsw(unsigned int port, const void *addr, size_t count) 164{ 165 const uint16_t *buf = addr; 166 while (count--) 167 outw(port, *buf++); 168} 169 170static __inline void 171outsl(unsigned int port, const void *addr, size_t count) 172{ 173 const uint32_t *buf = addr; 174 while (count--) 175 outl(port, *buf++); 176} 177 178static __inline void 179disable_intr(void) 180{ 181 __asm __volatile ("rsm psr.i"); 182} 183 184static __inline void 185enable_intr(void) 186{ 187 __asm __volatile ("ssm psr.i;; srlz.d"); 188} 189 190static __inline register_t 191intr_disable(void) 192{ 193 register_t psr; 194 __asm __volatile ("mov %0=psr;;" : "=r"(psr)); 195 disable_intr(); 196 return ((psr & IA64_PSR_I) ? 1 : 0); 197} 198 199static __inline void 200intr_restore(register_t ie) 201{ 202 if (ie) 203 enable_intr(); 204} 205 206#endif /* __GNUCLIKE_ASM */ 207 208#endif /* _KERNEL */ 209 210#endif /* !_MACHINE_CPUFUNC_H_ */ 211