diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-11-05 14:31:24 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-11-05 14:31:24 +0000 |
commit | 496c1b19facc7b850fa0c09899fcc07a0702fbfd (patch) | |
tree | 123bc6e3e5fb4ab3c8c0d5ba900ff3b2da4a0e57 /target-i386 | |
parent | 8835b9df3bddf332c883c861d6a1defc12c4ebe9 (diff) | |
parent | e01dd3da5cf9aa90ae844d3b86c2c2762066edac (diff) |
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
* Guest ABI fixes for PC machines (hw_version)
* Fixes for recent Perl
* John Snow's configure fixes
* file-backed RAM improvements (Igor, Pavel)
* -Werror=clobbered fixes (Stefan)
* Kill -d ioport
* Fix qemu-system-s390x
* Performance improvement for kvmclock migration
# gpg: Signature made Thu 05 Nov 2015 13:42:27 GMT using RSA key ID 78C7AE83
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>"
# gpg: aka "Paolo Bonzini <pbonzini@redhat.com>"
* remotes/bonzini/tags/for-upstream:
iscsi: Translate scsi sense into error code
Revert "Introduce cpu_clean_all_dirty"
kvmclock: add a new function to update env->tsc.
configure: disable FORTIFY_SOURCE under clang
backends/hostmem-file: Allow to specify full pathname for backing file
configure: disallow ccache during compile tests
cpu-exec: Fix compiler warning (-Werror=clobbered)
memory: call begin, log_start and commit when registering a new listener
megasas: Use qemu_hw_version() instead of QEMU_VERSION
osdep: Rename qemu_{get, set}_version() to qemu_{, set_}hw_version()
pc: Set hw_version on all machine classes
qemu-log: remove -d ioport
ioport: do not use CPU_LOG_IOPORT
target-i386: fix pcmpxstrx equal-ordered (strstr) mode
scripts/text2pod.pl: Escape left brace
file_ram_alloc: propagate error to caller instead of terminating QEMU
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/cpu.c | 2 | ||||
-rw-r--r-- | target-i386/kvm.c | 45 | ||||
-rw-r--r-- | target-i386/kvm_i386.h | 1 | ||||
-rw-r--r-- | target-i386/ops_sse.h | 4 |
4 files changed, 49 insertions, 3 deletions
diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 9280bfc7d8..9d0eedf751 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2243,7 +2243,7 @@ void x86_cpudef_setup(void) pstrcpy(def->model_id, sizeof(def->model_id), "QEMU Virtual CPU version "); pstrcat(def->model_id, sizeof(def->model_id), - qemu_get_version()); + qemu_hw_version()); break; } } diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 64046cb69d..2a9953b2d4 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -111,6 +111,51 @@ bool kvm_allows_irq0_override(void) return !kvm_irqchip_in_kernel() || kvm_has_gsi_routing(); } +static int kvm_get_tsc(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs); + CPUX86State *env = &cpu->env; + struct { + struct kvm_msrs info; + struct kvm_msr_entry entries[1]; + } msr_data; + int ret; + + if (env->tsc_valid) { + return 0; + } + + msr_data.info.nmsrs = 1; + msr_data.entries[0].index = MSR_IA32_TSC; + env->tsc_valid = !runstate_is_running(); + + ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_MSRS, &msr_data); + if (ret < 0) { + return ret; + } + + env->tsc = msr_data.entries[0].data; + return 0; +} + +static inline void do_kvm_synchronize_tsc(void *arg) +{ + CPUState *cpu = arg; + + kvm_get_tsc(cpu); +} + +void kvm_synchronize_all_tsc(void) +{ + CPUState *cpu; + + if (kvm_enabled()) { + CPU_FOREACH(cpu) { + run_on_cpu(cpu, do_kvm_synchronize_tsc, cpu); + } + } +} + static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max) { struct kvm_cpuid2 *cpuid; diff --git a/target-i386/kvm_i386.h b/target-i386/kvm_i386.h index e557e94f44..c1b312ba2a 100644 --- a/target-i386/kvm_i386.h +++ b/target-i386/kvm_i386.h @@ -15,6 +15,7 @@ bool kvm_allows_irq0_override(void); bool kvm_has_smm(void); +void kvm_synchronize_all_tsc(void); void kvm_arch_reset_vcpu(X86CPU *cs); void kvm_arch_do_init_vcpu(X86CPU *cs); diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h index 7aa693aee9..1780d1d791 100644 --- a/target-i386/ops_sse.h +++ b/target-i386/ops_sse.h @@ -2037,10 +2037,10 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s, } break; case 3: - for (j = valids - validd; j >= 0; j--) { + for (j = valids; j >= 0; j--) { res <<= 1; v = 1; - for (i = MIN(upper - j, validd); i >= 0; i--) { + for (i = MIN(valids - j, validd); i >= 0; i--) { v &= (pcmp_val(s, ctrl, i + j) == pcmp_val(d, ctrl, i)); } res |= v; |