Bharata B Rao <bhar...@linux.ibm.com> writes: > Add support for H_REG_SNS hcall so that asynchronous page > fault mechanism can be supported on PowerKVM guests. > > This hcall essentially issues KVM_PPC_SET_SNS to let the > host map and pin the memory containing the Subvention > Notification Structure. It also claims SPAPR_IRQ_SNS to > be used as subvention notification interrupt. > > Note: Updates to linux-headers/linux/kvm.h are temporary > pending headers update. > > Signed-off-by: Bharata B Rao <bhar...@linux.ibm.com>
... > +static target_ulong h_reg_sns(PowerPCCPU *cpu, SpaprMachineState *spapr, > + target_ulong opcode, target_ulong *args) > +{ > + target_ulong addr = args[0]; > + target_ulong len = args[1]; > + > + if (addr == -1) { > + return deregister_sns(cpu, spapr); > + } > + > + /* > + * If SNS area is already registered, can't register again before > + * deregistering it first. > + */ > + if (spapr->sns_addr == -1) { > + return H_PARAMETER; > + } Don't you mean (spapr->sns_addr != -1) ? > + > + if (!QEMU_IS_ALIGNED(addr, 4096)) { > + return H_PARAMETER; > + } > + > + if (len < 256) { > + return H_P2; > + } > + > + /* TODO: SNS area is not allowed to cross a page boundary */ > + > + /* KVM_PPC_SET_SNS ioctl */ > + if (kvmppc_set_sns_reg(addr, len)) { > + return H_PARAMETER; > + } > + > + /* Record SNS addr and len */ > + spapr->sns_addr = addr; > + spapr->sns_len = len; > + > + /* Register irq source for sending ESN notification */ > + spapr_irq_claim(spapr, SPAPR_IRQ_SNS, false, &error_fatal); > + args[1] = SPAPR_IRQ_SNS; /* irq no in R5 */ > + > + return H_SUCCESS; > +}