From: Aurelien Jarno <aurelien@aurel32.net>
To: qemu-devel@nongnu.org
Cc: Alexander Graf <agraf@suse.de>,
Aurelien Jarno <aurelien@aurel32.net>,
Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH v2 15/16] target-s390x: use softmmu functions for mvcp/mvcs
Date: Wed, 3 Jun 2015 23:09:55 +0200 [thread overview]
Message-ID: <1433365796-1118-16-git-send-email-aurelien@aurel32.net> (raw)
In-Reply-To: <1433365796-1118-1-git-send-email-aurelien@aurel32.net>
mvcp and mvcs helper get access to the physical memory by a call to
mmu_translate for the virtual to real conversion and then using ldb_phys
and stb_phys to physically access the data. In practice this is quite
slow because it bypasses the QEMU softmmu TLB and because stb_phys calls
try to invalidate the corresponding memory for each access.
Instead use cpu_ldb_{primary,secondary} for the loads and
cpu_stb_{primary,secondary} for the stores. Ideally this should be
further optimized by a call to memcpy, but that already improves the
boot time of a guest by a factor 1.8.
Cc: Alexander Graf <agraf@suse.de>
Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
target-s390x/mem_helper.c | 53 ++++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 33 deletions(-)
diff --git a/target-s390x/mem_helper.c b/target-s390x/mem_helper.c
index 30a2a6d..04500ab 100644
--- a/target-s390x/mem_helper.c
+++ b/target-s390x/mem_helper.c
@@ -1015,59 +1015,46 @@ uint32_t HELPER(csp)(CPUS390XState *env, uint32_t r1, uint64_t r2)
return cc;
}
-static uint32_t mvc_asc(CPUS390XState *env, int64_t l, uint64_t a1,
- uint64_t mode1, uint64_t a2, uint64_t mode2)
+uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
{
- CPUState *cs = CPU(s390_env_get_cpu(env));
- target_ulong src, dest;
- int flags, cc = 0, i;
+ int cc = 0, i;
- if (!l) {
- return 0;
- } else if (l > 256) {
+ HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n",
+ __func__, l, a1, a2);
+
+ if (l > 256) {
/* max 256 */
l = 256;
cc = 3;
}
- if (mmu_translate(env, a1, 1, mode1, &dest, &flags, true)) {
- cpu_loop_exit(CPU(s390_env_get_cpu(env)));
- }
- dest |= a1 & ~TARGET_PAGE_MASK;
-
- if (mmu_translate(env, a2, 0, mode2, &src, &flags, true)) {
- cpu_loop_exit(CPU(s390_env_get_cpu(env)));
- }
- src |= a2 & ~TARGET_PAGE_MASK;
-
/* XXX replace w/ memcpy */
for (i = 0; i < l; i++) {
- /* XXX be more clever */
- if ((((dest + i) & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) ||
- (((src + i) & TARGET_PAGE_MASK) != (src & TARGET_PAGE_MASK))) {
- mvc_asc(env, l - i, a1 + i, mode1, a2 + i, mode2);
- break;
- }
- stb_phys(cs->as, dest + i, ldub_phys(cs->as, src + i));
+ cpu_stb_secondary(env, a1 + i, cpu_ldub_primary(env, a2 + i));
}
return cc;
}
-uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
+uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
{
+ int cc = 0, i;
+
HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n",
__func__, l, a1, a2);
- return mvc_asc(env, l, a1, PSW_ASC_SECONDARY, a2, PSW_ASC_PRIMARY);
-}
+ if (l > 256) {
+ /* max 256 */
+ l = 256;
+ cc = 3;
+ }
-uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
-{
- HELPER_LOG("%s: %16" PRIx64 " %16" PRIx64 " %16" PRIx64 "\n",
- __func__, l, a1, a2);
+ /* XXX replace w/ memcpy */
+ for (i = 0; i < l; i++) {
+ cpu_stb_primary(env, a1 + i, cpu_ldub_secondary(env, a2 + i));
+ }
- return mvc_asc(env, l, a1, PSW_ASC_PRIMARY, a2, PSW_ASC_SECONDARY);
+ return cc;
}
/* invalidate pte */
--
2.1.4
next prev parent reply other threads:[~2015-06-03 21:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-03 21:09 [Qemu-devel] [PATCH v2 00/16] fixes and improvements Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 01/16] target-s390x: fix exception for invalid operation code Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 02/16] target-s390x: fix CLGIT instruction Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 03/16] target-s390x: change CHRL and CGHRL format to RIL-b Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 04/16] target-s390x: move STORE CLOCK FAST to the correct facility Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 05/16] target-s390x: move SET DFP ROUNDING MODE " Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 06/16] target-s390x: implement LOAD FP INTEGER instructions Aurelien Jarno
2015-06-03 22:26 ` Richard Henderson
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 07/16] target-s390x: implement TRANSLATE AND TEST instruction Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 08/16] target-s390x: implement TRANSLATE EXTENDED instruction Aurelien Jarno
2015-06-03 21:37 ` Richard Henderson
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 09/16] target-s390x: implement LPDFR and LNDFR instructions Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 10/16] target-s390x: implement miscellaneous-instruction-extensions facility Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 11/16] target-s390x: implement load-and-trap facility Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 12/16] target-s390x: implement high-word facility Aurelien Jarno
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 13/16] target-s390x: add a cpu_mmu_idx_to_asc function Aurelien Jarno
2015-06-03 21:40 ` Richard Henderson
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 14/16] target-s390x: support non current ASC in s390_cpu_handle_mmu_fault Aurelien Jarno
2015-06-03 21:42 ` Richard Henderson
2015-06-03 21:09 ` Aurelien Jarno [this message]
2015-06-03 22:06 ` [Qemu-devel] [PATCH v2 15/16] target-s390x: use softmmu functions for mvcp/mvcs Richard Henderson
2015-06-03 21:09 ` [Qemu-devel] [PATCH v2 16/16] target-s390x: fix MVC instruction when areas overlap Aurelien Jarno
2015-06-03 21:54 ` Richard Henderson
2015-06-03 22:29 ` [Qemu-devel] [PATCH v2 00/16] fixes and improvements Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1433365796-1118-16-git-send-email-aurelien@aurel32.net \
--to=aurelien@aurel32.net \
--cc=agraf@suse.de \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).