On 20/11/2018 10:27, Juergen Gross wrote: > On 09/11/2018 19:12, Daniel Kiper wrote: >> On Fri, Nov 02, 2018 at 01:37:29PM +0100, Juergen Gross wrote:>>> + >>> + asm volatile ("wrmsr" : : "c" (msr), "a" (pfn), "d" (0) : "memory"); >>> +} >>> + >>> +int >>> +grub_xen_hypercall (grub_uint32_t callno, grub_uint32_t a0, >>> + grub_uint32_t a1, grub_uint32_t a2, >>> + grub_uint32_t a3, grub_uint32_t a4, >>> + grub_uint32_t a5 __attribute__ ((unused))) >>> +{ >>> + grub_uint32_t __res, __ign0, __ign1, __ign2, __ign3, __ign4; >>> + >>> + asm volatile ("call *%[callno]" >>> + : "=a" (__res), "=b" (__ign0), "=c" (__ign1), "=d" (__ign2), >>> + "=S" (__ign3), "=D" (__ign4) >>> + : "1" (a0), "2" (a1), "3" (a2), "4" (a3), "5" (a4), >> >> I think that you can drop all __ign* variables if you specify proper >> registers in input argument. If this does not work you can use "+" >> modifier instead of "=" in the output argument. > > I'll have a try.
Doesn't work. Specifying only the input registers neglects the hypercall clobbering those. Using the "+" modifier lets gcc complain. I'll just use a single dummy variable. Juergen _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel