From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HTML_MESSAGE,HTML_OBFUSCATE_05_10, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BDADC43603 for ; Thu, 12 Dec 2019 20:04:45 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 080FC2073B for ; Thu, 12 Dec 2019 20:04:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="d5zlIK3E" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 080FC2073B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:36828 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ifUhY-0008Mi-1e for qemu-devel@archiver.kernel.org; Thu, 12 Dec 2019 15:04:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:53363) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ifUfI-0006VW-41 for qemu-devel@nongnu.org; Thu, 12 Dec 2019 15:02:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ifUfD-0005AG-Pu for qemu-devel@nongnu.org; Thu, 12 Dec 2019 15:02:24 -0500 Received: from mail-oi1-x231.google.com ([2607:f8b0:4864:20::231]:46650) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ifUfD-00058S-Do for qemu-devel@nongnu.org; Thu, 12 Dec 2019 15:02:19 -0500 Received: by mail-oi1-x231.google.com with SMTP id a124so52602oii.13 for ; Thu, 12 Dec 2019 12:02:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=jMIXdO1/Z7+yJmCndPIsEETjR6+6gcbhj7aQYL3K0ss=; b=d5zlIK3EhgiTyUYqDXUsK5fXfIfN4ylYlmHVFM34IRzDoNfZXitPClU4n6XctPXWor jMJ+wm0Jo3d5PwgEw2olx/6S7F/j85Ekr5kWScc1XHqI1f0yCf8JQYm+FClkoUWQG7g/ VxQhTG7u+OZ8MmigkfgN8kw/x5uvKHXBva7Na2UKgY686Xt21BAJUBU72MbzxP5Rs5F6 KoJklmHXAo2jBzibRKN6PqZ0qwqOmVhxpCTPEnxDS61trv+2YuXgNTCl0iEIT7a8HeWU pWv3q+2N1Vr1tqfBAY5uIG2T+txcNse+rZ9+wNKAvpih7jEBe/GZKNyFCR4ZoUGBBOoH bAVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=jMIXdO1/Z7+yJmCndPIsEETjR6+6gcbhj7aQYL3K0ss=; b=RkuOGJ+nXmOJV5ryaaQ1T6ZsLq7XpogaMBKsRFZyyEY1OaGUDtpfkPKncT0oG4+Xu/ i4Ahm/CT8A8qO7ui6Y84p3Kch2DIX4Xv1OQ6YENliDWDRx8i7m7u+EIVT0E7+7FmXVL4 VfX508/pf5seBHZuIdVHTOTicJD9cG3bIIhfLN0yvuzVki9YWyGzFYFKeqrqOOv19hEY 9UzaXzj0An+LZAvH14TcjSNdWJ0OBIvhoy2wwinx15pZB9d6yl52yrNcmVNbrcUUHnm7 2njI3s9kheD3wZ7aCoF0zjMEoTtGNZef+kHxWejzWye9carOaQ7BusAn6Jp7AxPAPmT3 JWpQ== X-Gm-Message-State: APjAAAWuuwoUhoG/OJ8C0XEEmz/+arNDNExslyXH30OgR6Q1ZMo1RjrY XlLUaCKr9FrIaFyiuoUmyfc2WWBrSVPVi12eeRQ= X-Google-Smtp-Source: APXvYqyYnNs+XQ0TLBesJnN3ZT5Gdld82kIJGLlqCBzkW4AC4oXkDbSCbrnwg3Y639LHBci6wXu6s4Sqp/SQFl7WPKU= X-Received: by 2002:aca:bd85:: with SMTP id n127mr6317136oif.136.1576180938368; Thu, 12 Dec 2019 12:02:18 -0800 (PST) MIME-Version: 1.0 Received: by 2002:a9d:d21:0:0:0:0:0 with HTTP; Thu, 12 Dec 2019 12:02:17 -0800 (PST) In-Reply-To: <20191212040039.26546-15-richard.henderson@linaro.org> References: <20191212040039.26546-1-richard.henderson@linaro.org> <20191212040039.26546-15-richard.henderson@linaro.org> From: Aleksandar Markovic Date: Thu, 12 Dec 2019 21:02:17 +0100 Message-ID: Subject: [PATCH 14/28] cputlb: Expand cpu_ldst_useronly_template.h in user-exec.c To: Richard Henderson Content-Type: multipart/alternative; boundary="000000000000eeec4b05998738b4" X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::231 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "qemu-devel@nongnu.org" Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" --000000000000eeec4b05998738b4 Content-Type: text/plain; charset="UTF-8" On Thursday, December 12, 2019, Richard Henderson < richard.henderson@linaro.org> wrote: > With the tracing hooks, the inline functions are no longer > so simple. Reduce the amount of preprocessor obfuscation > by expanding the text of each of the functions generated. > The result is only slightly larger than the original. > > Hello, Richard. Are you talking about source code size here? I am truly interested in the size of exectutable - it should remain about the same, no? Can you perhaps confirm that? Thanks. > Signed-off-by: Richard Henderson > --- > include/exec/cpu_ldst.h | 54 +++-- > include/exec/cpu_ldst_useronly_template.h | 159 --------------- > accel/tcg/user-exec.c | 236 ++++++++++++++++++++++ > 3 files changed, 262 insertions(+), 187 deletions(-) > delete mode 100644 include/exec/cpu_ldst_useronly_template.h > > diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h > index 3b2c46bdf4..5a638fd8d6 100644 > --- a/include/exec/cpu_ldst.h > +++ b/include/exec/cpu_ldst.h > @@ -124,35 +124,33 @@ static inline void clear_helper_retaddr(void) > > /* In user-only mode we provide only the _code and _data accessors. */ > > -#define MEMSUFFIX _data > -#define DATA_SIZE 1 > -#include "exec/cpu_ldst_useronly_template.h" > +uint32_t cpu_ldub_data(CPUArchState *env, abi_ptr ptr); > +uint32_t cpu_lduw_data(CPUArchState *env, abi_ptr ptr); > +uint32_t cpu_ldl_data(CPUArchState *env, abi_ptr ptr); > +uint64_t cpu_ldq_data(CPUArchState *env, abi_ptr ptr); > +int cpu_ldsb_data(CPUArchState *env, abi_ptr ptr); > +int cpu_ldsw_data(CPUArchState *env, abi_ptr ptr); > > -#define DATA_SIZE 2 > -#include "exec/cpu_ldst_useronly_template.h" > +uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr); > +uint32_t cpu_lduw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr); > +uint32_t cpu_ldl_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr); > +uint64_t cpu_ldq_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr); > +int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr); > +int cpu_ldsw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr); > > -#define DATA_SIZE 4 > -#include "exec/cpu_ldst_useronly_template.h" > +void cpu_stb_data(CPUArchState *env, abi_ptr ptr, uint32_t val); > +void cpu_stw_data(CPUArchState *env, abi_ptr ptr, uint32_t val); > +void cpu_stl_data(CPUArchState *env, abi_ptr ptr, uint32_t val); > +void cpu_stq_data(CPUArchState *env, abi_ptr ptr, uint64_t val); > > -#define DATA_SIZE 8 > -#include "exec/cpu_ldst_useronly_template.h" > -#undef MEMSUFFIX > - > -#define MEMSUFFIX _code > -#define CODE_ACCESS > -#define DATA_SIZE 1 > -#include "exec/cpu_ldst_useronly_template.h" > - > -#define DATA_SIZE 2 > -#include "exec/cpu_ldst_useronly_template.h" > - > -#define DATA_SIZE 4 > -#include "exec/cpu_ldst_useronly_template.h" > - > -#define DATA_SIZE 8 > -#include "exec/cpu_ldst_useronly_template.h" > -#undef MEMSUFFIX > -#undef CODE_ACCESS > +void cpu_stb_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr); > +void cpu_stw_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr); > +void cpu_stl_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr); > +void cpu_stq_data_ra(CPUArchState *env, abi_ptr ptr, > + uint64_t val, uintptr_t retaddr); > > /* > * Provide the same *_mmuidx_ra interface as for softmmu. > @@ -524,6 +522,8 @@ void cpu_stq_mmuidx_ra(CPUArchState *env, abi_ptr > addr, uint64_t val, > #undef CPU_MMU_INDEX > #undef MEMSUFFIX > > +#endif /* defined(CONFIG_USER_ONLY) */ > + > uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr); > uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr); > uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr); > @@ -539,8 +539,6 @@ static inline int cpu_ldsw_code(CPUArchState *env, > abi_ptr addr) > return (int16_t)cpu_lduw_code(env, addr); > } > > -#endif /* defined(CONFIG_USER_ONLY) */ > - > /** > * tlb_vaddr_to_host: > * @env: CPUArchState > diff --git a/include/exec/cpu_ldst_useronly_template.h > b/include/exec/cpu_ldst_useronly_template.h > deleted file mode 100644 > index e5a3d1983a..0000000000 > --- a/include/exec/cpu_ldst_useronly_template.h > +++ /dev/null > @@ -1,159 +0,0 @@ > -/* > - * User-only accessor function support > - * > - * Generate inline load/store functions for one data size. > - * > - * Generate a store function as well as signed and unsigned loads. > - * > - * Not used directly but included from cpu_ldst.h. > - * > - * Copyright (c) 2015 Linaro Limited > - * > - * This library is free software; you can redistribute it and/or > - * modify it under the terms of the GNU Lesser General Public > - * License as published by the Free Software Foundation; either > - * version 2 of the License, or (at your option) any later version. > - * > - * This library is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - * Lesser General Public License for more details. > - * > - * You should have received a copy of the GNU Lesser General Public > - * License along with this library; if not, see < > http://www.gnu.org/licenses/>. > - */ > - > -#if !defined(CODE_ACCESS) > -#include "trace-root.h" > -#endif > - > -#include "trace/mem.h" > - > -#if DATA_SIZE == 8 > -#define SUFFIX q > -#define USUFFIX q > -#define DATA_TYPE uint64_t > -#define SHIFT 3 > -#elif DATA_SIZE == 4 > -#define SUFFIX l > -#define USUFFIX l > -#define DATA_TYPE uint32_t > -#define SHIFT 2 > -#elif DATA_SIZE == 2 > -#define SUFFIX w > -#define USUFFIX uw > -#define DATA_TYPE uint16_t > -#define DATA_STYPE int16_t > -#define SHIFT 1 > -#elif DATA_SIZE == 1 > -#define SUFFIX b > -#define USUFFIX ub > -#define DATA_TYPE uint8_t > -#define DATA_STYPE int8_t > -#define SHIFT 0 > -#else > -#error unsupported data size > -#endif > - > -#if DATA_SIZE == 8 > -#define RES_TYPE uint64_t > -#else > -#define RES_TYPE uint32_t > -#endif > - > -static inline RES_TYPE > -glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr) > -{ > - RES_TYPE ret; > -#ifdef CODE_ACCESS > - set_helper_retaddr(1); > - ret = glue(glue(ld, USUFFIX), _p)(g2h(ptr)); > - clear_helper_retaddr(); > -#else > - MemOp op = MO_TE | SHIFT; > - uint16_t meminfo = trace_mem_get_info(op, MMU_USER_IDX, false); > - trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > - ret = glue(glue(ld, USUFFIX), _p)(g2h(ptr)); > -#endif > - return ret; > -} > - > -#ifndef CODE_ACCESS > -static inline RES_TYPE > -glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env, > - abi_ptr ptr, > - uintptr_t retaddr) > -{ > - RES_TYPE ret; > - set_helper_retaddr(retaddr); > - ret = glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(env, ptr); > - clear_helper_retaddr(); > - return ret; > -} > -#endif > - > -#if DATA_SIZE <= 2 > -static inline int > -glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr) > -{ > - int ret; > -#ifdef CODE_ACCESS > - set_helper_retaddr(1); > - ret = glue(glue(lds, SUFFIX), _p)(g2h(ptr)); > - clear_helper_retaddr(); > -#else > - MemOp op = MO_TE | MO_SIGN | SHIFT; > - uint16_t meminfo = trace_mem_get_info(op, MMU_USER_IDX, false); > - trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > - ret = glue(glue(lds, SUFFIX), _p)(g2h(ptr)); > - qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > -#endif > - return ret; > -} > - > -#ifndef CODE_ACCESS > -static inline int > -glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env, > - abi_ptr ptr, > - uintptr_t retaddr) > -{ > - int ret; > - set_helper_retaddr(retaddr); > - ret = glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(env, ptr); > - clear_helper_retaddr(); > - return ret; > -} > -#endif /* CODE_ACCESS */ > -#endif /* DATA_SIZE <= 2 */ > - > -#ifndef CODE_ACCESS > -static inline void > -glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr, > - RES_TYPE v) > -{ > - MemOp op = MO_TE | SHIFT; > - uint16_t meminfo = trace_mem_get_info(op, MMU_USER_IDX, true); > - trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > - glue(glue(st, SUFFIX), _p)(g2h(ptr), v); > - qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > -} > - > -static inline void > -glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env, > - abi_ptr ptr, > - RES_TYPE v, > - uintptr_t retaddr) > -{ > - set_helper_retaddr(retaddr); > - glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(env, ptr, v); > - clear_helper_retaddr(); > -} > -#endif > - > -#undef RES_TYPE > -#undef DATA_TYPE > -#undef DATA_STYPE > -#undef SUFFIX > -#undef USUFFIX > -#undef DATA_SIZE > -#undef SHIFT > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c > index b09f7a1577..79da4219bb 100644 > --- a/accel/tcg/user-exec.c > +++ b/accel/tcg/user-exec.c > @@ -26,6 +26,8 @@ > #include "translate-all.h" > #include "exec/helper-proto.h" > #include "qemu/atomic128.h" > +#include "trace-root.h" > +#include "trace/mem.h" > > #undef EAX > #undef ECX > @@ -734,6 +736,240 @@ int cpu_signal_handler(int host_signum, void *pinfo, > > /* The softmmu versions of these helpers are in cputlb.c. */ > > +uint32_t cpu_ldub_data(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + uint16_t meminfo = trace_mem_get_info(MO_UB, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = ldub_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +int cpu_ldsb_data(CPUArchState *env, abi_ptr ptr) > +{ > + int ret; > + uint16_t meminfo = trace_mem_get_info(MO_SB, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = ldsb_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +uint32_t cpu_lduw_data(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + uint16_t meminfo = trace_mem_get_info(MO_TEUW, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = lduw_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +int cpu_ldsw_data(CPUArchState *env, abi_ptr ptr) > +{ > + int ret; > + uint16_t meminfo = trace_mem_get_info(MO_TESW, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = ldsw_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +uint32_t cpu_ldl_data(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + uint16_t meminfo = trace_mem_get_info(MO_TEUL, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = ldl_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +uint64_t cpu_ldq_data(CPUArchState *env, abi_ptr ptr) > +{ > + uint64_t ret; > + uint16_t meminfo = trace_mem_get_info(MO_TEQ, MMU_USER_IDX, false); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + ret = ldq_p(g2h(ptr)); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > + return ret; > +} > + > +uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_ldub_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr) > +{ > + int ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_ldsb_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint32_t cpu_lduw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_lduw_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +int cpu_ldsw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr) > +{ > + int ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_ldsw_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint32_t cpu_ldl_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_ldl_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint64_t cpu_ldq_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t > retaddr) > +{ > + uint64_t ret; > + > + set_helper_retaddr(retaddr); > + ret = cpu_ldq_data(env, ptr); > + clear_helper_retaddr(); > + return ret; > +} > + > +void cpu_stb_data(CPUArchState *env, abi_ptr ptr, uint32_t val) > +{ > + uint16_t meminfo = trace_mem_get_info(MO_UB, MMU_USER_IDX, true); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + stb_p(g2h(ptr), val); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > +} > + > +void cpu_stw_data(CPUArchState *env, abi_ptr ptr, uint32_t val) > +{ > + uint16_t meminfo = trace_mem_get_info(MO_TEUW, MMU_USER_IDX, true); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + stw_p(g2h(ptr), val); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > +} > + > +void cpu_stl_data(CPUArchState *env, abi_ptr ptr, uint32_t val) > +{ > + uint16_t meminfo = trace_mem_get_info(MO_TEUL, MMU_USER_IDX, true); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + stl_p(g2h(ptr), val); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > +} > + > +void cpu_stq_data(CPUArchState *env, abi_ptr ptr, uint64_t val) > +{ > + uint16_t meminfo = trace_mem_get_info(MO_TEQ, MMU_USER_IDX, true); > + > + trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo); > + stq_p(g2h(ptr), val); > + qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); > +} > + > +void cpu_stb_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr) > +{ > + set_helper_retaddr(retaddr); > + cpu_stb_data(env, ptr, val); > + clear_helper_retaddr(); > +} > + > +void cpu_stw_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr) > +{ > + set_helper_retaddr(retaddr); > + cpu_stw_data(env, ptr, val); > + clear_helper_retaddr(); > +} > + > +void cpu_stl_data_ra(CPUArchState *env, abi_ptr ptr, > + uint32_t val, uintptr_t retaddr) > +{ > + set_helper_retaddr(retaddr); > + cpu_stl_data(env, ptr, val); > + clear_helper_retaddr(); > +} > + > +void cpu_stq_data_ra(CPUArchState *env, abi_ptr ptr, > + uint64_t val, uintptr_t retaddr) > +{ > + set_helper_retaddr(retaddr); > + cpu_stq_data(env, ptr, val); > + clear_helper_retaddr(); > +} > + > +uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(1); > + ret = ldub_p(g2h(ptr)); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(1); > + ret = lduw_p(g2h(ptr)); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr ptr) > +{ > + uint32_t ret; > + > + set_helper_retaddr(1); > + ret = ldl_p(g2h(ptr)); > + clear_helper_retaddr(); > + return ret; > +} > + > +uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr ptr) > +{ > + uint64_t ret; > + > + set_helper_retaddr(1); > + ret = ldq_p(g2h(ptr)); > + clear_helper_retaddr(); > + return ret; > +} > + > /* Do not allow unaligned operations to proceed. Return the host > address. */ > static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, > int size, uintptr_t retaddr) > -- > 2.20.1 > > > --000000000000eeec4b05998738b4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

