On Fri, Jul 12, 2024, Xin3 Li wrote:
E.g. if it's somewhere in task_struct, then kvm_on_user_return() would restore the current task's desired RSP0.
So you're suggesting to extend the framework to allow per task constants?
Yeah, or more likely, special case MSR_IA32_FRED_RSP0. If KVM didn't already have the user return framework, I wouldn't suggest this as I doubt avoiding WRMSR when switching between vCPU tasks will be very meaningful, but it's easy to handle FRED_RSP0, so why not.
Great, I will take the patch.
It looks to me that this also works for KERNEL GS BASE MSR, no?
I don't think so, because the kernel expects MSR_KERNEL_GS_BASE to be accurate when querying GS.base for the current task:
unsigned long x86_gsbase_read_task(struct task_struct *task) { unsigned long gsbase;
if (task == current) gsbase = x86_gsbase_read_cpu_inactive(); else if (boot_cpu_has(X86_FEATURE_FSGSBASE) || (task->thread.gsindex == 0)) gsbase = task->thread.gsbase; else gsbase = x86_fsgsbase_read_task(task, task->thread.gsindex);
return gsbase; }