浏览代码

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>
Richard Henderson 1 年之前
父节点
当前提交
5915139aba

+ 0 - 2
.gitlab-ci.d/buildtest-template.yml

@@ -45,10 +45,8 @@
     exclude:
     exclude:
       - build/**/*.p
       - build/**/*.p
       - build/**/*.a.p
       - build/**/*.a.p
-      - build/**/*.fa.p
       - build/**/*.c.o
       - build/**/*.c.o
       - build/**/*.c.o.d
       - build/**/*.c.o.d
-      - build/**/*.fa
 
 
 .common_test_job_template:
 .common_test_job_template:
   extends: .base_job_template
   extends: .base_job_template

+ 0 - 2
.gitlab-ci.d/buildtest.yml

@@ -178,10 +178,8 @@ build-previous-qemu:
     exclude:
     exclude:
       - build-previous/**/*.p
       - build-previous/**/*.p
       - build-previous/**/*.a.p
       - build-previous/**/*.a.p
-      - build-previous/**/*.fa.p
       - build-previous/**/*.c.o
       - build-previous/**/*.c.o
       - build-previous/**/*.c.o.d
       - build-previous/**/*.c.o.d
-      - build-previous/**/*.fa
   needs:
   needs:
     job: amd64-opensuse-leap-container
     job: amd64-opensuse-leap-container
   variables:
   variables:

+ 1 - 1
block/meson.build

@@ -39,7 +39,7 @@ block_ss.add(files(
   'throttle.c',
   'throttle.c',
   'throttle-groups.c',
   'throttle-groups.c',
   'write-threshold.c',
   'write-threshold.c',
-), zstd, zlib, gnutls)
+), zstd, zlib)
 
 
 system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
 system_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
 system_ss.add(files('block-ram-registrar.c'))
 system_ss.add(files('block-ram-registrar.c'))

+ 4 - 0
chardev/char-stdio.c

@@ -41,6 +41,7 @@
 /* init terminal so that we can grab keys */
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
 static struct termios oldtty;
 static int old_fd0_flags;
 static int old_fd0_flags;
+static int old_fd1_flags;
 static bool stdio_in_use;
 static bool stdio_in_use;
 static bool stdio_allow_signal;
 static bool stdio_allow_signal;
 static bool stdio_echo_state;
 static bool stdio_echo_state;
