On Wed, Mar 17, 2021, Paolo Bonzini wrote: > On 16/03/21 19:44, Sean Christopherson wrote: > > + return (ret)true; \ > > I'm not sure if (void)true is amazing or disgusting, but anyway... Definitely both. > > +BUILD_VMX_MSR_BITMAP_HELPER(bool, test, read) > > +BUILD_VMX_MSR_BITMAP_HELPER(bool, test, write) > > +BUILD_VMX_MSR_BITMAP_HELPER(void, clear, read, __) > > +BUILD_VMX_MSR_BITMAP_HELPER(void, clear, write, __) > > +BUILD_VMX_MSR_BITMAP_HELPER(void, set, read, __) > > +BUILD_VMX_MSR_BITMAP_HELPER(void, set, write, __) > > ... I guess we have an armed truce where you let me do my bit manipulation > magic and I let you do your macro magic. Ha, mutually assured destruction. > Still, I think gluing the variadic arguments with ## is a bit too much. Heh, I don't disagree at all. Honestly, I was surprised it worked, and couldn't resist throwing it in because it's so absurd. > This would be slightly less mysterious: > > +BUILD_VMX_MSR_BITMAP_HELPER(bool, vmx_test_msr_bitmap_, read, test_bit) > +BUILD_VMX_MSR_BITMAP_HELPER(bool, vmx_test_msr_bitmap_, write, test_bit) > +BUILD_VMX_MSR_BITMAP_HELPER(void, vmx_clear_msr_bitmap_, read, __clear_bit) > +BUILD_VMX_MSR_BITMAP_HELPER(void, vmx_clear_msr_bitmap_, write, > __clear_bit) > +BUILD_VMX_MSR_BITMAP_HELPER(void, vmx_set_msr_bitmap_, read, __set_bit) > +BUILD_VMX_MSR_BITMAP_HELPER(void, vmx_set_msr_bitmap_, write, __set_bit) > > And I also wonder if we really need to expand all six functions one at a > time. You could remove the third argument and VMX_MSR_BITMAP_BASE_*, at the > cost of expanding the inline functions' body twice in > BUILD_VMX_MSR_BITMAP_HELPER. I'll play around with the macros to see if I can make them less obnoxious. I found it easier to differentiate between the read/write offset and the high/low offset by building them one at a time. I'll see if I can find a compromise.