Skip to content

Commit 9e48260

Browse files
committed
Merge tag 'x86_urgent_for_v6.2_rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fix from Borislav Petkov: - Prevent the compiler from reordering accesses to debug regs which could cause a #VC exception in SEV-ES guests at the wrong place in the NMI handling path * tag 'x86_urgent_for_v6.2_rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/debug: Fix stack recursion caused by wrongly ordered DR7 accesses
2 parents de506ee + 9d2c720 commit 9e48260

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

arch/x86/include/asm/debugreg.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,20 @@ static __always_inline unsigned long native_get_debugreg(int regno)
3939
asm("mov %%db6, %0" :"=r" (val));
4040
break;
4141
case 7:
42-
asm("mov %%db7, %0" :"=r" (val));
42+
/*
43+
* Apply __FORCE_ORDER to DR7 reads to forbid re-ordering them
44+
* with other code.
45+
*
46+
* This is needed because a DR7 access can cause a #VC exception
47+
* when running under SEV-ES. Taking a #VC exception is not a
48+
* safe thing to do just anywhere in the entry code and
49+
* re-ordering might place the access into an unsafe location.
50+
*
51+
* This happened in the NMI handler, where the DR7 read was
52+
* re-ordered to happen before the call to sev_es_ist_enter(),
53+
* causing stack recursion.
54+
*/
55+
asm volatile("mov %%db7, %0" : "=r" (val) : __FORCE_ORDER);
4356
break;
4457
default:
4558
BUG();
@@ -66,7 +79,16 @@ static __always_inline void native_set_debugreg(int regno, unsigned long value)
6679
asm("mov %0, %%db6" ::"r" (value));
6780
break;
6881
case 7:
69-
asm("mov %0, %%db7" ::"r" (value));
82+
/*
83+
* Apply __FORCE_ORDER to DR7 writes to forbid re-ordering them
84+
* with other code.
85+
*
86+
* While is didn't happen with a DR7 write (see the DR7 read
87+
* comment above which explains where it happened), add the
88+
* __FORCE_ORDER here too to avoid similar problems in the
89+
* future.
90+
*/
91+
asm volatile("mov %0, %%db7" ::"r" (value), __FORCE_ORDER);
7092
break;
7193
default:
7294
BUG();

0 commit comments

Comments
 (0)