[RFC] Use para_fill instead of vmi_get_function for APIC ops

From: Anthony Liguori
Date: Mon Feb 26 2007 - 19:07:46 EST


Hi Zach,

It seems to me that the APIC paravirt_ops should be filled by para_fill() instead of vmi_get_function(). vmi_get_function() returns a nop when the relocation type is NONE. para_fill() leaves the native code in place.

The native version of the apic write ops is more or less *(APIC_BASE + reg) = value. APIC_BASE is unknown to the ROM so it's impossible to simulate this in the ROM.

This means that a ROM has no choice but to do APIC emulation (or jump through seriously hairy loops to get the APIC mapped in it's address space). Was this the intention?

N.B. attached patch is just to illustrate the point. Has not even been compile tested.

Regards,

Anthony Liguori --- linux-2.6.21-rc1/arch/i386/kernel/vmi.c~ 2007-02-20 22:32:30.000000000 -0600
+++ linux-2.6.21-rc1/arch/i386/kernel/vmi.c 2007-02-26 17:58:18.000000000 -0600
@@ -852,9 +852,9 @@
#endif

#ifdef CONFIG_X86_LOCAL_APIC
- paravirt_ops.apic_read = vmi_get_function(VMI_CALL_APICRead);
- paravirt_ops.apic_write = vmi_get_function(VMI_CALL_APICWrite);
- paravirt_ops.apic_write_atomic = vmi_get_function(VMI_CALL_APICWrite);
+ para_fill(apic_read, APICRead);
+ para_fill(apic_write, APICWrite);
+ para_fill(apic_write_atomic, APICWrite);
#endif

/*