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); \
        } \
}
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to