pcpu.h (122829) | pcpu.h (122833) |
---|---|
1/*- 2 * Copyright (c) Peter Wemm <peter@netplex.com.au> 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 unchanged lines hidden (view full) --- 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 * | 1/*- 2 * Copyright (c) Peter Wemm <peter@netplex.com.au> 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 unchanged lines hidden (view full) --- 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/amd64/include/pcpu.h 122829 2003-11-17 03:40:41Z bde $ | 26 * $FreeBSD: head/sys/amd64/include/pcpu.h 122833 2003-11-17 04:40:58Z bde $ |
27 */ 28 29#ifndef _MACHINE_PCPU_H_ 30#define _MACHINE_PCPU_H_ 31 32#ifdef _KERNEL 33 34/* --- 28 unchanged lines hidden (view full) --- 63 * Evaluates to the type of the per-cpu variable name. 64 */ 65#define __pcpu_type(name) \ 66 __typeof(((struct pcpu *)0)->name) 67 68/* 69 * Evaluates to the address of the per-cpu variable name. 70 */ | 27 */ 28 29#ifndef _MACHINE_PCPU_H_ 30#define _MACHINE_PCPU_H_ 31 32#ifdef _KERNEL 33 34/* --- 28 unchanged lines hidden (view full) --- 63 * Evaluates to the type of the per-cpu variable name. 64 */ 65#define __pcpu_type(name) \ 66 __typeof(((struct pcpu *)0)->name) 67 68/* 69 * Evaluates to the address of the per-cpu variable name. 70 */ |
71#define __PCPU_PTR(name) ({ \ | 71#define __PCPU_PTR(name) __extension__ ({ \ |
72 __pcpu_type(name) *__p; \ 73 \ 74 __asm __volatile("movq %%gs:%1,%0; addq %2,%0" \ 75 : "=r" (__p) \ 76 : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))), \ 77 "i" (__pcpu_offset(name))); \ 78 \ 79 __p; \ 80}) 81 82/* 83 * Evaluates to the value of the per-cpu variable name. 84 */ | 72 __pcpu_type(name) *__p; \ 73 \ 74 __asm __volatile("movq %%gs:%1,%0; addq %2,%0" \ 75 : "=r" (__p) \ 76 : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))), \ 77 "i" (__pcpu_offset(name))); \ 78 \ 79 __p; \ 80}) 81 82/* 83 * Evaluates to the value of the per-cpu variable name. 84 */ |
85#define __PCPU_GET(name) ({ \ | 85#define __PCPU_GET(name) __extension__ ({ \ |
86 __pcpu_type(name) __result; \ 87 \ 88 if (sizeof(__result) == 1) { \ 89 u_char __b; \ 90 __asm __volatile("movb %%gs:%1,%0" \ 91 : "=r" (__b) \ 92 : "m" (*(u_char *)(__pcpu_offset(name)))); \ 93 __result = *(__pcpu_type(name) *)&__b; \ --- 20 unchanged lines hidden (view full) --- 114 } \ 115 \ 116 __result; \ 117}) 118 119/* 120 * Sets the value of the per-cpu variable name to value val. 121 */ | 86 __pcpu_type(name) __result; \ 87 \ 88 if (sizeof(__result) == 1) { \ 89 u_char __b; \ 90 __asm __volatile("movb %%gs:%1,%0" \ 91 : "=r" (__b) \ 92 : "m" (*(u_char *)(__pcpu_offset(name)))); \ 93 __result = *(__pcpu_type(name) *)&__b; \ --- 20 unchanged lines hidden (view full) --- 114 } \ 115 \ 116 __result; \ 117}) 118 119/* 120 * Sets the value of the per-cpu variable name to value val. 121 */ |
122#define __PCPU_SET(name, val) ({ \ | 122#define __PCPU_SET(name, val) { \ |
123 __pcpu_type(name) __val = (val); \ 124 \ 125 if (sizeof(__val) == 1) { \ 126 u_char __b; \ 127 __b = *(u_char *)&__val; \ 128 __asm __volatile("movb %1,%%gs:%0" \ 129 : "=m" (*(u_char *)(__pcpu_offset(name))) \ 130 : "r" (__b)); \ --- 13 unchanged lines hidden (view full) --- 144 u_long __l; \ 145 __l = *(u_long *)&__val; \ 146 __asm __volatile("movq %1,%%gs:%0" \ 147 : "=m" (*(u_long *)(__pcpu_offset(name))) \ 148 : "r" (__l)); \ 149 } else { \ 150 *__PCPU_PTR(name) = __val; \ 151 } \ | 123 __pcpu_type(name) __val = (val); \ 124 \ 125 if (sizeof(__val) == 1) { \ 126 u_char __b; \ 127 __b = *(u_char *)&__val; \ 128 __asm __volatile("movb %1,%%gs:%0" \ 129 : "=m" (*(u_char *)(__pcpu_offset(name))) \ 130 : "r" (__b)); \ --- 13 unchanged lines hidden (view full) --- 144 u_long __l; \ 145 __l = *(u_long *)&__val; \ 146 __asm __volatile("movq %1,%%gs:%0" \ 147 : "=m" (*(u_long *)(__pcpu_offset(name))) \ 148 : "r" (__l)); \ 149 } else { \ 150 *__PCPU_PTR(name) = __val; \ 151 } \ |
152}) | 152} |
153 154#define PCPU_GET(member) __PCPU_GET(pc_ ## member) 155#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member) 156#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val) 157 158#else 159#error gcc or lint is required to use this file 160#endif 161 162#endif /* _KERNEL */ 163 164#endif /* ! _MACHINE_PCPU_H_ */ | 153 154#define PCPU_GET(member) __PCPU_GET(pc_ ## member) 155#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member) 156#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val) 157 158#else 159#error gcc or lint is required to use this file 160#endif 161 162#endif /* _KERNEL */ 163 164#endif /* ! _MACHINE_PCPU_H_ */ |