@@ -50,6 +51,8 @@ static void term_exit(void)
     if (stdio_in_use) {
     if (stdio_in_use) {
         tcsetattr(0, TCSANOW, &oldtty);
         tcsetattr(0, TCSANOW, &oldtty);
         fcntl(0, F_SETFL, old_fd0_flags);
         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;
     stdio_in_use = true;
     old_fd0_flags = fcntl(0, F_GETFL);
     old_fd0_flags = fcntl(0, F_GETFL);
+    old_fd1_flags = fcntl(1, F_GETFL);
     tcgetattr(0, &oldtty);
     tcgetattr(0, &oldtty);
     if (!g_unix_set_fd_nonblocking(0, true, NULL)) {
     if (!g_unix_set_fd_nonblocking(0, true, NULL)) {
         error_setg_errno(errp, errno, "Failed to set FD nonblocking");
         error_setg_errno(errp, errno, "Failed to set FD nonblocking");

+ 2 - 6
docs/devel/build-system.rst

@@ -235,14 +235,10 @@ Subsystem sourcesets:
   are then turned into static libraries as follows::
   are then turned into static libraries as follows::
 
 
     libchardev = static_library('chardev', chardev_ss.sources(),
     libchardev = static_library('chardev', chardev_ss.sources(),
-                                name_suffix: 'fa',
                                 build_by_default: false)
                                 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:
 Target-independent emulator sourcesets:
   Various general purpose helper code is compiled only once and
   Various general purpose helper code is compiled only once and

+ 2 - 4
gdbstub/meson.build

@@ -19,18 +19,16 @@ gdb_system_ss = gdb_system_ss.apply({})
 
 
 libgdb_user = static_library('gdb_user',
 libgdb_user = static_library('gdb_user',
                              gdb_user_ss.sources() + genh,
                              gdb_user_ss.sources() + genh,
-                             name_suffix: 'fa',
                              c_args: '-DCONFIG_USER_ONLY',
                              c_args: '-DCONFIG_USER_ONLY',
                              build_by_default: false)
                              build_by_default: false)
 
 
 libgdb_system = static_library('gdb_system',
 libgdb_system = static_library('gdb_system',
                                 gdb_system_ss.sources() + genh,
                                 gdb_system_ss.sources() + genh,
-                                name_suffix: 'fa',
                                 build_by_default: false)
                                 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)
 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)
 system_ss.add(gdb_system)
 
 
 common_ss.add(files('syscalls.c'))
 common_ss.add(files('syscalls.c'))

+ 1 - 0
hw/i386/pc.c

@@ -80,6 +80,7 @@
     { "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
     { "athlon-" TYPE_X86_CPU, "model-id", "QEMU Virtual CPU version " v, },
 
 
 GlobalProperty pc_compat_9_0[] = {
 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, "x-l1-cache-per-thread", "false" },
     { TYPE_X86_CPU, "guest-phys-bits", "0" },
     { TYPE_X86_CPU, "guest-phys-bits", "0" },
     { "sev-guest", "legacy-vm-type", "true" },
     { "sev-guest", "legacy-vm-type", "true" },

+ 1 - 1
io/meson.build

@@ -13,4 +13,4 @@ io_ss.add(files(
   'dns-resolver.c',
   'dns-resolver.c',
   'net-listener.c',
   'net-listener.c',
   'task.c',
   'task.c',
-), gnutls)
+))

+ 49 - 51
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',
         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'],
                           'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
         version: files('VERSION'))
         version: files('VERSION'))
@@ -3467,22 +3467,21 @@ endif
 
 
 if enable_modules
 if enable_modules
   libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
   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
 endif
 
 
 qom_ss = qom_ss.apply({})
 qom_ss = qom_ss.apply({})
 libqom = static_library('qom', qom_ss.sources() + genh,
 libqom = static_library('qom', qom_ss.sources() + genh,
                         dependencies: [qom_ss.dependencies()],
                         dependencies: [qom_ss.dependencies()],
-                        name_suffix: 'fa',
                         build_by_default: false)
                         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 = files('event-loop-base.c')
 event_loop_base = static_library('event-loop-base',
 event_loop_base = static_library('event-loop-base',
                                  sources: event_loop_base + genh,
                                  sources: event_loop_base + genh,
-                                 name_suffix: 'fa',
                                  build_by_default: false)
                                  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])
                                      dependencies: [qom])
 
 
 stub_ss = stub_ss.apply({})
 stub_ss = stub_ss.apply({})
@@ -3531,7 +3530,7 @@ if have_block
     'blockdev-nbd.c',
     'blockdev-nbd.c',
     'iothread.c',
     'iothread.c',
     'job-qmp.c',
     'job-qmp.c',
-  ), gnutls)
+  ))
 
 
   # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
   # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
   # os-win32.c does not
   # os-win32.c does not
@@ -3608,6 +3607,7 @@ modinfo_files = []
 
 
 block_mods = []
 block_mods = []
 system_mods = []
 system_mods = []
+emulator_modules = []
 foreach d, list : modules
 foreach d, list : modules
   if not (d == 'block' ? have_block : have_system)
   if not (d == 'block' ? have_block : have_system)
     continue
     continue
@@ -3615,14 +3615,21 @@ foreach d, list : modules
 
 
   foreach m, module_ss : list
   foreach m, module_ss : list
     if enable_modules
     if enable_modules
