qemu.git
10 months agomigration: Rephrase message on failure to save / load Xen device state
Markus Armbruster [Mon, 13 May 2024 14:17:02 +0000 (16:17 +0200)]
migration: Rephrase message on failure to save / load Xen device state

Functions that use an Error **errp parameter to return errors should
not also report them to the user, because reporting is the caller's
job.  When the caller does, the error is reported twice.  When it
doesn't (because it recovered from the error), there is no error to
report, i.e. the report is bogus.

qmp_xen_save_devices_state() and qmp_xen_load_devices_state() violate
this principle: they call qemu_save_device_state() and
qemu_loadvm_state(), which call error_report_err().

I wish I could clean this up now, but migration's error reporting is
too complicated (confused?) for me to mess with it.

Instead, I'm merely improving the error reported by
qmp_xen_load_devices_state() and qmp_xen_load_devices_state() to the
QMP core from

    An IO error has occurred

to
    saving Xen device state failed

and

    loading Xen device state failed

respectively.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240513141703.549874-6-armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Acked-by: Fabiano Rosas <farosas@suse.de>
Acked-by: Peter Xu <peterx@redhat.com>
10 months agocpus: Improve error messages on memsave, pmemsave write error
Markus Armbruster [Mon, 13 May 2024 14:17:01 +0000 (16:17 +0200)]
cpus: Improve error messages on memsave, pmemsave write error

qmp_memsave() and qmp_pmemsave() report fwrite() error as

    An IO error has occurred

Improve this to

    writing memory to '<filename>' failed

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240513141703.549874-5-armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10 months agoblock/vmdk: Improve error messages on extent write error
Markus Armbruster [Mon, 13 May 2024 14:17:00 +0000 (16:17 +0200)]
block/vmdk: Improve error messages on extent write error

vmdk_init_extent() reports blk_co_pwrite() failure to its caller as

    An IO error has occurred

The errno code returned by blk_co_pwrite() is lost.

Improve this to

    failed to write VMDK <what>: <description of errno>

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240513141703.549874-4-armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10 months agodump/win_dump: Improve error messages on write error
Markus Armbruster [Mon, 13 May 2024 14:16:59 +0000 (16:16 +0200)]
dump/win_dump: Improve error messages on write error

create_win_dump() and write_run report qemu_write_full() failure to
their callers as

    An IO error has occurred

The errno set by qemu_write_full() is lost.

Improve this to

    win-dump: failed to write header: <description of errno>

and

    win-dump: failed to save memory: <description of errno>

This matches how dump.c reports similar errors.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240513141703.549874-3-armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10 months agoblock: Improve error message when external snapshot can't flush
Markus Armbruster [Mon, 13 May 2024 14:16:58 +0000 (16:16 +0200)]
block: Improve error message when external snapshot can't flush

external_snapshot_action() reports bdrv_flush() failure to its caller
as

    An IO error has occurred

The errno code returned by bdrv_flush() is lost.

Improve this to

    Write to node '<device or node name>' failed: <description of errno>

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240513141703.549874-2-armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10 months agoMerge tag 'pull-lu-20240526' of https://gitlab.com/rth7680/qemu into staging
Richard Henderson [Mon, 27 May 2024 00:51:00 +0000 (17:51 -0700)]
Merge tag 'pull-lu-20240526' of https://gitlab.com/rth7680/qemu into staging

target/i386: Introduce X86Access and use for xsave and friends
linux-user/i386: Fix allocation and alignment of fp state in signal frame

# -----BEGIN PGP SIGNATURE-----
#
# iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmZT2GwdHHJpY2hhcmQu
# aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV87pQf9F/cmrKQG1mVWKmJd
# MI7l63lbxejdgAADv1nmro+oapCsJSaQeUSrYp904ydqJjVfBJkaoXfknGsvxrNA
# oW7nEuYt0sBKdaBUKhYpMOJ3ivfw7lVVMJmjNv9ngZRhW+WOoJrBHoleUkVLiM7D
# rxkMLL+LQ7BR9i0Lv1unorOkqUPGNOnEd45qRn6k1g/Qnqi8SNMzxFwO8+232u8m
# EG9un/oh4mKPyb5vSg3Y4JLg+yDKCRScBqBU1wcKFe1u+umBkv2BNcU+k62AJh1q
# bv8i1n+X/dFAd1aj0NEupi04EOZIof5m3T4YIWg7M4I94NiFWNZ18vgskkmiO+Mo
# 0KPd/A==
# =sYrE
# -----END PGP SIGNATURE-----
# gpg: Signature made Sun 26 May 2024 05:48:44 PM PDT
# gpg:                using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F
# gpg:                issuer "richard.henderson@linaro.org"
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [ultimate]

* tag 'pull-lu-20240526' of https://gitlab.com/rth7680/qemu: (28 commits)
  target/i386: Pass host pointer and size to cpu_x86_{xsave,xrstor}
  target/i386: Pass host pointer and size to cpu_x86_{fxsave,fxrstor}
  target/i386: Pass host pointer and size to cpu_x86_{fsave,frstor}
  target/i386: Convert do_xrstor to X86Access
  target/i386: Convert do_xsave to X86Access
  linux-user/i386: Honor xfeatures in xrstor_sigcontext
  linux-user/i386: Fix allocation and alignment of fp state
  linux-user/i386: Return boolean success from xrstor_sigcontext
  linux-user/i386: Return boolean success from restore_sigcontext
  linux-user/i386: Fix -mregparm=3 for signal delivery
  linux-user/i386: Split out struct target_fregs_state
  linux-user/i386: Replace target_fpstate_fxsave with X86LegacyXSaveArea
  linux-user/i386: Remove xfeatures from target_fpstate_fxsave
  linux-user/i386: Drop xfeatures_size from sigcontext arithmetic
  target/i386: Add {hw,sw}_reserved to X86LegacyXSaveArea
  target/i386: Add rbfm argument to cpu_x86_{xsave,xrstor}
  target/i386: Split out do_xsave_chk
  target/i386: Convert do_xrstor_* to X86Access
  target/i386: Convert do_xsave_* to X86Access
  tagret/i386: Convert do_fxsave, do_fxrstor to X86Access
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Pass host pointer and size to cpu_x86_{xsave,xrstor}
Richard Henderson [Tue, 9 Apr 2024 04:04:19 +0000 (18:04 -1000)]
target/i386: Pass host pointer and size to cpu_x86_{xsave,xrstor}

We have already validated the memory region in the course of
validating the signal frame.  No need to do it again within
the helper function.

In addition, return failure when the header contains invalid
xstate_bv.  The kernel handles this via exception handling
within XSTATE_OP within xrstor_from_user_sigframe.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Pass host pointer and size to cpu_x86_{fxsave,fxrstor}
Richard Henderson [Tue, 9 Apr 2024 03:57:11 +0000 (17:57 -1000)]
target/i386: Pass host pointer and size to cpu_x86_{fxsave,fxrstor}

We have already validated the memory region in the course of
validating the signal frame.  No need to do it again within
the helper function.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Pass host pointer and size to cpu_x86_{fsave,frstor}
Richard Henderson [Tue, 9 Apr 2024 03:31:05 +0000 (17:31 -1000)]
target/i386: Pass host pointer and size to cpu_x86_{fsave,frstor}

We have already validated the memory region in the course of
validating the signal frame.  No need to do it again within
the helper function.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xrstor to X86Access
Richard Henderson [Tue, 9 Apr 2024 02:07:05 +0000 (16:07 -1000)]
target/i386: Convert do_xrstor to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xsave to X86Access
Richard Henderson [Tue, 9 Apr 2024 01:05:28 +0000 (15:05 -1000)]
target/i386: Convert do_xsave to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Honor xfeatures in xrstor_sigcontext
Richard Henderson [Tue, 9 Apr 2024 00:51:54 +0000 (14:51 -1000)]
linux-user/i386: Honor xfeatures in xrstor_sigcontext

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Fix allocation and alignment of fp state
Richard Henderson [Tue, 9 Apr 2024 00:30:30 +0000 (14:30 -1000)]
linux-user/i386: Fix allocation and alignment of fp state

For modern cpus, the kernel uses xsave to store all extra
cpu state across the signal handler.  For xsave/xrstor to
work, the pointer must be 64 byte aligned.  Moreover, the
regular part of the signal frame must be 16 byte aligned.

Attempt to mirror the kernel code as much as possible.
Use enum FPStateKind instead of use_xsave() and use_fxsr().

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1648
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Return boolean success from xrstor_sigcontext
Richard Henderson [Mon, 8 Apr 2024 23:15:03 +0000 (13:15 -1000)]
linux-user/i386: Return boolean success from xrstor_sigcontext

Invert the sense of the return value and use bool.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Return boolean success from restore_sigcontext
Richard Henderson [Mon, 8 Apr 2024 23:07:54 +0000 (13:07 -1000)]
linux-user/i386: Return boolean success from restore_sigcontext

Invert the sense of the return value and use bool.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Fix -mregparm=3 for signal delivery
Richard Henderson [Mon, 8 Apr 2024 21:51:53 +0000 (11:51 -1000)]
linux-user/i386: Fix -mregparm=3 for signal delivery

Since v2.6.19, the kernel has supported -mregparm=3.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Split out struct target_fregs_state
Richard Henderson [Mon, 8 Apr 2024 20:53:55 +0000 (10:53 -1000)]
linux-user/i386: Split out struct target_fregs_state

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Replace target_fpstate_fxsave with X86LegacyXSaveArea
Richard Henderson [Mon, 8 Apr 2024 20:33:54 +0000 (10:33 -1000)]
linux-user/i386: Replace target_fpstate_fxsave with X86LegacyXSaveArea

Use the structure definition from target/i386/cpu.h.
The only minor quirk is re-casting the sw_reserved
area to the OS specific struct target_fpx_sw_bytes.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Remove xfeatures from target_fpstate_fxsave
Richard Henderson [Mon, 8 Apr 2024 20:25:47 +0000 (10:25 -1000)]
linux-user/i386: Remove xfeatures from target_fpstate_fxsave

This is easily computed by advancing past the structure.
At the same time, replace the magic number "64".

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agolinux-user/i386: Drop xfeatures_size from sigcontext arithmetic
Richard Henderson [Mon, 8 Apr 2024 20:22:32 +0000 (10:22 -1000)]
linux-user/i386: Drop xfeatures_size from sigcontext arithmetic

This is subtracting sizeof(target_fpstate_fxsave) in
TARGET_FXSAVE_SIZE, then adding it again via &fxsave->xfeatures.
Perform the same computation using xstate_size alone.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Add {hw,sw}_reserved to X86LegacyXSaveArea
Richard Henderson [Mon, 8 Apr 2024 19:55:21 +0000 (09:55 -1000)]
target/i386: Add {hw,sw}_reserved to X86LegacyXSaveArea

This completes the 512 byte structure, allowing the union to
be removed.  Assert that the structure layout is as expected.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Add rbfm argument to cpu_x86_{xsave,xrstor}
Richard Henderson [Mon, 8 Apr 2024 19:48:26 +0000 (09:48 -1000)]
target/i386: Add rbfm argument to cpu_x86_{xsave,xrstor}

For now, continue to pass all 1's from signal.c.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Split out do_xsave_chk
Richard Henderson [Mon, 8 Apr 2024 19:45:13 +0000 (09:45 -1000)]
target/i386: Split out do_xsave_chk

This path is not required by user-only, and can in fact
be shared between xsave and xrstor.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xrstor_* to X86Access
Richard Henderson [Mon, 8 Apr 2024 19:14:47 +0000 (09:14 -1000)]
target/i386: Convert do_xrstor_* to X86Access

The body of do_xrstor is now fully converted.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xsave_* to X86Access
Richard Henderson [Mon, 8 Apr 2024 19:01:58 +0000 (09:01 -1000)]
target/i386: Convert do_xsave_* to X86Access

The body of do_xsave is now fully converted.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotagret/i386: Convert do_fxsave, do_fxrstor to X86Access
Richard Henderson [Mon, 8 Apr 2024 18:44:37 +0000 (08:44 -1000)]
tagret/i386: Convert do_fxsave, do_fxrstor to X86Access

Move the alignment fault from do_* to helper_*, as it need
not apply to usage from within user-only signal handling.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xrstor_{fpu,mxcr,sse} to X86Access
Richard Henderson [Mon, 8 Apr 2024 18:33:29 +0000 (08:33 -1000)]
target/i386: Convert do_xrstor_{fpu,mxcr,sse} to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_xsave_{fpu,mxcr,sse} to X86Access
Richard Henderson [Mon, 8 Apr 2024 17:58:42 +0000 (07:58 -1000)]
target/i386: Convert do_xsave_{fpu,mxcr,sse} to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_fsave, do_frstor to X86Access
Richard Henderson [Mon, 8 Apr 2024 10:35:06 +0000 (00:35 -1000)]
target/i386: Convert do_fsave, do_frstor to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_fstenv to X86Access
Richard Henderson [Mon, 8 Apr 2024 10:23:22 +0000 (00:23 -1000)]
target/i386: Convert do_fstenv to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_fldenv to X86Access
Richard Henderson [Mon, 8 Apr 2024 10:14:48 +0000 (00:14 -1000)]
target/i386: Convert do_fldenv to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert helper_{fbld,fbst}_ST0 to X86Access
Richard Henderson [Mon, 8 Apr 2024 09:58:17 +0000 (23:58 -1000)]
target/i386: Convert helper_{fbld,fbst}_ST0 to X86Access

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Convert do_fldt, do_fstt to X86Access
Richard Henderson [Mon, 8 Apr 2024 09:50:46 +0000 (23:50 -1000)]
target/i386: Convert do_fldt, do_fstt to X86Access

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/i386: Add tcg/access.[ch]
Richard Henderson [Mon, 8 Apr 2024 09:26:18 +0000 (23:26 -1000)]
target/i386: Add tcg/access.[ch]

Provide a method to amortize page lookup across large blocks.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agoMerge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
Richard Henderson [Sat, 25 May 2024 13:53:34 +0000 (06:53 -0700)]
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging

Build system and target/i386/translate.c cleanups

# -----BEGIN PGP SIGNATURE-----
#
# iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmZRy1gUHHBib256aW5p
# QHJlZGhhdC5jb20ACgkQv/vSX3jHroMTtQf/ZQskuqZyTrDhB/uVUT8oT5JNKQNS
# GbFSgDK7jDdBeU3UmoYrlx9vfFR/mH5cA88MlusUy0SjQBNo4onD725o6Vvum/LW
# DPe5ZyE34wvOasM7KXqJsD+2SttjaVjCXN4ip+E9WL5By2TWJgrk6IgTtvAhT9cd
# LWb5OEIInaq7ZiWz3EpjmGvZd0M4mxqXi5OeDvmoFyf38xElfbWZWbfhJv+H5L1X
# stivPBtUbXOzh63NL491hUYQtiAWlow8Qcnn7CYRflb6Vdd4QPK+6W8FX5KyU2eC
# bXRXloW7wjEAC9pyiVky1SCvtNg7AVFL+9kxwiGreoZfo+/IMA+NP6pGOg==
# =hpWy
# -----END PGP SIGNATURE-----
# gpg: Signature made Sat 25 May 2024 04:28:24 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: (24 commits)
  migration: remove unnecessary zlib dependency
  meson: do not query modules before they are processed
  tcg: include dependencies in static_library()
  meson: remove unnecessary dependency
  meson: remove unnecessary reference to libm
  target/i386: remove aflag argument of gen_lea_v_seg
  target/i386: clean up repeated string operations
  target/i386: introduce gen_lea_ss_ofs
  target/i386: use mo_stacksize more
  target/i386: inline gen_add_A0_ds_seg
  target/i386: split gen_ldst_modrm for load and store
  target/i386: reg in gen_ldst_modrm is always OR_TMP0
  target/i386: raze the gen_eob* jungle
  target/i386: assert that gen_update_eip_cur and gen_update_eip_next are the same in tb_stop
  target/i386: avoid calling gen_eob_inhibit_irq before tb_stop
  target/i386: avoid calling gen_eob_syscall before tb_stop
  target/i386: document and group DISAS_* constants
  target/i386: set CC_OP in helpers if they want CC_OP_EFLAGS
  target/i386: cpu_load_eflags already sets cc_op
  target/i386: remove unnecessary gen_update_cc_op before gen_eob*
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agomigration: remove unnecessary zlib dependency
Paolo Bonzini [Fri, 24 May 2024 16:16:08 +0000 (18:16 +0200)]
migration: remove unnecessary zlib dependency

zlib code is only used by the emulators, not by the tests.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agomeson: do not query modules before they are processed
Paolo Bonzini [Fri, 24 May 2024 09:21:35 +0000 (11:21 +0200)]
meson: do not query modules before they are processed

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotcg: include dependencies in static_library()
Paolo Bonzini [Fri, 24 May 2024 08:54:50 +0000 (10:54 +0200)]
tcg: include dependencies in static_library()

This ensures that for example libffi can be reached even if it is not
in /usr/include.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agomeson: remove unnecessary dependency
Paolo Bonzini [Fri, 24 May 2024 10:06:10 +0000 (12:06 +0200)]
meson: remove unnecessary dependency

The dbus_display1_dep is not really used since all occurrences also
request gio independently.  Just list the generated sources and drop
dbus_display1_dep.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agomeson: remove unnecessary reference to libm
Paolo Bonzini [Fri, 24 May 2024 09:32:27 +0000 (11:32 +0200)]
meson: remove unnecessary reference to libm

libm is linked into all targets via libqemuutil, no need to specify it
explicitly.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: remove aflag argument of gen_lea_v_seg
Paolo Bonzini [Thu, 9 May 2024 14:59:34 +0000 (16:59 +0200)]
target/i386: remove aflag argument of gen_lea_v_seg

It is always s->aflag.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: clean up repeated string operations
Paolo Bonzini [Wed, 24 Apr 2024 14:49:09 +0000 (16:49 +0200)]
target/i386: clean up repeated string operations

Do not bother generating inline wrappers for gen_repz and gen_repz2;
use s->prefix to separate REPZ from REPNZ in the case of SCAS and
CMPS.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: introduce gen_lea_ss_ofs
Paolo Bonzini [Wed, 24 Apr 2024 14:58:15 +0000 (16:58 +0200)]
target/i386: introduce gen_lea_ss_ofs

Generalize gen_stack_A0() to include an initial add and to use an arbitrary
destination.  This is a common pattern and it is not a huge burden to
add the extra arguments to the only caller of gen_stack_A0().

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: use mo_stacksize more
Paolo Bonzini [Wed, 24 Apr 2024 14:00:54 +0000 (16:00 +0200)]
target/i386: use mo_stacksize more

Use mo_stacksize for all stack accesses, including when
a 64-bit code segment is impossible and the code is
therefore checking only for SS32(s).

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: inline gen_add_A0_ds_seg
Paolo Bonzini [Wed, 24 Apr 2024 13:31:58 +0000 (15:31 +0200)]
target/i386: inline gen_add_A0_ds_seg

It is only used in MONITOR, where a direct call of gen_lea_v_seg
is simpler, and in XLAT.  Inline it in the latter.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: split gen_ldst_modrm for load and store
Paolo Bonzini [Wed, 24 Apr 2024 13:04:13 +0000 (15:04 +0200)]
target/i386: split gen_ldst_modrm for load and store

The is_store argument of gen_ldst_modrm has only ever been passed
a constant.  Just split the function in two.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: reg in gen_ldst_modrm is always OR_TMP0
Paolo Bonzini [Wed, 24 Apr 2024 13:04:13 +0000 (15:04 +0200)]
target/i386: reg in gen_ldst_modrm is always OR_TMP0

Values other than OR_TMP0 were only ever used by MOV and MOVNTI
opcodes.  Now that these have been converted to the new decoder,
remove the argument.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: raze the gen_eob* jungle
Paolo Bonzini [Thu, 16 May 2024 21:29:53 +0000 (23:29 +0200)]
target/i386: raze the gen_eob* jungle

Make gen_eob take the DISAS_* constant as an argument, so that
it is not necessary to have wrappers around it.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: assert that gen_update_eip_cur and gen_update_eip_next are the same...
Paolo Bonzini [Thu, 16 May 2024 16:38:32 +0000 (18:38 +0200)]
target/i386: assert that gen_update_eip_cur and gen_update_eip_next are the same in tb_stop

This is an invariant now that there are no calls to gen_eob_inhibit_irq()
outside tb_stop.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: avoid calling gen_eob_inhibit_irq before tb_stop
Paolo Bonzini [Thu, 16 May 2024 16:35:55 +0000 (18:35 +0200)]
target/i386: avoid calling gen_eob_inhibit_irq before tb_stop

sti only has one exit, so it does not need to generate the
end-of-translation code inline.  It can be deferred to tb_stop.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: avoid calling gen_eob_syscall before tb_stop
Paolo Bonzini [Thu, 16 May 2024 16:46:55 +0000 (18:46 +0200)]
target/i386: avoid calling gen_eob_syscall before tb_stop

syscall and sysret only have one exit, so they do not need to
generate the end-of-translation code inline.  It can be
deferred to tb_stop.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: document and group DISAS_* constants
Paolo Bonzini [Thu, 16 May 2024 17:04:36 +0000 (19:04 +0200)]
target/i386: document and group DISAS_* constants

Place DISAS_* constants that update cpu_eip first, and
the "jump" ones last.  Add comments explaining the differences
and usage.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: set CC_OP in helpers if they want CC_OP_EFLAGS
Paolo Bonzini [Thu, 16 May 2024 21:04:28 +0000 (23:04 +0200)]
target/i386: set CC_OP in helpers if they want CC_OP_EFLAGS

Mark cc_op as clean and do not spill it at the end of the translation block.
Technically this is a tiny bit less efficient, but:

* it results in translations that are a tiny bit smaller

* for most of these instructions, it is not unlikely that they are close to
the end of the basic block, in which case cc_op would not be overwritten

* anyway the cost is probably dwarfed by that of computing flags.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: cpu_load_eflags already sets cc_op
Paolo Bonzini [Thu, 16 May 2024 21:08:40 +0000 (23:08 +0200)]
target/i386: cpu_load_eflags already sets cc_op

No need to set it again at the end of the translation block, cc_op_dirty
can be set to false.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: remove unnecessary gen_update_cc_op before gen_eob*
Paolo Bonzini [Thu, 16 May 2024 16:38:02 +0000 (18:38 +0200)]
target/i386: remove unnecessary gen_update_cc_op before gen_eob*

This is already handled in gen_eob().  Before adding another DISAS_*
case, remove the double calls.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: cleanup eob handling of RSM
Paolo Bonzini [Thu, 16 May 2024 16:43:44 +0000 (18:43 +0200)]
target/i386: cleanup eob handling of RSM

gen_helper_rsm cannot generate an exception, and reloads the flags.
So there's no need to spill cc_op and update cpu_eip, but on the
other hand cc_op must be reset to CC_OP_EFLAGS before returning.

It all works by chance, because by spilling cc_op before the call
to the helper, it becomes non-dirty and gen_eob will not overwrite
the CC_OP_EFLAGS value that is placed there by the helper.  But
let's clean it up.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: no single-step exception after MOV or POP SS
Paolo Bonzini [Sat, 25 May 2024 08:03:22 +0000 (10:03 +0200)]
target/i386: no single-step exception after MOV or POP SS

Intel SDM 18.3.1.4 "If an occurrence of the MOV or POP instruction
loads the SS register executes with EFLAGS.TF = 1, no single-step debug
exception occurs following the MOV or POP instruction."

Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agotarget/i386: disable jmp_opt if EFLAGS.RF is 1
Paolo Bonzini [Fri, 24 May 2024 15:17:47 +0000 (17:17 +0200)]
target/i386: disable jmp_opt if EFLAGS.RF is 1

If EFLAGS.RF is 1, special processing in gen_eob_worker() is needed and
therefore goto_tb cannot be used.

Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agoconfigure: move -mcx16 flag out of CPU_CFLAGS
Artyom Kunakovsky [Thu, 23 May 2024 05:11:18 +0000 (08:11 +0300)]
configure: move -mcx16 flag out of CPU_CFLAGS

The point of CPU_CFLAGS is really just to select the appropriate multilib,
for example for library linking tests, and -mcx16 is not needed for
that purpose.

Furthermore, if -mcx16 is part of QEMU's choice of a basic x86_64
instruction set, it should be applied to cross-compiled x86_64 code too;
it is plausible that tests/tcg would want to cover cmpxchg16b as well,
for example.  In the end this makes just as much sense as a per sub-build
tweak, so move the flag to meson.build and cross_cc_cflags_x86_64.

This leaves out contrib/plugins, which would fail when attempting to use
__sync_val_compare_and_swap_16 (note it does not do yet); while minor,
this *is* a disadvantage of this change.  But building contrib/plugins
with a Makefile instead of meson.build is something self-inflicted just
for the sake of showing that it can be done, and if this kind of papercut
started becoming a problem we could make the directory part of the meson
build.  Until then, we can live with the limitation.