On Thursday, December 12, 2019, Richard Henderson <richard.henderson@lina= ro.org> wrote:
With the tracing ho= oks, the inline functions are no longer
so simple.=C2=A0 Reduce the amount of preprocessor obfuscation
by expanding the text of each of the functions generated.
The result is only slightly larger than the original.


Hello, Richard.

Are you talking about source code size here?

I = am truly interested in the size of exectutable - it should remain about the= same, no? Can you perhaps confirm that?

Thanks.
=C2=A0
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
=C2=A0include/exec/cpu_ldst.h=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 54 +++--
=C2=A0include/exec/cpu_ldst_useronly_template.h | 159 ---------------<= br> =C2=A0accel/tcg/user-exec.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0| 236 ++++++++++++++++++++++
=C2=A03 files changed, 262 insertions(+), 187 deletions(-)
=C2=A0delete mode 100644 include/exec/cpu_ldst_useronly_template.h

diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h
index 3b2c46bdf4..5a638fd8d6 100644
--- a/include/exec/cpu_ldst.h
+++ b/include/exec/cpu_ldst.h
@@ -124,35 +124,33 @@ static inline void clear_helper_retaddr(void)

=C2=A0/* In user-only mode we provide only the _code and _data accessors. *= /

-#define MEMSUFFIX _data
-#define DATA_SIZE 1
-#include "exec/cpu_ldst_useronly_template.h"
+uint32_t cpu_ldub_data(CPUArchState *env, abi_ptr ptr);
+uint32_t cpu_lduw_data(CPUArchState *env, abi_ptr ptr);
+uint32_t cpu_ldl_data(CPUArchState *env, abi_ptr ptr);
+uint64_t cpu_ldq_data(CPUArchState *env, abi_ptr ptr);
+int cpu_ldsb_data(CPUArchState *env, abi_ptr ptr);
+int cpu_ldsw_data(CPUArchState *env, abi_ptr ptr);

-#define DATA_SIZE 2
-#include "exec/cpu_ldst_useronly_template.h"
+uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retadd= r);
+uint32_t cpu_lduw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retadd= r);
+uint32_t cpu_ldl_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr= );
+uint64_t cpu_ldq_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr= );
+int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr); +int cpu_ldsw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr);
-#define DATA_SIZE 4
-#include "exec/cpu_ldst_useronly_template.h"
+void cpu_stb_data(CPUArchState *env, abi_ptr ptr, uint32_t val);
+void cpu_stw_data(CPUArchState *env, abi_ptr ptr, uint32_t val);
+void cpu_stl_data(CPUArchState *env, abi_ptr ptr, uint32_t val);
+void cpu_stq_data(CPUArchState *env, abi_ptr ptr, uint64_t val);

-#define DATA_SIZE 8
-#include "exec/cpu_ldst_useronly_template.h"
-#undef MEMSUFFIX
-
-#define MEMSUFFIX _code
-#define CODE_ACCESS
-#define DATA_SIZE 1
-#include "exec/cpu_ldst_useronly_template.h"
-
-#define DATA_SIZE 2
-#include "exec/cpu_ldst_useronly_template.h"
-
-#define DATA_SIZE 4
-#include "exec/cpu_ldst_useronly_template.h"
-
-#define DATA_SIZE 8
-#include "exec/cpu_ldst_useronly_template.h"
-#undef MEMSUFFIX
-#undef CODE_ACCESS
+void cpu_stb_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr);
+void cpu_stw_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr);
+void cpu_stl_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr);
+void cpu_stq_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint64_t val, uintptr_t retaddr);

=C2=A0/*
=C2=A0 * Provide the same *_mmuidx_ra interface as for softmmu.
@@ -524,6 +522,8 @@ void cpu_stq_mmuidx_ra(CPUArchState *env, abi_ptr addr,= uint64_t val,
=C2=A0#undef CPU_MMU_INDEX
=C2=A0#undef MEMSUFFIX

+#endif /* defined(CONFIG_USER_ONLY) */
+
=C2=A0uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr);
=C2=A0uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr);
=C2=A0uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr);
@@ -539,8 +539,6 @@ static inline int cpu_ldsw_code(CPUArchState *env, abi_= ptr addr)
=C2=A0 =C2=A0 =C2=A0return (int16_t)cpu_lduw_code(env, addr);
=C2=A0}

