Messages in this thread | | | Date | Sat, 15 Apr 2023 00:22:11 +0800 | Subject | Re: [RFC PATCH V4 10/17] x86/hyperv: Add smp support for sev-snp guest | From | Tianyu Lan <> |
| |
On 4/12/2023 10:59 PM, Michael Kelley (LINUX) wrote: >> #ifdef CONFIG_AMD_MEM_ENCRYPT >> >> #define GHCB_USAGE_HYPERV_CALL 1 >> >> +static u8 ap_start_input_arg[PAGE_SIZE] __bss_decrypted __aligned(PAGE_SIZE); >> +static u8 ap_start_stack[PAGE_SIZE] __aligned(PAGE_SIZE); > Just a question: ap_start_stack is a static variable that gets used as the > starting stack for every AP. So obviously, once each AP is started, we must > be sure that the AP moves off the ap_start_stack before the next AP is > started. How is that synchronization done? I see that do_boot_cpu() is > where the wakeup_secondary_cpu() function is called. Then there's > some waiting until the AP completes "initial initialization" per the > comment in the code. Is there where we know that the AP is no > longer using ap_start_stack? >
Hi Micahel: secondary_startup_64_no_verify() in the head_64.S initializes a boot time stack to replace the old stack. It's very begining stage of starting AP. The initial_stack was initialized with idle->thread.sp in the do_boot_cpu(). The AP is started one by one in current code and so It's safe to reuse the stack for all APs to boot up.
278 /* 279 * Setup a boot time stack - Any secondary CPU will have lost its stack 280 * by now because the cr3-switch above unmaps the real-mode stack 281 */ 282 movq initial_stack(%rip), %rsp 283
| |