Signed-off-by: Artyom Kunakovsky <artyomkunakovsky@gmail.com>
Message-ID: <20240523051118.29367-1-artyomkunakovsky@gmail.com>
[rewrite commit message, remove from configure. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
10 months agoMerge tag 'pull-ppc-for-9.1-1-20240524-1' of https://gitlab.com/npiggin/qemu into...
Richard Henderson [Fri, 24 May 2024 05:09:59 +0000 (22:09 -0700)]
Merge tag 'pull-ppc-for-9.1-1-20240524-1' of https://gitlab.com/npiggin/qemu into staging

*** NOTE ***
This replaces the previous PR for tags/pull-ppc-for-9.1-1-20240524

* Fix an interesting TLB invalidate race
* Implement more instructions with decodetree
* Add the POWER8/9/10 BHRB facility
* Add missing instructions, registers, SMT support
* First round of a big MMU xlate cleanup

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCgAdFiEETkN92lZhb0MpsKeVZ7MCdqhiHK4FAmZP1bsACgkQZ7MCdqhi
# HK7TuQ/7BQugpF2yOYroQmo0Yl4RPfFp6ACqfYQgehcGegg3SWpEselTeOJla3G9
# UyVd0mlWf7DciYi61qit/WyLOeuRXMtRjrnFLV2wz9o7D/Ey5/aLQfUL4oCDt/i2
# hmmq3ZAcr7WWxaz338pLJx9gIVjaNiqSoRz9HgHNkQq0pxkbEo1eSjZ6QLSvqYC2
# dwtJHywFrHNo14aq1Nc7PZ5MFxNN6t7hm7KRHKFrt8Obar15n64MSHyRvMzHI9EO
# RgNzz9/qe5yvJ4kmaNiZjntxojXCBUhhlCTtaDIG1LDBc2yNG5VWQUnwThvyNxxX
# h+Ia4Pv7blXikQ6RuqsvFyrLCgUvwXwBiQwiQCJyITk0asLyJVwhkUpiI/jJvOun
# AujSA/6e2pbSe4RUZytkzygx2KVODrVtcSoOvo8kRw+2aTOWMv7DbfBalmWJQWgx
# 0xSeuUz22eNKEL2XbZWNM5v0OgXUXIs9BVeCqn7RB4lC2RNi72v111UPuKYq6Ijx
# SHWQMGPGu9FNBsIdriclRWXVXHpVHz/s/l8AJT8ad6E57UHVk5zCPrbFZFImvQkL
# E7xlctijeST8V5qGyBPG3M4aPoER9+6J32ORSx7KwDwr+fzkbNUXC8UUC4OjAZ+d
# 2vhie9Vs5xWq/E8gGovTymeQ4yHArobDz/j7+rrr0qeppnKLWjM=
# =jHL7
# -----END PGP SIGNATURE-----
# gpg: Signature made Thu 23 May 2024 04:48:11 PM PDT
# gpg:                using RSA key 4E437DDA56616F4329B0A79567B30276A8621CAE
# gpg: Good signature from "Nicholas Piggin <npiggin@gmail.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 4E43 7DDA 5661 6F43 29B0  A795 67B3 0276 A862 1CAE

* tag 'pull-ppc-for-9.1-1-20240524-1' of https://gitlab.com/npiggin/qemu: (72 commits)
  target/ppc: Remove pp_check() and reuse ppc_hash32_pp_prot()
  target/ppc: Move out BookE and related MMU functions from mmu_common.c
  target/ppc: Add a function to check for page protection bit
  target/ppc/mmu-radix64.c: Drop a local variable
  target/ppc/mmu-hash32.c: Drop a local variable
  target/ppc: Split off common embedded TLB init
  target/ppc: Remove id_tlbs flag from CPU env
  target/ppc: Move mmu_ctx_t type to mmu_common.c
  target/ppc: Transform ppc_jumbo_xlate() into ppc_6xx_xlate()
  target/ppc: Split off 40x cases from ppc_jumbo_xlate()
  target/ppc: Split off real mode handling from get_physical_address_wtlb()
  target/ppc: Simplify ppc_booke_xlate() part 2
  target/ppc: Simplify ppc_booke_xlate() part 1
  target/ppc: Split off BookE handling from ppc_jumbo_xlate()
  target/ppc: Remove BookE from direct store handling
  target/ppc: Don't use mmu_ctx_t in mmubooke206_get_physical_address()
  target/ppc: Don't use mmu_ctx_t in mmubooke_get_physical_address()
  target/ppc: Don't use mmu_ctx_t for mmu40x_get_physical_address()
  target/ppc: Replace hard coded constants in ppc_jumbo_xlate()
  target/ppc: Deindent ppc_jumbo_xlate()
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10 months agotarget/ppc: Remove pp_check() and reuse ppc_hash32_pp_prot()
BALATON Zoltan [Sun, 12 May 2024 23:28:09 +0000 (01:28 +0200)]
target/ppc: Remove pp_check() and reuse ppc_hash32_pp_prot()

The ppc_hash32_pp_prot() function in mmu-hash32.c is the same as
pp_check() in mmu_common.c, merge these to remove duplicated code.
Define the common function as static lnline otherwise exporting the
function from mmu-hash32.c would stop the compiler inlining it which
results in slightly lower performance.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
[np: move ppc_hash32_pp_prot inline without changing it]
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Move out BookE and related MMU functions from mmu_common.c
BALATON Zoltan [Sun, 12 May 2024 23:28:08 +0000 (01:28 +0200)]
target/ppc: Move out BookE and related MMU functions from mmu_common.c

Add a new mmu-booke.c file for BookE and related MMU bits from
mmu_common.c.

Acked-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Add a function to check for page protection bit
BALATON Zoltan [Sun, 12 May 2024 23:28:07 +0000 (01:28 +0200)]
target/ppc: Add a function to check for page protection bit

Checking if a page protection bit is set for a given access type is a
common operation. Add a function to avoid repeating the same check at
multiple places. As this relies on access type and page protection bit
values having certain relation also add an assert to ensure that this
assumption holds.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc/mmu-radix64.c: Drop a local variable
BALATON Zoltan [Sun, 12 May 2024 23:28:06 +0000 (01:28 +0200)]
target/ppc/mmu-radix64.c: Drop a local variable

The value is only used once so no need to introduce a local variable
for it.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc/mmu-hash32.c: Drop a local variable
BALATON Zoltan [Sun, 12 May 2024 23:28:05 +0000 (01:28 +0200)]
target/ppc/mmu-hash32.c: Drop a local variable

In ppc_hash32_xlate() the value of need_prop is checked in two places
but precalculating it does not help because when we reach the first
check we always return and not reach the second place so the value
will only be used once. We can drop the local variable and calculate
it when needed, which makes these checks using it similar to other
places with such checks.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split off common embedded TLB init
BALATON Zoltan [Sun, 12 May 2024 23:28:03 +0000 (01:28 +0200)]
target/ppc: Split off common embedded TLB init

Several 4xx CPUs and e200 share the same TLB settings enclosed in an
ifdef. Split it off in a common function to reduce code duplication
and the number of ifdefs.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Remove id_tlbs flag from CPU env
BALATON Zoltan [Sun, 12 May 2024 23:28:02 +0000 (01:28 +0200)]
target/ppc: Remove id_tlbs flag from CPU env

This flag for split instruction/data TLBs is only set for 6xx soft TLB
MMU model and not used otherwise so no need to have a separate flag
for that.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Move mmu_ctx_t type to mmu_common.c
BALATON Zoltan [Sun, 12 May 2024 23:28:00 +0000 (01:28 +0200)]
target/ppc: Move mmu_ctx_t type to mmu_common.c

Remove mmu_ctx_t definition from internal.h as this type is only used
within mmu_common.c.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Transform ppc_jumbo_xlate() into ppc_6xx_xlate()
BALATON Zoltan [Sun, 12 May 2024 23:27:59 +0000 (01:27 +0200)]
target/ppc: Transform ppc_jumbo_xlate() into ppc_6xx_xlate()

Now that only 6xx cases left in ppc_jumbo_xlate() we can change it
to ppc_6xx_xlate() also removing get_physical_address_wtlb().

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split off 40x cases from ppc_jumbo_xlate()
BALATON Zoltan [Sun, 12 May 2024 23:27:58 +0000 (01:27 +0200)]
target/ppc: Split off 40x cases from ppc_jumbo_xlate()

Introduce ppc_40x_xlate() to split off 40x handlning leaving only 6xx
in ppc_jumbo_xlate() now.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split off real mode handling from get_physical_address_wtlb()
BALATON Zoltan [Sun, 12 May 2024 23:27:57 +0000 (01:27 +0200)]
target/ppc: Split off real mode handling from get_physical_address_wtlb()

Add ppc_real_mode_xlate() to handle real mode translation and allow
removing this case from ppc_jumbo_xlate().

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Simplify ppc_booke_xlate() part 2
BALATON Zoltan [Sun, 12 May 2024 23:27:56 +0000 (01:27 +0200)]
target/ppc: Simplify ppc_booke_xlate() part 2

Merge the code fetch and data access cases in a common switch.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Simplify ppc_booke_xlate() part 1
BALATON Zoltan [Sun, 12 May 2024 23:27:55 +0000 (01:27 +0200)]
target/ppc: Simplify ppc_booke_xlate() part 1

Move setting error_code that appears in every case out in front and
hoist the common fall through case for BOOKE206 as well which allows
removing the nested switches.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split off BookE handling from ppc_jumbo_xlate()
BALATON Zoltan [Sun, 12 May 2024 23:27:54 +0000 (01:27 +0200)]
target/ppc: Split off BookE handling from ppc_jumbo_xlate()

Introduce ppc_booke_xlate() to handle BookE and BookE 2.06 cases to
reduce ppc_jumbo_xlate() further.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Remove BookE from direct store handling
BALATON Zoltan [Sun, 12 May 2024 23:27:53 +0000 (01:27 +0200)]
target/ppc: Remove BookE from direct store handling

As BookE never returns -4 we can drop BookE from the direct store case
in ppc_jumbo_xlate().

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Don't use mmu_ctx_t in mmubooke206_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:52 +0000 (01:27 +0200)]
target/ppc: Don't use mmu_ctx_t in mmubooke206_get_physical_address()

mmubooke206_get_physical_address() only uses the raddr and prot fields
from mmu_ctx_t. Pass these directly instead of using a ctx struct.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Don't use mmu_ctx_t in mmubooke_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:51 +0000 (01:27 +0200)]
target/ppc: Don't use mmu_ctx_t in mmubooke_get_physical_address()

mmubooke_get_physical_address() only uses the raddr and prot fields
from mmu_ctx_t. Pass these directly instead of using a ctx struct.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Don't use mmu_ctx_t for mmu40x_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:50 +0000 (01:27 +0200)]
target/ppc: Don't use mmu_ctx_t for mmu40x_get_physical_address()

mmu40x_get_physical_address() only uses the raddr and prot fields from
mmu_ctx_t. Pass these directly instead of using a ctx struct.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Replace hard coded constants in ppc_jumbo_xlate()
BALATON Zoltan [Sun, 12 May 2024 23:27:49 +0000 (01:27 +0200)]
target/ppc: Replace hard coded constants in ppc_jumbo_xlate()

The "2" in booke206_update_mas_tlb_miss() call corresponds to
MMU_INST_FETCH which is the value of access_type in this branch;
mmubooke206_esr() only checks for MMU_DATA_STORE and it's called from
code access so using MMU_DATA_LOAD here seems wrong so replace it with
access_type here as well that yields the same result. This also makes
these calls the same as the data access branch further down.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Deindent ppc_jumbo_xlate()
BALATON Zoltan [Sun, 12 May 2024 23:27:48 +0000 (01:27 +0200)]
target/ppc: Deindent ppc_jumbo_xlate()

Instead of putting a large block of code in an if, invert the
condition and return early to be able to deindent the code block.

Acked-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Fix misindented qemu_log_mask() calls
BALATON Zoltan [Sun, 12 May 2024 23:27:47 +0000 (01:27 +0200)]
target/ppc: Fix misindented qemu_log_mask() calls

Fix several qemu_log_mask() calls that are misindented.

Acked-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Inline and remove check_physical()
BALATON Zoltan [Sun, 12 May 2024 23:27:45 +0000 (01:27 +0200)]
target/ppc: Inline and remove check_physical()

This function just does two assignments and and unnecessary check that
is always true so inline it in the only caller left and remove it.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split off real mode cases in get_physical_address_wtlb()
BALATON Zoltan [Sun, 12 May 2024 23:27:44 +0000 (01:27 +0200)]
target/ppc: Split off real mode cases in get_physical_address_wtlb()

The real mode handling is identical in the remaining switch cases.
Split off these common real mode cases into a separate conditional to
leave only the else branches in the switch that are different.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Split out BookE xlate cases before checking real mode
BALATON Zoltan [Sun, 12 May 2024 23:27:43 +0000 (01:27 +0200)]
target/ppc: Split out BookE xlate cases before checking real mode

BookE does not have real mode so split off and handle it first in
get_physical_address_wtlb() before checking for real mode for other
MMU models.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Eliminate ret from mmu6xx_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:42 +0000 (01:27 +0200)]
target/ppc: Eliminate ret from mmu6xx_get_physical_address()

