Module Name: src
Committed By: knakahara
Date: Tue Sep 13 05:36:29 UTC 2022
Modified Files:
src/sys/arch/amd64/amd64: lock_stubs.S
Log Message:
Fix PR kern/57007. I missed applying a part of the original patch.
To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/amd64/amd64/lock_stubs.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/lock_stubs.S
diff -u src/sys/arch/amd64/amd64/lock_stubs.S:1.37 src/sys/arch/amd64/amd64/lock_stubs.S:1.38
--- src/sys/arch/amd64/amd64/lock_stubs.S:1.37 Wed Sep 7 00:40:18 2022
+++ src/sys/arch/amd64/amd64/lock_stubs.S Tue Sep 13 05:36:29 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: lock_stubs.S,v 1.37 2022/09/07 00:40:18 knakahara Exp $ */
+/* $NetBSD: lock_stubs.S,v 1.38 2022/09/13 05:36:29 knakahara Exp $ */
/*
* Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -124,13 +124,13 @@ ENTRY(mutex_spin_exit)
movl CPU_INFO_MTX_OLDSPL(%r8), %edi
incl CPU_INFO_MTX_COUNT(%r8)
jnz 1f
- cmpl CPU_INFO_ILEVEL(%r8), %edi
+ cmpb CPU_INFO_ILEVEL(%r8), %dil
jae 1f
- movl CPU_INFO_IUNMASK(%r8,%rdi,4), %esi
+ movq CPU_INFO_IUNMASK(%r8,%rdi,8), %rsi
CLI(ax)
- testl CPU_INFO_IPENDING(%r8), %esi
+ testq CPU_INFO_IPENDING(%r8), %rsi
jnz _C_LABEL(Xspllower)
- movl %edi, CPU_INFO_ILEVEL(%r8)
+ movb %dil, CPU_INFO_ILEVEL(%r8)
STI(ax)
1: rep /* double byte ret as branch */
ret /* target: see AMD docs */
@@ -141,23 +141,27 @@ ENTRY(mutex_spin_exit)
movb $0x00, MTX_LOCK(%rdi)
movl CPU_INFO_MTX_OLDSPL(%rsi), %ecx
incl CPU_INFO_MTX_COUNT(%rsi)
- movl CPU_INFO_ILEVEL(%rsi),%edx
+ movzbl CPU_INFO_ILEVEL(%rsi),%edx
cmovnzl %edx,%ecx
- pushq %rbx
cmpl %edx,%ecx /* new level is lower? */
jae 2f
+ xorq %rdi,%rdi /* rdi: ci_ipending mask */
+ notq %rdi
+ shrq $8,%rdi
+ movq %rcx,%r9 /* r9: shifted new level */
+ shlq $56,%r9
1:
- movl CPU_INFO_IPENDING(%rsi),%eax
- testl %eax,CPU_INFO_IUNMASK(%rsi,%rcx,4)/* deferred interrupts? */
+ movq CPU_INFO_IPENDING(%rsi),%rax
+ testq %rax,CPU_INFO_IUNMASK(%rsi,%rcx,8)/* deferred interrupts? */
jnz 3f
- movl %eax,%ebx
- cmpxchg8b CPU_INFO_ISTATE(%rsi) /* swap in new ilevel */
+ movq %rax,%r8
+ andq %rdi,%r8
+ orq %r9,%r8
+ cmpxchgq %r8,CPU_INFO_ISTATE(%rsi) /* swap in new ilevel */
jnz 4f
2:
- popq %rbx
ret
3:
- popq %rbx
movl %ecx, %edi
jmp _C_LABEL(Xspllower)
4: