Deleted Added
full compact
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_ */