Return directly, which is simpler than dragging a return value through
multpile if and else blocks.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Move some debug logging in ppc6xx_tlb_check()
BALATON Zoltan [Sun, 12 May 2024 23:27:41 +0000 (01:27 +0200)]
target/ppc: Move some debug logging in ppc6xx_tlb_check()

Move the debug logging within ppc6xx_tlb_check() from after its only
call to simplify the caller.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Move else branch to avoid large if block in mmu6xx_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:40 +0000 (01:27 +0200)]
target/ppc: Move else branch to avoid large if block in mmu6xx_get_physical_address()

In mmu6xx_get_physical_address() we have a large if block with a two
line else branch that effectively returns. Invert the condition and
move the else there to allow deindenting the large if block to make
the flow easier to follow.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Introduce mmu6xx_get_physical_address()
BALATON Zoltan [Sun, 12 May 2024 23:27:39 +0000 (01:27 +0200)]
target/ppc: Introduce mmu6xx_get_physical_address()

Repurpose get_segment_6xx_tlb() to do the whole address translation
for POWERPC_MMU_SOFT_6xx MMU model by moving the BAT check there and
renaming it to match other similar functions. These are only called
once together so no need to keep these separate functions and
combining them simplifies the caller allowing further restructuring.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Drop cases for unimplemented MPC8xx MMU
BALATON Zoltan [Sun, 12 May 2024 23:27:38 +0000 (01:27 +0200)]
target/ppc: Drop cases for unimplemented MPC8xx MMU

