* Bugfixes

* Code of conduct and conflict resolution policy
 -----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmBlrKYUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroPRzQgAon5iI9jdGTgdJHow2ajn0rCxDEgp
 G97a+hXYtKOnp2bhq5XxlQNW8Tw6fKolfA/ISnOMCix1hQe6eqNxCevwdAdKJgSg
 UkV2c08CR3dR28olqSPDzTQd6COpqKfL9V9dApLn8FtbyPbIX0IlvS/mQaHbtvvK
 lAe+fRqn+UZe4xTiE4FTGUD35PmtgYW5TzX1QWF6R6S6BCfJ07s7S/L99zP8d1UU
 fQQzaKTIOtVWv5765oxU0R1LpRtPxfBqlxDFVbzx9B0s+Grp4wyn7h2gplkwK2Rs
 YXElsRjARlSW3VfASaX+yjCxX4hQ9HjFvi0iH5vYHprX6lnm/27gSjNFxQ==
 =P9vW
 -----END PGP SIGNATURE-----

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

* Bugfixes
* Code of conduct and conflict resolution policy

# gpg: Signature made Thu 01 Apr 2021 12:21:10 BST
# 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]
# Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4  E2F7 7E15 100C CD36 69B1
#      Subkey fingerprint: F133 3857 4B66 2389 866C  7682 BFFB D25F 78C7 AE83

* remotes/bonzini-gitlab/tags/for-upstream:
  docs: Add a QEMU Code of Conduct and Conflict Resolution Policy document
  hexagon: do not specify Python scripts as inputs
  hexagon: do not specify executables as inputs
  configure: Do not use default_feature for EXESUF
  target/openrisc: fix icount handling for timer instructions
  replay: notify CPU on event
  icount: get rid of static variable
  Revert "qom: use qemu_printf to print help for user-creatable objects"
  replay: fix recursive checkpoints
  qapi: qom: do not use target-specific conditionals
  target/i386: Verify memory operand for lcall and ljmp
  meson: Propagate gnutls dependency to migration

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2021-04-01 13:35:36 +01:00
commit 00084bab87
15 changed files with 197 additions and 46 deletions

2
configure vendored
View File

@ -365,7 +365,7 @@ tcg_interpreter="false"
bigendian="no"
mingw32="no"
gcov="no"
EXESUF="$default_feature"
EXESUF=""
HOST_DSOSUF=".so"
modules="no"
module_upgrades="no"

View File

@ -0,0 +1,60 @@
Code of Conduct
===============
The QEMU community is made up of a mixture of professionals and
volunteers from all over the world. Diversity is one of our strengths,
but it can also lead to communication issues and unhappiness.
To that end, we have a few ground rules that we ask people to adhere to.
* Be welcoming. We are committed to making participation in this project
a harassment-free experience for everyone, regardless of level of
experience, gender, gender identity and expression, sexual orientation,
disability, personal appearance, body size, race, ethnicity, age, religion,
or nationality.
* Be respectful. Not all of us will agree all the time. Disagreements, both
social and technical, happen all the time and the QEMU community is no
exception. When we disagree, we try to understand why. It is important that
we resolve disagreements and differing views constructively. Members of the
QEMU community should be respectful when dealing with other contributors as
well as with people outside the QEMU community and with users of QEMU.
Harassment and other exclusionary behavior are not acceptable. A community
where people feel uncomfortable or threatened is neither welcoming nor
respectful. Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery
* Personal attacks
* Trolling or insulting/derogatory comments
* Public or private harassment
* Publishing other's private information, such as physical or electronic
addresses, without explicit permission
This isn't an exhaustive list of things that you can't do. Rather, take
it in the spirit in which it's intended: a guide to make it easier to
be excellent to each other.
This code of conduct applies to all spaces managed by the QEMU project.
This includes IRC, the mailing lists, the issue tracker, community
events, and any other forums created by the project team which the
community uses for communication. This code of conduct also applies
outside these spaces, when an individual acts as a representative or a
member of the project or its community.
By adopting this code of conduct, project maintainers commit themselves
to fairly and consistently applying these principles to every aspect of
managing this project. If you believe someone is violating the code of
conduct, please read the :ref:`conflict-resolution` document for
information about how to proceed.
Sources
-------
This document is based on the `Fedora Code of Conduct
<https://fedoraproject.org/code-of-conduct>`__ and the
`Contributor Covenant version 1.3.0
<https://www.contributor-covenant.org/version/1/3/0/code-of-conduct/>`__.

View File

