Messages in this thread | | | Date | Wed, 29 Sep 2021 09:58:22 -0700 | Subject | Re: [PATCH 4/8] x86/traps: Demand-populate PASID MSR via #GP | From | Andy Lutomirski <> |
| |
On 9/28/21 16:10, Luck, Tony wrote: > Moving beyond pseudo-code and into compiles-but-probably-broken-code. > > > The intent of the functions below is that Fenghua should be able to > do: > > void fpu__pasid_write(u32 pasid) > { > u64 msr_val = pasid | MSR_IA32_PASID_VALID; > struct ia32_pasid_state *addr; > > addr = begin_update_one_xsave_feature(current, XFEATURE_PASID, true); > addr->pasid = msr_val; > finish_update_one_xsave_feature(current); > } >
This gets gnarly because we would presumably like to optimize the case where we can do the update directly in registers. I wonder if we can do it with a bit of macro magic in a somewhat generic way:
typedef fpu__pasid_type u32;
static inline void fpu__set_pasid_in_register(const u32 *value) { wrmsr(...); }
#define DEFINE_FPU_HELPER(name) \ static inline void fpu__set_##name(const fpu__##name##_type *val) \ { \ fpregs_lock(); \ if (should write in memory) { \ ->xfeatures |= XFEATURE_##name; \ ptr = get_xsave_addr(...); \ memcpy(ptr, val, sizeof(*val)); \ __fpu_invalidate_fpregs_state(...); \ } else { \ fpu__set_##name##_in_register(val); \ } \ }
| |