On Sun, Sep 27, 2020 at 08:38:03AM -0700, Dave Hansen wrote: > On 9/27/20 3:51 AM, Greg Kroah-Hartman wrote: > >> +static inline long acrn_hypercall0(unsigned long hcall_id) > >> +{ > >> + register long r8 asm("r8"); > >> + long result; > >> + > >> + /* Nothing can come between the r8 assignment and the asm: */ > >> + r8 = hcall_id; > >> + asm volatile("vmcall\n\t" > >> + : "=a" (result) > >> + : "r" (r8) > >> + : ); > > What keeps an interrupt from happening between the r8 assignment and the > > asm: ? > > It's probably better phrased something like: "No other C code can come > between this r8 assignment and the inline asm". An interrupt would > actually be fine in there because interrupts save and restore all > register state, including r8. > > The problem (mentioned in the changelog) is that gcc does not let you > place data directly into r8. But, it does allow you to declare a > register variable that you can assign to use r8. There might be a > problem if a function calls was in between and clobber the register, > thus the "nothing can come between" comment. > > The comment is really intended to scare away anyone from adding printk()'s. > > More information about these register variables is here: > > > https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables > > Any better ideas for comments would be greatly appreciated. It has 4 or > 5 copies so I wanted it to be succinct.
This is disguisting.. Segher, does this actually work? Nick, does clang also support this?