* Fix off-by-one in MODE SELECT commands

* extend --extra-*flags behavior to meson-based tests
 * allow using snappy in static builds
 * i386 TCG fixes
 * fix build failure when libgbm is not available
 -----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmGJB/gUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroM0+gf/STwGM2h7I/1V/rAQnLzpA4Y9iMwB
 urMjz5rBqSpBSvyxA83JAj7a/6V70U+gm+03Nh4zdKyvKKzVmsSHtLU6EbZFUy5y
 +agY6AoB/3VLIWSf8zJ5KsxLS3r030mvu6XBbs94AEDbQ5O4YjO+Tb5r/dIOVhJb
 W1B59cPvkSmmBoFnJe2/CNcHf0AMDQ96ge2su+Sx909Lyo94r6kibFb1bkjep/ke
 0f21o3nAXSN/GBoZutLyZvMdEpwddrYwjVIyV2zCKL2XjTVXDKIphHM2iLyJxNli
 mnsQY51ZVdNkNAVy76nUWQ4+nJ/kT8Dhcl+6kWvI373PgokmEVpgZ0QKHQ==
 =GH6j
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging

* Fix off-by-one in MODE SELECT commands
* extend --extra-*flags behavior to meson-based tests
* allow using snappy in static builds
* i386 TCG fixes
* fix build failure when libgbm is not available

# gpg: Signature made Mon 08 Nov 2021 12:20:24 PM CET
# 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]

* remotes/bonzini/tags/for-upstream:
  ui/gtk-egl: Fix build failure when libgbm is not available
  configure: ignore preexisting QEMU_*FLAGS envvars
  configure: propagate --extra-cflags and --extra-ldflags to meson compile tests
  configure: preserve CFLAGS, CXXFLAGS and LDFLAGS in config.status
  configure: simplify calls to meson_quote
  docs: adjust for demise of scripts/create_config
  meson: perform snappy test with the C++ compiler if used
  hw/scsi/scsi-disk: MODE_PAGE_ALLS not allowed in MODE SELECT commands
  target-i386: mmu: fix handling of noncanonical virtual addresses
  target-i386: mmu: use pg_mode instead of HF_LMA_MASK

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-11-08 16:23:32 +01:00
commit 5e10ccc270
6 changed files with 59 additions and 35 deletions

46
configure vendored
View File

