diff mbox series

[kvm-unit-tests,RFC,11/17] x86 TDX: Add a formal IPI handler

Message ID 20220303071907.650203-12-zhenzhong.duan@intel.com (mailing list archive)
State New, archived
Headers show
Series X86: TDX framework support | expand

Commit Message

Duan, Zhenzhong March 3, 2022, 7:19 a.m. UTC
Current IPI handler may currupts cpu context, it's not an big
issue as AP only enable interrupt in idle loop.

But in TD-guest, hlt instruction is simulated though tdvmcall
in #VE handler. IPI will currupt #VE context.

Save and restore cpu context in IPI handler to avoid crash.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Yu Zhang <yu.c.zhang@intel.com>
---
 lib/x86/smp.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/lib/x86/smp.c b/lib/x86/smp.c
index 2ac0ef74f264..8a37143c6d78 100644
--- a/lib/x86/smp.c
+++ b/lib/x86/smp.c
@@ -39,12 +39,20 @@  static __attribute__((used)) void ipi(void)
 
 asm (
      "ipi_entry: \n"
-     "   call ipi \n"
-#ifndef __x86_64__
-     "   iret"
-#else
-     "   iretq"
+#ifdef __x86_64__
+     "push %r15; push %r14; push %r13; push %r12 \n\t"
+     "push %r11; push %r10; push %r9; push %r8 \n\t"
 #endif
+     "push %"R "di; push %"R "si; push %"R "bp; \n\t"
+     "push %"R "bx; push %"R "dx; push %"R "cx; push %"R "ax \n\t"
+     "call ipi \n\t"
+     "pop %"R "ax; pop %"R "cx; pop %"R "dx; pop %"R "bx \n\t"
+     "pop %"R "bp; pop %"R "si; pop %"R "di \n\t"
+#ifdef __x86_64__
+     "pop %r8; pop %r9; pop %r10; pop %r11 \n\t"
+     "pop %r12; pop %r13; pop %r14; pop %r15 \n\t"
+#endif
+     "iret"W" \n\t"
      );
 
 int cpu_count(void)