+      module_ss.add(modulecommon)
       module_ss = module_ss.apply(config_all_devices, strict: false)
       module_ss = module_ss.apply(config_all_devices, strict: false)
       sl = static_library(d + '-' + m, [genh, module_ss.sources()],
       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'
       if d == 'block'
         block_mods += sl
         block_mods += sl
       else
       else
         system_mods += sl
         system_mods += sl
       endif
       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() != []
       if module_ss.sources() != []
         # FIXME: Should use sl.extract_all_objects(recursive: true) as
         # FIXME: Should use sl.extract_all_objects(recursive: true) as
         # input. Sources can be used multiple times but objects are
         # input. Sources can be used multiple times but objects are
@@ -3648,6 +3655,7 @@ endforeach
 foreach d, list : target_modules
 foreach d, list : target_modules
   foreach m, module_ss : list
   foreach m, module_ss : list
     if enable_modules
     if enable_modules
+      module_ss.add(modulecommon)
       foreach target : target_dirs
       foreach target : target_dirs
         if target.endswith('-softmmu')
         if target.endswith('-softmmu')
           config_target = config_target_mak[target]
           config_target = config_target_mak[target]
@@ -3660,11 +3668,17 @@ foreach d, list : target_modules
             module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
             module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
             sl = static_library(module_name,
             sl = static_library(module_name,
                                 [genh, target_module_ss.sources()],
                                 [genh, target_module_ss.sources()],
-                                dependencies: [modulecommon, target_module_ss.dependencies()],
+                                dependencies: target_module_ss.dependencies(),
                                 include_directories: target_inc,
                                 include_directories: target_inc,
                                 c_args: c_args,
                                 c_args: c_args,
                                 pic: true)
                                 pic: true)
             system_mods += sl
             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.
             # FIXME: Should use sl.extract_all_objects(recursive: true) too.
             modinfo_files += custom_target(module_name + '.modinfo',
             modinfo_files += custom_target(module_name + '.modinfo',
                                            output: module_name + '.modinfo',
                                            output: module_name + '.modinfo',
@@ -3698,6 +3712,10 @@ if enable_modules
       hw_arch[arch].add(modinfo_dep)
       hw_arch[arch].add(modinfo_dep)
     endif
     endif
   endforeach
   endforeach
+
+  if emulator_modules.length() > 0
+    alias_target('modules', emulator_modules)
+  endif
 endif
 endif
 
 
 nm = find_program('nm')
 nm = find_program('nm')
@@ -3714,96 +3732,75 @@ qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
 authz_ss = authz_ss.apply({})
 authz_ss = authz_ss.apply({})
 libauthz = static_library('authz', authz_ss.sources() + genh,
 libauthz = static_library('authz', authz_ss.sources() + genh,
                           dependencies: [authz_ss.dependencies()],
                           dependencies: [authz_ss.dependencies()],
-                          name_suffix: 'fa',
                           build_by_default: false)
                           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({})
 crypto_ss = crypto_ss.apply({})
 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
                            dependencies: [crypto_ss.dependencies()],
                            dependencies: [crypto_ss.dependencies()],
-                           name_suffix: 'fa',
                            build_by_default: false)
                            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({})
 io_ss = io_ss.apply({})
 libio = static_library('io', io_ss.sources() + genh,
 libio = static_library('io', io_ss.sources() + genh,
                        dependencies: [io_ss.dependencies()],
                        dependencies: [io_ss.dependencies()],
                        link_with: libqemuutil,
                        link_with: libqemuutil,
-                       name_suffix: 'fa',
                        build_by_default: false)
                        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,
 libmigration = static_library('migration', sources: migration_files + genh,
-                              name_suffix: 'fa',
                               build_by_default: false)
                               build_by_default: false)
-migration = declare_dependency(link_with: libmigration,
+migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
                                dependencies: [qom, io])
                                dependencies: [qom, io])
 system_ss.add(migration)
 system_ss.add(migration)
 
 
 block_ss = block_ss.apply({})
 block_ss = block_ss.apply({})
 libblock = static_library('block', block_ss.sources() + genh,
 libblock = static_library('block', block_ss.sources() + genh,
                           dependencies: block_ss.dependencies(),
                           dependencies: block_ss.dependencies(),
-                          link_depends: block_syms,
-                          name_suffix: 'fa',
                           build_by_default: false)
                           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({})
 blockdev_ss = blockdev_ss.apply({})
 libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
 libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
                              dependencies: blockdev_ss.dependencies(),
                              dependencies: blockdev_ss.dependencies(),
-                             name_suffix: 'fa',
                              build_by_default: false)
                              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({})
 qmp_ss = qmp_ss.apply({})
 libqmp = static_library('qmp', qmp_ss.sources() + genh,
 libqmp = static_library('qmp', qmp_ss.sources() + genh,
                         dependencies: qmp_ss.dependencies(),
                         dependencies: qmp_ss.dependencies(),
-                        name_suffix: 'fa',
                         build_by_default: false)
                         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,
 libchardev = static_library('chardev', chardev_ss.sources() + genh,
-                            name_suffix: 'fa',
                             dependencies: chardev_ss.dependencies(),
                             dependencies: chardev_ss.dependencies(),
                             build_by_default: false)
                             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({})
 hwcore_ss = hwcore_ss.apply({})
 libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
 libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
-                           name_suffix: 'fa',
                            build_by_default: false)
                            build_by_default: false)
-hwcore = declare_dependency(link_whole: libhwcore)
+hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
 common_ss.add(hwcore)
 common_ss.add(hwcore)
 
 
 ###########
 ###########
 # Targets #
 # 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)
 system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
 common_ss.add(qom, qemuutil)
 common_ss.add(qom, qemuutil)
 
 
@@ -3818,8 +3815,7 @@ common_all = static_library('common',
                             sources: common_ss.all_sources() + genh,
                             sources: common_ss.all_sources() + genh,
                             include_directories: common_user_inc,
                             include_directories: common_user_inc,
                             implicit_include_directories: false,
                             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')
 feature_to_c = find_program('scripts/feature_to_c.py')
 
 
@@ -3928,8 +3924,7 @@ foreach target : target_dirs
                  objects: objects,
                  objects: objects,
                  include_directories: target_inc,
                  include_directories: target_inc,
                  c_args: c_args,
                  c_args: c_args,
-                 build_by_default: false,
-                 name_suffix: 'fa')
+                 build_by_default: false)
 
 
   if target.endswith('-softmmu')
   if target.endswith('-softmmu')
     execs = [{
     execs = [{
@@ -4035,11 +4030,14 @@ endif
 
 
 if have_tools
 if have_tools
   qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
   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)
              dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
   qemu_io = executable('qemu-io', files('qemu-io.c'),
   qemu_io = executable('qemu-io', files('qemu-io.c'),
+             link_args: '@block.syms', link_depends: block_syms,
              dependencies: [block, qemuutil], install: true)
              dependencies: [block, qemuutil], install: true)
   qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
   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)
                install: true)
 
 
   subdir('storage-daemon')
   subdir('storage-daemon')

+ 3 - 4
plugins/meson.build

@@ -1,4 +1,3 @@
-plugin_ldflags = []
 # Modules need more symbols than just those in plugins/qemu-plugins.symbols
 # Modules need more symbols than just those in plugins/qemu-plugins.symbols
 if not enable_modules
 if not enable_modules
   if host_os == 'darwin'
   if host_os == 'darwin'
@@ -7,9 +6,9 @@ if not enable_modules
       output: 'qemu-plugins-ld64.symbols',
       output: 'qemu-plugins-ld64.symbols',
       capture: true,
       capture: true,
       command: ['sed', '-ne', 's/^[[:space:]]*\\(qemu_.*\\);/_\\1/p', '@INPUT@'])
       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
   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
 endif
 endif
 
 