@ -0,0 +1,80 @@
.. _conflict-resolution:
Conflict Resolution Policy
==========================
Conflicts in the community can take many forms, from someone having a
bad day and using harsh and hurtful language on the mailing list to more
serious code of conduct violations (including sexist/racist statements
or threats of violence), and everything in between.
For the vast majority of issues, we aim to empower individuals to first
resolve conflicts themselves, asking for help when needed, and only
after that fails to escalate further. This approach gives people more
control over the outcome of their dispute.
How we resolve conflicts
------------------------
If you are experiencing conflict, please consider first addressing the
perceived conflict directly with other involved parties, preferably through
a real-time medium such as IRC. You could also try to get a third-party (e.g.
a mutual friend, and/or someone with background on the issue, but not
involved in the conflict) to intercede or mediate.
If this fails or if you do not feel comfortable proceeding this way, or
if the problem requires immediate escalation, report the issue to the QEMU
leadership committee by sending an email to qemu@sfconservancy.org, providing
references to the misconduct.
For very urgent topics, you can also inform one or more members through IRC.
The up-to-date list of members is `available on the QEMU wiki
<https://wiki.qemu.org/Conservancy>`__.
Your report will be treated confidentially by the leadership committee and
not be published without your agreement. The QEMU leadership committee will
then do its best to review the incident in a timely manner, and will either
seek further information, or will make a determination on next steps.
Remedies
--------
Escalating an issue to the QEMU leadership committee may result in actions
impacting one or more involved parties. In the event the leadership
committee has to intervene, here are some of the ways they might respond:
1. Take no action. For example, if the leadership committee determines
the complaint has not been substantiated or is being made in bad faith,
or if it is deemed to be outside its purview.
2. A private reprimand, explaining the consequences of continued behavior,
to one or more involved individuals.
3. A private reprimand and request for a private or public apology
4. A public reprimand and request for a public apology
5. A public reprimand plus a mandatory cooling off period. The cooling
off period may require, for example, one or more of the following:
abstaining from maintainer duties; not interacting with people involved,
including unsolicited interaction with those enforcing the guidelines
and interaction on social media; being denied participation to in-person
events. The cooling off period is voluntary but may escalate to a
temporary ban in order to enforce it.
6. A temporary or permanent ban from some or all current and future QEMU
spaces (mailing lists, IRC, wiki, etc.), possibly including in-person
events.
In the event of severe harassment, the leadership committee may advise that
the matter be escalated to the relevant local law enforcement agency. It
is however not the role of the leadership committee to initiate contact
with law enforcement on behalf of any of the community members involved
in an incident.
Sources
-------
This document was developed based on the `Drupal Conflict Resolution
Policy and Process <https://www.drupal.org/conflict-resolution>`__
and the `Mozilla Consequence Ladder
<https://github.com/mozilla/diversity/blob/master/code-of-conduct-enforcement/consequence-ladder.md>`__

View File

@ -14,6 +14,8 @@ Contents:
:maxdepth: 2
:includehidden:
code-of-conduct
conflict-resolution
build-system
style
kconfig

View File

@ -24,7 +24,7 @@ softmmu_ss.add(files(
'savevm.c',
'socket.c',
'tls.c',
))
), gnutls)
softmmu_ss.add(when: ['CONFIG_RDMA', rdma], if_true: files('rdma.c'))
softmmu_ss.add(when: 'CONFIG_LIVE_BLOCK_MIGRATION', if_true: files('block.c'))

View File

@ -733,8 +733,7 @@
'*policy': 'uint32',
'*handle': 'uint32',
'*cbitpos': 'uint32',
'reduced-phys-bits': 'uint32' },
'if': 'defined(CONFIG_SEV)' }
'reduced-phys-bits': 'uint32' } }
##
# @ObjectType:
@ -768,14 +767,14 @@
{ 'name': 'memory-backend-memfd',
'if': 'defined(CONFIG_LINUX)' },
'memory-backend-ram',
{'name': 'pef-guest', 'if': 'defined(CONFIG_PSERIES)' },
'pef-guest',
'pr-manager-helper',
'rng-builtin',
'rng-egd',
'rng-random',
'secret',
'secret_keyring',
{'name': 'sev-guest', 'if': 'defined(CONFIG_SEV)' },
'sev-guest',
's390-pv-guest',
'throttle-group',
'tls-creds-anon',
@ -831,8 +830,7 @@
'rng-random': 'RngRandomProperties',
'secret': 'SecretProperties',
'secret_keyring': 'SecretKeyringProperties',
'sev-guest': { 'type': 'SevGuestProperties',
'if': 'defined(CONFIG_SEV)' },
'sev-guest': 'SevGuestProperties',
'throttle-group': 'ThrottleGroupProperties',
'tls-creds-anon': 'TlsCredsAnonProperties',
'tls-creds-psk': 'TlsCredsPskProperties',

