* meson: Pass objects and dependencies to declare_dependency(), not static_library()
* meson: Drop the .fa library suffix * target/i386: drop AMD machine check bits from Intel CPUID * target/i386: add avx-vnni-int16 feature * target/i386: SEV bugfixes * target/i386: SEV-SNP -cpu host support * char: fix exit issues -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmaGceoUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroNcpgf/XziKojGOTvYsE7xMijOUswYjCG5m ZVLqxTug8Q0zO/9mGvluKBTWmh8KhRWOovX5iZL8+F0gPoYPG4ONpNhh3wpA9+S7 H7ph4V6sDJBX4l3OrOK6htD8dO5D9kns1iKGnE0lY60PkcHl+pU8BNWfK1zYp5US geiyzuRFRRtDmoNx5+o+w+D+W5msPZsnlj5BnPWM+O/ykeFfSrk2ztfdwHKXUhCB 5FJcu2sWVx+wsdVzdjgT8USi5+VTK4vabq3SfccmNRxBRnJOCU5MrR63stMDceo4 TswSB88I0WRV1848AudcGZRkjvKaXLyHJ+QTjg2dp7itEARJ3MGsvOpS5A== =3kv7 -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * meson: Pass objects and dependencies to declare_dependency(), not static_library() * meson: Drop the .fa library suffix * target/i386: drop AMD machine check bits from Intel CPUID * target/i386: add avx-vnni-int16 feature * target/i386: SEV bugfixes * target/i386: SEV-SNP -cpu host support * char: fix exit issues # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmaGceoUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroNcpgf/XziKojGOTvYsE7xMijOUswYjCG5m # ZVLqxTug8Q0zO/9mGvluKBTWmh8KhRWOovX5iZL8+F0gPoYPG4ONpNhh3wpA9+S7 # H7ph4V6sDJBX4l3OrOK6htD8dO5D9kns1iKGnE0lY60PkcHl+pU8BNWfK1zYp5US # geiyzuRFRRtDmoNx5+o+w+D+W5msPZsnlj5BnPWM+O/ykeFfSrk2ztfdwHKXUhCB # 5FJcu2sWVx+wsdVzdjgT8USi5+VTK4vabq3SfccmNRxBRnJOCU5MrR63stMDceo4 # TswSB88I0WRV1848AudcGZRkjvKaXLyHJ+QTjg2dp7itEARJ3MGsvOpS5A== # =3kv7 # -----END PGP SIGNATURE----- # gpg: Signature made Thu 04 Jul 2024 02:56:58 AM PDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: target/i386/SEV: implement mask_cpuid_features target/i386: add support for masking CPUID features in confidential guests char-stdio: Restore blocking mode of stdout on exit target/i386: add avx-vnni-int16 feature i386/sev: Fallback to the default SEV device if none provided in sev_get_capabilities() i386/sev: Fix error message in sev_get_capabilities() target/i386: do not include undefined bits in the AMD topoext leaf target/i386: SEV: fix formatting of CPUID mismatch message target/i386: drop AMD machine check bits from Intel CPUID target/i386: pass X86CPU to x86_cpu_get_supported_feature_word meson: Drop the .fa library suffix Revert "meson: Propagate gnutls dependency" meson: Pass objects and dependencies to declare_dependency() meson: merge plugin_ldflags into emulator_link_args meson: move block.syms dependency out of libblock meson: move shared_module() calls where modules are already walked Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
5915139aba
@ -45,10 +45,8 @@
|
||||
exclude:
|
||||
- build/**/*.p
|
||||
- build/**/*.a.p
|
||||
- build/**/*.fa.p
|
||||
- build/**/*.c.o
|
||||
- build/**/*.c.o.d
|
||||
- build/**/*.fa
|
||||
|
||||
.common_test_job_template:
|
||||
extends: .base_job_template
|
||||
|
@ -178,10 +178,8 @@ build-previous-qemu:
|
||||
exclude:
|
||||
- build-previous/**/*.p
|
||||
- build-previous/**/*.a.p
|
||||
- build-previous/**/*.fa.p
|
||||
- build-previous/**/*.c.o
|
||||
- build-previous/**/*.c.o.d
|
||||
- build-previous/**/*.fa
|
||||
needs:
|
||||
job: amd64-opensuse-leap-container
|
||||
variables:
|
||||
|
@ -39,7 +39,7 @@ block_ss.add(files(
|
||||
'throttle.c',
|
||||
'throttle-groups.c',
|
||||
'write-threshold.c',
|
||||
), zstd, zlib, gnutls)
|
||||
), zstd, zlib)
|
||||
|
||||
system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
||||
system_ss.add(files('block-ram-registrar.c'))
|
||||
|
@ -41,6 +41,7 @@
|
||||
/* init terminal so that we can grab keys */
|
||||
static struct termios oldtty;
|
||||
static int old_fd0_flags;
|
||||
static int old_fd1_flags;
|
||||
static bool stdio_in_use;
|
||||
static bool stdio_allow_signal;
|
||||
static bool stdio_echo_state;
|
||||
@ -50,6 +51,8 @@ static void term_exit(void)
|
||||
if (stdio_in_use) {
|
||||
tcsetattr(0, TCSANOW, &oldtty);
|
||||
fcntl(0, F_SETFL, old_fd0_flags);
|
||||
fcntl(1, F_SETFL, old_fd1_flags);
|
||||
stdio_in_use = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -102,6 +105,7 @@ static void qemu_chr_open_stdio(Chardev *chr,
|
||||
|
||||
stdio_in_use = true;
|
||||
old_fd0_flags = fcntl(0, F_GETFL);
|
||||
old_fd1_flags = fcntl(1, F_GETFL);
|
||||
tcgetattr(0, &oldtty);
|
||||
if (!g_unix_set_fd_nonblocking(0, true, NULL)) {
|
||||
error_setg_errno(errp, errno, "Failed to set FD nonblocking");
|
||||
|
@ -235,14 +235,10 @@ Subsystem sourcesets:
|
||||
are then turned into static libraries as follows::
|
||||
|
||||
libchardev = static_library('chardev', chardev_ss.sources(),
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
chardev = declare_dependency(link_whole: libchardev)
|
||||
|
||||
As of Meson 0.55.1, the special ``.fa`` suffix should be used for everything
|
||||
that is used with ``link_whole``, to ensure that the link flags are placed
|
||||
correctly in the command line.
|
||||
chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
|
||||
dependencies: chardev_ss.dependencies())
|
||||
|
||||
Target-independent emulator sourcesets:
|
||||
Various general purpose helper code is compiled only once and
|
||||
|
@ -19,18 +19,16 @@ gdb_system_ss = gdb_system_ss.apply({})
|
||||
|
||||
libgdb_user = static_library('gdb_user',
|
||||
gdb_user_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
c_args: '-DCONFIG_USER_ONLY',
|
||||
build_by_default: false)
|
||||
|
||||
libgdb_system = static_library('gdb_system',
|
||||
gdb_system_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
gdb_user = declare_dependency(link_whole: libgdb_user)
|
||||
gdb_user = declare_dependency(objects: libgdb_user.extract_all_objects(recursive: false))
|
||||
user_ss.add(gdb_user)
|
||||
gdb_system = declare_dependency(link_whole: libgdb_system)
|
||||
gdb_system = declare_dependency(objects: libgdb_system.extract_all_objects(recursive: false))
|
||||
system_ss.add(gdb_system)
|
||||
|
||||
common_ss.add(files('syscalls.c'))
|
||||
|
@ -80,6 +80,7 @@
|
||||
{ "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
|
||||
|
||||
GlobalProperty pc_compat_9_0[] = {
|
||||
{ TYPE_X86_CPU, "x-amd-topoext-features-only", "false" },
|
||||
{ TYPE_X86_CPU, "x-l1-cache-per-thread", "false" },
|
||||
{ TYPE_X86_CPU, "guest-phys-bits", "0" },
|
||||
{ "sev-guest", "legacy-vm-type", "true" },
|
||||
|
@ -13,4 +13,4 @@ io_ss.add(files(
|
||||
'dns-resolver.c',
|
||||
'net-listener.c',
|
||||
'task.c',
|
||||
), gnutls)
|
||||
))
|
||||
|
100
meson.build
100
meson.build
@ -1,4 +1,4 @@
|
||||
project('qemu', ['c'], meson_version: '>=0.63.0',
|
||||
project('qemu', ['c'], meson_version: '>=1.1.0',
|
||||
default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
|
||||
'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
|
||||
version: files('VERSION'))
|
||||
@ -3467,22 +3467,21 @@ endif
|
||||
|
||||
if enable_modules
|
||||
libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
|
||||
modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
|
||||
modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
|
||||
endif
|
||||
|
||||
qom_ss = qom_ss.apply({})
|
||||
libqom = static_library('qom', qom_ss.sources() + genh,
|
||||
dependencies: [qom_ss.dependencies()],
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
qom = declare_dependency(link_whole: libqom)
|
||||
qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
|
||||
dependencies: qom_ss.dependencies())
|
||||
|
||||
event_loop_base = files('event-loop-base.c')
|
||||
event_loop_base = static_library('event-loop-base',
|
||||
sources: event_loop_base + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
event_loop_base = declare_dependency(link_whole: event_loop_base,
|
||||
event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
|
||||
dependencies: [qom])
|
||||
|
||||
stub_ss = stub_ss.apply({})
|
||||
@ -3531,7 +3530,7 @@ if have_block
|
||||
'blockdev-nbd.c',
|
||||
'iothread.c',
|
||||
'job-qmp.c',
|
||||
), gnutls)
|
||||
))
|
||||
|
||||
# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
|
||||
# os-win32.c does not
|
||||
@ -3608,6 +3607,7 @@ modinfo_files = []
|
||||
|
||||
block_mods = []
|
||||
system_mods = []
|
||||
emulator_modules = []
|
||||
foreach d, list : modules
|
||||
if not (d == 'block' ? have_block : have_system)
|
||||
continue
|
||||
@ -3615,14 +3615,21 @@ foreach d, list : modules
|
||||
|
||||
foreach m, module_ss : list
|
||||
if enable_modules
|
||||
module_ss.add(modulecommon)
|
||||
module_ss = module_ss.apply(config_all_devices, strict: false)
|
||||
sl = static_library(d + '-' + m, [genh, module_ss.sources()],
|
||||
dependencies: [modulecommon, module_ss.dependencies()], pic: true)
|
||||
dependencies: module_ss.dependencies(), pic: true)
|
||||
if d == 'block'
|
||||
block_mods += sl
|
||||
else
|
||||
system_mods += sl
|
||||
endif
|
||||
emulator_modules += shared_module(sl.name(),
|
||||
name_prefix: '',
|
||||
objects: sl.extract_all_objects(recursive: false),
|
||||
dependencies: module_ss.dependencies(),
|
||||
install: true,
|
||||
install_dir: qemu_moddir)
|
||||
if module_ss.sources() != []
|
||||
# FIXME: Should use sl.extract_all_objects(recursive: true) as
|
||||
# input. Sources can be used multiple times but objects are
|
||||
@ -3648,6 +3655,7 @@ endforeach
|
||||
foreach d, list : target_modules
|
||||
foreach m, module_ss : list
|
||||
if enable_modules
|
||||
module_ss.add(modulecommon)
|
||||
foreach target : target_dirs
|
||||
if target.endswith('-softmmu')
|
||||
config_target = config_target_mak[target]
|
||||
@ -3660,11 +3668,17 @@ foreach d, list : target_modules
|
||||
module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
|
||||
sl = static_library(module_name,
|
||||
[genh, target_module_ss.sources()],
|
||||
dependencies: [modulecommon, target_module_ss.dependencies()],
|
||||
dependencies: target_module_ss.dependencies(),
|
||||
include_directories: target_inc,
|
||||
c_args: c_args,
|
||||
pic: true)
|
||||
system_mods += sl
|
||||
emulator_modules += shared_module(sl.name(),
|
||||
name_prefix: '',
|
||||
objects: sl.extract_all_objects(recursive: false),
|
||||
dependencies: target_module_ss.dependencies(),
|
||||
install: true,
|
||||
install_dir: qemu_moddir)
|
||||
# FIXME: Should use sl.extract_all_objects(recursive: true) too.
|
||||
modinfo_files += custom_target(module_name + '.modinfo',
|
||||
output: module_name + '.modinfo',
|
||||
@ -3698,6 +3712,10 @@ if enable_modules
|
||||
hw_arch[arch].add(modinfo_dep)
|
||||
endif
|
||||
endforeach
|
||||
|
||||
if emulator_modules.length() > 0
|
||||
alias_target('modules', emulator_modules)
|
||||
endif
|
||||
endif
|
||||
|
||||
nm = find_program('nm')
|
||||
@ -3714,96 +3732,75 @@ qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
|
||||
authz_ss = authz_ss.apply({})
|
||||
libauthz = static_library('authz', authz_ss.sources() + genh,
|
||||
dependencies: [authz_ss.dependencies()],
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
authz = declare_dependency(link_whole: libauthz,
|
||||
dependencies: qom)
|
||||
authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
|
||||
dependencies: [authz_ss.dependencies(), qom])
|
||||
|
||||
crypto_ss = crypto_ss.apply({})
|
||||
libcrypto = static_library('crypto', crypto_ss.sources() + genh,
|
||||
dependencies: [crypto_ss.dependencies()],
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
crypto = declare_dependency(link_whole: libcrypto,
|
||||
dependencies: [authz, qom])
|
||||
crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
|
||||
dependencies: [crypto_ss.dependencies(), authz, qom])
|
||||
|
||||
io_ss = io_ss.apply({})
|
||||
libio = static_library('io', io_ss.sources() + genh,
|
||||
dependencies: [io_ss.dependencies()],
|
||||
link_with: libqemuutil,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
|
||||
io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
|
||||
dependencies: [io_ss.dependencies(), crypto, qom])
|
||||
|
||||
libmigration = static_library('migration', sources: migration_files + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
migration = declare_dependency(link_with: libmigration,
|
||||
migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
|
||||
dependencies: [qom, io])
|
||||
system_ss.add(migration)
|
||||
|
||||
block_ss = block_ss.apply({})
|
||||
libblock = static_library('block', block_ss.sources() + genh,
|
||||
dependencies: block_ss.dependencies(),
|
||||
link_depends: block_syms,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
block = declare_dependency(link_whole: [libblock],
|
||||
link_args: '@block.syms',
|
||||
dependencies: [crypto, io])
|
||||
block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
|
||||
dependencies: [block_ss.dependencies(), crypto, io])
|
||||
|
||||
blockdev_ss = blockdev_ss.apply({})
|
||||
libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
|
||||
dependencies: blockdev_ss.dependencies(),
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
blockdev = declare_dependency(link_whole: [libblockdev],
|
||||
dependencies: [block, event_loop_base])
|
||||
blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
|
||||
dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
|
||||
|
||||
qmp_ss = qmp_ss.apply({})
|
||||
libqmp = static_library('qmp', qmp_ss.sources() + genh,
|
||||
dependencies: qmp_ss.dependencies(),
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
qmp = declare_dependency(link_whole: [libqmp])
|
||||
qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
|
||||
dependencies: qmp_ss.dependencies())
|
||||
|
||||
libchardev = static_library('chardev', chardev_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
dependencies: chardev_ss.dependencies(),
|
||||
build_by_default: false)
|
||||
|
||||
chardev = declare_dependency(link_whole: libchardev)
|
||||
chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
|
||||
dependencies: chardev_ss.dependencies())
|
||||
|
||||
hwcore_ss = hwcore_ss.apply({})
|
||||
libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
hwcore = declare_dependency(link_whole: libhwcore)
|
||||
hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
|
||||
common_ss.add(hwcore)
|
||||
|
||||
###########
|
||||
# Targets #
|
||||
###########
|
||||
|
||||
emulator_modules = []
|
||||
foreach m : block_mods + system_mods
|
||||
emulator_modules += shared_module(m.name(),
|
||||
build_by_default: true,
|
||||
name_prefix: '',
|
||||
link_whole: m,
|
||||
install: true,
|
||||
install_dir: qemu_moddir)
|
||||
endforeach
|
||||
if emulator_modules.length() > 0
|
||||
alias_target('modules', emulator_modules)
|
||||
endif
|
||||
|
||||
system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
|
||||
common_ss.add(qom, qemuutil)
|
||||
|
||||
@ -3818,8 +3815,7 @@ common_all = static_library('common',
|
||||
sources: common_ss.all_sources() + genh,
|
||||
include_directories: common_user_inc,
|
||||
implicit_include_directories: false,
|
||||
dependencies: common_ss.all_dependencies(),
|
||||
name_suffix: 'fa')
|
||||
dependencies: common_ss.all_dependencies())
|
||||
|
||||
feature_to_c = find_program('scripts/feature_to_c.py')
|
||||
|
||||
@ -3928,8 +3924,7 @@ foreach target : target_dirs
|
||||
objects: objects,
|
||||
include_directories: target_inc,
|
||||
c_args: c_args,
|
||||
build_by_default: false,
|
||||
name_suffix: 'fa')
|
||||
build_by_default: false)
|
||||
|
||||
if target.endswith('-softmmu')
|
||||
execs = [{
|
||||
@ -4035,11 +4030,14 @@ endif
|
||||
|
||||
if have_tools
|
||||
qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
|
||||
link_args: '@block.syms', link_depends: block_syms,
|
||||
dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
|
||||
qemu_io = executable('qemu-io', files('qemu-io.c'),
|
||||
link_args: '@block.syms', link_depends: block_syms,
|
||||
dependencies: [block, qemuutil], install: true)
|
||||
qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
|
||||
dependencies: [blockdev, qemuutil, gnutls, selinux],
|
||||
link_args: '@block.syms', link_depends: block_syms,
|
||||
dependencies: [blockdev, qemuutil, selinux],
|
||||
install: true)
|
||||
|
||||
subdir('storage-daemon')
|
||||
|
@ -1,4 +1,3 @@
|
||||
plugin_ldflags = []
|
||||
# Modules need more symbols than just those in plugins/qemu-plugins.symbols
|
||||
if not enable_modules
|
||||
if host_os == 'darwin'
|
||||
@ -7,9 +6,9 @@ if not enable_modules
|
||||
output: 'qemu-plugins-ld64.symbols',
|
||||
capture: true,
|
||||
command: ['sed', '-ne', 's/^[[:space:]]*\\(qemu_.*\\);/_\\1/p', '@INPUT@'])
|
||||
plugin_ldflags = ['-Wl,-exported_symbols_list,plugins/qemu-plugins-ld64.symbols']
|
||||
emulator_link_args += ['-Wl,-exported_symbols_list,plugins/qemu-plugins-ld64.symbols']
|
||||
else
|
||||
plugin_ldflags = ['-Xlinker', '--dynamic-list=' + (meson.project_source_root() / 'plugins/qemu-plugins.symbols')]
|
||||
emulator_link_args += ['-Xlinker', '--dynamic-list=' + (meson.project_source_root() / 'plugins/qemu-plugins.symbols')]
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -37,5 +36,5 @@ if get_option('plugins')
|
||||
'loader.c',
|
||||
'core.c',
|
||||
'api.c',
|
||||
), declare_dependency(link_args: plugin_ldflags))
|
||||
))
|
||||
endif
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
[meson]
|
||||
# The install key should match the version in python/wheels/
|
||||
meson = { accepted = ">=0.63.0", installed = "1.2.3", canary = "meson" }
|
||||
meson = { accepted = ">=1.1.0", installed = "1.2.3", canary = "meson" }
|
||||
|
||||
[docs]
|
||||
# Please keep the installed versions in sync with docs/requirements.txt
|
||||
|
@ -1,6 +1,6 @@
|
||||
qsd_ss = ss.source_set()
|
||||
qsd_ss.add(files('qemu-storage-daemon.c'))
|
||||
qsd_ss.add(blockdev, chardev, qmp, qom, qemuutil, gnutls)
|
||||
qsd_ss.add(blockdev, chardev, qmp, qom, qemuutil)
|
||||
|
||||
subdir('qapi')
|
||||
|
||||
@ -8,6 +8,7 @@ if have_tools
|
||||
qsd_ss = qsd_ss.apply({})
|
||||
qsd = executable('qemu-storage-daemon',
|
||||
qsd_ss.sources(),
|
||||
link_args: '@block.syms', link_depends: block_syms,
|
||||
dependencies: qsd_ss.dependencies(),
|
||||
install: true)
|
||||
endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "block/export.h"
|
||||
|
||||
/* Only used in programs that support block exports (libblockdev.fa) */
|
||||
/* Only used in programs that support block exports (libblockdev.a) */
|
||||
void blk_exp_close_all(void)
|
||||
{
|
||||
}
|
||||
|
@ -39,6 +39,8 @@ struct X86ConfidentialGuestClass {
|
||||
|
||||
/* <public> */
|
||||
int (*kvm_type)(X86ConfidentialGuest *cg);
|
||||
uint32_t (*mask_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -56,4 +58,26 @@ static inline int x86_confidential_guest_kvm_type(X86ConfidentialGuest *cg)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* x86_confidential_guest_mask_cpuid_features:
|
||||
*
|
||||
* Removes unsupported features from a confidential guest's CPUID values, returns
|
||||
* the value with the bits removed. The bits removed should be those that KVM
|
||||
* provides independent of host-supported CPUID features, but are not supported by
|
||||
* the confidential computing firmware.
|
||||
*/
|
||||
static inline int x86_confidential_guest_mask_cpuid_features(X86ConfidentialGuest *cg,
|
||||
uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value)
|
||||
{
|
||||
X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg);
|
||||
|
||||
if (klass->mask_cpuid_features) {
|
||||
return klass->mask_cpuid_features(cg, feature, index, reg, value);
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1131,7 +1131,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
.feat_names = {
|
||||
NULL, NULL, NULL, NULL,
|
||||
"avx-vnni-int8", "avx-ne-convert", NULL, NULL,
|
||||
"amx-complex", NULL, NULL, NULL,
|
||||
"amx-complex", NULL, "avx-vnni-int16", NULL,
|
||||
NULL, NULL, "prefetchiti", NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
@ -6035,11 +6035,11 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
bool migratable_only)
|
||||
uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
|
||||
{
|
||||
FeatureWordInfo *wi = &feature_word_info[w];
|
||||
uint64_t r = 0;
|
||||
uint32_t unavail = 0;
|
||||
|
||||
if (kvm_enabled()) {
|
||||
switch (wi->type) {
|
||||
@ -6065,20 +6065,34 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
} else {
|
||||
return ~0;
|
||||
}
|
||||
|
||||
switch (w) {
|
||||
#ifndef TARGET_X86_64
|
||||
if (w == FEAT_8000_0001_EDX) {
|
||||
case FEAT_8000_0001_EDX:
|
||||
/*
|
||||
* 32-bit TCG can emulate 64-bit compatibility mode. If there is no
|
||||
* way for userspace to get out of its 32-bit jail, we can leave
|
||||
* the LM bit set.
|
||||
*/
|
||||
uint32_t unavail = tcg_enabled()
|
||||
unavail = tcg_enabled()
|
||||
? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
|
||||
: CPUID_EXT2_LM;
|
||||
r &= ~unavail;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
if (migratable_only) {
|
||||
|
||||
case FEAT_8000_0007_EBX:
|
||||
if (cpu && !IS_AMD_CPU(&cpu->env)) {
|
||||
/* Disable AMD machine check architecture for Intel CPU. */
|
||||
unavail = ~0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
r &= ~unavail;
|
||||
if (cpu && cpu->migratable) {
|
||||
r &= x86_cpu_get_migratable_flags(w);
|
||||
}
|
||||
return r;
|
||||
@ -6968,6 +6982,9 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
*eax = *ebx = *ecx = *edx = 0;
|
||||
break;
|
||||
}
|
||||
if (cpu->amd_topoext_features_only) {
|
||||
*edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE;
|
||||
}
|
||||
break;
|
||||
case 0x8000001E:
|
||||
if (cpu->core_id <= 255) {
|
||||
@ -7371,7 +7388,7 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
|
||||
* by the user.
|
||||
*/
|
||||
env->features[w] |=
|
||||
x86_cpu_get_supported_feature_word(w, cpu->migratable) &
|
||||
x86_cpu_get_supported_feature_word(cpu, w) &
|
||||
~env->user_features[w] &
|
||||
~feature_word_info[w].no_autoenable_flags;
|
||||
}
|
||||
@ -7497,7 +7514,7 @@ static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
|
||||
|
||||
for (w = 0; w < FEATURE_WORDS; w++) {
|
||||
uint64_t host_feat =
|
||||
x86_cpu_get_supported_feature_word(w, false);
|
||||
x86_cpu_get_supported_feature_word(NULL, w);
|
||||
uint64_t requested_features = env->features[w];
|
||||
uint64_t unavailable_features = requested_features & ~host_feat;
|
||||
mark_unavailable_features(cpu, w, unavailable_features, prefix);
|
||||
@ -7617,7 +7634,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||
env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
|
||||
if (requested_lbr_fmt && kvm_enabled()) {
|
||||
uint64_t host_perf_cap =
|
||||
x86_cpu_get_supported_feature_word(FEAT_PERF_CAPABILITIES, false);
|
||||
x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES);
|
||||
unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
|
||||
|
||||
if (!cpu->enable_pmu) {
|
||||
@ -8279,6 +8296,7 @@ static Property x86_cpu_properties[] = {
|
||||
DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
|
||||
DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
|
||||
DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
|
||||
DEFINE_PROP_BOOL("x-amd-topoext-features-only", X86CPU, amd_topoext_features_only, true),
|
||||
DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
|
||||
DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
|
||||
DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
|
||||
|
@ -666,8 +666,7 @@ typedef enum FeatureWord {
|
||||
} FeatureWord;
|
||||
|
||||
typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
||||
uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
bool migratable_only);
|
||||
uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w);
|
||||
|
||||
/* cpuid_features bits */
|
||||
#define CPUID_FP87 (1U << 0)
|
||||
@ -813,6 +812,8 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
|
||||
/* Support RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE */
|
||||
#define CPUID_7_0_EBX_FSGSBASE (1U << 0)
|
||||
/* Support TSC adjust MSR */
|
||||
#define CPUID_7_0_EBX_TSC_ADJUST (1U << 1)
|
||||
/* Support SGX */
|
||||
#define CPUID_7_0_EBX_SGX (1U << 2)
|
||||
/* 1st Group of Advanced Bit Manipulation Extensions */
|
||||
@ -1003,6 +1004,8 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
#define CPUID_8000_0008_EBX_STIBP_ALWAYS_ON (1U << 17)
|
||||
/* Speculative Store Bypass Disable */
|
||||
#define CPUID_8000_0008_EBX_AMD_SSBD (1U << 24)
|
||||
/* Paravirtualized Speculative Store Bypass Disable MSR */
|
||||
#define CPUID_8000_0008_EBX_VIRT_SSBD (1U << 25)
|
||||
/* Predictive Store Forwarding Disable */
|
||||
#define CPUID_8000_0008_EBX_AMD_PSFD (1U << 28)
|
||||
|
||||
@ -2105,6 +2108,9 @@ struct ArchCPU {
|
||||
/* Only advertise CPUID leaves defined by the vendor */
|
||||
bool vendor_cpuid_only;
|
||||
|
||||
/* Only advertise TOPOEXT features that AMD defines */
|
||||
bool amd_topoext_features_only;
|
||||
|
||||
/* Enable auto level-increase for Intel Processor Trace leave */
|
||||
bool intel_pt_auto_level;
|
||||
|
||||
|
@ -143,7 +143,7 @@ static void kvm_cpu_xsave_init(void)
|
||||
if (!esa->size) {
|
||||
continue;
|
||||
}
|
||||
if ((x86_cpu_get_supported_feature_word(esa->feature, false) & esa->bits)
|
||||
if ((x86_cpu_get_supported_feature_word(NULL, esa->feature) & esa->bits)
|
||||
!= esa->bits) {
|
||||
continue;
|
||||
}
|
||||
|
@ -548,6 +548,11 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
ret |= 1U << KVM_HINTS_REALTIME;
|
||||
}
|
||||
|
||||
if (current_machine->cgs) {
|
||||
ret = x86_confidential_guest_mask_cpuid_features(
|
||||
X86_CONFIDENTIAL_GUEST(current_machine->cgs),
|
||||
function, index, reg, ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -587,17 +587,17 @@ static SevCapability *sev_get_capabilities(Error **errp)
|
||||
}
|
||||
|
||||
sev_common = SEV_COMMON(MACHINE(qdev_get_machine())->cgs);
|
||||
if (!sev_common) {
|
||||
error_setg(errp, "SEV is not configured");
|
||||
return NULL;
|
||||
if (sev_common) {
|
||||
sev_device = object_property_get_str(OBJECT(sev_common), "sev-device",
|
||||
&error_abort);
|
||||
} else {
|
||||
sev_device = g_strdup(DEFAULT_SEV_DEVICE);
|
||||
}
|
||||
|
||||
sev_device = object_property_get_str(OBJECT(sev_common), "sev-device",
|
||||
&error_abort);
|
||||
fd = open(sev_device, O_RDWR);
|
||||
if (fd < 0) {
|
||||
error_setg_errno(errp, errno, "SEV: Failed to open %s",
|
||||
DEFAULT_SEV_DEVICE);
|
||||
sev_device);
|
||||
g_free(sev_device);
|
||||
return NULL;
|
||||
}
|
||||
@ -841,7 +841,7 @@ sev_snp_cpuid_report_mismatches(SnpCpuidInfo *old,
|
||||
size_t i;
|
||||
|
||||
if (old->count != new->count) {
|
||||
error_report("SEV-SNP: CPUID validation failed due to count mismatch,"
|
||||
error_report("SEV-SNP: CPUID validation failed due to count mismatch, "
|
||||
"provided: %d, expected: %d", old->count, new->count);
|
||||
return;
|
||||
}
|
||||
@ -853,8 +853,8 @@ sev_snp_cpuid_report_mismatches(SnpCpuidInfo *old,
|
||||
new_func = &new->entries[i];
|
||||
|
||||
if (memcmp(old_func, new_func, sizeof(SnpCpuidFunc))) {
|
||||
error_report("SEV-SNP: CPUID validation failed for function 0x%x, index: 0x%x"
|
||||
"provided: eax:0x%08x, ebx: 0x%08x, ecx: 0x%08x, edx: 0x%08x"
|
||||
error_report("SEV-SNP: CPUID validation failed for function 0x%x, index: 0x%x, "
|
||||
"provided: eax:0x%08x, ebx: 0x%08x, ecx: 0x%08x, edx: 0x%08x, "
|
||||
"expected: eax:0x%08x, ebx: 0x%08x, ecx: 0x%08x, edx: 0x%08x",
|
||||
old_func->eax_in, old_func->ecx_in,
|
||||
old_func->eax, old_func->ebx, old_func->ecx, old_func->edx,
|
||||
@ -945,6 +945,38 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
sev_snp_mask_cpuid_features(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index,
|
||||
int reg, uint32_t value)
|
||||
{
|
||||
switch (feature) {
|
||||
case 1:
|
||||
if (reg == R_ECX) {
|
||||
return value & ~CPUID_EXT_TSC_DEADLINE_TIMER;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (index == 0 && reg == R_EBX) {
|
||||
return value & ~CPUID_7_0_EBX_TSC_ADJUST;
|
||||
}
|
||||
if (index == 0 && reg == R_EDX) {
|
||||
return value & ~(CPUID_7_0_EDX_SPEC_CTRL |
|
||||
CPUID_7_0_EDX_STIBP |
|
||||
CPUID_7_0_EDX_FLUSH_L1D |
|
||||
CPUID_7_0_EDX_ARCH_CAPABILITIES |
|
||||
CPUID_7_0_EDX_CORE_CAPABILITY |
|
||||
CPUID_7_0_EDX_SPEC_CTRL_SSBD);
|
||||
}
|
||||
break;
|
||||
case 0x80000008:
|
||||
if (reg == R_EBX) {
|
||||
return value & ~CPUID_8000_0008_EBX_VIRT_SSBD;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
static int
|
||||
sev_launch_update_data(SevCommonState *sev_common, hwaddr gpa,
|
||||
uint8_t *addr, size_t len)
|
||||
@ -2315,6 +2347,7 @@ sev_snp_guest_class_init(ObjectClass *oc, void *data)
|
||||
klass->launch_finish = sev_snp_launch_finish;
|
||||
klass->launch_update_data = sev_snp_launch_update_data;
|
||||
klass->kvm_init = sev_snp_kvm_init;
|
||||
x86_klass->mask_cpuid_features = sev_snp_mask_cpuid_features;
|
||||
x86_klass->kvm_type = sev_snp_kvm_type;
|
||||
|
||||
object_class_property_add(oc, "policy", "uint64",
|
||||
|
@ -31,20 +31,20 @@ tcg_ss = tcg_ss.apply({})
|
||||
|
||||
libtcg_user = static_library('tcg_user',
|
||||
tcg_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
dependencies: tcg_ss.dependencies(),
|
||||
c_args: '-DCONFIG_USER_ONLY',
|
||||
build_by_default: false)
|
||||
|
||||
tcg_user = declare_dependency(link_with: libtcg_user)
|
||||
tcg_user = declare_dependency(objects: libtcg_user.extract_all_objects(recursive: false),
|
||||
dependencies: tcg_ss.dependencies())
|
||||
user_ss.add(tcg_user)
|
||||
|
||||
libtcg_system = static_library('tcg_system',
|
||||
tcg_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
dependencies: tcg_ss.dependencies(),
|
||||
c_args: '-DCONFIG_SOFTMMU',
|
||||
build_by_default: false)
|
||||
|
||||
tcg_system = declare_dependency(link_with: libtcg_system)
|
||||
tcg_system = declare_dependency(objects: libtcg_system.extract_all_objects(recursive: false),
|
||||
dependencies: tcg_ss.dependencies())
|
||||
system_ss.add(tcg_system)
|
||||
|
@ -87,7 +87,7 @@ distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES)
|
||||
.PHONY: check-venv check-avocado check-acceptance check-acceptance-deprecated-warning
|
||||
|
||||
# Build up our target list from the filtered list of ninja targets
|
||||
TARGETS=$(patsubst libqemu-%.fa, %, $(filter libqemu-%.fa, $(ninja-targets)))
|
||||
TARGETS=$(patsubst libqemu-%.a, %, $(filter libqemu-%.a, $(ninja-targets)))
|
||||
|
||||
TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group
|
||||
TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
|
||||
|
@ -69,7 +69,6 @@ if have_virtfs
|
||||
endif
|
||||
|
||||
libqos = static_library('qos', libqos_srcs + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
|
||||
qos = declare_dependency(link_whole: libqos)
|
||||
qos = declare_dependency(objects: libqos.extract_all_objects(recursive: false))
|
||||
|
@ -44,7 +44,7 @@ vnc_ss.add(files(
|
||||
'vnc-jobs.c',
|
||||
'vnc-clipboard.c',
|
||||
))
|
||||
vnc_ss.add(zlib, jpeg, gnutls)
|
||||
vnc_ss.add(zlib, jpeg)
|
||||
vnc_ss.add(when: sasl, if_true: files('vnc-auth-sasl.c'))
|
||||
system_ss.add_all(when: [vnc, pixman], if_true: vnc_ss)
|
||||
system_ss.add(when: vnc, if_false: files('vnc-stubs.c'))
|
||||
|
Loading…
Reference in New Issue
Block a user