Module Name: src
Committed By: chs
Date: Wed Jul 7 01:13:29 UTC 2010
Modified Files:
src/sys/arch/amd64/amd64: copy.S
Log Message:
fix more bugs in ucas_*():
move the "old" value to %*ax so that cmpxchg* can work.
remove the PCB_ONFAULT stuff, onfault_handler() handles this already.
return the error from fault handler in ucas_fault rather than forcing EFAULT.
To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/amd64/amd64/copy.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/copy.S
diff -u src/sys/arch/amd64/amd64/copy.S:1.17 src/sys/arch/amd64/amd64/copy.S:1.18
--- src/sys/arch/amd64/amd64/copy.S:1.17 Tue Jun 22 18:26:05 2010
+++ src/sys/arch/amd64/amd64/copy.S Wed Jul 7 01:13:29 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: copy.S,v 1.17 2010/06/22 18:26:05 rmind Exp $ */
+/* $NetBSD: copy.S,v 1.18 2010/07/07 01:13:29 chs Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -502,13 +502,11 @@
movq $VM_MAXUSER_ADDRESS-8, %r8
cmpq %r8, %rdi
ja _C_LABEL(ucas_fault)
- /* Label for fault handler */
+ movq %rsi, %rax
.Lucas64_start:
/* Perform the CAS */
lock
cmpxchgq %rdx, (%rdi)
- /* Clear the fault handler */
- movq %rax, PCB_ONFAULT(%r8)
.Lucas64_end:
/*
* Note: %rax is "old" value.
@@ -516,8 +514,6 @@
*/
movq %rax, (%rcx)
xorq %rax, %rax
- /* Clear the fault handler */
- movq %rax, PCB_ONFAULT(%r8)
ret
DEFERRED_SWITCH_CALL
@@ -530,7 +526,7 @@
movq $VM_MAXUSER_ADDRESS-4, %r8
cmpq %r8, %rdi
ja _C_LABEL(ucas_fault)
- /* Label for fault handler */
+ movl %esi, %eax
.Lucas32_start:
/* Perform the CAS */
lock
@@ -546,15 +542,15 @@
DEFERRED_SWITCH_CALL
/*
- * Fault handler for ucas_32() and ucas_64().
- * Unset the handler and return the failure.
+ * Fault handler for ucas_*().
+ * Just return the error set by trap().
*/
NENTRY(ucas_fault)
- movq $EFAULT, %rax
ret
/*
- * int ucas_ptr(volatile void *uptr, void *old, void *new, void *ret);
+ * int ucas_ptr(volatile void **uptr, void *old, void *new, void **ret);
+ * int ucas_int(volatile int *uptr, int old, intnew, int *ret);
*/
STRONG_ALIAS(ucas_ptr, ucas_64)
STRONG_ALIAS(ucas_int, ucas_32)