The PTI path does this: ... SWITCH_TO_KERNEL_CR3 scratch_reg=%rsp /* Load the top of the task stack into RSP */ movq CPU_ENTRY_AREA_tss + TSS_sp1 + CPU_ENTRY_AREA, %rsp
And the non-PTI entry path does this: ... movq %rsp, PER_CPU_VAR(rsp_scratch) movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp Both "mov ___, %rsp" instructions have the kernel %GS value in place and both are running on a good kernel CR3. Does anybody remember why we don't use cpu_current_top_of_stack in the PTI-on case? I'm wondering if it was because we, at some point, did the mov ..., %rsp before CR3 was good. But it doesn't look like we do that now, so should we maybe make both copies do: movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp for consistency?