mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-07-22 19:04:26 +00:00
* Clean-ups for "errp" handling in s390x cpu_model code
* Fix a possible abort in the "edu" device * Add missing qga stubs for stand-alone qga builds and re-enable qga-ssh-test * Fix memory corruption caused by the stm32l4x5 uart device * Update the s390x custom runner to Ubuntu 22.04 * Fix READ NATIVE MAX ADDRESS IDE commands to avoid a possible crash * Shorten the runtime of Cirrus-CI jobs -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmYwmaMRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbUCERAAss5PJMG8rI4i4X/3nW49JYTlPOpgm/YX /UWF+eHUlqaqDdE0s+Pdw4Ozo3hXQt/E/CkcyflUTzVpnZtpv9vkhNWyjOoPV31v GQyQEzGvxZXl2S595XefyAyaMTP5maBhUTlyZWJo385cQraa60Ot5d4Mibr2CobY gIBRxEGB/frJYpbHJPxd/FxJV120gtuWAdZwGGYYYjwMzf2IKu2veODB8CnUErlX WNUsIzjtAslfh8Ek2ZmPzD7uktCUeigkukqIrLC1oEU3wzbJHkISv1kXCKPW/Nf6 ISjVa5TqGwkiiF8fw9aYKvWrnPJS7JkhXw7Gz+b39d846kUdNyDfgLcYJeNS3cZ2 R1xgR9B6hX8ZmikMbGC+0/Sv15u2Yr+bFxJBTJzq6zdOAb9EJNQY1hW2w/Lbrg3X LjY+ltcVweoSILT6AE6vGDPCHfBzO+6FcptFvw7ePvRGOlwAPZ3tEB9G2LEbCYgg BjWNP4aRuSfbUebO4x4Todz65WN8aY1EIBXORU/wgUlF2+zajWiOI5JRDKjWz2qQ gAMeCbLplli5bYrChWtouRIXtb061cQloULddu/SRFcaJOlV3SCzx4JfN15pU90s jRMIhMESAEj4NSfclhxsOiYp3ywZTvlQsVA6MgPlu2i3HJakQnt5zbg59TesRn2d r5PfAk83UnA= =0OB7 -----END PGP SIGNATURE----- Merge tag 'pull-request-2024-04-30' of https://gitlab.com/thuth/qemu into staging * Clean-ups for "errp" handling in s390x cpu_model code * Fix a possible abort in the "edu" device * Add missing qga stubs for stand-alone qga builds and re-enable qga-ssh-test * Fix memory corruption caused by the stm32l4x5 uart device * Update the s390x custom runner to Ubuntu 22.04 * Fix READ NATIVE MAX ADDRESS IDE commands to avoid a possible crash * Shorten the runtime of Cirrus-CI jobs # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmYwmaMRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbUCERAAss5PJMG8rI4i4X/3nW49JYTlPOpgm/YX # /UWF+eHUlqaqDdE0s+Pdw4Ozo3hXQt/E/CkcyflUTzVpnZtpv9vkhNWyjOoPV31v # GQyQEzGvxZXl2S595XefyAyaMTP5maBhUTlyZWJo385cQraa60Ot5d4Mibr2CobY # gIBRxEGB/frJYpbHJPxd/FxJV120gtuWAdZwGGYYYjwMzf2IKu2veODB8CnUErlX # WNUsIzjtAslfh8Ek2ZmPzD7uktCUeigkukqIrLC1oEU3wzbJHkISv1kXCKPW/Nf6 # ISjVa5TqGwkiiF8fw9aYKvWrnPJS7JkhXw7Gz+b39d846kUdNyDfgLcYJeNS3cZ2 # R1xgR9B6hX8ZmikMbGC+0/Sv15u2Yr+bFxJBTJzq6zdOAb9EJNQY1hW2w/Lbrg3X # LjY+ltcVweoSILT6AE6vGDPCHfBzO+6FcptFvw7ePvRGOlwAPZ3tEB9G2LEbCYgg # BjWNP4aRuSfbUebO4x4Todz65WN8aY1EIBXORU/wgUlF2+zajWiOI5JRDKjWz2qQ # gAMeCbLplli5bYrChWtouRIXtb061cQloULddu/SRFcaJOlV3SCzx4JfN15pU90s # jRMIhMESAEj4NSfclhxsOiYp3ywZTvlQsVA6MgPlu2i3HJakQnt5zbg59TesRn2d # r5PfAk83UnA= # =0OB7 # -----END PGP SIGNATURE----- # gpg: Signature made Tue 30 Apr 2024 12:11:31 AM PDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] * tag 'pull-request-2024-04-30' of https://gitlab.com/thuth/qemu: .gitlab-ci.d/cirrus: Remove the netbsd and openbsd jobs .gitlab-ci.d/cirrus.yml: Shorten the runtime of the macOS and FreeBSD jobs tests/qtest/ide-test: Verify READ NATIVE MAX ADDRESS is not limited hw/ide/core.c (cmd_read_native_max): Avoid limited device parameters gitlab: remove stale s390x-all-linux-static conf hacks gitlab: migrate the s390x custom machine to 22.04 build-environment: make some packages optional hw/char/stm32l4x5_usart: Fix memory corruption by adding correct class_size qga: Re-enable the qga-ssh-test when running without fuzzing stubs: Add missing qga stubs hw: misc: edu: use qemu_log_mask instead of hw_error hw: misc: edu: rename local vars in edu_check_range hw: misc: edu: fix 2 off-by-one errors target/s390x/cpu_models_sysemu: Drop local @err in apply_cpu_model() target/s390x/cpu_models: Make kvm_s390_apply_cpu_model() return boolean target/s390x/cpu_models: Drop local @err in get_max_cpu_model() target/s390x/cpu_models: Make kvm_s390_get_host_cpu_model() return boolean target/s390x/cpu_model: Drop local @err in s390_realize_cpu_model() target/s390x/cpu_model: Make check_compatibility() return boolean Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
b1e880789b
|
@ -57,6 +57,7 @@ x64-freebsd-13-build:
|
||||||
CIRRUS_VM_RAM: 8G
|
CIRRUS_VM_RAM: 8G
|
||||||
UPDATE_COMMAND: pkg update; pkg upgrade -y
|
UPDATE_COMMAND: pkg update; pkg upgrade -y
|
||||||
INSTALL_COMMAND: pkg install -y
|
INSTALL_COMMAND: pkg install -y
|
||||||
|
CONFIGURE_ARGS: --target-list-exclude=arm-softmmu,i386-softmmu,microblaze-softmmu,mips64el-softmmu,mipsel-softmmu,mips-softmmu,ppc-softmmu,sh4eb-softmmu,xtensa-softmmu
|
||||||
TEST_TARGETS: check
|
TEST_TARGETS: check
|
||||||
|
|
||||||
aarch64-macos-13-base-build:
|
aarch64-macos-13-base-build:
|
||||||
|
@ -72,6 +73,7 @@ aarch64-macos-13-base-build:
|
||||||
INSTALL_COMMAND: brew install
|
INSTALL_COMMAND: brew install
|
||||||
PATH_EXTRA: /opt/homebrew/ccache/libexec:/opt/homebrew/gettext/bin
|
PATH_EXTRA: /opt/homebrew/ccache/libexec:/opt/homebrew/gettext/bin
|
||||||
PKG_CONFIG_PATH: /opt/homebrew/curl/lib/pkgconfig:/opt/homebrew/ncurses/lib/pkgconfig:/opt/homebrew/readline/lib/pkgconfig
|
PKG_CONFIG_PATH: /opt/homebrew/curl/lib/pkgconfig:/opt/homebrew/ncurses/lib/pkgconfig:/opt/homebrew/readline/lib/pkgconfig
|
||||||
|
CONFIGURE_ARGS: --target-list-exclude=arm-softmmu,i386-softmmu,microblazeel-softmmu,mips64-softmmu,mipsel-softmmu,mips-softmmu,ppc-softmmu,sh4-softmmu,xtensaeb-softmmu
|
||||||
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
||||||
|
|
||||||
aarch64-macos-14-base-build:
|
aarch64-macos-14-base-build:
|
||||||
|
@ -89,40 +91,3 @@ aarch64-macos-14-base-build:
|
||||||
PKG_CONFIG_PATH: /opt/homebrew/curl/lib/pkgconfig:/opt/homebrew/ncurses/lib/pkgconfig:/opt/homebrew/readline/lib/pkgconfig
|
PKG_CONFIG_PATH: /opt/homebrew/curl/lib/pkgconfig:/opt/homebrew/ncurses/lib/pkgconfig:/opt/homebrew/readline/lib/pkgconfig
|
||||||
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
||||||
QEMU_JOB_OPTIONAL: 1
|
QEMU_JOB_OPTIONAL: 1
|
||||||
|
|
||||||
|
|
||||||
# The following jobs run VM-based tests via KVM on a Linux-based Cirrus-CI job
|
|
||||||
.cirrus_kvm_job:
|
|
||||||
extends: .base_job_template
|
|
||||||
stage: build
|
|
||||||
image: registry.gitlab.com/libvirt/libvirt-ci/cirrus-run:master
|
|
||||||
needs: []
|
|
||||||
timeout: 80m
|
|
||||||
script:
|
|
||||||
- sed -e "s|[@]CI_REPOSITORY_URL@|$CI_REPOSITORY_URL|g"
|
|
||||||
-e "s|[@]CI_COMMIT_REF_NAME@|$CI_COMMIT_REF_NAME|g"
|
|
||||||
-e "s|[@]CI_COMMIT_SHA@|$CI_COMMIT_SHA|g"
|
|
||||||
-e "s|[@]NAME@|$NAME|g"
|
|
||||||
-e "s|[@]CONFIGURE_ARGS@|$CONFIGURE_ARGS|g"
|
|
||||||
-e "s|[@]TEST_TARGETS@|$TEST_TARGETS|g"
|
|
||||||
<.gitlab-ci.d/cirrus/kvm-build.yml >.gitlab-ci.d/cirrus/$NAME.yml
|
|
||||||
- cat .gitlab-ci.d/cirrus/$NAME.yml
|
|
||||||
- cirrus-run -v --show-build-log always .gitlab-ci.d/cirrus/$NAME.yml
|
|
||||||
variables:
|
|
||||||
QEMU_JOB_CIRRUS: 1
|
|
||||||
QEMU_JOB_OPTIONAL: 1
|
|
||||||
|
|
||||||
|
|
||||||
x86-netbsd:
|
|
||||||
extends: .cirrus_kvm_job
|
|
||||||
variables:
|
|
||||||
NAME: netbsd
|
|
||||||
CONFIGURE_ARGS: --target-list=x86_64-softmmu,ppc64-softmmu,aarch64-softmmu
|
|
||||||
TEST_TARGETS: check
|
|
||||||
|
|
||||||
x86-openbsd:
|
|
||||||
extends: .cirrus_kvm_job
|
|
||||||
variables:
|
|
||||||
NAME: openbsd
|
|
||||||
CONFIGURE_ARGS: --target-list=i386-softmmu,riscv64-softmmu,mips64-softmmu
|
|
||||||
TEST_TARGETS: check
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
container:
|
|
||||||
image: fedora:35
|
|
||||||
cpu: 4
|
|
||||||
memory: 8Gb
|
|
||||||
kvm: true
|
|
||||||
|
|
||||||
env:
|
|
||||||
CIRRUS_CLONE_DEPTH: 1
|
|
||||||
CI_REPOSITORY_URL: "@CI_REPOSITORY_URL@"
|
|
||||||
CI_COMMIT_REF_NAME: "@CI_COMMIT_REF_NAME@"
|
|
||||||
CI_COMMIT_SHA: "@CI_COMMIT_SHA@"
|
|
||||||
|
|
||||||
@NAME@_task:
|
|
||||||
@NAME@_vm_cache:
|
|
||||||
folder: $HOME/.cache/qemu-vm
|
|
||||||
install_script:
|
|
||||||
- dnf update -y
|
|
||||||
- dnf install -y git make openssh-clients qemu-img qemu-system-x86 wget meson
|
|
||||||
clone_script:
|
|
||||||
- git clone --depth 100 "$CI_REPOSITORY_URL" .
|
|
||||||
- git fetch origin "$CI_COMMIT_REF_NAME"
|
|
||||||
- git reset --hard "$CI_COMMIT_SHA"
|
|
||||||
build_script:
|
|
||||||
- if [ -f $HOME/.cache/qemu-vm/images/@NAME@.img ]; then
|
|
||||||
make vm-build-@NAME@ J=$(getconf _NPROCESSORS_ONLN)
|
|
||||||
EXTRA_CONFIGURE_OPTS="@CONFIGURE_ARGS@"
|
|
||||||
BUILD_TARGET="@TEST_TARGETS@" ;
|
|
||||||
else
|
|
||||||
make vm-build-@NAME@ J=$(getconf _NPROCESSORS_ONLN) BUILD_TARGET=help
|
|
||||||
EXTRA_CONFIGURE_OPTS="--disable-system --disable-user --disable-tools" ;
|
|
||||||
fi
|
|
|
@ -29,7 +29,7 @@
|
||||||
junit: build/meson-logs/testlog.junit.xml
|
junit: build/meson-logs/testlog.junit.xml
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-20.04-s390x.yml'
|
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-s390x.yml'
|
||||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-aarch64.yml'
|
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-aarch64.yml'
|
||||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-aarch32.yml'
|
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-aarch32.yml'
|
||||||
- local: '/.gitlab-ci.d/custom-runners/centos-stream-8-x86_64.yml'
|
- local: '/.gitlab-ci.d/custom-runners/centos-stream-8-x86_64.yml'
|
||||||
|
|
|
@ -1,34 +1,32 @@
|
||||||
# All ubuntu-20.04 jobs should run successfully in an environment
|
# All ubuntu-22.04 jobs should run successfully in an environment
|
||||||
# setup by the scripts/ci/setup/build-environment.yml task
|
# setup by the scripts/ci/setup/build-environment.yml task
|
||||||
# "Install basic packages to build QEMU on Ubuntu 20.04/20.04"
|
# "Install basic packages to build QEMU on Ubuntu 22.04"
|
||||||
|
|
||||||
ubuntu-20.04-s390x-all-linux-static:
|
ubuntu-22.04-s390x-all-linux-static:
|
||||||
extends: .custom_runner_template
|
extends: .custom_runner_template
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
rules:
|
rules:
|
||||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||||
- if: "$S390X_RUNNER_AVAILABLE"
|
- if: "$S390X_RUNNER_AVAILABLE"
|
||||||
script:
|
script:
|
||||||
# --disable-libssh is needed because of https://bugs.launchpad.net/qemu/+bug/1838763
|
|
||||||
# --disable-glusterfs is needed because there's no static version of those libs in distro supplied packages
|
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- ../configure --enable-debug --static --disable-system --disable-glusterfs --disable-libssh
|
- ../configure --enable-debug --static --disable-system
|
||||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||||
- make --output-sync -j`nproc`
|
- make --output-sync -j`nproc`
|
||||||
- make --output-sync check-tcg
|
- make --output-sync check-tcg
|
||||||
- make --output-sync -j`nproc` check
|
- make --output-sync -j`nproc` check
|
||||||
|
|
||||||
ubuntu-20.04-s390x-all:
|
ubuntu-22.04-s390x-all:
|
||||||
extends: .custom_runner_template
|
extends: .custom_runner_template
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
timeout: 75m
|
timeout: 75m
|
||||||
rules:
|
rules:
|
||||||
|
@ -42,12 +40,12 @@ ubuntu-20.04-s390x-all:
|
||||||
- make --output-sync -j`nproc`
|
- make --output-sync -j`nproc`
|
||||||
- make --output-sync -j`nproc` check
|
- make --output-sync -j`nproc` check
|
||||||
|
|
||||||
ubuntu-20.04-s390x-alldbg:
|
ubuntu-22.04-s390x-alldbg:
|
||||||
extends: .custom_runner_template
|
extends: .custom_runner_template
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
rules:
|
rules:
|
||||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||||
|
@ -65,12 +63,12 @@ ubuntu-20.04-s390x-alldbg:
|
||||||
- make --output-sync -j`nproc`
|
- make --output-sync -j`nproc`
|
||||||
- make --output-sync -j`nproc` check
|
- make --output-sync -j`nproc` check
|
||||||
|
|
||||||
ubuntu-20.04-s390x-clang:
|
ubuntu-22.04-s390x-clang:
|
||||||
extends: .custom_runner_template
|
extends: .custom_runner_template
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
rules:
|
rules:
|
||||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||||
|
@ -87,11 +85,11 @@ ubuntu-20.04-s390x-clang:
|
||||||
- make --output-sync -j`nproc`
|
- make --output-sync -j`nproc`
|
||||||
- make --output-sync -j`nproc` check
|
- make --output-sync -j`nproc` check
|
||||||
|
|
||||||
ubuntu-20.04-s390x-tci:
|
ubuntu-22.04-s390x-tci:
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
rules:
|
rules:
|
||||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||||
|
@ -107,12 +105,12 @@ ubuntu-20.04-s390x-tci:
|
||||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||||
- make --output-sync -j`nproc`
|
- make --output-sync -j`nproc`
|
||||||
|
|
||||||
ubuntu-20.04-s390x-notcg:
|
ubuntu-22.04-s390x-notcg:
|
||||||
extends: .custom_runner_template
|
extends: .custom_runner_template
|
||||||
needs: []
|
needs: []
|
||||||
stage: build
|
stage: build
|
||||||
tags:
|
tags:
|
||||||
- ubuntu_20.04
|
- ubuntu_22.04
|
||||||
- s390x
|
- s390x
|
||||||
rules:
|
rules:
|
||||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
|
@ -617,6 +617,7 @@ static const TypeInfo stm32l4x5_usart_types[] = {
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
.instance_size = sizeof(Stm32l4x5UsartBaseState),
|
.instance_size = sizeof(Stm32l4x5UsartBaseState),
|
||||||
.instance_init = stm32l4x5_usart_base_init,
|
.instance_init = stm32l4x5_usart_base_init,
|
||||||
|
.class_size = sizeof(Stm32l4x5UsartBaseClass),
|
||||||
.class_init = stm32l4x5_usart_base_class_init,
|
.class_init = stm32l4x5_usart_base_class_init,
|
||||||
.abstract = true,
|
.abstract = true,
|
||||||
}, {
|
}, {
|
||||||
|
|
|
@ -1623,11 +1623,24 @@ static bool cmd_read_native_max(IDEState *s, uint8_t cmd)
|
||||||
/* Refuse if no sectors are addressable (e.g. medium not inserted) */
|
/* Refuse if no sectors are addressable (e.g. medium not inserted) */
|
||||||
if (s->nb_sectors == 0) {
|
if (s->nb_sectors == 0) {
|
||||||
ide_abort_command(s);
|
ide_abort_command(s);
|
||||||
return true;
|
} else {
|
||||||
}
|
/*
|
||||||
|
* Save the active drive parameters, which may have been
|
||||||
|
* limited from their native counterparts by, e.g., INITIALIZE
|
||||||
|
* DEVICE PARAMETERS or SET MAX ADDRESS.
|
||||||
|
*/
|
||||||
|
const int aheads = s->heads;
|
||||||
|
const int asectors = s->sectors;
|
||||||
|
|
||||||
ide_cmd_lba48_transform(s, lba48);
|
s->heads = s->drive_heads;
|
||||||
ide_set_sector(s, s->nb_sectors - 1);
|
s->sectors = s->drive_sectors;
|
||||||
|
|
||||||
|
ide_cmd_lba48_transform(s, lba48);
|
||||||
|
ide_set_sector(s, s->nb_sectors - 1);
|
||||||
|
|
||||||
|
s->heads = aheads;
|
||||||
|
s->sectors = asectors;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
|
@ -103,25 +104,25 @@ static void edu_lower_irq(EduState *edu, uint32_t val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool within(uint64_t addr, uint64_t start, uint64_t end)
|
static void edu_check_range(uint64_t xfer_start, uint64_t xfer_size,
|
||||||
|
uint64_t dma_start, uint64_t dma_size)
|
||||||
{
|
{
|
||||||
return start <= addr && addr < end;
|
uint64_t xfer_end = xfer_start + xfer_size;
|
||||||
}
|
uint64_t dma_end = dma_start + dma_size;
|
||||||
|
|
||||||
static void edu_check_range(uint64_t addr, uint64_t size1, uint64_t start,
|
/*
|
||||||
uint64_t size2)
|
* 1. ensure we aren't overflowing
|
||||||
{
|
* 2. ensure that xfer is within dma address range
|
||||||
uint64_t end1 = addr + size1;
|
*/
|
||||||
uint64_t end2 = start + size2;
|
if (dma_end >= dma_start && xfer_end >= xfer_start &&
|
||||||
|
xfer_start >= dma_start && xfer_end <= dma_end) {
|
||||||
if (within(addr, start, end2) &&
|
|
||||||
end1 > addr && end1 <= end2) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hw_error("EDU: DMA range 0x%016"PRIx64"-0x%016"PRIx64
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
" out of bounds (0x%016"PRIx64"-0x%016"PRIx64")!",
|
"EDU: DMA range 0x%016"PRIx64"-0x%016"PRIx64
|
||||||
addr, end1 - 1, start, end2 - 1);
|
" out of bounds (0x%016"PRIx64"-0x%016"PRIx64")!",
|
||||||
|
xfer_start, xfer_end - 1, dma_start, dma_end - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static dma_addr_t edu_clamp_addr(const EduState *edu, dma_addr_t addr)
|
static dma_addr_t edu_clamp_addr(const EduState *edu, dma_addr_t addr)
|
||||||
|
@ -129,7 +130,9 @@ static dma_addr_t edu_clamp_addr(const EduState *edu, dma_addr_t addr)
|
||||||
dma_addr_t res = addr & edu->dma_mask;
|
dma_addr_t res = addr & edu->dma_mask;
|
||||||
|
|
||||||
if (addr != res) {
|
if (addr != res) {
|
||||||
printf("EDU: clamping DMA %#.16"PRIx64" to %#.16"PRIx64"!\n", addr, res);
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
|
"EDU: clamping DMA 0x%016"PRIx64" to 0x%016"PRIx64"!",
|
||||||
|
addr, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -181,12 +181,11 @@ test_env = environment()
|
||||||
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
|
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
|
||||||
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
||||||
|
|
||||||
# disable qga-ssh-test for now. glib's G_TEST_OPTION_ISOLATE_DIRS triggers
|
# disable qga-ssh-test with fuzzing: glib's G_TEST_OPTION_ISOLATE_DIRS triggers
|
||||||
# the leak detector in build-oss-fuzz Gitlab CI test. we should re-enable
|
# the leak detector in build-oss-fuzz Gitlab CI test. we should re-enable
|
||||||
# this when an alternative is implemented or when the underlying glib
|
# this when an alternative is implemented or when the underlying glib
|
||||||
# issue is identified/fix
|
# issue is identified/fix
|
||||||
#if host_os != 'windows'
|
if host_os != 'windows' and not get_option('fuzzing')
|
||||||
if false
|
|
||||||
srcs = [files('commands-posix-ssh.c')]
|
srcs = [files('commands-posix-ssh.c')]
|
||||||
i = 0
|
i = 0
|
||||||
foreach output: qga_qapi_outputs
|
foreach output: qga_qapi_outputs
|
||||||
|
|
|
@ -95,7 +95,6 @@
|
||||||
- libpam0g-dev
|
- libpam0g-dev
|
||||||
- libpcre2-dev
|
- libpcre2-dev
|
||||||
- libpixman-1-dev
|
- libpixman-1-dev
|
||||||
- libpmem-dev
|
|
||||||
- libpng-dev
|
- libpng-dev
|
||||||
- libpulse-dev
|
- libpulse-dev
|
||||||
- librbd-dev
|
- librbd-dev
|
||||||
|
@ -107,7 +106,6 @@
|
||||||
- libslirp-dev
|
- libslirp-dev
|
||||||
- libsnappy-dev
|
- libsnappy-dev
|
||||||
- libspice-protocol-dev
|
- libspice-protocol-dev
|
||||||
- libspice-server-dev
|
|
||||||
- libssh-dev
|
- libssh-dev
|
||||||
- libsystemd-dev
|
- libsystemd-dev
|
||||||
- libtasn1-6-dev
|
- libtasn1-6-dev
|
||||||
|
@ -119,7 +117,6 @@
|
||||||
- libvdeplug-dev
|
- libvdeplug-dev
|
||||||
- libvirglrenderer-dev
|
- libvirglrenderer-dev
|
||||||
- libvte-2.91-dev
|
- libvte-2.91-dev
|
||||||
- libxen-dev
|
|
||||||
- libxml2-dev
|
- libxml2-dev
|
||||||
- libzstd-dev
|
- libzstd-dev
|
||||||
- llvm
|
- llvm
|
||||||
|
@ -156,6 +153,19 @@
|
||||||
- ansible_facts['distribution'] == 'Ubuntu'
|
- ansible_facts['distribution'] == 'Ubuntu'
|
||||||
- ansible_facts['distribution_version'] == '22.04'
|
- ansible_facts['distribution_version'] == '22.04'
|
||||||
|
|
||||||
|
# not all packages are available for all architectures
|
||||||
|
- name: Install additional packages to build QEMU on Ubuntu 22.04
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- libpmem-dev
|
||||||
|
- libspice-server-dev
|
||||||
|
- libxen-dev
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- ansible_facts['distribution'] == 'Ubuntu'
|
||||||
|
- ansible_facts['distribution_version'] == '22.04'
|
||||||
|
- ansible_facts['architecture'] == 'aarch64' or ansible_facts['architecture'] == 'x86_64'
|
||||||
|
|
||||||
- name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 22.04
|
- name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 22.04
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
|
|
|
@ -21,12 +21,12 @@ if have_block
|
||||||
stub_ss.add(files('migr-blocker.c'))
|
stub_ss.add(files('migr-blocker.c'))
|
||||||
stub_ss.add(files('physmem.c'))
|
stub_ss.add(files('physmem.c'))
|
||||||
stub_ss.add(files('ram-block.c'))
|
stub_ss.add(files('ram-block.c'))
|
||||||
stub_ss.add(files('replay-tools.c'))
|
|
||||||
stub_ss.add(files('runstate-check.c'))
|
stub_ss.add(files('runstate-check.c'))
|
||||||
stub_ss.add(files('uuid.c'))
|
stub_ss.add(files('uuid.c'))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if have_block or have_ga
|
if have_block or have_ga
|
||||||
|
stub_ss.add(files('replay-tools.c'))
|
||||||
# stubs for hooks in util/main-loop.c, util/async.c etc.
|
# stubs for hooks in util/main-loop.c, util/async.c etc.
|
||||||
stub_ss.add(files('cpus-get-virtual-clock.c'))
|
stub_ss.add(files('cpus-get-virtual-clock.c'))
|
||||||
stub_ss.add(files('icount.c'))
|
stub_ss.add(files('icount.c'))
|
||||||
|
@ -45,6 +45,10 @@ if have_block or have_ga
|
||||||
stub_ss.add(files('qmp-quit.c'))
|
stub_ss.add(files('qmp-quit.c'))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if have_ga
|
||||||
|
stub_ss.add(files('error-printf.c'))
|
||||||
|
endif
|
||||||
|
|
||||||
if have_block or have_user
|
if have_block or have_user
|
||||||
stub_ss.add(files('qtest.c'))
|
stub_ss.add(files('qtest.c'))
|
||||||
stub_ss.add(files('vm-stop.c'))
|
stub_ss.add(files('vm-stop.c'))
|
||||||
|
|
|
@ -511,7 +511,7 @@ static void check_compat_model_failed(Error **errp,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_compatibility(const S390CPUModel *max_model,
|
static bool check_compatibility(const S390CPUModel *max_model,
|
||||||
const S390CPUModel *model, Error **errp)
|
const S390CPUModel *model, Error **errp)
|
||||||
{
|
{
|
||||||
ERRP_GUARD();
|
ERRP_GUARD();
|
||||||
|
@ -519,11 +519,11 @@ static void check_compatibility(const S390CPUModel *max_model,
|
||||||
|
|
||||||
if (model->def->gen > max_model->def->gen) {
|
if (model->def->gen > max_model->def->gen) {
|
||||||
check_compat_model_failed(errp, max_model, "Selected CPU generation is too new");
|
check_compat_model_failed(errp, max_model, "Selected CPU generation is too new");
|
||||||
return;
|
return false;
|
||||||
} else if (model->def->gen == max_model->def->gen &&
|
} else if (model->def->gen == max_model->def->gen &&
|
||||||
model->def->ec_ga > max_model->def->ec_ga) {
|
model->def->ec_ga > max_model->def->ec_ga) {
|
||||||
check_compat_model_failed(errp, max_model, "Selected CPU GA level is too new");
|
check_compat_model_failed(errp, max_model, "Selected CPU GA level is too new");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
@ -531,14 +531,14 @@ static void check_compatibility(const S390CPUModel *max_model,
|
||||||
error_setg(errp, "The unpack facility is not compatible with "
|
error_setg(errp, "The unpack facility is not compatible with "
|
||||||
"the --only-migratable option. You must remove either "
|
"the --only-migratable option. You must remove either "
|
||||||
"the 'unpack' facility or the --only-migratable option");
|
"the 'unpack' facility or the --only-migratable option");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* detect the missing features to properly report them */
|
/* detect the missing features to properly report them */
|
||||||
bitmap_andnot(missing, model->features, max_model->features, S390_FEAT_MAX);
|
bitmap_andnot(missing, model->features, max_model->features, S390_FEAT_MAX);
|
||||||
if (bitmap_empty(missing, S390_FEAT_MAX)) {
|
if (bitmap_empty(missing, S390_FEAT_MAX)) {
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_setg(errp, " ");
|
error_setg(errp, " ");
|
||||||
|
@ -547,11 +547,11 @@ static void check_compatibility(const S390CPUModel *max_model,
|
||||||
"available in the current configuration: ");
|
"available in the current configuration: ");
|
||||||
error_append_hint(errp,
|
error_append_hint(errp,
|
||||||
"Consider a different accelerator, QEMU, or kernel version\n");
|
"Consider a different accelerator, QEMU, or kernel version\n");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
S390CPUModel *get_max_cpu_model(Error **errp)
|
S390CPUModel *get_max_cpu_model(Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
|
||||||
static S390CPUModel max_model;
|
static S390CPUModel max_model;
|
||||||
static bool cached;
|
static bool cached;
|
||||||
|
|
||||||
|
@ -560,16 +560,14 @@ S390CPUModel *get_max_cpu_model(Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
kvm_s390_get_host_cpu_model(&max_model, &err);
|
if (!kvm_s390_get_host_cpu_model(&max_model, errp)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
max_model.def = s390_find_cpu_def(QEMU_MAX_CPU_TYPE, QEMU_MAX_CPU_GEN,
|
max_model.def = s390_find_cpu_def(QEMU_MAX_CPU_TYPE, QEMU_MAX_CPU_GEN,
|
||||||
QEMU_MAX_CPU_EC_GA, NULL);
|
QEMU_MAX_CPU_EC_GA, NULL);
|
||||||
bitmap_copy(max_model.features, qemu_max_cpu_feat, S390_FEAT_MAX);
|
bitmap_copy(max_model.features, qemu_max_cpu_feat, S390_FEAT_MAX);
|
||||||
}
|
}
|
||||||
if (err) {
|
|
||||||
error_propagate(errp, err);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cached = true;
|
cached = true;
|
||||||
return &max_model;
|
return &max_model;
|
||||||
}
|
}
|
||||||
|
@ -577,7 +575,6 @@ S390CPUModel *get_max_cpu_model(Error **errp)
|
||||||
void s390_realize_cpu_model(CPUState *cs, Error **errp)
|
void s390_realize_cpu_model(CPUState *cs, Error **errp)
|
||||||
{
|
{
|
||||||
ERRP_GUARD();
|
ERRP_GUARD();
|
||||||
Error *err = NULL;
|
|
||||||
S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
|
S390CPUClass *xcc = S390_CPU_GET_CLASS(cs);
|
||||||
S390CPU *cpu = S390_CPU(cs);
|
S390CPU *cpu = S390_CPU(cs);
|
||||||
const S390CPUModel *max_model;
|
const S390CPUModel *max_model;
|
||||||
|
@ -606,9 +603,7 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
|
||||||
cpu->model->cpu_ver = max_model->cpu_ver;
|
cpu->model->cpu_ver = max_model->cpu_ver;
|
||||||
|
|
||||||
check_consistency(cpu->model);
|
check_consistency(cpu->model);
|
||||||
check_compatibility(max_model, cpu->model, &err);
|
if (!check_compatibility(max_model, cpu->model, errp)) {
|
||||||
if (err) {
|
|
||||||
error_propagate(errp, err);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ S390CPUDef const *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga,
|
||||||
S390FeatBitmap features);
|
S390FeatBitmap features);
|
||||||
|
|
||||||
bool kvm_s390_cpu_models_supported(void);
|
bool kvm_s390_cpu_models_supported(void);
|
||||||
void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp);
|
bool kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp);
|
||||||
void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp);
|
bool kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp);
|
||||||
|
|
||||||
#endif /* TARGET_S390X_CPU_MODELS_H */
|
#endif /* TARGET_S390X_CPU_MODELS_H */
|
||||||
|
|
|
@ -389,7 +389,6 @@ CpuModelBaselineInfo *qmp_query_cpu_model_baseline(CpuModelInfo *infoa,
|
||||||
|
|
||||||
void apply_cpu_model(const S390CPUModel *model, Error **errp)
|
void apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
|
||||||
static S390CPUModel applied_model;
|
static S390CPUModel applied_model;
|
||||||
static bool applied;
|
static bool applied;
|
||||||
|
|
||||||
|
@ -405,9 +404,7 @@ void apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
kvm_s390_apply_cpu_model(model, &err);
|
if (!kvm_s390_apply_cpu_model(model, errp)) {
|
||||||
if (err) {
|
|
||||||
error_propagate(errp, err);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2375,7 +2375,7 @@ bool kvm_s390_cpu_models_supported(void)
|
||||||
KVM_S390_VM_CPU_MACHINE_SUBFUNC);
|
KVM_S390_VM_CPU_MACHINE_SUBFUNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
bool kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||||
{
|
{
|
||||||
struct kvm_s390_vm_cpu_machine prop = {};
|
struct kvm_s390_vm_cpu_machine prop = {};
|
||||||
struct kvm_device_attr attr = {
|
struct kvm_device_attr attr = {
|
||||||
|
@ -2390,14 +2390,14 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||||
|
|
||||||
if (!kvm_s390_cpu_models_supported()) {
|
if (!kvm_s390_cpu_models_supported()) {
|
||||||
error_setg(errp, "KVM doesn't support CPU models");
|
error_setg(errp, "KVM doesn't support CPU models");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* query the basic cpu model properties */
|
/* query the basic cpu model properties */
|
||||||
rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
|
rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error querying host CPU model: %d", rc);
|
error_setg(errp, "KVM: Error querying host CPU model: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_type = cpuid_type(prop.cpuid);
|
cpu_type = cpuid_type(prop.cpuid);
|
||||||
|
@ -2420,13 +2420,13 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||||
rc = query_cpu_feat(model->features);
|
rc = query_cpu_feat(model->features);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error querying CPU features: %d", rc);
|
error_setg(errp, "KVM: Error querying CPU features: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
/* get supported cpu subfunctions indicated via query / test bit */
|
/* get supported cpu subfunctions indicated via query / test bit */
|
||||||
rc = query_cpu_subfunc(model->features);
|
rc = query_cpu_subfunc(model->features);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error querying CPU subfunctions: %d", rc);
|
error_setg(errp, "KVM: Error querying CPU subfunctions: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PTFF subfunctions might be indicated although kernel support missing */
|
/* PTFF subfunctions might be indicated although kernel support missing */
|
||||||
|
@ -2482,7 +2482,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||||
}
|
}
|
||||||
if (!model->def) {
|
if (!model->def) {
|
||||||
error_setg(errp, "KVM: host CPU model could not be identified");
|
error_setg(errp, "KVM: host CPU model could not be identified");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
/* for now, we can only provide the AP feature with HW support */
|
/* for now, we can only provide the AP feature with HW support */
|
||||||
if (ap_available()) {
|
if (ap_available()) {
|
||||||
|
@ -2506,6 +2506,7 @@ void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
|
||||||
/* strip of features that are not part of the maximum model */
|
/* strip of features that are not part of the maximum model */
|
||||||
bitmap_and(model->features, model->features, model->def->full_feat,
|
bitmap_and(model->features, model->features, model->def->full_feat,
|
||||||
S390_FEAT_MAX);
|
S390_FEAT_MAX);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int configure_uv_feat_guest(const S390FeatBitmap features)
|
static int configure_uv_feat_guest(const S390FeatBitmap features)
|
||||||
|
@ -2542,7 +2543,7 @@ static void kvm_s390_configure_apie(bool interpret)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
bool kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
{
|
{
|
||||||
struct kvm_s390_vm_cpu_processor prop = {
|
struct kvm_s390_vm_cpu_processor prop = {
|
||||||
.fac_list = { 0 },
|
.fac_list = { 0 },
|
||||||
|
@ -2559,11 +2560,11 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
if (kvm_s390_cmma_available()) {
|
if (kvm_s390_cmma_available()) {
|
||||||
kvm_s390_enable_cmma();
|
kvm_s390_enable_cmma();
|
||||||
}
|
}
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
if (!kvm_s390_cpu_models_supported()) {
|
if (!kvm_s390_cpu_models_supported()) {
|
||||||
error_setg(errp, "KVM doesn't support CPU models");
|
error_setg(errp, "KVM doesn't support CPU models");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
prop.cpuid = s390_cpuid_from_cpu_model(model);
|
prop.cpuid = s390_cpuid_from_cpu_model(model);
|
||||||
prop.ibc = s390_ibc_from_cpu_model(model);
|
prop.ibc = s390_ibc_from_cpu_model(model);
|
||||||
|
@ -2573,19 +2574,19 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
|
rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error configuring the CPU model: %d", rc);
|
error_setg(errp, "KVM: Error configuring the CPU model: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
/* configure cpu features indicated e.g. via SCLP */
|
/* configure cpu features indicated e.g. via SCLP */
|
||||||
rc = configure_cpu_feat(model->features);
|
rc = configure_cpu_feat(model->features);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error configuring CPU features: %d", rc);
|
error_setg(errp, "KVM: Error configuring CPU features: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
/* configure cpu subfunctions indicated via query / test bit */
|
/* configure cpu subfunctions indicated via query / test bit */
|
||||||
rc = configure_cpu_subfunc(model->features);
|
rc = configure_cpu_subfunc(model->features);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error configuring CPU subfunctions: %d", rc);
|
error_setg(errp, "KVM: Error configuring CPU subfunctions: %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
/* enable CMM via CMMA */
|
/* enable CMM via CMMA */
|
||||||
if (test_bit(S390_FEAT_CMM, model->features)) {
|
if (test_bit(S390_FEAT_CMM, model->features)) {
|
||||||
|
@ -2600,8 +2601,9 @@ void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
|
||||||
rc = configure_uv_feat_guest(model->features);
|
rc = configure_uv_feat_guest(model->features);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
|
error_setg(errp, "KVM: Error configuring CPU UV features %d", rc);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_s390_restart_interrupt(S390CPU *cpu)
|
void kvm_s390_restart_interrupt(S390CPU *cpu)
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
#include "hw/pci/pci_ids.h"
|
#include "hw/pci/pci_ids.h"
|
||||||
#include "hw/pci/pci_regs.h"
|
#include "hw/pci/pci_regs.h"
|
||||||
|
|
||||||
#define TEST_IMAGE_SIZE 64 * 1024 * 1024
|
/* Specified by ATA (physical) CHS geometry for ~64 MiB device. */
|
||||||
|
#define TEST_IMAGE_SIZE ((130 * 16 * 63) * 512)
|
||||||
|
|
||||||
#define IDE_PCI_DEV 1
|
#define IDE_PCI_DEV 1
|
||||||
#define IDE_PCI_FUNC 1
|
#define IDE_PCI_FUNC 1
|
||||||
|
@ -88,11 +89,13 @@ enum {
|
||||||
enum {
|
enum {
|
||||||
CMD_DSM = 0x06,
|
CMD_DSM = 0x06,
|
||||||
CMD_DIAGNOSE = 0x90,
|
CMD_DIAGNOSE = 0x90,
|
||||||
|
CMD_INIT_DP = 0x91, /* INITIALIZE DEVICE PARAMETERS */
|
||||||
CMD_READ_DMA = 0xc8,
|
CMD_READ_DMA = 0xc8,
|
||||||
CMD_WRITE_DMA = 0xca,
|
CMD_WRITE_DMA = 0xca,
|
||||||
CMD_FLUSH_CACHE = 0xe7,
|
CMD_FLUSH_CACHE = 0xe7,
|
||||||
CMD_IDENTIFY = 0xec,
|
CMD_IDENTIFY = 0xec,
|
||||||
CMD_PACKET = 0xa0,
|
CMD_PACKET = 0xa0,
|
||||||
|
CMD_READ_NATIVE = 0xf8, /* READ NATIVE MAX ADDRESS */
|
||||||
|
|
||||||
CMDF_ABORT = 0x100,
|
CMDF_ABORT = 0x100,
|
||||||
CMDF_NO_BM = 0x200,
|
CMDF_NO_BM = 0x200,
|
||||||
|
@ -560,6 +563,46 @@ static void string_cpu_to_be16(uint16_t *s, size_t bytes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_specify(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QPCIDevice *dev;
|
||||||
|
QPCIBar bmdma_bar, ide_bar;
|
||||||
|
uint16_t cyls;
|
||||||
|
uint8_t heads, spt;
|
||||||
|
|
||||||
|
qts = ide_test_start(
|
||||||
|
"-blockdev driver=file,node-name=hda,filename=%s "
|
||||||
|
"-device ide-hd,drive=hda,bus=ide.0,unit=0 ",
|
||||||
|
tmp_path[0]);
|
||||||
|
|
||||||
|
dev = get_pci_device(qts, &bmdma_bar, &ide_bar);
|
||||||
|
|
||||||
|
/* Initialize drive with zero sectors per track and one head. */
|
||||||
|
qpci_io_writeb(dev, ide_bar, reg_nsectors, 0);
|
||||||
|
qpci_io_writeb(dev, ide_bar, reg_device, 0);
|
||||||
|
qpci_io_writeb(dev, ide_bar, reg_command, CMD_INIT_DP);
|
||||||
|
|
||||||
|
/* READ NATIVE MAX ADDRESS (CHS mode). */
|
||||||
|
qpci_io_writeb(dev, ide_bar, reg_device, 0xa0);
|
||||||
|
qpci_io_writeb(dev, ide_bar, reg_command, CMD_READ_NATIVE);
|
||||||
|
|
||||||
|
heads = qpci_io_readb(dev, ide_bar, reg_device) & 0xf;
|
||||||
|
++heads;
|
||||||
|
g_assert_cmpint(heads, ==, 16);
|
||||||
|
|
||||||
|
cyls = qpci_io_readb(dev, ide_bar, reg_lba_high) << 8;
|
||||||
|
cyls |= qpci_io_readb(dev, ide_bar, reg_lba_middle);
|
||||||
|
++cyls;
|
||||||
|
g_assert_cmpint(cyls, ==, 130);
|
||||||
|
|
||||||
|
spt = qpci_io_readb(dev, ide_bar, reg_lba_low);
|
||||||
|
g_assert_cmpint(spt, ==, 63);
|
||||||
|
|
||||||
|
ide_test_quit(qts);
|
||||||
|
free_pci_device(dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_identify(void)
|
static void test_identify(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
@ -1077,6 +1120,8 @@ int main(int argc, char **argv)
|
||||||
/* Run the tests */
|
/* Run the tests */
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
|
qtest_add_func("/ide/read_native", test_specify);
|
||||||
|
|
||||||
qtest_add_func("/ide/identify", test_identify);
|
qtest_add_func("/ide/identify", test_identify);
|
||||||
|
|
||||||
qtest_add_func("/ide/diagnostic", test_diagnostic);
|
qtest_add_func("/ide/diagnostic", test_diagnostic);
|
||||||
|
|
Loading…
Reference in a new issue