@ -158,7 +158,7 @@ update_cxxflags() {
# Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those # Set QEMU_CXXFLAGS from QEMU_CFLAGS by filtering out those
# options which some versions of GCC's C++ compiler complain about # options which some versions of GCC's C++ compiler complain about
# because they only make sense for C programs. # because they only make sense for C programs.
QEMU_CXXFLAGS="$QEMU_CXXFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS" QEMU_CXXFLAGS="-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS"
CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/) CONFIGURE_CXXFLAGS=$(echo "$CONFIGURE_CFLAGS" | sed s/-std=gnu11/-std=gnu++11/)
for arg in $QEMU_CFLAGS; do for arg in $QEMU_CFLAGS; do
case $arg in case $arg in
@ -174,14 +174,14 @@ update_cxxflags() {
compile_object() { compile_object() {
local_cflags="$1" local_cflags="$1"
do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
} }
compile_prog() { compile_prog() {
local_cflags="$1" local_cflags="$1"
local_ldflags="$2" local_ldflags="$2"
do_cc $CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \ do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
$LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
} }
# symbolically link $1 to $2. Portable version of "ln -sf". # symbolically link $1 to $2. Portable version of "ln -sf".
@ -286,6 +286,10 @@ for opt do
esac esac
done done
EXTRA_CFLAGS=""
EXTRA_CXXFLAGS=""
EXTRA_LDFLAGS=""
xen_ctrl_version="$default_feature" xen_ctrl_version="$default_feature"
xfs="$default_feature" xfs="$default_feature"
membarrier="$default_feature" membarrier="$default_feature"
@ -394,13 +398,13 @@ for opt do
;; ;;
--cpu=*) cpu="$optarg" --cpu=*) cpu="$optarg"
;; ;;
--extra-cflags=*) QEMU_CFLAGS="$QEMU_CFLAGS $optarg" --extra-cflags=*)
QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg" EXTRA_CFLAGS="$EXTRA_CFLAGS $optarg"
EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
;;
--extra-cxxflags=*) EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS $optarg"
;; ;;
--extra-cxxflags=*) QEMU_CXXFLAGS="$QEMU_CXXFLAGS $optarg" --extra-ldflags=*) EXTRA_LDFLAGS="$EXTRA_LDFLAGS $optarg"
;;
--extra-ldflags=*) QEMU_LDFLAGS="$QEMU_LDFLAGS $optarg"
EXTRA_LDFLAGS="$optarg"
;; ;;
--enable-debug-info) debug_info="yes" --enable-debug-info) debug_info="yes"
;; ;;
@ -461,11 +465,13 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
# left shift of signed integers is well defined and has the expected # left shift of signed integers is well defined and has the expected
# 2s-complement style results. (Both clang and gcc agree that it # 2s-complement style results. (Both clang and gcc agree that it
# provides these semantics.) # provides these semantics.)
QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv $QEMU_CFLAGS" QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
QEMU_LDFLAGS=
# Flags that are needed during configure but later taken care of by Meson # Flags that are needed during configure but later taken care of by Meson
CONFIGURE_CFLAGS="-std=gnu11 -Wall" CONFIGURE_CFLAGS="-std=gnu11 -Wall"
CONFIGURE_LDFLAGS= CONFIGURE_LDFLAGS=
@ -1346,8 +1352,8 @@ Advanced options (experts only):
build time build time
--cxx=CXX use C++ compiler CXX [$cxx] --cxx=CXX use C++ compiler CXX [$cxx]
--objcc=OBJCC use Objective-C compiler OBJCC [$objcc] --objcc=OBJCC use Objective-C compiler OBJCC [$objcc]
--extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS --extra-cflags=CFLAGS append extra C compiler flags CFLAGS
--extra-cxxflags=CXXFLAGS append extra C++ compiler flags QEMU_CXXFLAGS --extra-cxxflags=CXXFLAGS append extra C++ compiler flags CXXFLAGS
--extra-ldflags=LDFLAGS append extra linker flags LDFLAGS --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS
--cross-cc-ARCH=CC use compiler when building ARCH guest test cases --cross-cc-ARCH=CC use compiler when building ARCH guest test cases
--cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests
@ -3402,7 +3408,7 @@ EOF
update_cxxflags update_cxxflags
if do_cxx $CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then if do_cxx $CXXFLAGS $EXTRA_CXXFLAGS $CONFIGURE_CXXFLAGS $QEMU_CXXFLAGS -o $TMPE $TMPCXX $TMPO $QEMU_LDFLAGS; then
# C++ compiler $cxx works ok with C compiler $cc # C++ compiler $cxx works ok with C compiler $cc
: :
else else
@ -3894,6 +3900,7 @@ echo "TOPSRC_DIR=$source_path" >> $config_mak
if test "$skip_meson" = no; then if test "$skip_meson" = no; then
cross="config-meson.cross.new" cross="config-meson.cross.new"
meson_quote() { meson_quote() {
test $# = 0 && return
echo "'$(echo $* | sed "s/ /','/g")'" echo "'$(echo $* | sed "s/ /','/g")'"
} }
@ -3908,10 +3915,10 @@ if test "$skip_meson" = no; then
test -z "$cxx" && echo "link_language = 'c'" >> $cross test -z "$cxx" && echo "link_language = 'c'" >> $cross
echo "[built-in options]" >> $cross echo "[built-in options]" >> $cross
echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross echo "c_args = [$(meson_quote $CFLAGS $EXTRA_CFLAGS)]" >> $cross
echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross echo "cpp_args = [$(meson_quote $CXXFLAGS $EXTRA_CXXFLAGS)]" >> $cross
echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross echo "c_link_args = [$(meson_quote $CFLAGS $LDFLAGS $EXTRA_CFLAGS $EXTRA_LDFLAGS)]" >> $cross
echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross echo "cpp_link_args = [$(meson_quote $CXXFLAGS $LDFLAGS $EXTRA_CXXFLAGS $EXTRA_LDFLAGS)]" >> $cross
echo "[binaries]" >> $cross echo "[binaries]" >> $cross
echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross echo "c = [$(meson_quote $cc $CPU_CFLAGS)]" >> $cross
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross test -n "$cxx" && echo "cpp = [$(meson_quote $cxx $CPU_CFLAGS)]" >> $cross
@ -4056,9 +4063,12 @@ preserve_env AR
preserve_env AS preserve_env AS
preserve_env CC preserve_env CC
preserve_env CPP preserve_env CPP
preserve_env CFLAGS
preserve_env CXX preserve_env CXX
preserve_env CXXFLAGS
preserve_env INSTALL preserve_env INSTALL
preserve_env LD preserve_env LD
preserve_env LDFLAGS
preserve_env LD_LIBRARY_PATH preserve_env LD_LIBRARY_PATH
preserve_env LIBTOOL preserve_env LIBTOOL
preserve_env MAKE preserve_env MAKE

View File

@ -464,11 +464,10 @@ Built by Meson:
scripts/make_device_config.sh program, feeding it the scripts/make_device_config.sh program, feeding it the
default-configs/$TARGET-NAME file as input. default-configs/$TARGET-NAME file as input.
``config-host.h``, ``$TARGET-NAME/config-target.h``, ``$TARGET-NAME/config-devices.h`` ``config-host.h``, ``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
These files are used by source code to determine what features These files are used by source code to determine what features are
are enabled. They are generated from the contents of the corresponding enabled. They are generated from the contents of the corresponding
``*.h`` files using the scripts/create_config program. This extracts ``*.mak`` files using Meson's ``configure_file()`` function.
relevant variables and formats them as C preprocessor macros.
``build.ninja`` ``build.ninja``
The build rules. The build rules.

View File