Drop MPC8xx cases from get_physical_address_wtlb() and ppc_jumbo_xlate().
The default case would still catch this and abort the same way and
there is still a warning about it in ppc_tlb_invalidate_all() which is
called in ppc_cpu_reset_hold() so likely we never get here but to make
sure add a case to ppc_xlate() to the same effect.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Simplify checking for real mode in get_physical_address_wtlb()
BALATON Zoltan [Sun, 12 May 2024 23:27:37 +0000 (01:27 +0200)]
target/ppc: Simplify checking for real mode in get_physical_address_wtlb()

In get_physical_address_wtlb() the real_mode flag depends on either
the MSR[IR] or MSR[DR] bit depending on access_type. Extract just the
needed bit in a more straight forward way instead of doing unnecessary
computation.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Remove unneeded local variable from booke tlb checks
BALATON Zoltan [Sun, 12 May 2024 23:27:36 +0000 (01:27 +0200)]
target/ppc: Remove unneeded local variable from booke tlb checks

In mmubooke_check_tlb() and mmubooke206_check_tlb() we can assign the
value of prot2 directly to the destination, no need to have a separate
local variable for it.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Move calculation of a value closer to its usage in booke tlb checks
BALATON Zoltan [Sun, 12 May 2024 23:27:35 +0000 (01:27 +0200)]
target/ppc: Move calculation of a value closer to its usage in booke tlb checks

In mmubooke_check_tlb() and mmubooke206_check_tlb() prot2 is
calculated first but only used after an unrelated check that can
return before tha value is used. Move the calculation after the check,
closer to where it is used, to keep them together and avoid computing
it when not needed.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Remove unused helper_rac()
BALATON Zoltan [Sun, 12 May 2024 23:27:34 +0000 (01:27 +0200)]
target/ppc: Remove unused helper_rac()

The helper_rac function is defined but not used, remove it.

Fixes: 005b69fdcc (target/ppc: Remove PowerPC 601 CPUs)
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Remove unused struct 'mmu_ctx_hash32'
Dr. David Alan Gilbert [Sun, 12 May 2024 23:27:33 +0000 (01:27 +0200)]
target/ppc: Remove unused struct 'mmu_ctx_hash32'

I think it's use was removed by
Commit 5883d8b296 ("mmu-hash*: Don't use full ppc_hash{32,
64}_translate() path for get_phys_page_debug()")

Reviewed-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Dr. David Alan Gilbert <dave@treblig.org>
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: add SMT support to msgsnd broadcast
Nicholas Piggin [Mon, 5 Jun 2023 10:05:36 +0000 (20:05 +1000)]
target/ppc: add SMT support to msgsnd broadcast

msgsnd has a broadcast mode that sends hypervisor doorbells to all
threads belonging to the same core as the target. A "subcore" mode
sends to all or one thread depending on 1LPAR mode.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Implement SPRC/SPRD SPRs
Nicholas Piggin [Sun, 18 Jun 2023 09:37:07 +0000 (19:37 +1000)]
target/ppc: Implement SPRC/SPRD SPRs

This implements the POWER SPRC/SPRD SPRs, and SCRATCH0-7 registers that
can be accessed via these indirect SPRs.

SCRATCH registers only provide storage, but they are used by firmware
for low level crash and progress data, so this implementation logs
writes to the registers to help with analysis.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Implement LDBAR, TTR SPRs
Nicholas Piggin [Mon, 22 May 2023 06:23:21 +0000 (16:23 +1000)]
target/ppc: Implement LDBAR, TTR SPRs

LDBAR, TTR are a Power-specific SPRs. These simple implementations
are enough for IBM proprietary firmware for now.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Add SMT support to PTCR SPR
Nicholas Piggin [Wed, 12 Jul 2023 13:02:00 +0000 (23:02 +1000)]
target/ppc: Add SMT support to PTCR SPR

PTCR is a per-core register.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: Add SMT support to simple SPRs
Nicholas Piggin [Wed, 12 Jul 2023 12:54:40 +0000 (22:54 +1000)]
target/ppc: Add SMT support to simple SPRs

AMOR, MMCRC, HRMOR, TSCR, HMEER, RPR SPRs are per-core or per-LPAR
registers with simple (generic) implementations.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
10 months agotarget/ppc: add helper to write per-LPAR SPRs
Nicholas Piggin [Fri, 26 May 2023 17:17:38 +0000 (03:17 +1000)]
target/ppc: add helper to write per-LPAR SPRs

An SPR can be either per-thread, per-core, or per-LPAR. Per-LPAR means
per-thread or per-core, depending on 1LPAR mode.

Reviewed-by: Glenn Miles <milesg@linux.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>