static void kvm_patch_ins_ld(u32 *inst, long addr, u32 rt) { #ifdef CONFIG_64BIT kvm_patch_ins(inst, KVM_INST_LD | rt | (addr & 0x0000fffc)); #else kvm_patch_ins(inst, KVM_INST_LWZ | rt | ((addr + 4) & 0x0000fffc)); #endif }
static void kvm_patch_ins_b(u32 *inst, int addr) { #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_PPC_BOOK3S) /* On relocatable kernels interrupts handlers and our code can be in different regions, so we don't patch them */ if ((ulong)inst < (ulong)&__end_interrupts) return; #endif kvm_patch_ins(inst, KVM_INST_B | (addr & KVM_INST_B_MASK)); }
static int kvm_para_setup(void) { extern u32 kvm_hypercall_start; struct device_node *hyper_node; u32 *insts; int len, i; hyper_node = of_find_node_by_path("/hypervisor"); if (!hyper_node) return -1; insts = (u32*)of_get_property(hyper_node, "hcall-instructions", &len); if (len % 4) return -1; if (len > (4 * 4)) return -1; for (i = 0; i < (len / 4); i++) kvm_patch_ins(&(&kvm_hypercall_start)[i], insts[i]); return 0; }
static void kvm_patch_ins_nop(u32 *inst) { kvm_patch_ins(inst, KVM_INST_NOP); }
static void kvm_patch_ins_stw(u32 *inst, long addr, u32 rt) { kvm_patch_ins(inst, KVM_INST_STW | rt | (addr & 0x0000fffc)); }
static void kvm_patch_ins_lwz(u32 *inst, long addr, u32 rt) { kvm_patch_ins(inst, KVM_INST_LWZ | rt | (addr & 0x0000ffff)); }