cpufunc.h revision 114208
1219561Savg/*- 2219561Savg * Copyright (c) 1998 Doug Rabson 3219561Savg * All rights reserved. 4219561Savg * 5219561Savg * Redistribution and use in source and binary forms, with or without 6219561Savg * modification, are permitted provided that the following conditions 7219561Savg * are met: 8219561Savg * 1. Redistributions of source code must retain the above copyright 9219561Savg * notice, this list of conditions and the following disclaimer. 10219561Savg * 2. Redistributions in binary form must reproduce the above copyright 11219561Savg * notice, this list of conditions and the following disclaimer in the 12219561Savg * documentation and/or other materials provided with the distribution. 13219561Savg * 14253996Savg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15253996Savg * 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 114208 2003-04-29 09:50:03Z 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 38struct thread; 39 40#ifdef __GNUC__ 41 42static __inline void 43breakpoint(void) 44{ 45 __asm __volatile("break 0x80100"); /* XXX use linux value */ 46} 47 48#endif 49 50extern uint64_t ia64_port_base; 51#define __MEMIO_ADDR(x) (__volatile void*)(IA64_PHYS_TO_RR6(x)) 52#define __PIO_ADDR(x) (__volatile void*)(ia64_port_base | \ 53 (((x) & 0xFFFC) << 10) | ((x) & 0xFFF)) 54 55/* 56 * I/O port reads with ia32 semantics. 57 */ 58static __inline uint8_t 59inb(unsigned int port) 60{ 61 __volatile uint8_t *p; 62 uint8_t v; 63 p = __PIO_ADDR(port); 64 ia64_mf(); 65 v = *p; 66 ia64_mf_a(); 67 ia64_mf(); 68 return (v); 69} 70 71static __inline uint16_t 72inw(unsigned int port) 73{ 74 __volatile uint16_t *p; 75 uint16_t v; 76 p = __PIO_ADDR(port); 77 ia64_mf(); 78 v = *p; 79 ia64_mf_a(); 80 ia64_mf(); 81 return (v); 82} 83 84static __inline uint32_t 85inl(unsigned int port) 86{ 87 volatile uint32_t *p; 88 uint32_t v; 89 p = __PIO_ADDR(port); 90 ia64_mf(); 91 v = *p; 92 ia64_mf_a(); 93 ia64_mf(); 94 return (v); 95} 96 97static __inline void 98insb(unsigned int port, void *addr, size_t count) 99{ 100 uint8_t *buf = addr; 101 while (count--) 102 *buf++ = inb(port); 103} 104 105static __inline void 106insw(unsigned int port, void *addr, size_t count) 107{ 108 uint16_t *buf = addr; 109 while (count--) 110 *buf++ = inw(port); 111} 112 113static __inline void 114insl(unsigned int port, void *addr, size_t count) 115{ 116 uint32_t *buf = addr; 117 while (count--) 118 *buf++ = inl(port); 119} 120 121static __inline void 122outb(unsigned int port, uint8_t data) 123{ 124 volatile uint8_t *p; 125 p = __PIO_ADDR(port); 126 ia64_mf(); 127 *p = data; 128 ia64_mf_a(); 129 ia64_mf(); 130} 131 132static __inline void 133outw(unsigned int port, uint16_t data) 134{ 135 volatile uint16_t *p; 136 p = __PIO_ADDR(port); 137 ia64_mf(); 138 *p = data; 139 ia64_mf_a(); 140 ia64_mf(); 141} 142 143static __inline void 144outl(unsigned int port, uint32_t data) 145{ 146 volatile uint32_t *p; 147 p = __PIO_ADDR(port); 148 ia64_mf(); 149 *p = 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); 197} 198 199static __inline void 200intr_restore(critical_t psr) 201{ 202 __asm __volatile ("mov psr.l=%0;; srlz.d" :: "r"(psr)); 203} 204 205#endif /* _KERNEL */ 206 207#endif /* !_MACHINE_CPUFUNC_H_ */ 208