-#endif /* defined(CONFIG_USER_ONLY) */
-
=C2=A0/**
=C2=A0 * tlb_vaddr_to_host:
=C2=A0 * @env: CPUArchState
diff --git a/include/exec/cpu_ldst_useronly_template.h b/include/exec/= cpu_ldst_useronly_template.h
deleted file mode 100644
index e5a3d1983a..0000000000
--- a/include/exec/cpu_ldst_useronly_template.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *=C2=A0 User-only accessor function support
- *
- * Generate inline load/store functions for one data size.
- *
- * Generate a store function as well as signed and unsigned loads.
- *
- * Not used directly but included from cpu_ldst.h.
- *
- *=C2=A0 Copyright (c) 2015 Linaro Limited
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.=C2=A0 See the GNU<= br> - * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined(CODE_ACCESS)
-#include "trace-root.h"
-#endif
-
-#include "trace/mem.h"
-
-#if DATA_SIZE =3D=3D 8
-#define SUFFIX q
-#define USUFFIX q
-#define DATA_TYPE uint64_t
-#define SHIFT 3
-#elif DATA_SIZE =3D=3D 4
-#define SUFFIX l
-#define USUFFIX l
-#define DATA_TYPE uint32_t
-#define SHIFT 2
-#elif DATA_SIZE =3D=3D 2
-#define SUFFIX w
-#define USUFFIX uw
-#define DATA_TYPE uint16_t
-#define DATA_STYPE int16_t
-#define SHIFT 1
-#elif DATA_SIZE =3D=3D 1
-#define SUFFIX b
-#define USUFFIX ub
-#define DATA_TYPE uint8_t
-#define DATA_STYPE int8_t
-#define SHIFT 0
-#else
-#error unsupported data size
-#endif
-
-#if DATA_SIZE =3D=3D 8
-#define RES_TYPE uint64_t
-#else
-#define RES_TYPE uint32_t
-#endif
-
-static inline RES_TYPE
-glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
-{
-=C2=A0 =C2=A0 RES_TYPE ret;
-#ifdef CODE_ACCESS
-=C2=A0 =C2=A0 set_helper_retaddr(1);
-=C2=A0 =C2=A0 ret =3D glue(glue(ld, USUFFIX), _p)(g2h(ptr));
-=C2=A0 =C2=A0 clear_helper_retaddr();
-#else
-=C2=A0 =C2=A0 MemOp op =3D MO_TE | SHIFT;
-=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(op, MMU_USER_IDX, fa= lse);
-=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
-=C2=A0 =C2=A0 ret =3D glue(glue(ld, USUFFIX), _p)(g2h(ptr));
-#endif
-=C2=A0 =C2=A0 return ret;
-}
-
-#ifndef CODE_ACCESS
-static inline RES_TYPE
-glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 abi_ptr ptr,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 uintptr_t retaddr)
-{
-=C2=A0 =C2=A0 RES_TYPE ret;
-=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
-=C2=A0 =C2=A0 ret =3D glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(env, ptr); -=C2=A0 =C2=A0 clear_helper_retaddr();
-=C2=A0 =C2=A0 return ret;
-}
-#endif
-
-#if DATA_SIZE <=3D 2
-static inline int
-glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
-{
-=C2=A0 =C2=A0 int ret;
-#ifdef CODE_ACCESS
-=C2=A0 =C2=A0 set_helper_retaddr(1);
-=C2=A0 =C2=A0 ret =3D glue(glue(lds, SUFFIX), _p)(g2h(ptr));
-=C2=A0 =C2=A0 clear_helper_retaddr();
-#else
-=C2=A0 =C2=A0 MemOp op =3D MO_TE | MO_SIGN | SHIFT;
-=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(op, MMU_USER_IDX, fa= lse);
-=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
-=C2=A0 =C2=A0 ret =3D glue(glue(lds, SUFFIX), _p)(g2h(ptr));
-=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); -#endif
-=C2=A0 =C2=A0 return ret;
-}
-
-#ifndef CODE_ACCESS
-static inline int
-glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 abi_ptr ptr,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 uintptr_t retaddr)
-{
-=C2=A0 =C2=A0 int ret;
-=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
-=C2=A0 =C2=A0 ret =3D glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(env, ptr); -=C2=A0 =C2=A0 clear_helper_retaddr();
-=C2=A0 =C2=A0 return ret;
-}
-#endif /* CODE_ACCESS */
-#endif /* DATA_SIZE <=3D 2 */
-
-#ifndef CODE_ACCESS
-static inline void
-glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 RES_TYPE v)
-{
-=C2=A0 =C2=A0 MemOp op =3D MO_TE | SHIFT;
-=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(op, MMU_USER_IDX, tr= ue);
-=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
-=C2=A0 =C2=A0 glue(glue(st, SUFFIX), _p)(g2h(ptr), v);
-=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); -}
-
-static inline void
-glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 abi_ptr ptr,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 RES_TYPE v,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 uintptr_t retaddr)
-{
-=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
-=C2=A0 =C2=A0 glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(env, ptr, v);
-=C2=A0 =C2=A0 clear_helper_retaddr();
-}
-#endif
-
-#undef RES_TYPE
-#undef DATA_TYPE
-#undef DATA_STYPE
-#undef SUFFIX
-#undef USUFFIX
-#undef DATA_SIZE
-#undef SHIFT
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
index b09f7a1577..79da4219bb 100644
--- a/accel/tcg/user-exec.c
+++ b/accel/tcg/user-exec.c
@@ -26,6 +26,8 @@
=C2=A0#include "translate-all.h"
=C2=A0#include "exec/helper-proto.h"
=C2=A0#include "qemu/atomic128.h"
+#include "trace-root.h"
+#include "trace/mem.h"

