mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* scsi-disk: Don't silently truncate serial number * backends/hostmem: Report error on unavailable qemu_madvise() features or unaligned memory sizes * target/i386: fixes and documentation for INHIBIT_IRQ/TF/RF and debugging * i386/hvf: Adds support for INVTSC cpuid bit * i386/hvf: Fixes for dirty memory tracking * i386/hvf: Use hv_vcpu_interrupt() and hv_vcpu_run_until() * hvf: Cleanups * stubs: fixes for --disable-system build * i386/kvm: support for FRED * i386/kvm: fix MCE handling on AMD hosts # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmZkF2oUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroPNlQf+N9y6Eh0nMEEQ69twtV8ytglTY+uX # FsogvnsXHNMVubOWmmeItM6kFXTAkR9cmFaL8dqI1Gs03xEQdQXbF1KejJZOAZVl # RQMOW8Fg2Afr+0lwqCXHvhsmZ4hr5yUkRndyucA/E9AO2uGrtgwsWGDBGaHJOZIA # lAsEMOZgKjXHZnefXjhMrvpk/QNovjEV6f1RHX3oKZjKSI5/G4IqGSmwNYToot8p # 2fgs4Qti4+1gNyM2oBLq7cCMjMS61tSxOMH4uqVoIisjyckPlAFRvc+DXtKsUAAs # 9AgM++pNgpB0IXv67czRUNdRoK7OI8I0ULhI4qHXi6Yg2QYAHqpQ6WL4Lg== # =RP7U # -----END PGP SIGNATURE----- # gpg: Signature made Sat 08 Jun 2024 01:33:46 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: (42 commits) python: mkvenv: remove ensure command Revert "python: use vendored tomli" i386: Add support for overflow recovery i386: Add support for SUCCOR feature i386: Fix MCE support for AMD hosts docs: i386: pc: Avoid mentioning limit of maximum vCPUs target/i386: Add get/set/migrate support for FRED MSRs target/i386: enumerate VMX nested-exception support vmxcap: add support for VMX FRED controls target/i386: mark CR4.FRED not reserved target/i386: add support for FRED in CPUID enumeration hvf: Makes assert_hvf_ok report failed expression i386/hvf: Updates API usage to use modern vCPU run function i386/hvf: In kick_vcpu use hv_vcpu_interrupt to force exit i386/hvf: Fixes dirty memory tracking by page granularity RX->RWX change hvf: Consistent types for vCPU handles i386/hvf: Fixes some compilation warnings i386/hvf: Adds support for INVTSC cpuid bit stubs/meson: Fix qemuutil build when --disable-system scsi-disk: Don't silently truncate serial number ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -400,7 +400,7 @@ static int hvf_init_vcpu(CPUState *cpu)
|
||||
r = hv_vcpu_create(&cpu->accel->fd,
|
||||
(hv_vcpu_exit_t **)&cpu->accel->exit, NULL);
|
||||
#else
|
||||
r = hv_vcpu_create((hv_vcpuid_t *)&cpu->accel->fd, HV_VCPU_DEFAULT);
|
||||
r = hv_vcpu_create(&cpu->accel->fd, HV_VCPU_DEFAULT);
|
||||
#endif
|
||||
cpu->accel->dirty = true;
|
||||
assert_hvf_ok(r);
|
||||
|
||||
+22
-29
@@ -13,40 +13,33 @@
|
||||
#include "sysemu/hvf.h"
|
||||
#include "sysemu/hvf_int.h"
|
||||
|
||||
void assert_hvf_ok(hv_return_t ret)
|
||||
const char *hvf_return_string(hv_return_t ret)
|
||||
{
|
||||
switch (ret) {
|
||||
case HV_SUCCESS: return "HV_SUCCESS";
|
||||
case HV_ERROR: return "HV_ERROR";
|
||||
case HV_BUSY: return "HV_BUSY";
|
||||
case HV_BAD_ARGUMENT: return "HV_BAD_ARGUMENT";
|
||||
case HV_NO_RESOURCES: return "HV_NO_RESOURCES";
|
||||
case HV_NO_DEVICE: return "HV_NO_DEVICE";
|
||||
case HV_UNSUPPORTED: return "HV_UNSUPPORTED";
|
||||
#if defined(MAC_OS_VERSION_11_0) && \
|
||||
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
|
||||
case HV_DENIED: return "HV_DENIED";
|
||||
#endif
|
||||
default: return "[unknown hv_return value]";
|
||||
}
|
||||
}
|
||||
|
||||
void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
|
||||
const char *exp)
|
||||
{
|
||||
if (ret == HV_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (ret) {
|
||||
case HV_ERROR:
|
||||
error_report("Error: HV_ERROR");
|
||||
break;
|
||||
case HV_BUSY:
|
||||
error_report("Error: HV_BUSY");
|
||||
break;
|
||||
case HV_BAD_ARGUMENT:
|
||||
error_report("Error: HV_BAD_ARGUMENT");
|
||||
break;
|
||||
case HV_NO_RESOURCES:
|
||||
error_report("Error: HV_NO_RESOURCES");
|
||||
break;
|
||||
case HV_NO_DEVICE:
|
||||
error_report("Error: HV_NO_DEVICE");
|
||||
break;
|
||||
case HV_UNSUPPORTED:
|
||||
error_report("Error: HV_UNSUPPORTED");
|
||||
break;
|
||||
#if defined(MAC_OS_VERSION_11_0) && \
|
||||
MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0
|
||||
case HV_DENIED:
|
||||
error_report("Error: HV_DENIED");
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
error_report("Unknown Error");
|
||||
}
|
||||
error_report("Error: %s = %s (0x%x, at %s:%u)",
|
||||
exp, hvf_return_string(ret), ret, file, line);
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
|
||||
return false;
|
||||
}
|
||||
|
||||
backend->aligned = true;
|
||||
name = object_get_canonical_path(OBJECT(backend));
|
||||
ram_flags = (backend->share ? RAM_SHARED : 0) | RAM_PROTECTED;
|
||||
return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name,
|
||||
|
||||
@@ -80,6 +80,7 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
backend->aligned = true;
|
||||
name = host_memory_backend_get_name(backend);
|
||||
ram_flags = backend->share ? RAM_SHARED : 0;
|
||||
ram_flags |= fb->readonly ? RAM_READONLY_FD : 0;
|
||||
|
||||
@@ -52,6 +52,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
|
||||
return false;
|
||||
}
|
||||
|
||||
backend->aligned = true;
|
||||
name = host_memory_backend_get_name(backend);
|
||||
ram_flags = backend->share ? RAM_SHARED : 0;
|
||||
ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
|
||||
|
||||
+28
-8
@@ -20,6 +20,7 @@
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "qemu/mmap-alloc.h"
|
||||
#include "qemu/madvise.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "hw/qdev-core.h"
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
@@ -169,19 +170,24 @@ static void host_memory_backend_set_merge(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
|
||||
|
||||
if (!host_memory_backend_mr_inited(backend)) {
|
||||
backend->merge = value;
|
||||
if (QEMU_MADV_MERGEABLE == QEMU_MADV_INVALID) {
|
||||
if (value) {
|
||||
error_setg(errp, "Memory merging is not supported on this host");
|
||||
}
|
||||
assert(!backend->merge);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value != backend->merge) {
|
||||
if (!host_memory_backend_mr_inited(backend) &&
|
||||
value != backend->merge) {
|
||||
void *ptr = memory_region_get_ram_ptr(&backend->mr);
|
||||
uint64_t sz = memory_region_size(&backend->mr);
|
||||
|
||||
qemu_madvise(ptr, sz,
|
||||
value ? QEMU_MADV_MERGEABLE : QEMU_MADV_UNMERGEABLE);
|
||||
backend->merge = value;
|
||||
}
|
||||
|
||||
backend->merge = value;
|
||||
}
|
||||
|
||||
static bool host_memory_backend_get_dump(Object *obj, Error **errp)
|
||||
@@ -195,19 +201,24 @@ static void host_memory_backend_set_dump(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
|
||||
|
||||
if (!host_memory_backend_mr_inited(backend)) {
|
||||
backend->dump = value;
|
||||
if (QEMU_MADV_DONTDUMP == QEMU_MADV_INVALID) {
|
||||
if (!value) {
|
||||
error_setg(errp, "Dumping guest memory cannot be disabled on this host");
|
||||
}
|
||||
assert(backend->dump);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value != backend->dump) {
|
||||
if (host_memory_backend_mr_inited(backend) &&
|
||||
value != backend->dump) {
|
||||
void *ptr = memory_region_get_ram_ptr(&backend->mr);
|
||||
uint64_t sz = memory_region_size(&backend->mr);
|
||||
|
||||
qemu_madvise(ptr, sz,
|
||||
value ? QEMU_MADV_DODUMP : QEMU_MADV_DONTDUMP);
|
||||
backend->dump = value;
|
||||
}
|
||||
|
||||
backend->dump = value;
|
||||
}
|
||||
|
||||
static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
|
||||
@@ -325,6 +336,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
|
||||
HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
|
||||
void *ptr;
|
||||
uint64_t sz;
|
||||
size_t pagesize;
|
||||
bool async = !phase_check(PHASE_LATE_BACKENDS_CREATED);
|
||||
|
||||
if (!bc->alloc) {
|
||||
@@ -336,6 +348,14 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
|
||||
|
||||
ptr = memory_region_get_ram_ptr(&backend->mr);
|
||||
sz = memory_region_size(&backend->mr);
|
||||
pagesize = qemu_ram_pagesize(backend->mr.ram_block);
|
||||
|
||||
if (backend->aligned && !QEMU_IS_ALIGNED(sz, pagesize)) {
|
||||
g_autofree char *pagesize_str = size_to_str(pagesize);
|
||||
error_setg(errp, "backend '%s' memory size must be multiple of %s",
|
||||
object_get_typename(OBJECT(uc)), pagesize_str);
|
||||
return;
|
||||
}
|
||||
|
||||
if (backend->merge) {
|
||||
qemu_madvise(ptr, sz, QEMU_MADV_MERGEABLE);
|
||||
|
||||
@@ -955,10 +955,6 @@ mkvenv="$python ${source_path}/python/scripts/mkvenv.py"
|
||||
|
||||
# Finish preparing the virtual environment using vendored .whl files
|
||||
|
||||
if $python -c 'import sys; sys.exit(sys.version_info >= (3,11))'; then
|
||||
$mkvenv ensure --dir "${source_path}/python/wheels" \
|
||||
'tomli>=1.2.0' || exit 1
|
||||
fi
|
||||
$mkvenv ensuregroup --dir "${source_path}/python/wheels" \
|
||||
${source_path}/pythondeps.toml meson || exit 1
|
||||
|
||||
|
||||
@@ -185,14 +185,13 @@ Bundled Python packages
|
||||
|
||||
Python packages that are **mandatory** dependencies to build QEMU,
|
||||
but are not available in all supported distros, are bundled with the
|
||||
QEMU sources. Currently this includes Meson (outdated in CentOS 8
|
||||
and derivatives, Ubuntu 20.04 and 22.04, and openSUSE Leap) and tomli
|
||||
(absent in Ubuntu 20.04).
|
||||
QEMU sources. The only one is currently Meson (outdated in Ubuntu
|
||||
22.04 and openSUSE Leap).
|
||||
|
||||
If you need to update these, please do so by modifying and rerunning
|
||||
``python/scripts/vendor.py``. This script embeds the sha256 hash of
|
||||
package sources and checks it. The pypi.org web site provides an easy
|
||||
way to retrieve the sha256 hash of the sources.
|
||||
In order to include a new or updated wheel, modify and rerun the
|
||||
``python/scripts/vendor.py`` script. The script embeds the
|
||||
sha256 hash of package sources and checks it. The pypi.org web site
|
||||
provides an easy way to retrieve the sha256 hash of the sources.
|
||||
|
||||
|
||||
Stage 2: Meson
|
||||
|
||||
@@ -36,7 +36,8 @@ The QEMU PC System emulator simulates the following peripherals:
|
||||
- PCI UHCI, OHCI, EHCI or XHCI USB controller and a virtual USB-1.1
|
||||
hub.
|
||||
|
||||
SMP is supported with up to 255 CPUs (and 4096 CPUs for PC Q35 machine).
|
||||
SMP is supported with a large number of virtual CPUs (upper limit is
|
||||
configuration dependent).
|
||||
|
||||
QEMU uses the PC BIOS from the Seabios project and the Plex86/Bochs LGPL
|
||||
VGA BIOS.
|
||||
|
||||
+10
-1
@@ -17,6 +17,7 @@
|
||||
#include "hw/loader.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-visit-machine.h"
|
||||
#include "qemu/madvise.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
@@ -427,6 +428,10 @@ static void machine_set_dump_guest_core(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(obj);
|
||||
|
||||
if (!value && QEMU_MADV_DONTDUMP == QEMU_MADV_INVALID) {
|
||||
error_setg(errp, "Dumping guest memory cannot be disabled on this host");
|
||||
return;
|
||||
}
|
||||
ms->dump_guest_core = value;
|
||||
}
|
||||
|
||||
@@ -441,6 +446,10 @@ static void machine_set_mem_merge(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
MachineState *ms = MACHINE(obj);
|
||||
|
||||
if (value && QEMU_MADV_MERGEABLE == QEMU_MADV_INVALID) {
|
||||
error_setg(errp, "Memory merging is not supported on this host");
|
||||
return;
|
||||
}
|
||||
ms->mem_merge = value;
|
||||
}
|
||||
|
||||
@@ -1129,7 +1138,7 @@ static void machine_initfn(Object *obj)
|
||||
container_get(obj, "/peripheral-anon");
|
||||
|
||||
ms->dump_guest_core = true;
|
||||
ms->mem_merge = true;
|
||||
ms->mem_merge = (QEMU_MADV_MERGEABLE != QEMU_MADV_INVALID);
|
||||
ms->enable_graphics = true;
|
||||
ms->kernel_cmdline = g_strdup("");
|
||||
ms->ram_size = mc->default_ram_size;
|
||||
|
||||
+17
-3
@@ -58,6 +58,9 @@
|
||||
|
||||
#define TYPE_SCSI_DISK_BASE "scsi-disk-base"
|
||||
|
||||
#define MAX_SERIAL_LEN 36
|
||||
#define MAX_SERIAL_LEN_FOR_DEVID 20
|
||||
|
||||
OBJECT_DECLARE_TYPE(SCSIDiskState, SCSIDiskClass, SCSI_DISK_BASE)
|
||||
|
||||
struct SCSIDiskClass {
|
||||
@@ -648,8 +651,8 @@ static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
|
||||
}
|
||||
|
||||
l = strlen(s->serial);
|
||||
if (l > 36) {
|
||||
l = 36;
|
||||
if (l > MAX_SERIAL_LEN) {
|
||||
l = MAX_SERIAL_LEN;
|
||||
}
|
||||
|
||||
trace_scsi_disk_emulate_vpd_page_80(req->cmd.xfer);
|
||||
@@ -2501,9 +2504,20 @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
|
||||
if (!s->vendor) {
|
||||
s->vendor = g_strdup("QEMU");
|
||||
}
|
||||
if (s->serial && strlen(s->serial) > MAX_SERIAL_LEN) {
|
||||
error_setg(errp, "The serial number can't be longer than %d characters",
|
||||
MAX_SERIAL_LEN);
|
||||
return;
|
||||
}
|
||||
if (!s->device_id) {
|
||||
if (s->serial) {
|
||||
s->device_id = g_strdup_printf("%.20s", s->serial);
|
||||
if (strlen(s->serial) > MAX_SERIAL_LEN_FOR_DEVID) {
|
||||
error_setg(errp, "The serial number can't be longer than %d "
|
||||
"characters when it is also used as the default for "
|
||||
"device_id", MAX_SERIAL_LEN_FOR_DEVID);
|
||||
return;
|
||||
}
|
||||
s->device_id = g_strdup(s->serial);
|
||||
} else {
|
||||
const char *str = blk_name(s->qdev.conf.blk);
|
||||
if (str && *str) {
|
||||
|
||||
@@ -74,7 +74,7 @@ struct HostMemoryBackend {
|
||||
uint64_t size;
|
||||
bool merge, dump, use_canonical_path;
|
||||
bool prealloc, is_mapped, share, reserve;
|
||||
bool guest_memfd;
|
||||
bool guest_memfd, aligned;
|
||||
uint32_t prealloc_threads;
|
||||
ThreadContext *prealloc_context;
|
||||
DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
|
||||
|
||||
@@ -13,8 +13,10 @@
|
||||
|
||||
#ifdef __aarch64__
|
||||
#include <Hypervisor/Hypervisor.h>
|
||||
typedef hv_vcpu_t hvf_vcpuid;
|
||||
#else
|
||||
#include <Hypervisor/hv.h>
|
||||
typedef hv_vcpuid_t hvf_vcpuid;
|
||||
#endif
|
||||
|
||||
/* hvf_slot flags */
|
||||
@@ -50,7 +52,7 @@ struct HVFState {
|
||||
extern HVFState *hvf_state;
|
||||
|
||||
struct AccelCPUState {
|
||||
uint64_t fd;
|
||||
hvf_vcpuid fd;
|
||||
void *exit;
|
||||
bool vtimer_masked;
|
||||
sigset_t unblock_ipi_mask;
|
||||
@@ -58,7 +60,10 @@ struct AccelCPUState {
|
||||
bool dirty;
|
||||
};
|
||||
|
||||
void assert_hvf_ok(hv_return_t ret);
|
||||
void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
|
||||
const char *exp);
|
||||
#define assert_hvf_ok(EX) assert_hvf_ok_impl((EX), __FILE__, __LINE__, #EX)
|
||||
const char *hvf_return_string(hv_return_t ret);
|
||||
int hvf_arch_init(void);
|
||||
int hvf_arch_init_vcpu(CPUState *cpu);
|
||||
void hvf_arch_vcpu_destroy(CPUState *cpu);
|
||||
|
||||
+10
-4
@@ -2556,10 +2556,16 @@ config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
|
||||
#else
|
||||
int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
|
||||
#endif'''))
|
||||
config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
|
||||
#include <sys/mman.h>
|
||||
#include <stddef.h>
|
||||
int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
|
||||
|
||||
# On Darwin posix_madvise() has the same return semantics as plain madvise(),
|
||||
# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
|
||||
# function. On the flip side, it has madvise() which is preferred anyways.
|
||||
if host_os != 'darwin'
|
||||
config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
|
||||
#include <sys/mman.h>
|
||||
#include <stddef.h>
|
||||
int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
|
||||
endif
|
||||
|
||||
config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
|
||||
#include <pthread.h>
|
||||
|
||||
@@ -13,7 +13,6 @@ Commands:
|
||||
create create a venv
|
||||
post_init
|
||||
post-venv initialization
|
||||
ensure Ensure that the specified package is installed.
|
||||
ensuregroup
|
||||
Ensure that the specified package group is installed.
|
||||
|
||||
@@ -36,18 +35,6 @@ options:
|
||||
|
||||
--------------------------------------------------
|
||||
|
||||
usage: mkvenv ensure [-h] [--online] [--dir DIR] dep_spec...
|
||||
|
||||
positional arguments:
|
||||
dep_spec PEP 508 Dependency specification, e.g. 'meson>=0.61.5'
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
--online Install packages from PyPI, if necessary.
|
||||
--dir DIR Path to vendored packages where we may install from.
|
||||
|
||||
--------------------------------------------------
|
||||
|
||||
usage: mkvenv ensuregroup [-h] [--online] [--dir DIR] file group...
|
||||
|
||||
positional arguments:
|
||||
@@ -726,57 +713,6 @@ def _do_ensure(
|
||||
return None
|
||||
|
||||
|
||||
def ensure(
|
||||
dep_specs: Sequence[str],
|
||||
online: bool = False,
|
||||
wheels_dir: Optional[Union[str, Path]] = None,
|
||||
prog: Optional[str] = None,
|
||||
) -> None:
|
||||
"""
|
||||
Use pip to ensure we have the package specified by @dep_specs.
|
||||
|
||||
If the package is already installed, do nothing. If online and
|
||||
wheels_dir are both provided, prefer packages found in wheels_dir
|
||||
first before connecting to PyPI.
|
||||
|
||||
:param dep_specs:
|
||||
PEP 508 dependency specifications. e.g. ['meson>=0.61.5'].
|
||||
:param online: If True, fall back to PyPI.
|
||||
:param wheels_dir: If specified, search this path for packages.
|
||||
:param prog:
|
||||
If specified, use this program name for error diagnostics that will
|
||||
be presented to the user. e.g., 'sphinx-build' can be used as a
|
||||
bellwether for the presence of 'sphinx'.
|
||||
"""
|
||||
|
||||
if not HAVE_DISTLIB:
|
||||
raise Ouch("a usable distlib could not be found, please install it")
|
||||
|
||||
# Convert the depspecs to a dictionary, as if they came
|
||||
# from a section in a pythondeps.toml file
|
||||
group: Dict[str, Dict[str, str]] = {}
|
||||
for spec in dep_specs:
|
||||
name = distlib.version.LegacyMatcher(spec).name
|
||||
group[name] = {}
|
||||
|
||||
spec = spec.strip()
|
||||
pos = len(name)
|
||||
ver = spec[pos:].strip()
|
||||
if ver:
|
||||
group[name]["accepted"] = ver
|
||||
|
||||
if prog:
|
||||
group[name]["canary"] = prog
|
||||
prog = None
|
||||
|
||||
result = _do_ensure(group, online, wheels_dir)
|
||||
if result:
|
||||
# Well, that's not good.
|
||||
if result[1]:
|
||||
raise Ouch(result[0])
|
||||
raise SystemExit(f"\n{result[0]}\n\n")
|
||||
|
||||
|
||||
def _parse_groups(file: str) -> Dict[str, Dict[str, Any]]:
|
||||
if not HAVE_TOMLLIB:
|
||||
if sys.version_info < (3, 11):
|
||||
@@ -888,39 +824,6 @@ def _add_ensuregroup_subcommand(subparsers: Any) -> None:
|
||||
)
|
||||
|
||||
|
||||
def _add_ensure_subcommand(subparsers: Any) -> None:
|
||||
subparser = subparsers.add_parser(
|
||||
"ensure", help="Ensure that the specified package is installed."
|
||||
)
|
||||
subparser.add_argument(
|
||||
"--online",
|
||||
action="store_true",
|
||||
help="Install packages from PyPI, if necessary.",
|
||||
)
|
||||
subparser.add_argument(
|
||||
"--dir",
|
||||
type=str,
|
||||
action="store",
|
||||
help="Path to vendored packages where we may install from.",
|
||||
)
|
||||
subparser.add_argument(
|
||||
"--diagnose",
|
||||
type=str,
|
||||
action="store",
|
||||
help=(
|
||||
"Name of a shell utility to use for "
|
||||
"diagnostics if this command fails."
|
||||
),
|
||||
)
|
||||
subparser.add_argument(
|
||||
"dep_specs",
|
||||
type=str,
|
||||
action="store",
|
||||
help="PEP 508 Dependency specification, e.g. 'meson>=0.61.5'",
|
||||
nargs="+",
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
"""CLI interface to make_qemu_venv. See module docstring."""
|
||||
if os.environ.get("DEBUG") or os.environ.get("GITLAB_CI"):
|
||||
@@ -944,7 +847,6 @@ def main() -> int:
|
||||
|
||||
_add_create_subcommand(subparsers)
|
||||
_add_post_init_subcommand(subparsers)
|
||||
_add_ensure_subcommand(subparsers)
|
||||
_add_ensuregroup_subcommand(subparsers)
|
||||
|
||||
args = parser.parse_args()
|
||||
@@ -957,13 +859,6 @@ def main() -> int:
|
||||
)
|
||||
if args.command == "post_init":
|
||||
post_venv_setup()
|
||||
if args.command == "ensure":
|
||||
ensure(
|
||||
dep_specs=args.dep_specs,
|
||||
online=args.online,
|
||||
wheels_dir=args.dir,
|
||||
prog=args.diagnose,
|
||||
)
|
||||
if args.command == "ensuregroup":
|
||||
ensure_group(
|
||||
file=args.file,
|
||||
|
||||
@@ -43,9 +43,6 @@ def main() -> int:
|
||||
packages = {
|
||||
"meson==1.2.3":
|
||||
"4533a43c34548edd1f63a276a42690fce15bde9409bcf20c4b8fa3d7e4d7cac1",
|
||||
|
||||
"tomli==2.0.1":
|
||||
"939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
|
||||
}
|
||||
|
||||
vendor_dir = Path(__file__, "..", "..", "wheels").resolve()
|
||||
|
||||
Binary file not shown.
@@ -24,6 +24,7 @@ MSR_IA32_VMX_TRUE_EXIT_CTLS = 0x48F
|
||||
MSR_IA32_VMX_TRUE_ENTRY_CTLS = 0x490
|
||||
MSR_IA32_VMX_VMFUNC = 0x491
|
||||
MSR_IA32_VMX_PROCBASED_CTLS3 = 0x492
|
||||
MSR_IA32_VMX_EXIT_CTLS2 = 0x493
|
||||
|
||||
class msr(object):
|
||||
def __init__(self):
|
||||
@@ -116,6 +117,7 @@ controls = [
|
||||
54: 'INS/OUTS instruction information',
|
||||
55: 'IA32_VMX_TRUE_*_CTLS support',
|
||||
56: 'Skip checks on event error code',
|
||||
58: 'VMX nested exception support',
|
||||
},
|
||||
msr = MSR_IA32_VMX_BASIC,
|
||||
),
|
||||
@@ -219,11 +221,21 @@ controls = [
|
||||
23: 'Clear IA32_BNDCFGS',
|
||||
24: 'Conceal VM exits from PT',
|
||||
25: 'Clear IA32_RTIT_CTL',
|
||||
31: 'Activate secondary VM-exit controls',
|
||||
},
|
||||
cap_msr = MSR_IA32_VMX_EXIT_CTLS,
|
||||
true_cap_msr = MSR_IA32_VMX_TRUE_EXIT_CTLS,
|
||||
),
|
||||
|
||||
Allowed1Control(
|
||||
name = 'secondary VM-Exit controls',
|
||||
bits = {
|
||||
0: 'Save IA32 FRED MSRs',
|
||||
1: 'Load IA32 FRED MSRs',
|
||||
},
|
||||
cap_msr = MSR_IA32_VMX_EXIT_CTLS2,
|
||||
),
|
||||
|
||||
Control(
|
||||
name = 'VM-Entry controls',
|
||||
bits = {
|
||||
@@ -237,6 +249,7 @@ controls = [
|
||||
16: 'Load IA32_BNDCFGS',
|
||||
17: 'Conceal VM entries from PT',
|
||||
18: 'Load IA32_RTIT_CTL',
|
||||
23: 'Load IA32 FRED MSRs',
|
||||
},
|
||||
cap_msr = MSR_IA32_VMX_ENTRY_CTLS,
|
||||
true_cap_msr = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
|
||||
|
||||
+1
-7
@@ -3,6 +3,7 @@
|
||||
# below, so that it is clear who needs the stubbed functionality.
|
||||
|
||||
stub_ss.add(files('cpu-get-clock.c'))
|
||||
stub_ss.add(files('error-printf.c'))
|
||||
stub_ss.add(files('fdset.c'))
|
||||
stub_ss.add(files('iothread-lock.c'))
|
||||
stub_ss.add(files('is-daemonized.c'))
|
||||
@@ -45,17 +46,10 @@ if have_block or have_ga
|
||||
stub_ss.add(files('qmp-quit.c'))
|
||||
endif
|
||||
|
||||
if have_ga
|
||||
stub_ss.add(files('error-printf.c'))
|
||||
endif
|
||||
|
||||
if have_block or have_user
|
||||
stub_ss.add(files('qtest.c'))
|
||||
stub_ss.add(files('vm-stop.c'))
|
||||
stub_ss.add(files('vmstate.c'))
|
||||
|
||||
# more symbols provided by the monitor
|
||||
stub_ss.add(files('error-printf.c'))
|
||||
endif
|
||||
|
||||
if have_user
|
||||
|
||||
+31
-2
@@ -1114,7 +1114,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
"avx-vnni", "avx512-bf16", NULL, "cmpccxadd",
|
||||
NULL, NULL, "fzrm", "fsrs",
|
||||
"fsrc", NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, "fred", "lkgs", "wrmsrns",
|
||||
NULL, "amx-fp16", NULL, "avx-ifma",
|
||||
NULL, NULL, "lam", NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
@@ -1180,6 +1180,22 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
.tcg_features = TCG_APM_FEATURES,
|
||||
.unmigratable_flags = CPUID_APM_INVTSC,
|
||||
},
|
||||
[FEAT_8000_0007_EBX] = {
|
||||
.type = CPUID_FEATURE_WORD,
|
||||
.feat_names = {
|
||||
"overflow-recov", "succor", NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
},
|
||||
.cpuid = { .eax = 0x80000007, .reg = R_EBX, },
|
||||
.tcg_features = 0,
|
||||
.unmigratable_flags = 0,
|
||||
},
|
||||
[FEAT_8000_0008_EBX] = {
|
||||
.type = CPUID_FEATURE_WORD,
|
||||
.feat_names = {
|
||||
@@ -1492,6 +1508,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
[54] = "vmx-ins-outs",
|
||||
[55] = "vmx-true-ctls",
|
||||
[56] = "vmx-any-errcode",
|
||||
[58] = "vmx-nested-exception",
|
||||
},
|
||||
.msr = {
|
||||
.index = MSR_IA32_VMX_BASIC,
|
||||
@@ -1701,6 +1718,18 @@ static FeatureDep feature_dependencies[] = {
|
||||
.from = { FEAT_7_0_ECX, CPUID_7_0_ECX_WAITPKG },
|
||||
.to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
|
||||
},
|
||||
{
|
||||
.from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
|
||||
.to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
|
||||
},
|
||||
{
|
||||
.from = { FEAT_7_1_EAX, CPUID_7_1_EAX_LKGS },
|
||||
.to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
|
||||
},
|
||||
{
|
||||
.from = { FEAT_7_1_EAX, CPUID_7_1_EAX_WRMSRNS },
|
||||
.to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
|
||||
},
|
||||
};
|
||||
|
||||
typedef struct X86RegisterInfo32 {
|
||||
@@ -6874,7 +6903,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
|
||||
break;
|
||||
case 0x80000007:
|
||||
*eax = 0;
|
||||
*ebx = 0;
|
||||
*ebx = env->features[FEAT_8000_0007_EBX];
|
||||
*ecx = 0;
|
||||
*edx = env->features[FEAT_8000_0007_EDX];
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user