summaryrefslogtreecommitdiff
path: root/arch/i386/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r--arch/i386/kernel/spinlock.s30
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/i386/kernel/spinlock.s b/arch/i386/kernel/spinlock.s
new file mode 100644
index 0000000..c8235ca
--- /dev/null
+++ b/arch/i386/kernel/spinlock.s
@@ -0,0 +1,30 @@
+.section .text
+
+.global aquire_lock
+.type aquire_lock, @function
+aquire_lock:
+ pushl %ebp
+ movl %esp, %ebp
+locked:
+ movl 8(%esp), %eax
+ lock incl (%eax)
+ jc spin_wait
+
+ popl %ebp
+ ret
+spin_wait:
+ test %eax, 1
+ jnz spin_wait
+ jmp locked
+
+.global release_lock
+.type release_lock, @function
+release_lock:
+ pushl %ebp
+ movl %esp, %ebp
+
+ movl 8(%ebp), %eax
+ lock decl (%eax)
+
+ popl %ebp
+ ret