=C2=A0#undef EAX
=C2=A0#undef ECX
@@ -734,6 +736,240 @@ int cpu_signal_handler(int host_signum, void *pinfo,<= br>
=C2=A0/* The softmmu versions of these helpers are in cputlb.c.=C2=A0 */
+uint32_t cpu_ldub_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_UB, MMU_USER_IDX,= false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D ldub_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+int cpu_ldsb_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 int ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_SB, MMU_USER_IDX,= false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D ldsb_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_lduw_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEUW, MMU_USER_ID= X, false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D lduw_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+int cpu_ldsw_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 int ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TESW, MMU_USER_ID= X, false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D ldsw_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_ldl_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEUL, MMU_USER_ID= X, false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D ldl_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+uint64_t cpu_ldq_data(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint64_t ret;
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEQ, MMU_USER_IDX= , false);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 ret =3D ldq_p(g2h(ptr));
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retadd= r)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_ldub_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr) +{
+=C2=A0 =C2=A0 int ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_ldsb_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_lduw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retadd= r)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_lduw_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+int cpu_ldsw_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr) +{
+=C2=A0 =C2=A0 int ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_ldsw_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_ldl_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr= )
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_ldl_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint64_t cpu_ldq_data_ra(CPUArchState *env, abi_ptr ptr, uintptr_t retaddr= )
+{
+=C2=A0 =C2=A0 uint64_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 ret =3D cpu_ldq_data(env, ptr);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+void cpu_stb_data(CPUArchState *env, abi_ptr ptr, uint32_t val)
+{
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_UB, MMU_USER_IDX,= true);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 stb_p(g2h(ptr), val);
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +}
+
+void cpu_stw_data(CPUArchState *env, abi_ptr ptr, uint32_t val)
+{
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEUW, MMU_USER_ID= X, true);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 stw_p(g2h(ptr), val);
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +}
+
+void cpu_stl_data(CPUArchState *env, abi_ptr ptr, uint32_t val)
+{
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEUL, MMU_USER_ID= X, true);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 stl_p(g2h(ptr), val);
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +}
+
+void cpu_stq_data(CPUArchState *env, abi_ptr ptr, uint64_t val)
+{
+=C2=A0 =C2=A0 uint16_t meminfo =3D trace_mem_get_info(MO_TEQ, MMU_USER_IDX= , true);
+
+=C2=A0 =C2=A0 trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo)= ;
+=C2=A0 =C2=A0 stq_p(g2h(ptr), val);
+=C2=A0 =C2=A0 qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo); +}
+
+void cpu_stb_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr)
+{
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 cpu_stb_data(env, ptr, val);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+}
+
+void cpu_stw_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr)
+{
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 cpu_stw_data(env, ptr, val);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+}
+
+void cpu_stl_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint32_t val, uintptr_t retaddr)
+{
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 cpu_stl_data(env, ptr, val);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+}
+
+void cpu_stq_data_ra(CPUArchState *env, abi_ptr ptr,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0uint64_t val, uintptr_t retaddr)
+{
+=C2=A0 =C2=A0 set_helper_retaddr(retaddr);
+=C2=A0 =C2=A0 cpu_stq_data(env, ptr, val);
+=C2=A0 =C2=A0 clear_helper_retaddr();
+}
+
+uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(1);
+=C2=A0 =C2=A0 ret =3D ldub_p(g2h(ptr));
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(1);
+=C2=A0 =C2=A0 ret =3D lduw_p(g2h(ptr));
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint32_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(1);
+=C2=A0 =C2=A0 ret =3D ldl_p(g2h(ptr));
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
+uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr ptr)
+{
+=C2=A0 =C2=A0 uint64_t ret;
+
+=C2=A0 =C2=A0 set_helper_retaddr(1);
+=C2=A0 =C2=A0 ret =3D ldq_p(g2h(ptr));
+=C2=A0 =C2=A0 clear_helper_retaddr();
+=C2=A0 =C2=A0 return ret;
+}
+
=C2=A0/* Do not allow unaligned operations to proceed.=C2=A0 Return the hos= t address.=C2=A0 */
=C2=A0static void *atomic_mmu_lookup(CPUArchState *env, target_ulong a= ddr,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int size, uintptr_t retaddr)
--
2.20.1


--000000000000eeec4b05998738b4--