@ -1087,6 +1087,7 @@ static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
uint8_t *p = *p_outbuf + 2; uint8_t *p = *p_outbuf + 2;
int length; int length;
assert(page < ARRAY_SIZE(mode_sense_valid));
if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) { if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
return -1; return -1;
} }
@ -1428,6 +1429,11 @@ static int scsi_disk_check_mode_select(SCSIDiskState *s, int page,
return -1; return -1;
} }
/* MODE_PAGE_ALLS is only valid for MODE SENSE commands */
if (page == MODE_PAGE_ALLS) {
return -1;
}
p = mode_current; p = mode_current;
memset(mode_current, 0, inlen + 2); memset(mode_current, 0, inlen + 2);
len = mode_sense_page(s, page, &p, 0); len = mode_sense_page(s, page, &p, 0);

View File

@ -197,6 +197,10 @@ add_project_arguments('-iquote', '.',
link_language = meson.get_external_property('link_language', 'cpp') link_language = meson.get_external_property('link_language', 'cpp')
if link_language == 'cpp' if link_language == 'cpp'
add_languages('cpp', required: true, native: false) add_languages('cpp', required: true, native: false)
cxx = meson.get_compiler('cpp')
linker = cxx
else
linker = cc
endif endif
if host_machine.system() == 'darwin' if host_machine.system() == 'darwin'
add_languages('objc', required: false, native: false) add_languages('objc', required: false, native: false)
@ -1109,7 +1113,7 @@ if not get_option('snappy').auto() or have_system
required: get_option('snappy'), required: get_option('snappy'),
kwargs: static_kwargs) kwargs: static_kwargs)
endif endif
if snappy.found() and not cc.links(''' if snappy.found() and not linker.links('''
#include <snappy-c.h> #include <snappy-c.h>
int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
snappy = not_found snappy = not_found

View File

@ -90,19 +90,10 @@ static int mmu_translate(CPUState *cs, hwaddr addr, MMUTranslateFunc get_hphys_f
target_ulong pdpe_addr; target_ulong pdpe_addr;
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
if (env->hflags & HF_LMA_MASK) { if (pg_mode & PG_MODE_LMA) {
bool la57 = pg_mode & PG_MODE_LA57; bool la57 = pg_mode & PG_MODE_LA57;
uint64_t pml5e_addr, pml5e; uint64_t pml5e_addr, pml5e;
uint64_t pml4e_addr, pml4e; uint64_t pml4e_addr, pml4e;
int32_t sext;
/* test virtual address sign extension */
sext = la57 ? (int64_t)addr >> 56 : (int64_t)addr >> 47;
if (get_hphys_func && sext != 0 && sext != -1) {
env->error_code = 0;
cs->exception_index = EXCP0D_GPF;
return 1;
}
if (la57) { if (la57) {
pml5e_addr = ((cr3 & ~0xfff) + pml5e_addr = ((cr3 & ~0xfff) +
@ -287,7 +278,7 @@ do_check_protect_pse36:
*prot |= PAGE_EXEC; *prot |= PAGE_EXEC;
} }
if (!(env->hflags & HF_LMA_MASK)) { if (!(pg_mode & PG_MODE_LMA)) {
pkr = 0; pkr = 0;
} else if (ptep & PG_USER_MASK) { } else if (ptep & PG_USER_MASK) {
pkr = pg_mode & PG_MODE_PKE ? env->pkru : 0; pkr = pg_mode & PG_MODE_PKE ? env->pkru : 0;
@ -423,6 +414,18 @@ static int handle_mmu_fault(CPUState *cs, vaddr addr, int size,
page_size = 4096; page_size = 4096;
} else { } else {
pg_mode = get_pg_mode(env); pg_mode = get_pg_mode(env);
if (pg_mode & PG_MODE_LMA) {
int32_t sext;
/* test virtual address sign extension */
sext = (int64_t)addr >> (pg_mode & PG_MODE_LA57 ? 56 : 47);
if (sext != 0 && sext != -1) {
env->error_code = 0;
cs->exception_index = EXCP0D_GPF;
return 1;
}
}
error_code = mmu_translate(cs, addr, get_hphys, env->cr[3], is_write1, error_code = mmu_translate(cs, addr, get_hphys, env->cr[3], is_write1,
mmu_idx, pg_mode, mmu_idx, pg_mode,
&paddr, &page_size, &prot); &paddr, &page_size, &prot);

View File

@ -155,10 +155,12 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds); surface_gl_destroy_texture(vc->gfx.gls, vc->gfx.ds);
surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
} }
#ifdef CONFIG_GBM
if (vc->gfx.guest_fb.dmabuf) { if (vc->gfx.guest_fb.dmabuf) {
egl_dmabuf_release_texture(vc->gfx.guest_fb.dmabuf); egl_dmabuf_release_texture(vc->gfx.guest_fb.dmabuf);
gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf); gd_egl_scanout_dmabuf(dcl, vc->gfx.guest_fb.dmabuf);
} }
#endif
} }
graphic_hw_update(dcl->con); graphic_hw_update(dcl->con);