@@ -37,5 +36,5 @@ if get_option('plugins')
     'loader.c',
     'loader.c',
     'core.c',
     'core.c',
     'api.c',
     'api.c',
-  ), declare_dependency(link_args: plugin_ldflags))
+  ))
 endif
 endif

+ 1 - 1
pythondeps.toml

@@ -19,7 +19,7 @@
 
 
 [meson]
 [meson]
 # The install key should match the version in python/wheels/
 # 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]
 [docs]
 # Please keep the installed versions in sync with docs/requirements.txt
 # Please keep the installed versions in sync with docs/requirements.txt

+ 2 - 1
storage-daemon/meson.build

@@ -1,6 +1,6 @@
 qsd_ss = ss.source_set()
 qsd_ss = ss.source_set()
 qsd_ss.add(files('qemu-storage-daemon.c'))
 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')
 subdir('qapi')
 
 
@@ -8,6 +8,7 @@ if have_tools
   qsd_ss = qsd_ss.apply({})
   qsd_ss = qsd_ss.apply({})
   qsd = executable('qemu-storage-daemon',
   qsd = executable('qemu-storage-daemon',
                    qsd_ss.sources(),
                    qsd_ss.sources(),
+                   link_args: '@block.syms', link_depends: block_syms,
                    dependencies: qsd_ss.dependencies(),
                    dependencies: qsd_ss.dependencies(),
                    install: true)
                    install: true)
 endif
 endif

