1c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh/*
2c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh * Copyright 2008 Google Inc. All Rights Reserved.
3c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh * Author: md@google.com (Michael Davidson)
4c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh *
5c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh * Based on time-warp-test.c, which is:
6c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh * Copyright (C) 2005, Ingo Molnar
7c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh */
8c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh
9c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh#ifndef SPINLOCK_H_
10c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh#define	SPINLOCK_H_
11c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh
12c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmblightypedef unsigned long spinlock_t;
13c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh
14c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmblighstatic inline void spin_lock(spinlock_t *lock)
15c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh{
16c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh	__asm__ __volatile__(
17c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh		"1: rep; nop\n"
18c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh		" lock; btsl $0,%0\n"
19c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh		"jc 1b\n"
20c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh			     : "=g"(*lock) : : "memory");
21c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh}
22c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh
23c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmblighstatic inline void spin_unlock(spinlock_t *lock)
24c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh{
25c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh	__asm__ __volatile__("movl $0,%0; rep; nop" : "=g"(*lock) :: "memory");
26c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh}
27c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh
28c2e8280a4f1bf8a586946b7ee4f63ae817f8c74dmbligh#endif	/* SPINLOCK_H_ */
29