View File

@ -17,7 +17,6 @@
#include "qemu/qemu-print.h"
#include "qapi/opts-visitor.h"
#include "qemu/config-file.h"
#include "qemu/qemu-print.h"
bool user_creatable_complete(UserCreatable *uc, Error **errp)
{

View File

@ -15,6 +15,7 @@
#include "replay-internal.h"
#include "block/aio.h"
#include "ui/input.h"
#include "hw/core/cpu.h"
typedef struct Event {
ReplayAsyncEventKind event_kind;
@ -126,6 +127,7 @@ void replay_add_event(ReplayAsyncEventKind event_kind,
g_assert(replay_mutex_locked());
QTAILQ_INSERT_TAIL(&events_list, event, events);
qemu_cpu_kick(first_cpu);
}
void replay_bh_schedule_event(QEMUBH *bh)

View File

@ -180,12 +180,13 @@ bool replay_checkpoint(ReplayCheckpoint checkpoint)
}
if (in_checkpoint) {
/* If we are already in checkpoint, then there is no need
for additional synchronization.
/*
Recursion occurs when HW event modifies timers.
Timer modification may invoke the checkpoint and
proceed to recursion. */
return true;
Prevent performing icount warp in this case and
wait for another invocation of the checkpoint.
*/
g_assert(replay_mode == REPLAY_MODE_PLAY);
return false;
}
in_checkpoint = true;

View File

@ -188,11 +188,12 @@ static const VMStateDescription icount_vmstate_adjust_timers = {
static const VMStateDescription icount_vmstate_shift = {
.name = "timer/icount/shift",
.version_id = 1,
.minimum_version_id = 1,
.version_id = 2,
.minimum_version_id = 2,
.needed = icount_shift_state_needed,
.fields = (VMStateField[]) {
VMSTATE_INT16(icount_time_shift, TimersState),
VMSTATE_INT64(last_delta, TimersState),
VMSTATE_END_OF_LIST()
}
};

View File

@ -176,9 +176,6 @@ static void icount_adjust(void)
int64_t cur_icount;
int64_t delta;
/* Protected by TimersState mutex. */
static int64_t last_delta;
/* If the VM is not running, then do nothing. */
if (!runstate_is_running()) {
return;
@ -193,20 +190,20 @@ static void icount_adjust(void)
delta = cur_icount - cur_time;
/* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
if (delta > 0
&& last_delta + ICOUNT_WOBBLE < delta * 2
&& timers_state.last_delta + ICOUNT_WOBBLE < delta * 2
&& timers_state.icount_time_shift > 0) {
/* The guest is getting too far ahead. Slow time down. */
qatomic_set(&timers_state.icount_time_shift,
timers_state.icount_time_shift - 1);
}
if (delta < 0
&& last_delta - ICOUNT_WOBBLE > delta * 2
&& timers_state.last_delta - ICOUNT_WOBBLE > delta * 2
&& timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
/* The guest is getting too far behind. Speed time up. */
qatomic_set(&timers_state.icount_time_shift,
timers_state.icount_time_shift + 1);
}
last_delta = delta;
timers_state.last_delta = delta;
qatomic_set_i64(&timers_state.qemu_icount_bias,
cur_icount - (timers_state.qemu_icount
<< timers_state.icount_time_shift));

View File

@ -43,6 +43,8 @@ typedef struct TimersState {
/* Conversion factor from emulated instructions to virtual clock ticks. */
int16_t icount_time_shift;
/* Icount delta used for shift auto adjust. */
int64_t last_delta;
/* Compensate for varying guest execution speed. */
int64_t qemu_icount_bias;

View File

@ -33,8 +33,7 @@ gen_semantics = executable(
semantics_generated = custom_target(
'semantics_generated.pyinc',
output: 'semantics_generated.pyinc',
input: gen_semantics,
command: ['@INPUT@', '@OUTPUT@'],
command: [gen_semantics, '@OUTPUT@'],
)
hexagon_ss.add(semantics_generated)
@ -54,90 +53,81 @@ hexagon_ss.add(semantics_generated)
shortcode_generated = custom_target(
'shortcode_generated.h.inc',
output: 'shortcode_generated.h.inc',
input: 'gen_shortcode.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_shortcode.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(shortcode_generated)
helper_protos_generated = custom_target(
'helper_protos_generated.h.inc',
output: 'helper_protos_generated.h.inc',
input: 'gen_helper_protos.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
command: [python, files('gen_helper_protos.py'), semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
)
hexagon_ss.add(helper_protos_generated)
tcg_funcs_generated = custom_target(
'tcg_funcs_generated.c.inc',
output: 'tcg_funcs_generated.c.inc',
input: 'gen_tcg_funcs.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
command: [python, files('gen_tcg_funcs.py'), semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
)
hexagon_ss.add(tcg_funcs_generated)
tcg_func_table_generated = custom_target(
'tcg_func_table_generated.c.inc',
output: 'tcg_func_table_generated.c.inc',
input: 'gen_tcg_func_table.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_tcg_func_table.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(tcg_func_table_generated)
helper_funcs_generated = custom_target(
'helper_funcs_generated.c.inc',
output: 'helper_funcs_generated.c.inc',
input: 'gen_helper_funcs.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def, gen_tcg_h],
command: [python, '@INPUT@', semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
command: [python, files('gen_helper_funcs.py'), semantics_generated, attribs_def, gen_tcg_h, '@OUTPUT@'],
)
hexagon_ss.add(helper_funcs_generated)
printinsn_generated = custom_target(
'printinsn_generated.h.inc',
output: 'printinsn_generated.h.inc',
input: 'gen_printinsn.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_printinsn.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(printinsn_generated)
op_regs_generated = custom_target(
'op_regs_generated.h.inc',
output: 'op_regs_generated.h.inc',
input: 'gen_op_regs.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_op_regs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(op_regs_generated)
op_attribs_generated = custom_target(
'op_attribs_generated.h.inc',
output: 'op_attribs_generated.h.inc',
input: 'gen_op_attribs.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_op_attribs.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(op_attribs_generated)
opcodes_def_generated = custom_target(
'opcodes_def_generated.h.inc',
output: 'opcodes_def_generated.h.inc',
input: 'gen_opcodes_def.py',
depends: [semantics_generated],
depend_files: [hex_common_py, attribs_def],
command: [python, '@INPUT@', semantics_generated, attribs_def, '@OUTPUT@'],
command: [python, files('gen_opcodes_def.py'), semantics_generated, attribs_def, '@OUTPUT@'],
)
hexagon_ss.add(opcodes_def_generated)
@ -154,8 +144,7 @@ gen_dectree_import = executable(
iset_py = custom_target(
'iset.py',
output: 'iset.py',
input: gen_dectree_import,
command: ['@INPUT@', '@OUTPUT@'],
command: [gen_dectree_import, '@OUTPUT@'],
)
hexagon_ss.add(iset_py)
@ -166,9 +155,8 @@ hexagon_ss.add(iset_py)
dectree_generated = custom_target(
'dectree_generated.h.inc',
output: 'dectree_generated.h.inc',
input: 'dectree.py',
depends: [iset_py],
command: ['PYTHONPATH=' + meson.current_build_dir(), '@INPUT@', '@OUTPUT@'],
command: ['env', 'PYTHONPATH=' + meson.current_build_dir(), files('dectree.py'), '@OUTPUT@'],
)
hexagon_ss.add(dectree_generated)

View File

@ -5061,6 +5061,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
gen_jr(s, s->T0);
break;
case 3: /* lcall Ev */
if (mod == 3) {
goto illegal_op;
}
gen_op_ld_v(s, ot, s->T1, s->A0);
gen_add_A0_im(s, 1 << ot);
gen_op_ld_v(s, MO_16, s->T0, s->A0);
@ -5088,6 +5091,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
gen_jr(s, s->T0);
break;
case 5: /* ljmp Ev */
if (mod == 3) {
goto illegal_op;
}
gen_op_ld_v(s, ot, s->T1, s->A0);
gen_add_A0_im(s, 1 << ot);
gen_op_ld_v(s, MO_16, s->T0, s->A0);

View File

@ -884,6 +884,18 @@ static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a)
gen_illegal_exception(dc);
} else {
TCGv spr = tcg_temp_new();
if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
gen_io_start();
if (dc->delayed_branch) {
tcg_gen_mov_tl(cpu_pc, jmp_pc);
tcg_gen_discard_tl(jmp_pc);
} else {
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next + 4);
}
dc->base.is_jmp = DISAS_EXIT;
}
tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k);
gen_helper_mfspr(cpu_R(dc, a->d), cpu_env, cpu_R(dc, a->d), spr);
tcg_temp_free(spr);
@ -898,6 +910,9 @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a)
} else {
TCGv spr;
if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
gen_io_start();
}
/* For SR, we will need to exit the TB to recognize the new
* exception state. For NPC, in theory this counts as a branch
* (although the SPR only exists for use by an ICE). Save all