2 * Copyright (c) 2010 The DragonFly Project. All rights reserved.
5 * This code is derived from software contributed to The DragonFly Project
6 * by Venkatesh Srinivas <me@endeavour.zapto.org>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include <machine/asmacros.h>
35 #include <machine/cputypes.h>
36 #include <machine/pmap.h>
37 #include <machine/specialreg.h>
44 * int cpu_mmw_spin(int *addr, int oldval)
46 * Spin on addr, waiting for it to no longer contain oldval;
64 * int cpu_mmw_mwait(int *addr, int oldval)
66 * Spin on addr, waiting for it to no longer contain oldval;
67 * return newval. Use the MONITOR/MWAIT instructions to wait
68 * for a state-change on the address.
70 * WARN 1: We receive wakeup events for much larger windows
71 * than a single address; CPUID EAX = 0x05 reports the
72 * windows; on an Intel Atom they seem to cacheline-sized.
73 * Synchronization variables should probably be
74 * cacheline-aligned to avoid false wakeups.
76 * WARN 2: This routine can be racy; when we wake from MWAIT, we must
77 * load the contents of the address; in the meantime, it
78 * is possible that it was swapped to the prior (or some other)
79 * value; care must be used -- CMPXCHG for wakeup, for example.
81 * WARN 3: Use this routine only when cpu_mi_features & CPU_MI_MONITOR