* 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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJWO1zDAAoJEL/70l94x66DXRgH/ArIMi9MGU2Vxi6wNFG9hKUl Cl13IS8VO0ui6R/0F1BFGK90WYxfM5ZsVLPnTdk4OeapY6eKnw0O44VE0GqDZKFa k3B9qzQLGPLZV75cd8WP+ZHDbPcIgPecr8Jz3/w18rYIcGZQ6GF45xgdJ0hnYQ4j bQdEiseZyuPyeBU+f6cyNeD/nct4CehJWFwK+WwPc8C96tUIpVSJWwsiOf6NWvda KgSs1fCInw9e1//qCWWPxojEvTTW/JdmAOHyh9JTEpUezlXrDrRa5bDwng1VkVHM SZZ8H30GZmp/r9UH32TAlnxWvnRunE+uQVTyl3EAS6J7M+K+7fx2voBYSrN4dEY= =vr8Z -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
496c1b19fa
@ -84,6 +84,7 @@ typedef struct IscsiTask {
|
||||
IscsiLun *iscsilun;
|
||||
QEMUTimer retry_timer;
|
||||
bool force_next_flush;
|
||||
int err_code;
|
||||
} IscsiTask;
|
||||
|
||||
typedef struct IscsiAIOCB {
|
||||
@ -169,19 +170,70 @@ static inline unsigned exp_random(double mean)
|
||||
return -mean * log((double)rand() / RAND_MAX);
|
||||
}
|
||||
|
||||
/* SCSI_STATUS_TASK_SET_FULL and SCSI_STATUS_TIMEOUT were introduced
|
||||
* in libiscsi 1.10.0 as part of an enum. The LIBISCSI_API_VERSION
|
||||
* macro was introduced in 1.11.0. So use the API_VERSION macro as
|
||||
* a hint that the macros are defined and define them ourselves
|
||||
* otherwise to keep the required libiscsi version at 1.9.0 */
|
||||
#if !defined(LIBISCSI_API_VERSION)
|
||||
#define QEMU_SCSI_STATUS_TASK_SET_FULL 0x28
|
||||
#define QEMU_SCSI_STATUS_TIMEOUT 0x0f000002
|
||||
#else
|
||||
#define QEMU_SCSI_STATUS_TASK_SET_FULL SCSI_STATUS_TASK_SET_FULL
|
||||
#define QEMU_SCSI_STATUS_TIMEOUT SCSI_STATUS_TIMEOUT
|
||||
/* SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST was introduced in
|
||||
* libiscsi 1.10.0, together with other constants we need. Use it as
|
||||
* a hint that we have to define them ourselves if needed, to keep the
|
||||
* minimum required libiscsi version at 1.9.0. We use an ASCQ macro for
|
||||
* the test because SCSI_STATUS_* is an enum.
|
||||
*
|
||||
* To guard against future changes where SCSI_SENSE_ASCQ_* also becomes
|
||||
* an enum, check against the LIBISCSI_API_VERSION macro, which was
|
||||
* introduced in 1.11.0. If it is present, there is no need to define
|
||||
* anything.
|
||||
*/
|
||||
#if !defined(SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST) && \
|
||||
!defined(LIBISCSI_API_VERSION)
|
||||
#define SCSI_STATUS_TASK_SET_FULL 0x28
|
||||
#define SCSI_STATUS_TIMEOUT 0x0f000002
|
||||
#define SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST 0x2600
|
||||
#define SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR 0x1a00
|
||||
#endif
|
||||
|
||||
static int iscsi_translate_sense(struct scsi_sense *sense)
|
||||
{
|
||||
int ret;
|
||||
|
||||
switch (sense->key) {
|
||||
case SCSI_SENSE_NOT_READY:
|
||||
return -EBUSY;
|
||||
case SCSI_SENSE_DATA_PROTECTION:
|
||||
return -EACCES;
|
||||
case SCSI_SENSE_COMMAND_ABORTED:
|
||||
return -ECANCELED;
|
||||
case SCSI_SENSE_ILLEGAL_REQUEST:
|
||||
/* Parse ASCQ */
|
||||
break;
|
||||
default:
|
||||
return -EIO;
|
||||
}
|
||||
switch (sense->ascq) {
|
||||
case SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR:
|
||||
case SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE:
|
||||
case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB:
|
||||
case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
case SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE:
|
||||
ret = -ENOSPC;
|
||||
break;
|
||||
case SCSI_SENSE_ASCQ_LOGICAL_UNIT_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT:
|
||||
case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED:
|
||||
case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN:
|
||||
ret = -ENOMEDIUM;
|
||||
break;
|
||||
case SCSI_SENSE_ASCQ_WRITE_PROTECTED:
|
||||
ret = -EACCES;
|
||||
break;
|
||||
default:
|
||||
ret = -EIO;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
|
||||
void *command_data, void *opaque)
|
||||
@ -203,11 +255,11 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
|
||||
goto out;
|
||||
}
|
||||
if (status == SCSI_STATUS_BUSY ||
|
||||
status == QEMU_SCSI_STATUS_TIMEOUT ||
|
||||
status == QEMU_SCSI_STATUS_TASK_SET_FULL) {
|
||||
status == SCSI_STATUS_TIMEOUT ||
|
||||
status == SCSI_STATUS_TASK_SET_FULL) {
|
||||
unsigned retry_time =
|
||||
exp_random(iscsi_retry_times[iTask->retries - 1]);
|
||||
if (status == QEMU_SCSI_STATUS_TIMEOUT) {
|
||||
if (status == SCSI_STATUS_TIMEOUT) {
|
||||
/* make sure the request is rescheduled AFTER the
|
||||
* reconnect is initiated */
|
||||
retry_time = EVENT_INTERVAL * 2;
|
||||
@ -226,6 +278,7 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
|
||||
return;
|
||||
}
|
||||
}
|
||||
iTask->err_code = iscsi_translate_sense(&task->sense);
|
||||
error_report("iSCSI Failure: %s", iscsi_get_error(iscsi));
|
||||
} else {
|
||||
iTask->iscsilun->force_next_flush |= iTask->force_next_flush;
|
||||
@ -455,7 +508,7 @@ retry:
|
||||
}
|
||||
|
||||
if (iTask.status != SCSI_STATUS_GOOD) {
|
||||
return -EIO;
|
||||
return iTask.err_code;
|
||||
}
|
||||
|
||||
iscsi_allocationmap_set(iscsilun, sector_num, nb_sectors);
|
||||
@ -644,7 +697,7 @@ retry:
|
||||
}
|
||||
|
||||
if (iTask.status != SCSI_STATUS_GOOD) {
|
||||
return -EIO;
|
||||
return iTask.err_code;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -683,7 +736,7 @@ retry:
|
||||
}
|
||||
|
||||
if (iTask.status != SCSI_STATUS_GOOD) {
|
||||
return -EIO;
|
||||
return iTask.err_code;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -703,7 +756,7 @@ iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
|
||||
if (status < 0) {
|
||||
error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s",
|
||||
iscsi_get_error(iscsi));
|
||||
acb->status = -EIO;
|
||||
acb->status = iscsi_translate_sense(&acb->task->sense);
|
||||
}
|
||||
|
||||
acb->ioh->driver_status = 0;
|
||||
@ -905,7 +958,7 @@ retry:
|
||||
}
|
||||
|
||||
if (iTask.status != SCSI_STATUS_GOOD) {
|
||||
return -EIO;
|
||||
return iTask.err_code;
|
||||
}
|
||||
|
||||
iscsi_allocationmap_clear(iscsilun, sector_num, nb_sectors);
|
||||
@ -999,7 +1052,7 @@ retry:
|
||||
}
|
||||
|
||||
if (iTask.status != SCSI_STATUS_GOOD) {
|
||||
return -EIO;
|
||||
return iTask.err_code;
|
||||
}
|
||||
|
||||
if (flags & BDRV_REQ_MAY_UNMAP) {
|
||||
|
21
configure
vendored
21
configure
vendored
@ -8,6 +8,9 @@
|
||||
CLICOLOR_FORCE= GREP_OPTIONS=
|
||||
unset CLICOLOR_FORCE GREP_OPTIONS
|
||||
|
||||
# Don't allow CCACHE, if present, to use cached results of compile tests!
|
||||
export CCACHE_RECACHE=yes
|
||||
|
||||
# Temporary directory used for files created while
|
||||
# configure runs. Since it is in the build directory
|
||||
# we can safely blow away any previous version of it
|
||||
@ -261,6 +264,7 @@ rdma=""
|
||||
gprof="no"
|
||||
debug_tcg="no"
|
||||
debug="no"
|
||||
fortify_source=""
|
||||
strip_opt="yes"
|
||||
tcg_interpreter="no"
|
||||
bigendian="no"
|
||||
@ -876,6 +880,7 @@ for opt do
|
||||
debug_tcg="yes"
|
||||
debug="yes"
|
||||
strip_opt="no"
|
||||
fortify_source="no"
|
||||
;;
|
||||
--enable-sparse) sparse="yes"
|
||||
;;
|
||||
@ -4398,6 +4403,7 @@ fi
|
||||
# check if ccache is interfering with
|
||||
# semantic analysis of macros
|
||||
|
||||
unset CCACHE_CPP2
|
||||
ccache_cpp2=no
|
||||
cat > $TMPC << EOF
|
||||
static const int Z = 1;
|
||||
@ -4421,6 +4427,19 @@ if ! compile_object "-Werror"; then
|
||||
ccache_cpp2=yes
|
||||
fi
|
||||
|
||||
#################################################
|
||||
# clang does not support glibc + FORTIFY_SOURCE.
|
||||
|
||||
if test "$fortify_source" != "no"; then
|
||||
if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
|
||||
fortify_source="no";
|
||||
elif echo | $cxx -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
|
||||
fortify_source="no";
|
||||
else
|
||||
fortify_source="yes"
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# End of CC checks
|
||||
# After here, no more $cc or $ld runs
|
||||
@ -4428,7 +4447,7 @@ fi
|
||||
if test "$gcov" = "yes" ; then
|
||||
CFLAGS="-fprofile-arcs -ftest-coverage -g $CFLAGS"
|
||||
LDFLAGS="-fprofile-arcs -ftest-coverage $LDFLAGS"
|
||||
elif test "$debug" = "no" ; then
|
||||
elif test "$fortify_source" = "yes" ; then
|
||||
CFLAGS="-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $CFLAGS"
|
||||
fi
|
||||
|
||||
|
18
cpu-exec.c
18
cpu-exec.c
@ -539,15 +539,27 @@ int cpu_exec(CPUState *cpu)
|
||||
only be set by a memory fault) */
|
||||
} /* for(;;) */
|
||||
} else {
|
||||
/* Reload env after longjmp - the compiler may have smashed all
|
||||
* local variables as longjmp is marked 'noreturn'. */
|
||||
#if defined(__clang__) || !QEMU_GNUC_PREREQ(4, 6)
|
||||
/* Some compilers wrongly smash all local variables after
|
||||
* siglongjmp. There were bug reports for gcc 4.5.0 and clang.
|
||||
* Reload essential local variables here for those compilers.
|
||||
* Newer versions of gcc would complain about this code (-Wclobbered). */
|
||||
cpu = current_cpu;
|
||||
cc = CPU_GET_CLASS(cpu);
|
||||
cpu->can_do_io = 1;
|
||||
#ifdef TARGET_I386
|
||||
x86_cpu = X86_CPU(cpu);
|
||||
env = &x86_cpu->env;
|
||||
#endif
|
||||
#else /* buggy compiler */
|
||||
/* Assert that the compiler does not smash local variables. */
|
||||
g_assert(cpu == current_cpu);
|
||||
g_assert(cc == CPU_GET_CLASS(cpu));
|
||||
#ifdef TARGET_I386
|
||||
g_assert(x86_cpu == X86_CPU(cpu));
|
||||
g_assert(env == &x86_cpu->env);
|
||||
#endif
|
||||
#endif /* buggy compiler */
|
||||
cpu->can_do_io = 1;
|
||||
tb_lock_reset();
|
||||
}
|
||||
} /* for(;;) */
|
||||
|
9
cpus.c
9
cpus.c
@ -694,15 +694,6 @@ void cpu_synchronize_all_post_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
void cpu_clean_all_dirty(void)
|
||||
{
|
||||
CPUState *cpu;
|
||||
|
||||
CPU_FOREACH(cpu) {
|
||||
cpu_clean_state(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
static int do_vm_stop(RunState state)
|
||||
{
|
||||
int ret = 0;
|
||||
|
40
exec.c
40
exec.c
@ -1205,6 +1205,7 @@ static void *file_ram_alloc(RAMBlock *block,
|
||||
const char *path,
|
||||
Error **errp)
|
||||
{
|
||||
struct stat st;
|
||||
char *filename;
|
||||
char *sanitized_name;
|
||||
char *c;
|
||||
@ -1233,26 +1234,33 @@ static void *file_ram_alloc(RAMBlock *block,
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Make name safe to use with mkstemp by replacing '/' with '_'. */
|
||||
sanitized_name = g_strdup(memory_region_name(block->mr));
|
||||
for (c = sanitized_name; *c != '\0'; c++) {
|
||||
if (*c == '/')
|
||||
*c = '_';
|
||||
if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
|
||||
/* Make name safe to use with mkstemp by replacing '/' with '_'. */
|
||||
sanitized_name = g_strdup(memory_region_name(block->mr));
|
||||
for (c = sanitized_name; *c != '\0'; c++) {
|
||||
if (*c == '/') {
|
||||
*c = '_';
|
||||
}
|
||||
}
|
||||
|
||||
filename = g_strdup_printf("%s/qemu_back_mem.%s.XXXXXX", path,
|
||||
sanitized_name);
|
||||
g_free(sanitized_name);
|
||||
|
||||
fd = mkstemp(filename);
|
||||
if (fd >= 0) {
|
||||
unlink(filename);
|
||||
}
|
||||
g_free(filename);
|
||||
} else {
|
||||
fd = open(path, O_RDWR | O_CREAT, 0644);
|
||||
}
|
||||
|
||||
filename = g_strdup_printf("%s/qemu_back_mem.%s.XXXXXX", path,
|
||||
sanitized_name);
|
||||
g_free(sanitized_name);
|
||||
|
||||
fd = mkstemp(filename);
|
||||
if (fd < 0) {
|
||||
error_setg_errno(errp, errno,
|
||||
"unable to create backing store for hugepages");
|
||||
g_free(filename);
|
||||
goto error;
|
||||
}
|
||||
unlink(filename);
|
||||
g_free(filename);
|
||||
|
||||
memory = ROUND_UP(memory, hpagesize);
|
||||
|
||||
@ -1282,10 +1290,6 @@ static void *file_ram_alloc(RAMBlock *block,
|
||||
return area;
|
||||
|
||||
error:
|
||||
if (mem_prealloc) {
|
||||
error_report("%s", error_get_pretty(*errp));
|
||||
exit(1);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
@ -2698,8 +2702,8 @@ void cpu_register_map_client(QEMUBH *bh)
|
||||
void cpu_exec_init_all(void)
|
||||
{
|
||||
qemu_mutex_init(&ram_list.mutex);
|
||||
memory_map_init();
|
||||
io_mem_init();
|
||||
memory_map_init();
|
||||
qemu_mutex_init(&map_client_list_lock);
|
||||
}
|
||||
|
||||
|
@ -1275,7 +1275,7 @@ static int n8x0_atag_setup(void *p, int model)
|
||||
strcpy((void *) w, "hw-build"); /* char component[12] */
|
||||
w += 6;
|
||||
strcpy((void *) w, "QEMU ");
|
||||
pstrcat((void *) w, 12, qemu_get_version()); /* char version[12] */
|
||||
pstrcat((void *) w, 12, qemu_hw_version()); /* char version[12] */
|
||||
w += 6;
|
||||
|
||||
tag = (model == 810) ? "1.1.10-qemu" : "1.1.6-qemu";
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "qemu/host-utils.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "kvm_i386.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/kvm/clock.h"
|
||||
|
||||
@ -125,21 +125,7 @@ static void kvmclock_vm_state_change(void *opaque, int running,
|
||||
return;
|
||||
}
|
||||
|
||||
cpu_synchronize_all_states();
|
||||
/* In theory, the cpu_synchronize_all_states() call above wouldn't
|
||||
* affect the rest of the code, as the VCPU state inside CPUState
|
||||
* is supposed to always match the VCPU state on the kernel side.
|
||||
*
|
||||
* In practice, calling cpu_synchronize_state() too soon will load the
|
||||
* kernel-side APIC state into X86CPU.apic_state too early, APIC state
|
||||
* won't be reloaded later because CPUState.vcpu_dirty==true, and
|
||||
* outdated APIC state may be migrated to another host.
|
||||
*
|
||||
* The real fix would be to make sure outdated APIC state is read
|
||||
* from the kernel again when necessary. While this is not fixed, we
|
||||
* need the cpu_clean_all_dirty() call below.
|
||||
*/
|
||||
cpu_clean_all_dirty();
|
||||
kvm_synchronize_all_tsc();
|
||||
|
||||
ret = kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data);
|
||||
if (ret < 0) {
|
||||
|
@ -472,6 +472,7 @@ static void pc_i440fx_machine_options(MachineClass *m)
|
||||
static void pc_i440fx_2_5_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_machine_options(m);
|
||||
m->hw_version = QEMU_VERSION;
|
||||
m->alias = "pc";
|
||||
m->is_default = 1;
|
||||
}
|
||||
@ -484,6 +485,7 @@ static void pc_i440fx_2_4_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_i440fx_2_5_machine_options(m);
|
||||
m->hw_version = "2.4.0";
|
||||
m->alias = NULL;
|
||||
m->is_default = 0;
|
||||
pcmc->broken_reserved_end = true;
|
||||
@ -497,6 +499,7 @@ DEFINE_I440FX_MACHINE(v2_4, "pc-i440fx-2.4", NULL,
|
||||
static void pc_i440fx_2_3_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_2_4_machine_options(m);
|
||||
m->hw_version = "2.3.0";
|
||||
m->alias = NULL;
|
||||
m->is_default = 0;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_3);
|
||||
@ -509,6 +512,7 @@ DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3,
|
||||
static void pc_i440fx_2_2_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_2_3_machine_options(m);
|
||||
m->hw_version = "2.2.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
|
||||
}
|
||||
|
||||
@ -519,6 +523,7 @@ DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
|
||||
static void pc_i440fx_2_1_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_2_2_machine_options(m);
|
||||
m->hw_version = "2.1.0";
|
||||
m->default_display = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
|
||||
}
|
||||
@ -531,6 +536,7 @@ DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
|
||||
static void pc_i440fx_2_0_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_2_1_machine_options(m);
|
||||
m->hw_version = "2.0.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
|
||||
}
|
||||
|
||||
@ -541,6 +547,7 @@ DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
|
||||
static void pc_i440fx_1_7_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_2_0_machine_options(m);
|
||||
m->hw_version = "1.7.0";
|
||||
m->default_machine_opts = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
|
||||
}
|
||||
@ -552,6 +559,7 @@ DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
|
||||
static void pc_i440fx_1_6_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_7_machine_options(m);
|
||||
m->hw_version = "1.6.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
|
||||
}
|
||||
|
||||
@ -562,6 +570,7 @@ DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6,
|
||||
static void pc_i440fx_1_5_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_6_machine_options(m);
|
||||
m->hw_version = "1.5.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_5);
|
||||
}
|
||||
|
||||
@ -572,6 +581,7 @@ DEFINE_I440FX_MACHINE(v1_5, "pc-i440fx-1.5", pc_compat_1_5,
|
||||
static void pc_i440fx_1_4_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_5_machine_options(m);
|
||||
m->hw_version = "1.4.0";
|
||||
m->hot_add_cpu = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_4);
|
||||
}
|
||||
@ -604,6 +614,7 @@ DEFINE_I440FX_MACHINE(v1_4, "pc-i440fx-1.4", pc_compat_1_4,
|
||||
static void pc_i440fx_1_3_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_4_machine_options(m);
|
||||
m->hw_version = "1.3.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_3);
|
||||
}
|
||||
|
||||
@ -642,6 +653,7 @@ DEFINE_I440FX_MACHINE(v1_3, "pc-1.3", pc_compat_1_3,
|
||||
static void pc_i440fx_1_2_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_3_machine_options(m);
|
||||
m->hw_version = "1.2.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_2);
|
||||
}
|
||||
|
||||
@ -684,6 +696,7 @@ DEFINE_I440FX_MACHINE(v1_2, "pc-1.2", pc_compat_1_2,
|
||||
static void pc_i440fx_1_1_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_i440fx_1_2_machine_options(m);
|
||||
m->hw_version = "1.1.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_1);
|
||||
}
|
||||
|
||||
|
@ -373,6 +373,7 @@ static void pc_q35_machine_options(MachineClass *m)
|
||||
static void pc_q35_2_5_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_machine_options(m);
|
||||
m->hw_version = QEMU_VERSION;
|
||||
m->alias = "q35";
|
||||
}
|
||||
|
||||
@ -383,6 +384,7 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
|
||||
{
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
pc_q35_2_5_machine_options(m);
|
||||
m->hw_version = "2.4.0";
|
||||
m->alias = NULL;
|
||||
pcmc->broken_reserved_end = true;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_4);
|
||||
@ -395,6 +397,7 @@ DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL,
|
||||
static void pc_q35_2_3_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_2_4_machine_options(m);
|
||||
m->hw_version = "2.3.0";
|
||||
m->no_floppy = 0;
|
||||
m->no_tco = 1;
|
||||
m->alias = NULL;
|
||||
@ -408,6 +411,7 @@ DEFINE_Q35_MACHINE(v2_3, "pc-q35-2.3", pc_compat_2_3,
|
||||
static void pc_q35_2_2_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_2_3_machine_options(m);
|
||||
m->hw_version = "2.2.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
|
||||
}
|
||||
|
||||
@ -418,6 +422,7 @@ DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
|
||||
static void pc_q35_2_1_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_2_2_machine_options(m);
|
||||
m->hw_version = "2.1.0";
|
||||
m->default_display = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
|
||||
}
|
||||
@ -429,6 +434,7 @@ DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
|
||||
static void pc_q35_2_0_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_2_1_machine_options(m);
|
||||
m->hw_version = "2.0.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
|
||||
}
|
||||
|
||||
@ -439,6 +445,7 @@ DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
|
||||
static void pc_q35_1_7_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_2_0_machine_options(m);
|
||||
m->hw_version = "1.7.0";
|
||||
m->default_machine_opts = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
|
||||
}
|
||||
@ -450,6 +457,7 @@ DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
|
||||
static void pc_q35_1_6_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_machine_options(m);
|
||||
m->hw_version = "1.6.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
|
||||
}
|
||||
|
||||
@ -460,6 +468,7 @@ DEFINE_Q35_MACHINE(v1_6, "pc-q35-1.6", pc_compat_1_6,
|
||||
static void pc_q35_1_5_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_1_6_machine_options(m);
|
||||
m->hw_version = "1.5.0";
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_5);
|
||||
}
|
||||
|
||||
@ -470,6 +479,7 @@ DEFINE_Q35_MACHINE(v1_5, "pc-q35-1.5", pc_compat_1_5,
|
||||
static void pc_q35_1_4_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_q35_1_5_machine_options(m);
|
||||
m->hw_version = "1.4.0";
|
||||
m->hot_add_cpu = NULL;
|
||||
SET_MACHINE_COMPAT(m, PC_COMPAT_1_4);
|
||||
}
|
||||
|
@ -2312,7 +2312,7 @@ int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
|
||||
if (version) {
|
||||
pstrcpy(s->version, sizeof(s->version), version);
|
||||
} else {
|
||||
pstrcpy(s->version, sizeof(s->version), qemu_get_version());
|
||||
pstrcpy(s->version, sizeof(s->version), qemu_hw_version());
|
||||
}
|
||||
|
||||
ide_reset(s);
|
||||
|
@ -757,7 +757,7 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
|
||||
|
||||
memcpy(info.product_name, base_class->product_name, 24);
|
||||
snprintf(info.serial_number, 32, "%s", s->hba_serial);
|
||||
snprintf(info.package_version, 0x60, "%s-QEMU", QEMU_VERSION);
|
||||
snprintf(info.package_version, 0x60, "%s-QEMU", qemu_hw_version());
|
||||
memcpy(info.image_component[0].name, "APP", 3);
|
||||
snprintf(info.image_component[0].version, 10, "%s-QEMU",
|
||||
base_class->product_version);
|
||||
|
@ -453,7 +453,7 @@ static bool scsi_target_emulate_inquiry(SCSITargetReq *r)
|
||||
r->buf[7] = 0x10 | (r->req.bus->info->tcq ? 0x02 : 0); /* Sync, TCQ. */
|
||||
memcpy(&r->buf[8], "QEMU ", 8);
|
||||
memcpy(&r->buf[16], "QEMU TARGET ", 16);
|
||||
pstrcpy((char *) &r->buf[32], 4, qemu_get_version());
|
||||
pstrcpy((char *) &r->buf[32], 4, qemu_hw_version());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2315,7 +2315,7 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
||||
}
|
||||
|
||||
if (!s->version) {
|
||||
s->version = g_strdup(qemu_get_version());
|
||||
s->version = g_strdup(qemu_hw_version());
|
||||
}
|
||||
if (!s->vendor) {
|
||||
s->vendor = g_strdup("QEMU");
|
||||
|
@ -35,7 +35,6 @@ static inline bool qemu_log_enabled(void)
|
||||
#define CPU_LOG_INT (1 << 4)
|
||||
#define CPU_LOG_EXEC (1 << 5)
|
||||
#define CPU_LOG_PCALL (1 << 6)
|
||||
#define CPU_LOG_IOPORT (1 << 7)
|
||||
#define CPU_LOG_TB_CPU (1 << 8)
|
||||
#define CPU_LOG_RESET (1 << 9)
|
||||
#define LOG_UNIMP (1 << 10)
|
||||
|
@ -247,8 +247,8 @@ static inline void qemu_timersub(const struct timeval *val1,
|
||||
|
||||
void qemu_set_cloexec(int fd);
|
||||
|
||||
void qemu_set_version(const char *);
|
||||
const char *qemu_get_version(void);
|
||||
void qemu_set_hw_version(const char *);
|
||||
const char *qemu_hw_version(void);
|
||||
|
||||
void fips_set_state(bool requested);
|
||||
bool fips_get_state(void);
|
||||
|
@ -11,7 +11,6 @@ void cpu_stop_current(void);
|
||||
void cpu_synchronize_all_states(void);
|
||||
void cpu_synchronize_all_post_reset(void);
|
||||
void cpu_synchronize_all_post_init(void);
|
||||
void cpu_clean_all_dirty(void);
|
||||
|
||||
void qtest_clock_warp(int64_t dest);
|
||||
|
||||
|
@ -417,7 +417,6 @@ int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
|
||||
void kvm_cpu_synchronize_state(CPUState *cpu);
|
||||
void kvm_cpu_synchronize_post_reset(CPUState *cpu);
|
||||
void kvm_cpu_synchronize_post_init(CPUState *cpu);
|
||||
void kvm_cpu_clean_state(CPUState *cpu);
|
||||
|
||||
/* generic hooks - to be moved/refactored once there are more users */
|
||||
|
||||
@ -442,13 +441,6 @@ static inline void cpu_synchronize_post_init(CPUState *cpu)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void cpu_clean_state(CPUState *cpu)
|
||||
{
|
||||
if (kvm_enabled()) {
|
||||
kvm_cpu_clean_state(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg, PCIDevice *dev);
|
||||
int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg,
|
||||
PCIDevice *dev);
|
||||
|
26
ioport.c
26
ioport.c
@ -30,14 +30,6 @@
|
||||
#include "exec/memory.h"
|
||||
#include "exec/address-spaces.h"
|
||||
|
||||
//#define DEBUG_IOPORT
|
||||
|
||||
#ifdef DEBUG_IOPORT
|
||||
# define LOG_IOPORT(...) qemu_log_mask(CPU_LOG_IOPORT, ## __VA_ARGS__)
|
||||
#else
|
||||
# define LOG_IOPORT(...) do { } while (0)
|
||||
#endif
|
||||
|
||||
typedef struct MemoryRegionPortioList {
|
||||
MemoryRegion mr;
|
||||
void *portio_opaque;
|
||||
@ -62,8 +54,7 @@ const MemoryRegionOps unassigned_io_ops = {
|
||||
|
||||
void cpu_outb(pio_addr_t addr, uint8_t val)
|
||||
{
|
||||
LOG_IOPORT("outb: %04"FMT_pioaddr" %02"PRIx8"\n", addr, val);
|
||||
trace_cpu_out(addr, val);
|
||||
trace_cpu_out(addr, 'b', val);
|
||||
address_space_write(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
&val, 1);
|
||||
}
|
||||
@ -72,8 +63,7 @@ void cpu_outw(pio_addr_t addr, uint16_t val)
|
||||
{
|
||||
uint8_t buf[2];
|
||||
|
||||
LOG_IOPORT("outw: %04"FMT_pioaddr" %04"PRIx16"\n", addr, val);
|
||||
trace_cpu_out(addr, val);
|
||||
trace_cpu_out(addr, 'w', val);
|
||||
stw_p(buf, val);
|
||||
address_space_write(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
buf, 2);
|
||||
@ -83,8 +73,7 @@ void cpu_outl(pio_addr_t addr, uint32_t val)
|
||||
{
|
||||
uint8_t buf[4];
|
||||
|
||||
LOG_IOPORT("outl: %04"FMT_pioaddr" %08"PRIx32"\n", addr, val);
|
||||
trace_cpu_out(addr, val);
|
||||
trace_cpu_out(addr, 'l', val);
|
||||
stl_p(buf, val);
|
||||
address_space_write(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
buf, 4);
|
||||
@ -96,8 +85,7 @@ uint8_t cpu_inb(pio_addr_t addr)
|
||||
|
||||
address_space_read(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED,
|
||||
&val, 1);
|
||||
trace_cpu_in(addr, val);
|
||||
LOG_IOPORT("inb : %04"FMT_pioaddr" %02"PRIx8"\n", addr, val);
|
||||
trace_cpu_in(addr, 'b', val);
|
||||
return val;
|
||||
}
|
||||
|
||||
@ -108,8 +96,7 @@ uint16_t cpu_inw(pio_addr_t addr)
|
||||
|
||||
address_space_read(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED, buf, 2);
|
||||
val = lduw_p(buf);
|
||||
trace_cpu_in(addr, val);
|
||||
LOG_IOPORT("inw : %04"FMT_pioaddr" %04"PRIx16"\n", addr, val);
|
||||
trace_cpu_in(addr, 'w', val);
|
||||
return val;
|
||||
}
|
||||
|
||||
@ -120,8 +107,7 @@ uint32_t cpu_inl(pio_addr_t addr)
|
||||
|
||||
address_space_read(&address_space_io, addr, MEMTXATTRS_UNSPECIFIED, buf, 4);
|
||||
val = ldl_p(buf);
|
||||
trace_cpu_in(addr, val);
|
||||
LOG_IOPORT("inl : %04"FMT_pioaddr" %08"PRIx32"\n", addr, val);
|
||||
trace_cpu_in(addr, 'l', val);
|
||||
return val;
|
||||
}
|
||||
|
||||
|
@ -1766,11 +1766,6 @@ void kvm_cpu_synchronize_post_init(CPUState *cpu)
|
||||
run_on_cpu(cpu, do_kvm_cpu_synchronize_post_init, cpu);
|
||||
}
|
||||
|
||||
void kvm_cpu_clean_state(CPUState *cpu)
|
||||
{
|
||||
cpu->kvm_vcpu_dirty = false;
|
||||
}
|
||||
|
||||
int kvm_cpu_exec(CPUState *cpu)
|
||||
{
|
||||
struct kvm_run *run = cpu->kvm_run;
|
||||
|
9
memory.c
9
memory.c
@ -2036,6 +2036,9 @@ static void listener_add_address_space(MemoryListener *listener,
|
||||
return;
|
||||
}
|
||||
|
||||
if (listener->begin) {
|
||||
listener->begin(listener);
|
||||
}
|
||||
if (global_dirty_log) {
|
||||
if (listener->log_global_start) {
|
||||
listener->log_global_start(listener);
|
||||
@ -2052,10 +2055,16 @@ static void listener_add_address_space(MemoryListener *listener,
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.readonly = fr->readonly,
|
||||
};
|
||||
if (fr->dirty_log_mask && listener->log_start) {
|
||||
listener->log_start(listener, §ion, 0, fr->dirty_log_mask);
|
||||
}
|
||||
if (listener->region_add) {
|
||||
listener->region_add(listener, §ion);
|
||||
}
|
||||
}
|
||||
if (listener->commit) {
|
||||
listener->commit(listener);
|
||||
}
|
||||
flatview_unref(view);
|
||||
}
|
||||
|
||||
|
@ -1299,7 +1299,7 @@ Instead of specifying the <shm size> using POSIX shm, you may specify
|
||||
a memory backend that has hugepage support:
|
||||
|
||||
@example
|
||||
qemu-system-i386 -object memory-backend-file,size=1G,mem-path=/mnt/hugepages,id=mb1
|
||||
qemu-system-i386 -object memory-backend-file,size=1G,mem-path=/mnt/hugepages/my-shmem-file,id=mb1
|
||||
-device ivshmem,memdev=mb1
|
||||
@end example
|
||||
|
||||
|
@ -112,8 +112,6 @@ const QEMULogItem qemu_log_items[] = {
|
||||
"x86 only: show protected mode far calls/returns/exceptions" },
|
||||
{ CPU_LOG_RESET, "cpu_reset",
|
||||
"show CPU state before CPU resets" },
|
||||
{ CPU_LOG_IOPORT, "ioport",
|
||||
"show all i/o ports accesses" },
|
||||
{ LOG_UNIMP, "unimp",
|
||||
"log unimplemented functionality" },
|
||||
{ LOG_GUEST_ERROR, "guest_errors",
|
||||
|
@ -317,7 +317,7 @@ while(<$inf>) {
|
||||
@columns = ();
|
||||
for $column (split (/\s*\@tab\s*/, $1)) {
|
||||
# @strong{...} is used a @headitem work-alike
|
||||
$column =~ s/^\@strong{(.*)}$/$1/;
|
||||
$column =~ s/^\@strong\{(.*)\}$/$1/;
|
||||
push @columns, $column;
|
||||
}
|
||||
$_ = "\n=item ".join (" : ", @columns)."\n";
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -139,8 +139,8 @@ paio_submit_co(int64_t sector_num, int nb_sectors, int type) "sector_num %"PRId6
|
||||
paio_submit(void *acb, void *opaque, int64_t sector_num, int nb_sectors, int type) "acb %p opaque %p sector_num %"PRId64" nb_sectors %d type %d"
|
||||
|
||||
# ioport.c
|
||||
cpu_in(unsigned int addr, unsigned int val) "addr %#x value %u"
|
||||
cpu_out(unsigned int addr, unsigned int val) "addr %#x value %u"
|
||||
cpu_in(unsigned int addr, char size, unsigned int val) "addr %#x(%c) value %u"
|
||||
cpu_out(unsigned int addr, char size, unsigned int val) "addr %#x(%c) value %u"
|
||||
|
||||
# balloon.c
|
||||
# Since requests are raised via monitor, not many tracepoints are needed.
|
||||
|
10
util/osdep.c
10
util/osdep.c
@ -52,7 +52,7 @@ extern int madvise(caddr_t, size_t, int);
|
||||
|
||||
static bool fips_enabled = false;
|
||||
|
||||
static const char *qemu_version = QEMU_VERSION;
|
||||
static const char *hw_version = QEMU_VERSION;
|
||||
|
||||
int socket_set_cork(int fd, int v)
|
||||
{
|
||||
@ -311,14 +311,14 @@ int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void qemu_set_version(const char *version)
|
||||
void qemu_set_hw_version(const char *version)
|
||||
{
|
||||
qemu_version = version;
|
||||
hw_version = version;
|
||||
}
|
||||
|
||||
const char *qemu_get_version(void)
|
||||
const char *qemu_hw_version(void)
|
||||
{
|
||||
return qemu_version;
|
||||
return hw_version;
|
||||
}
|
||||
|
||||
void fips_set_state(bool requested)
|
||||
|
Loading…
Reference in New Issue
Block a user