+ 1 - 1
stubs/blk-exp-close-all.c

@@ -1,7 +1,7 @@
 #include "qemu/osdep.h"
 #include "qemu/osdep.h"
 #include "block/export.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)
 void blk_exp_close_all(void)
 {
 {
 }
 }

+ 24 - 0
target/i386/confidential-guest.h

@@ -39,6 +39,8 @@ struct X86ConfidentialGuestClass {
 
 
     /* <public> */
     /* <public> */
     int (*kvm_type)(X86ConfidentialGuest *cg);
     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;
         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
 #endif

+ 29 - 11
target/i386/cpu.c

@@ -1131,7 +1131,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
         .feat_names = {
         .feat_names = {
             NULL, NULL, NULL, NULL,
             NULL, NULL, NULL, NULL,
             "avx-vnni-int8", "avx-ne-convert", 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, "prefetchiti", NULL,
             NULL, NULL, NULL, NULL,
             NULL, NULL, NULL, NULL,
             NULL, NULL, NULL, NULL,
             NULL, NULL, NULL, NULL,
@@ -6035,11 +6035,11 @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
 
 
 #endif /* !CONFIG_USER_ONLY */
 #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];
     FeatureWordInfo *wi = &feature_word_info[w];
     uint64_t r = 0;
     uint64_t r = 0;
+    uint32_t unavail = 0;
 
 
     if (kvm_enabled()) {
     if (kvm_enabled()) {
         switch (wi->type) {
         switch (wi->type) {
@@ -6065,20 +6065,34 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
     } else {
     } else {
         return ~0;
         return ~0;
     }
     }
+
+    switch (w) {
 #ifndef TARGET_X86_64
 #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
          * 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
          * way for userspace to get out of its 32-bit jail, we can leave
          * the LM bit set.
          * the LM bit set.
          */
          */
-        uint32_t unavail = tcg_enabled()
+        unavail = tcg_enabled()
             ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
             ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
             : CPUID_EXT2_LM;
             : CPUID_EXT2_LM;
-        r &= ~unavail;
-    }
+        break;
 #endif
 #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);
         r &= x86_cpu_get_migratable_flags(w);
     }
     }
     return r;
     return r;
@@ -6968,6 +6982,9 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
             *eax = *ebx = *ecx = *edx = 0;
             *eax = *ebx = *ecx = *edx = 0;
             break;
             break;
         }
         }
+        if (cpu->amd_topoext_features_only) {
+            *edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE;
+        }
         break;
         break;
     case 0x8000001E:
     case 0x8000001E:
         if (cpu->core_id <= 255) {
         if (cpu->core_id <= 255) {
@@ -7371,7 +7388,7 @@ void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
              * by the user.
              * by the user.
              */
              */
             env->features[w] |=
             env->features[w] |=
-                x86_cpu_get_supported_feature_word(w, cpu->migratable) &
+                x86_cpu_get_supported_feature_word(cpu, w) &
                 ~env->user_features[w] &
                 ~env->user_features[w] &
                 ~feature_word_info[w].no_autoenable_flags;
                 ~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++) {
     for (w = 0; w < FEATURE_WORDS; w++) {
         uint64_t host_feat =
         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 requested_features = env->features[w];
         uint64_t unavailable_features = requested_features & ~host_feat;
         uint64_t unavailable_features = requested_features & ~host_feat;
         mark_unavailable_features(cpu, w, unavailable_features, prefix);
         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;
         env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
     if (requested_lbr_fmt && kvm_enabled()) {
     if (requested_lbr_fmt && kvm_enabled()) {
         uint64_t host_perf_cap =
         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;
         unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
 
 
         if (!cpu->enable_pmu) {
         if (!cpu->enable_pmu) {
@@ -8279,6 +8296,7 @@ static Property x86_cpu_properties[] = {
     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
     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-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("lmce", X86CPU, enable_lmce, false),
     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,

+ 8 - 2
target/i386/cpu.h

@@ -666,8 +666,7 @@ typedef enum FeatureWord {
 } FeatureWord;
 } FeatureWord;
 
 
 typedef uint64_t FeatureWordArray[FEATURE_WORDS];
 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 */
 /* cpuid_features bits */
 #define CPUID_FP87 (1U << 0)
 #define CPUID_FP87 (1U << 0)
@@ -813,6 +812,8 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
 
 
 /* Support RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE */
 /* Support RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE */
 #define CPUID_7_0_EBX_FSGSBASE          (1U << 0)
 #define CPUID_7_0_EBX_FSGSBASE          (1U << 0)
+/* Support TSC adjust MSR */
+#define CPUID_7_0_EBX_TSC_ADJUST        (1U << 1)
 /* Support SGX */
 /* Support SGX */
 #define CPUID_7_0_EBX_SGX               (1U << 2)
 #define CPUID_7_0_EBX_SGX               (1U << 2)
 /* 1st Group of Advanced Bit Manipulation Extensions */
 /* 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)
 #define CPUID_8000_0008_EBX_STIBP_ALWAYS_ON    (1U << 17)
 /* Speculative Store Bypass Disable */
 /* Speculative Store Bypass Disable */
 #define CPUID_8000_0008_EBX_AMD_SSBD    (1U << 24)
 #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 */
 /* Predictive Store Forwarding Disable */
 #define CPUID_8000_0008_EBX_AMD_PSFD    (1U << 28)
 #define CPUID_8000_0008_EBX_AMD_PSFD    (1U << 28)
 
 
@@ -2105,6 +2108,9 @@ struct ArchCPU {
     /* Only advertise CPUID leaves defined by the vendor */
     /* Only advertise CPUID leaves defined by the vendor */
     bool vendor_cpuid_only;
     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 */
     /* Enable auto level-increase for Intel Processor Trace leave */
     bool intel_pt_auto_level;
     bool intel_pt_auto_level;
 
 

+ 1 - 1
target/i386/kvm/kvm-cpu.c

@@ -143,7 +143,7 @@ static void kvm_cpu_xsave_init(void)
         if (!esa->size) {
         if (!esa->size) {
             continue;
             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) {
             != esa->bits) {
             continue;
             continue;
         }
         }

+ 5 - 0
target/i386/kvm/kvm.c

@@ -548,6 +548,11 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
         ret |= 1U << KVM_HINTS_REALTIME;
         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;
     return ret;
 }
 }
 
 

+ 42 - 9
target/i386/sev.c

@@ -587,17 +587,17 @@ static SevCapability *sev_get_capabilities(Error **errp)
     }
     }
 
 
     sev_common = SEV_COMMON(MACHINE(qdev_get_machine())->cgs);
     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);
     fd = open(sev_device, O_RDWR);
     if (fd < 0) {
     if (fd < 0) {
         error_setg_errno(errp, errno, "SEV: Failed to open %s",
         error_setg_errno(errp, errno, "SEV: Failed to open %s",
-                         DEFAULT_SEV_DEVICE);
+                         sev_device);
         g_free(sev_device);
         g_free(sev_device);
         return NULL;
         return NULL;
     }
     }
@@ -841,7 +841,7 @@ sev_snp_cpuid_report_mismatches(SnpCpuidInfo *old,
     size_t i;
     size_t i;
 
 
     if (old->count != new->count) {
     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);
                      "provided: %d, expected: %d", old->count, new->count);
         return;
         return;
     }
     }
@@ -853,8 +853,8 @@ sev_snp_cpuid_report_mismatches(SnpCpuidInfo *old,
         new_func = &new->entries[i];
         new_func = &new->entries[i];
 
 
         if (memcmp(old_func, new_func, sizeof(SnpCpuidFunc))) {
         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",
                          "expected: eax:0x%08x, ebx: 0x%08x, ecx: 0x%08x, edx: 0x%08x",
                          old_func->eax_in, old_func->ecx_in,
                          old_func->eax_in, old_func->ecx_in,
                          old_func->eax, old_func->ebx, old_func->ecx, old_func->edx,
                          old_func->eax, old_func->ebx, old_func->ecx, old_func->edx,
@@ -945,6 +945,38 @@ out:
     return ret;
     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
 static int
 sev_launch_update_data(SevCommonState *sev_common, hwaddr gpa,
 sev_launch_update_data(SevCommonState *sev_common, hwaddr gpa,
                        uint8_t *addr, size_t len)
                        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_finish = sev_snp_launch_finish;
     klass->launch_update_data = sev_snp_launch_update_data;
     klass->launch_update_data = sev_snp_launch_update_data;
     klass->kvm_init = sev_snp_kvm_init;
     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;
     x86_klass->kvm_type = sev_snp_kvm_type;
 
 
     object_class_property_add(oc, "policy", "uint64",
     object_class_property_add(oc, "policy", "uint64",

+ 4 - 4
tcg/meson.build

@@ -31,20 +31,20 @@ tcg_ss = tcg_ss.apply({})
 
 
 libtcg_user = static_library('tcg_user',
 libtcg_user = static_library('tcg_user',
                              tcg_ss.sources() + genh,
                              tcg_ss.sources() + genh,
-                             name_suffix: 'fa',
                              dependencies: tcg_ss.dependencies(),
                              dependencies: tcg_ss.dependencies(),
                              c_args: '-DCONFIG_USER_ONLY',
                              c_args: '-DCONFIG_USER_ONLY',
                              build_by_default: false)
                              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)
 user_ss.add(tcg_user)
 
 
 libtcg_system = static_library('tcg_system',
 libtcg_system = static_library('tcg_system',
                                 tcg_ss.sources() + genh,
                                 tcg_ss.sources() + genh,
-                                name_suffix: 'fa',
                                 dependencies: tcg_ss.dependencies(),
                                 dependencies: tcg_ss.dependencies(),
                                 c_args: '-DCONFIG_SOFTMMU',
                                 c_args: '-DCONFIG_SOFTMMU',
                                 build_by_default: false)
                                 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)
 system_ss.add(tcg_system)

+ 1 - 1
tests/Makefile.include

@@ -87,7 +87,7 @@ distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES)
 .PHONY: check-venv check-avocado check-acceptance check-acceptance-deprecated-warning
 .PHONY: check-venv check-avocado check-acceptance check-acceptance-deprecated-warning
 
 
 # Build up our target list from the filtered list of ninja targets
 # 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_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group
 TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
 TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results

+ 1 - 2
tests/qtest/libqos/meson.build

@@ -69,7 +69,6 @@ if have_virtfs
 endif
 endif
 
 
 libqos = static_library('qos', libqos_srcs + genh,
 libqos = static_library('qos', libqos_srcs + genh,
-                        name_suffix: 'fa',
                         build_by_default: false)
                         build_by_default: false)
 
 
-qos = declare_dependency(link_whole: libqos)
+qos = declare_dependency(objects: libqos.extract_all_objects(recursive: false))

+ 1 - 1
ui/meson.build

@@ -44,7 +44,7 @@ vnc_ss.add(files(
   'vnc-jobs.c',
   'vnc-jobs.c',
   'vnc-clipboard.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'))
 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_all(when: [vnc, pixman], if_true: vnc_ss)
 system_ss.add(when: vnc, if_false: files('vnc-stubs.c'))
 system_ss.add(when: vnc, if_false: files('vnc-stubs.c'))