summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Maydell2020-07-13 14:01:30 +0200
committerPeter Maydell2020-07-13 14:01:30 +0200
commit00ce6c36b35e0eb8cc5d68a28f288a6335848813 (patch)
treeca25062dd798548f1c0bfe53e8dc278de5beaf32
parentMerge remote-tracking branch 'remotes/elmarco/tags/chardev-pull-request' into... (diff)
parentdocs/system/s390x: Improve the 3270 documentation (diff)
downloadqemu-00ce6c36b35e0eb8cc5d68a28f288a6335848813.tar.gz
qemu-00ce6c36b35e0eb8cc5d68a28f288a6335848813.tar.xz
qemu-00ce6c36b35e0eb8cc5d68a28f288a6335848813.zip
Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2020-07-13' into staging
* Some fuzzer related fixes * Fixes / improvements for the "configure" script * Doc updates * Gitlab pipeline-status script # gpg: Signature made Mon 13 Jul 2020 11:48:32 BST # 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 <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * remotes/huth-gitlab/tags/pull-request-2020-07-13: docs/system/s390x: Improve the 3270 documentation GitLab Gating CI: introduce pipeline-status contrib script disas/sh4: Add missing fallthrough annotations Remove the CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE switch docs/devel/fuzzing: Fix bugs in documentation tests/qtest/fuzz: Add missing spaces in description fuzz: add missing header for rcu_enable_atfork configure: do not clobber CFLAGS with --enable-fuzzing configure: fix malloc check Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rwxr-xr-xconfigure32
-rw-r--r--disas/sh4.c2
-rw-r--r--docs/devel/fuzzing.txt6
-rw-r--r--docs/system/s390x/3270.rst43
-rw-r--r--include/ui/gtk.h4
-rw-r--r--include/ui/qemu-pixman.h4
-rwxr-xr-xscripts/ci/gitlab-pipeline-status157
-rwxr-xr-xscripts/decodetree.py12
-rw-r--r--tests/qtest/fuzz/fuzz.c1
-rw-r--r--tests/qtest/fuzz/virtio_scsi_fuzz.c4
-rw-r--r--ui/gtk.c4
-rw-r--r--util/coroutine-ucontext.c4
12 files changed, 210 insertions, 63 deletions
diff --git a/configure b/configure
index 814ed81279..9b6ab9d3ca 100755
--- a/configure
+++ b/configure
@@ -5729,31 +5729,6 @@ if compile_prog "" "" ; then
fi
########################################
-# check whether we can disable warning option with a pragma (this is needed
-# to silence warnings in the headers of some versions of external libraries).
-# This test has to be compiled with -Werror as otherwise an unknown pragma is
-# only a warning.
-#
-# If we can't selectively disable warning in the code, disable -Werror so that
-# the build doesn't fail anyway.
-
-pragma_disable_unused_but_set=no
-cat > $TMPC << EOF
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#pragma GCC diagnostic pop
-
-int main(void) {
- return 0;
-}
-EOF
-if compile_prog "-Werror" "" ; then
- pragma_diagnostic_available=yes
-else
- werror=no
-fi
-
-########################################
# check if we have valgrind/valgrind.h
valgrind_h=no
@@ -6343,6 +6318,7 @@ int main(void) {
if (tmp != NULL) {
return *(int *)(tmp + 2);
}
+ return 1;
}
EOF
if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
@@ -7688,10 +7664,6 @@ if test "$linux_magic_h" = "yes" ; then
echo "CONFIG_LINUX_MAGIC_H=y" >> $config_host_mak
fi
-if test "$pragma_diagnostic_available" = "yes" ; then
- echo "CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE=y" >> $config_host_mak
-fi
-
if test "$valgrind_h" = "yes" ; then
echo "CONFIG_VALGRIND_H=y" >> $config_host_mak
fi
@@ -7925,7 +7897,7 @@ if test "$fuzzing" = "yes" ; then
if test "$have_fuzzer" = "yes"; then
FUZZ_LDFLAGS=" -fsanitize=address,fuzzer"
FUZZ_CFLAGS=" -fsanitize=address,fuzzer"
- CFLAGS=" -fsanitize=address,fuzzer-no-link"
+ CFLAGS="$CFLAGS -fsanitize=address,fuzzer-no-link"
else
error_exit "Your compiler doesn't support -fsanitize=address,fuzzer"
exit 1
diff --git a/disas/sh4.c b/disas/sh4.c
index 55ef865a36..dcdbdf26d8 100644
--- a/disas/sh4.c
+++ b/disas/sh4.c
@@ -1963,6 +1963,7 @@ print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
fprintf_fn (stream, "xd%d", rn & ~1);
break;
}
+ /* fallthrough */
case D_REG_N:
fprintf_fn (stream, "dr%d", rn);
break;
@@ -1972,6 +1973,7 @@ print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
fprintf_fn (stream, "xd%d", rm & ~1);
break;
}
+ /* fallthrough */
case D_REG_M:
fprintf_fn (stream, "dr%d", rm);
break;
diff --git a/docs/devel/fuzzing.txt b/docs/devel/fuzzing.txt
index 324d2cd92b..db5641de74 100644
--- a/docs/devel/fuzzing.txt
+++ b/docs/devel/fuzzing.txt
@@ -33,11 +33,11 @@ Fuzz targets are built similarly to system/softmmu:
This builds ./i386-softmmu/qemu-fuzz-i386
-The first option to this command is: --fuzz_taget=FUZZ_NAME
+The first option to this command is: --fuzz-target=FUZZ_NAME
To list all of the available fuzzers run qemu-fuzz-i386 with no arguments.
-eg:
- ./i386-softmmu/qemu-fuzz-i386 --fuzz-target=virtio-net-fork-fuzz
+For example:
+ ./i386-softmmu/qemu-fuzz-i386 --fuzz-target=virtio-scsi-fuzz
Internally, libfuzzer parses all arguments that do not begin with "--".
Information about these is available by passing -help=1
diff --git a/docs/system/s390x/3270.rst b/docs/system/s390x/3270.rst
index 1774cdcadf..0554a70a9f 100644
--- a/docs/system/s390x/3270.rst
+++ b/docs/system/s390x/3270.rst
@@ -1,9 +1,15 @@
3270 devices
============
-QEMU supports connecting an external 3270 terminal emulator (such as
-``x3270``) to make a single 3270 device available to a guest. Note that this
-supports basic features only.
+The 3270 is the classic 'green-screen' console of the mainframes (see the
+`IBM 3270 Wikipedia article <https://en.wikipedia.org/wiki/IBM_3270>`__).
+
+The 3270 data stream is not implemented within QEMU; the device only provides
+TN3270 (a telnet extension; see `RFC 854 <https://tools.ietf.org/html/rfc854>`__
+and `RFC 1576 <https://tools.ietf.org/html/rfc1576>`__) and leaves the heavy
+lifting to an external 3270 terminal emulator (such as ``x3270``) to make a
+single 3270 device available to a guest. Note that this supports basic
+features only.
To provide a 3270 device to a guest, create a ``x-terminal3270`` linked to
a ``tn3270`` chardev. The guest will see a 3270 channel device. In order
@@ -12,10 +18,14 @@ to actually be able to use it, attach the ``x3270`` emulator to the chardev.
Example configuration
---------------------
+* Make sure that 3270 support is enabled in the guest's Linux kernel. You need
+ ``CONFIG_TN3270`` and at least one of ``CONFIG_TN3270_TTY`` (for additional
+ ttys) or ``CONFIG_TN3270_CONSOLE`` (for a 3270 console).
+
* Add a ``tn3270`` chardev and a ``x-terminal3270`` to the QEMU command line::
- -chardev socket,id=char_0,host=0.0.0.0,port=2300,nowait,server,tn3270
- -device x-terminal3270,chardev=char_0,devno=fe.0.000a,id=terminal_0
+ -chardev socket,id=ch0,host=0.0.0.0,port=2300,nowait,server,tn3270
+ -device x-terminal3270,chardev=ch0,devno=fe.0.000a,id=terminal0
* Start the guest. In the guest, use ``chccwdev -e 0.0.000a`` to enable
the device.
@@ -29,4 +39,25 @@ Example configuration
systemctl start serial-getty@3270-tty1.service
-This should get you an addtional tty for logging into the guest.
+ This should get you an additional tty for logging into the guest.
+
+* If you want to use the 3270 device as the Linux kernel console instead of
+ an additional tty, you can also append ``conmode=3270 condev=000a`` to
+ the guest's kernel command line. The kernel then should use the 3270 as
+ console after the next boot.
+
+Restrictions
+------------
+
+3270 support is very basic. In particular:
+
+* Only one 3270 device is supported.
+
+* It has only been tested with Linux guests and the x3270 emulator.
+
+* TLS/SSL is not supported.
+
+* Resizing on reattach is not supported.
+
+* Multiple commands in one inbound buffer (for example, when the reset key
+ is pressed while the network is slow) are not supported.
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
index d1b230848a..eaeb450f91 100644
--- a/include/ui/gtk.h
+++ b/include/ui/gtk.h
@@ -1,15 +1,11 @@
#ifndef UI_GTK_H
#define UI_GTK_H
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
/* Work around an -Wstrict-prototypes warning in GTK headers */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#endif
#include <gtk/gtk.h>
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
#pragma GCC diagnostic pop
-#endif
#include <gdk/gdkkeysyms.h>
diff --git a/include/ui/qemu-pixman.h b/include/ui/qemu-pixman.h
index 3b7cf70157..87737a6f16 100644
--- a/include/ui/qemu-pixman.h
+++ b/include/ui/qemu-pixman.h
@@ -7,14 +7,10 @@
#define QEMU_PIXMAN_H
/* pixman-0.16.0 headers have a redundant declaration */
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wredundant-decls"
-#endif
#include <pixman.h>
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
#pragma GCC diagnostic pop
-#endif
/*
* pixman image formats are defined to be native endian,
diff --git a/scripts/ci/gitlab-pipeline-status b/scripts/ci/gitlab-pipeline-status
new file mode 100755
index 0000000000..348a49b6a4
--- /dev/null
+++ b/scripts/ci/gitlab-pipeline-status
@@ -0,0 +1,157 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019-2020 Red Hat, Inc.
+#
+# Author:
+# Cleber Rosa <crosa@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+"""
+Checks the GitLab pipeline status for a given commit ID
+"""
+
+# pylint: disable=C0103
+
+import argparse
+import http.client
+import json
+import os
+import subprocess
+import time
+import sys
+
+
+def get_local_staging_branch_commit():
+ """
+ Returns the commit sha1 for the *local* branch named "staging"
+ """
+ result = subprocess.run(['git', 'rev-parse', 'staging'],
+ stdin=subprocess.DEVNULL,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.DEVNULL,
+ cwd=os.path.dirname(__file__),
+ universal_newlines=True).stdout.strip()
+ if result == 'staging':
+ raise ValueError("There's no local branch named 'staging'")
+ if len(result) != 40:
+ raise ValueError("Branch staging HEAD doesn't look like a sha1")
+ return result
+
+
+def get_pipeline_status(project_id, commit_sha1):
+ """
+ Returns the JSON content of the pipeline status API response
+ """
+ url = '/api/v4/projects/{}/pipelines?sha={}'.format(project_id,
+ commit_sha1)
+ connection = http.client.HTTPSConnection('gitlab.com')
+ connection.request('GET', url=url)
+ response = connection.getresponse()
+ if response.code != http.HTTPStatus.OK:
+ raise ValueError("Failed to receive a successful response")
+ json_response = json.loads(response.read())
+
+ # As far as I can tell, there should be only one pipeline for the same
+ # project + commit. If this assumption is false, we can add further
+ # filters to the url, such as username, and order_by.
+ if not json_response:
+ raise ValueError("No pipeline found")
+ return json_response[0]
+
+
+def wait_on_pipeline_success(timeout, interval,
+ project_id, commit_sha):
+ """
+ Waits for the pipeline to finish within the given timeout
+ """
+ start = time.time()
+ while True:
+ if time.time() >= (start + timeout):
+ print("Waiting on the pipeline timed out")
+ return False
+
+ status = get_pipeline_status(project_id, commit_sha)
+ if status['status'] == 'running':
+ time.sleep(interval)
+ print('running...')
+ continue
+
+ if status['status'] == 'success':
+ return True
+
+ msg = "Pipeline failed, check: %s" % status['web_url']
+ print(msg)
+ return False
+
+
+def main():
+ """
+ Script entry point
+ """
+ parser = argparse.ArgumentParser(
+ prog='pipeline-status',
+ description='check or wait on a pipeline status')
+
+ parser.add_argument('-t', '--timeout', type=int, default=7200,
+ help=('Amount of time (in seconds) to wait for the '
+ 'pipeline to complete. Defaults to '
+ '%(default)s'))
+ parser.add_argument('-i', '--interval', type=int, default=60,
+ help=('Amount of time (in seconds) to wait between '
+ 'checks of the pipeline status. Defaults '
+ 'to %(default)s'))
+ parser.add_argument('-w', '--wait', action='store_true', default=False,
+ help=('Wether to wait, instead of checking only once '
+ 'the status of a pipeline'))
+ parser.add_argument('-p', '--project-id', type=int, default=11167699,
+ help=('The GitLab project ID. Defaults to the project '
+ 'for https://gitlab.com/qemu-project/qemu, that '
+ 'is, "%(default)s"'))
+ try:
+ default_commit = get_local_staging_branch_commit()
+ commit_required = False
+ except ValueError:
+ default_commit = ''
+ commit_required = True
+ parser.add_argument('-c', '--commit', required=commit_required,
+ default=default_commit,
+ help=('Look for a pipeline associated with the given '
+ 'commit. If one is not explicitly given, the '
+ 'commit associated with the local branch named '
+ '"staging" is used. Default: %(default)s'))
+ parser.add_argument('--verbose', action='store_true', default=False,
+ help=('A minimal verbosity level that prints the '
+ 'overall result of the check/wait'))
+
+ args = parser.parse_args()
+
+ try:
+ if args.wait:
+ success = wait_on_pipeline_success(
+ args.timeout,
+ args.interval,
+ args.project_id,
+ args.commit)
+ else:
+ status = get_pipeline_status(args.project_id,
+ args.commit)
+ success = status['status'] == 'success'
+ except Exception as error: # pylint: disable=W0703
+ success = False
+ if args.verbose:
+ print("ERROR: %s" % error.args[0])
+
+ if success:
+ if args.verbose:
+ print('success')
+ sys.exit(0)
+ else:
+ if args.verbose:
+ print('failure')
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index 530d41ca62..694757b6c2 100755
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -1327,12 +1327,10 @@ def main():
# but we can't tell which ones. Prevent issues from the compiler by
# suppressing redundant declaration warnings.
if anyextern:
- output("#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE\n",
- "# pragma GCC diagnostic push\n",
- "# pragma GCC diagnostic ignored \"-Wredundant-decls\"\n",
- "# ifdef __clang__\n"
+ output("#pragma GCC diagnostic push\n",
+ "#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n",
+ "#ifdef __clang__\n"
"# pragma GCC diagnostic ignored \"-Wtypedef-redefinition\"\n",
- "# endif\n",
"#endif\n\n")
out_pats = {}
@@ -1347,9 +1345,7 @@ def main():
output('\n')
if anyextern:
- output("#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE\n",
- "# pragma GCC diagnostic pop\n",
- "#endif\n\n")
+ output("#pragma GCC diagnostic pop\n\n")
for n in sorted(formats.keys()):
f = formats[n]
diff --git a/tests/qtest/fuzz/fuzz.c b/tests/qtest/fuzz/fuzz.c
index a36d9038e0..0b66e43409 100644
--- a/tests/qtest/fuzz/fuzz.c
+++ b/tests/qtest/fuzz/fuzz.c
@@ -19,6 +19,7 @@
#include "sysemu/runstate.h"
#include "sysemu/sysemu.h"
#include "qemu/main-loop.h"
+#include "qemu/rcu.h"
#include "tests/qtest/libqtest.h"
#include "tests/qtest/libqos/qgraph.h"
#include "fuzz.h"
diff --git a/tests/qtest/fuzz/virtio_scsi_fuzz.c b/tests/qtest/fuzz/virtio_scsi_fuzz.c
index 51dce491ab..3a9ea13736 100644
--- a/tests/qtest/fuzz/virtio_scsi_fuzz.c
+++ b/tests/qtest/fuzz/virtio_scsi_fuzz.c
@@ -191,7 +191,7 @@ static void register_virtio_scsi_fuzz_targets(void)
{
fuzz_add_qos_target(&(FuzzTarget){
.name = "virtio-scsi-fuzz",
- .description = "Fuzz the virtio-scsi virtual queues, forking"
+ .description = "Fuzz the virtio-scsi virtual queues, forking "
"for each fuzz run",
.pre_vm_init = &counter_shm_init,
.pre_fuzz = &virtio_scsi_pre_fuzz,
@@ -202,7 +202,7 @@ static void register_virtio_scsi_fuzz_targets(void)
fuzz_add_qos_target(&(FuzzTarget){
.name = "virtio-scsi-flags-fuzz",
- .description = "Fuzz the virtio-scsi virtual queues, forking"
+ .description = "Fuzz the virtio-scsi virtual queues, forking "
"for each fuzz run (also fuzzes the virtio flags)",
.pre_vm_init = &counter_shm_init,
.pre_fuzz = &virtio_scsi_pre_fuzz,
diff --git a/ui/gtk.c b/ui/gtk.c
index d4b49bd7da..b0cc08ad6d 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1996,14 +1996,10 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc,
* proper replacement (native opengl support) is only
* available in 3.16+. Silence the warning if possible.
*/
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
gtk_widget_set_double_buffered(vc->gfx.drawing_area, FALSE);
-#ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE
#pragma GCC diagnostic pop
-#endif
vc->gfx.dcl.ops = &dcl_egl_ops;
}
} else
diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c
index fff20aad80..904b375192 100644
--- a/util/coroutine-ucontext.c
+++ b/util/coroutine-ucontext.c
@@ -251,8 +251,8 @@ Coroutine *qemu_coroutine_new(void)
}
#ifdef CONFIG_VALGRIND_H
-#if defined(CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE) && !defined(__clang__)
/* Work around an unused variable in the valgrind.h macro... */
+#if !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#endif
@@ -260,7 +260,7 @@ static inline void valgrind_stack_deregister(CoroutineUContext *co)
{
VALGRIND_STACK_DEREGISTER(co->valgrind_stack_id);
}
-#if defined(CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE) && !defined(__clang__)
+#if !defined(__clang__)
#pragma GCC diagnostic pop
#endif
#endif