Accelerator patches

- Extract page-protection definitions to page-protection.h
 - Rework in accel/tcg in preparation of extracting TCG fields from CPUState
 - More uses of get_task_state() in user emulation
 - Xen refactors in preparation for adding multiple map caches (Juergen & Edgar)
 - MAINTAINERS updates (Aleksandar and Bin)
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmY40CAACgkQ4+MsLN6t
 wN5drxAA1oIsuUzpAJmlMIxZwlzbICiuexgn/HH9DwWNlrarKo7V1l4YB8jd9WOg
 IKuj7c39kJKsDEB8BXApYwcly+l7DYdnAAI8Z7a+eN+ffKNl/0XBaLjsGf58RNwY
 fb39/cXWI9ZxKxsHMSyjpiu68gOGvZ5JJqa30Fr+eOGuug9Fn/fOe1zC6l/dMagy
 Dnym72stpD+hcsN5sVwohTBIk+7g9og1O/ctRx6Q3ZCOPz4p0+JNf8VUu43/reaR
 294yRK++JrSMhOVFRzP+FH1G25NxiOrVCFXZsUTYU+qPDtdiKtjH1keI/sk7rwZ7
 U573lesl7ewQFf1PvMdaVf0TrQyOe6kUGr9Mn2k8+KgjYRAjTAQk8V4Ric/+xXSU
 0rd7Cz7lyQ8jm0DoOElROv+lTDQs4dvm3BopF3Bojo4xHLHd3SFhROVPG4tvGQ3H
 72Q5UPR2Jr2QZKiImvPceUOg0z5XxoN6KRUkSEpMFOiTRkbwnrH59z/qPijUpe6v
 8l5IlI9GjwkL7pcRensp1VC6e9KC7F5Od1J/2RLDw3UQllMQXqVw2bxD3CEtDRJL
 QSZoS4d1jUCW4iAYdqh/8+2cOIPiCJ4ai5u7lSdjrIJkRErm32FV/pQLZauoHlT5
 eTPUgzDoRXVgI1X1slTpVXlEEvRNbhZqSkYLkXr80MLn5hTafo0=
 =3Qkg
 -----END PGP SIGNATURE-----

Merge tag 'accel-20240506' of https://github.com/philmd/qemu into staging

Accelerator patches

- Extract page-protection definitions to page-protection.h
- Rework in accel/tcg in preparation of extracting TCG fields from CPUState
- More uses of get_task_state() in user emulation
- Xen refactors in preparation for adding multiple map caches (Juergen & Edgar)
- MAINTAINERS updates (Aleksandar and Bin)

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmY40CAACgkQ4+MsLN6t
# wN5drxAA1oIsuUzpAJmlMIxZwlzbICiuexgn/HH9DwWNlrarKo7V1l4YB8jd9WOg
# IKuj7c39kJKsDEB8BXApYwcly+l7DYdnAAI8Z7a+eN+ffKNl/0XBaLjsGf58RNwY
# fb39/cXWI9ZxKxsHMSyjpiu68gOGvZ5JJqa30Fr+eOGuug9Fn/fOe1zC6l/dMagy
# Dnym72stpD+hcsN5sVwohTBIk+7g9og1O/ctRx6Q3ZCOPz4p0+JNf8VUu43/reaR
# 294yRK++JrSMhOVFRzP+FH1G25NxiOrVCFXZsUTYU+qPDtdiKtjH1keI/sk7rwZ7
# U573lesl7ewQFf1PvMdaVf0TrQyOe6kUGr9Mn2k8+KgjYRAjTAQk8V4Ric/+xXSU
# 0rd7Cz7lyQ8jm0DoOElROv+lTDQs4dvm3BopF3Bojo4xHLHd3SFhROVPG4tvGQ3H
# 72Q5UPR2Jr2QZKiImvPceUOg0z5XxoN6KRUkSEpMFOiTRkbwnrH59z/qPijUpe6v
# 8l5IlI9GjwkL7pcRensp1VC6e9KC7F5Od1J/2RLDw3UQllMQXqVw2bxD3CEtDRJL
# QSZoS4d1jUCW4iAYdqh/8+2cOIPiCJ4ai5u7lSdjrIJkRErm32FV/pQLZauoHlT5
# eTPUgzDoRXVgI1X1slTpVXlEEvRNbhZqSkYLkXr80MLn5hTafo0=
# =3Qkg
# -----END PGP SIGNATURE-----
# gpg: Signature made Mon 06 May 2024 05:42:08 AM PDT
# gpg:                using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE
# gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [full]

* tag 'accel-20240506' of https://github.com/philmd/qemu: (28 commits)
  MAINTAINERS: Update my email address
  MAINTAINERS: Update Aleksandar Rikalo email
  system: Pass RAM MemoryRegion and is_write in xen_map_cache()
  xen: mapcache: Break out xen_map_cache_init_single()
  xen: mapcache: Break out xen_invalidate_map_cache_single()
  xen: mapcache: Refactor xen_invalidate_map_cache_entry_unlocked
  xen: mapcache: Refactor xen_replace_cache_entry_unlocked
  xen: mapcache: Break out xen_ram_addr_from_mapcache_single
  xen: mapcache: Refactor xen_remap_bucket for multi-instance
  xen: mapcache: Refactor xen_map_cache for multi-instance
  xen: mapcache: Refactor lock functions for multi-instance
  xen: let xen_ram_addr_from_mapcache() return -1 in case of not found entry
  system: let qemu_map_ram_ptr() use qemu_ram_ptr_length()
  user: Use get_task_state() helper
  user: Declare get_task_state() once in 'accel/tcg/vcpu-state.h'
  user: Forward declare TaskState type definition
  accel/tcg: Move @plugin_mem_cbs from CPUState to CPUNegativeOffsetState
  accel/tcg: Restrict cpu_plugin_mem_cbs_enabled() to TCG
  accel/tcg: Restrict qemu_plugin_vcpu_exit_hook() to TCG plugins
  accel/tcg: Update CPUNegativeOffsetState::can_do_io field documentation
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-05-06 10:19:09 -07:00
commit 873f9ca385
91 changed files with 421 additions and 300 deletions

View File

@ -167,6 +167,7 @@ F: include/exec/target_long.h
F: include/exec/helper*.h F: include/exec/helper*.h
F: include/exec/helper*.h.inc F: include/exec/helper*.h.inc
F: include/exec/helper-info.c.inc F: include/exec/helper-info.c.inc
F: include/exec/page-protection.h
F: include/sysemu/cpus.h F: include/sysemu/cpus.h
F: include/sysemu/tcg.h F: include/sysemu/tcg.h
F: include/hw/core/tcg-cpu-ops.h F: include/hw/core/tcg-cpu-ops.h
@ -284,7 +285,7 @@ MIPS TCG CPUs
M: Philippe Mathieu-Daudé <philmd@linaro.org> M: Philippe Mathieu-Daudé <philmd@linaro.org>
R: Aurelien Jarno <aurelien@aurel32.net> R: Aurelien Jarno <aurelien@aurel32.net>
R: Jiaxun Yang <jiaxun.yang@flygoat.com> R: Jiaxun Yang <jiaxun.yang@flygoat.com>
R: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com> R: Aleksandar Rikalo <arikalo@gmail.com>
S: Odd Fixes S: Odd Fixes
F: target/mips/ F: target/mips/
F: disas/*mips.c F: disas/*mips.c
@ -319,7 +320,7 @@ F: tests/tcg/ppc*/*
RISC-V TCG CPUs RISC-V TCG CPUs
M: Palmer Dabbelt <palmer@dabbelt.com> M: Palmer Dabbelt <palmer@dabbelt.com>
M: Alistair Francis <alistair.francis@wdc.com> M: Alistair Francis <alistair.francis@wdc.com>
M: Bin Meng <bin.meng@windriver.com> M: Bin Meng <bmeng.cn@gmail.com>
R: Weiwei Li <liwei1518@gmail.com> R: Weiwei Li <liwei1518@gmail.com>
R: Daniel Henrique Barboza <dbarboza@ventanamicro.com> R: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
R: Liu Zhiwei <zhiwei_liu@linux.alibaba.com> R: Liu Zhiwei <zhiwei_liu@linux.alibaba.com>
@ -1334,7 +1335,7 @@ F: include/hw/mips/
Jazz Jazz
M: Hervé Poussineau <hpoussin@reactos.org> M: Hervé Poussineau <hpoussin@reactos.org>
R: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com> R: Aleksandar Rikalo <arikalo@gmail.com>
S: Maintained S: Maintained
F: hw/mips/jazz.c F: hw/mips/jazz.c
F: hw/display/g364fb.c F: hw/display/g364fb.c
@ -1356,7 +1357,7 @@ F: tests/avocado/linux_ssh_mips_malta.py
F: tests/avocado/machine_mips_malta.py F: tests/avocado/machine_mips_malta.py
Mipssim Mipssim
R: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com> R: Aleksandar Rikalo <arikalo@gmail.com>
S: Orphan S: Orphan
F: hw/mips/mipssim.c F: hw/mips/mipssim.c
F: hw/net/mipsnet.c F: hw/net/mipsnet.c
@ -1384,7 +1385,7 @@ F: tests/avocado/machine_mips_loongson3v.py
Boston Boston
M: Paul Burton <paulburton@kernel.org> M: Paul Burton <paulburton@kernel.org>
R: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com> R: Aleksandar Rikalo <arikalo@gmail.com>
S: Odd Fixes S: Odd Fixes
F: hw/core/loader-fit.c F: hw/core/loader-fit.c
F: hw/mips/boston.c F: hw/mips/boston.c
@ -1602,7 +1603,7 @@ F: include/hw/riscv/opentitan.h
F: include/hw/*/ibex_*.h F: include/hw/*/ibex_*.h
Microchip PolarFire SoC Icicle Kit Microchip PolarFire SoC Icicle Kit
M: Bin Meng <bin.meng@windriver.com> M: Bin Meng <bmeng.cn@gmail.com>
L: qemu-riscv@nongnu.org L: qemu-riscv@nongnu.org
S: Supported S: Supported
F: docs/system/riscv/microchip-icicle-kit.rst F: docs/system/riscv/microchip-icicle-kit.rst
@ -1629,7 +1630,7 @@ F: include/hw/char/shakti_uart.h
SiFive Machines SiFive Machines
M: Alistair Francis <Alistair.Francis@wdc.com> M: Alistair Francis <Alistair.Francis@wdc.com>
M: Bin Meng <bin.meng@windriver.com> M: Bin Meng <bmeng.cn@gmail.com>
M: Palmer Dabbelt <palmer@dabbelt.com> M: Palmer Dabbelt <palmer@dabbelt.com>
L: qemu-riscv@nongnu.org L: qemu-riscv@nongnu.org
S: Supported S: Supported
@ -2125,7 +2126,7 @@ F: hw/ssi/xilinx_*
SD (Secure Card) SD (Secure Card)
M: Philippe Mathieu-Daudé <philmd@linaro.org> M: Philippe Mathieu-Daudé <philmd@linaro.org>
M: Bin Meng <bin.meng@windriver.com> M: Bin Meng <bmeng.cn@gmail.com>
L: qemu-block@nongnu.org L: qemu-block@nongnu.org
S: Odd Fixes S: Odd Fixes
F: include/hw/sd/sd* F: include/hw/sd/sd*
@ -3761,7 +3762,7 @@ M: Philippe Mathieu-Daudé <philmd@linaro.org>
R: Aurelien Jarno <aurelien@aurel32.net> R: Aurelien Jarno <aurelien@aurel32.net>
R: Huacai Chen <chenhuacai@kernel.org> R: Huacai Chen <chenhuacai@kernel.org>
R: Jiaxun Yang <jiaxun.yang@flygoat.com> R: Jiaxun Yang <jiaxun.yang@flygoat.com>
R: Aleksandar Rikalo <aleksandar.rikalo@syrmia.com> R: Aleksandar Rikalo <arikalo@gmail.com>
S: Odd Fixes S: Odd Fixes
F: tcg/mips/ F: tcg/mips/

View File

@ -147,6 +147,16 @@ static void init_delay_params(SyncClocks *sc, const CPUState *cpu)
} }
#endif /* CONFIG USER ONLY */ #endif /* CONFIG USER ONLY */
bool tcg_cflags_has(CPUState *cpu, uint32_t flags)
{
return cpu->tcg_cflags & flags;
}
void tcg_cflags_set(CPUState *cpu, uint32_t flags)
{
cpu->tcg_cflags |= flags;
}
uint32_t curr_cflags(CPUState *cpu) uint32_t curr_cflags(CPUState *cpu)
{ {
uint32_t cflags = cpu->tcg_cflags; uint32_t cflags = cpu->tcg_cflags;
@ -900,8 +910,6 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
vaddr pc, TranslationBlock **last_tb, vaddr pc, TranslationBlock **last_tb,
int *tb_exit) int *tb_exit)
{ {
int32_t insns_left;
trace_exec_tb(tb, pc); trace_exec_tb(tb, pc);
tb = cpu_tb_exec(cpu, tb, tb_exit); tb = cpu_tb_exec(cpu, tb, tb_exit);
if (*tb_exit != TB_EXIT_REQUESTED) { if (*tb_exit != TB_EXIT_REQUESTED) {
@ -910,8 +918,7 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
} }
*last_tb = NULL; *last_tb = NULL;
insns_left = qatomic_read(&cpu->neg.icount_decr.u32); if (cpu_loop_exit_requested(cpu)) {
if (insns_left < 0) {
/* Something asked us to stop executing chained TBs; just /* Something asked us to stop executing chained TBs; just
* continue round the main loop. Whatever requested the exit * continue round the main loop. Whatever requested the exit
* will also have set something else (eg exit_request or * will also have set something else (eg exit_request or
@ -928,7 +935,7 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
/* Ensure global icount has gone forward */ /* Ensure global icount has gone forward */
icount_update(cpu); icount_update(cpu);
/* Refill decrementer and continue execution. */ /* Refill decrementer and continue execution. */
insns_left = MIN(0xffff, cpu->icount_budget); int32_t insns_left = MIN(0xffff, cpu->icount_budget);
cpu->neg.icount_decr.u16.low = insns_left; cpu->neg.icount_decr.u16.low = insns_left;
cpu->icount_extra = cpu->icount_budget - insns_left; cpu->icount_extra = cpu->icount_budget - insns_left;

View File

@ -21,6 +21,7 @@
#include "qemu/main-loop.h" #include "qemu/main-loop.h"
#include "hw/core/tcg-cpu-ops.h" #include "hw/core/tcg-cpu-ops.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/memory.h" #include "exec/memory.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/cputlb.h" #include "exec/cputlb.h"

View File

@ -9,6 +9,7 @@
#ifndef ACCEL_TCG_INTERNAL_COMMON_H #ifndef ACCEL_TCG_INTERNAL_COMMON_H
#define ACCEL_TCG_INTERNAL_COMMON_H #define ACCEL_TCG_INTERNAL_COMMON_H
#include "exec/cpu-common.h"
#include "exec/translation-block.h" #include "exec/translation-block.h"
extern int64_t max_delay; extern int64_t max_delay;
@ -20,7 +21,24 @@ extern int64_t max_advance;
*/ */
static inline bool cpu_in_serial_context(CPUState *cs) static inline bool cpu_in_serial_context(CPUState *cs)
{ {
return !(cs->tcg_cflags & CF_PARALLEL) || cpu_in_exclusive_context(cs); return !tcg_cflags_has(cs, CF_PARALLEL) || cpu_in_exclusive_context(cs);
}
/**
* cpu_plugin_mem_cbs_enabled() - are plugin memory callbacks enabled?
* @cs: CPUState pointer
*
* The memory callbacks are installed if a plugin has instrumented an
* instruction for memory. This can be useful to know if you want to
* force a slow path for a series of memory accesses.
*/
static inline bool cpu_plugin_mem_cbs_enabled(const CPUState *cpu)
{
#ifdef CONFIG_PLUGIN
return !!cpu->neg.plugin_mem_cbs;
#else
return false;
#endif
} }
#endif #endif

View File

@ -55,7 +55,7 @@ static void gen_enable_mem_helper(struct qemu_plugin_tb *ptb,
* Tracking memory accesses performed from helpers requires extra work. * Tracking memory accesses performed from helpers requires extra work.
* If an instruction is emulated with helpers, we do two things: * If an instruction is emulated with helpers, we do two things:
* (1) copy the CB descriptors, and keep track of it so that they can be * (1) copy the CB descriptors, and keep track of it so that they can be
* freed later on, and (2) point CPUState.plugin_mem_cbs to the * freed later on, and (2) point CPUState.neg.plugin_mem_cbs to the
* descriptors, so that we can read them at run-time * descriptors, so that we can read them at run-time
* (i.e. when the helper executes). * (i.e. when the helper executes).
* This run-time access is performed from qemu_plugin_vcpu_mem_cb. * This run-time access is performed from qemu_plugin_vcpu_mem_cb.
@ -90,14 +90,14 @@ static void gen_enable_mem_helper(struct qemu_plugin_tb *ptb,
qemu_plugin_add_dyn_cb_arr(arr); qemu_plugin_add_dyn_cb_arr(arr);
tcg_gen_st_ptr(tcg_constant_ptr((intptr_t)arr), tcg_env, tcg_gen_st_ptr(tcg_constant_ptr((intptr_t)arr), tcg_env,
offsetof(CPUState, plugin_mem_cbs) - offsetof(CPUState, neg.plugin_mem_cbs) -
offsetof(ArchCPU, env)); offsetof(ArchCPU, env));
} }
static void gen_disable_mem_helper(void) static void gen_disable_mem_helper(void)
{ {
tcg_gen_st_ptr(tcg_constant_ptr(0), tcg_env, tcg_gen_st_ptr(tcg_constant_ptr(0), tcg_env,
offsetof(CPUState, plugin_mem_cbs) - offsetof(CPUState, neg.plugin_mem_cbs) -
offsetof(ArchCPU, env)); offsetof(ArchCPU, env));
} }

View File

@ -23,6 +23,7 @@
#include "exec/cputlb.h" #include "exec/cputlb.h"
#include "exec/log.h" #include "exec/log.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/tb-flush.h" #include "exec/tb-flush.h"
#include "exec/translate-all.h" #include "exec/translate-all.h"
#include "sysemu/tcg.h" #include "sysemu/tcg.h"

View File

@ -62,7 +62,7 @@ void tcg_cpu_init_cflags(CPUState *cpu, bool parallel)
cflags |= parallel ? CF_PARALLEL : 0; cflags |= parallel ? CF_PARALLEL : 0;
cflags |= icount_enabled() ? CF_USE_ICOUNT : 0; cflags |= icount_enabled() ? CF_USE_ICOUNT : 0;
cpu->tcg_cflags |= cflags; tcg_cflags_set(cpu, cflags);
} }
void tcg_cpu_destroy(CPUState *cpu) void tcg_cpu_destroy(CPUState *cpu)

View File

@ -644,15 +644,6 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
cpu_loop_exit_noexc(cpu); cpu_loop_exit_noexc(cpu);
} }
#else /* CONFIG_USER_ONLY */
void cpu_interrupt(CPUState *cpu, int mask)
{
g_assert(bql_locked());
cpu->interrupt_request |= mask;
qatomic_set(&cpu->neg.icount_decr.u16.high, -1);
}
#endif /* CONFIG_USER_ONLY */ #endif /* CONFIG_USER_ONLY */
/* /*

View File

@ -24,7 +24,9 @@
#include "qemu/bitops.h" #include "qemu/bitops.h"
#include "qemu/rcu.h" #include "qemu/rcu.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "qemu/main-loop.h"
#include "exec/translate-all.h" #include "exec/translate-all.h"
#include "exec/page-protection.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "qemu/atomic128.h" #include "qemu/atomic128.h"
#include "trace/trace-root.h" #include "trace/trace-root.h"
@ -37,6 +39,13 @@ __thread uintptr_t helper_retaddr;
//#define DEBUG_SIGNAL //#define DEBUG_SIGNAL
void cpu_interrupt(CPUState *cpu, int mask)
{
g_assert(bql_locked());
cpu->interrupt_request |= mask;
qatomic_set(&cpu->neg.icount_decr.u16.high, -1);
}
/* /*
* Adjust the pc to pass to cpu_restore_state; return the memop type. * Adjust the pc to pass to cpu_restore_state; return the memop type.
*/ */
@ -765,7 +774,7 @@ int page_unprotect(target_ulong address, uintptr_t pc)
if (prot & PAGE_EXEC) { if (prot & PAGE_EXEC) {
prot = (prot & ~PAGE_EXEC) | PAGE_READ; prot = (prot & ~PAGE_EXEC) | PAGE_READ;
} }
mprotect((void *)g2h_untagged(start), len, prot & PAGE_BITS); mprotect((void *)g2h_untagged(start), len, prot & PAGE_RWX);
} }
mmap_unlock(); mmap_unlock();

18
accel/tcg/vcpu-state.h Normal file
View File

@ -0,0 +1,18 @@
/*
* SPDX-FileContributor: Philippe Mathieu-Daudé <philmd@linaro.org>
* SPDX-FileCopyrightText: 2023 Linaro Ltd.
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef ACCEL_TCG_VCPU_STATE_H
#define ACCEL_TCG_VCPU_STATE_H
#include "hw/core/cpu.h"
#ifdef CONFIG_USER_ONLY
static inline TaskState *get_task_state(const CPUState *cs)
{
return cs->opaque;
}
#endif
#endif

View File

@ -56,6 +56,7 @@
#include <fcntl.h> #include <fcntl.h>
#include "qemu-bsd.h" #include "qemu-bsd.h"
#include "exec/page-protection.h"
extern struct bsd_shm_regions bsd_shm_regions[]; extern struct bsd_shm_regions bsd_shm_regions[];
extern abi_ulong target_brk; extern abi_ulong target_brk;

View File

@ -17,6 +17,7 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "exec/page-protection.h"
#include "qemu.h" #include "qemu.h"
@ -96,7 +97,7 @@ int target_mprotect(abi_ulong start, abi_ulong len, int prot)
end = host_end; end = host_end;
} }
ret = mprotect(g2h_untagged(host_start), ret = mprotect(g2h_untagged(host_start),
qemu_host_page_size, prot1 & PAGE_BITS); qemu_host_page_size, prot1 & PAGE_RWX);
if (ret != 0) if (ret != 0)
goto error; goto error;
host_start += qemu_host_page_size; host_start += qemu_host_page_size;
@ -107,7 +108,7 @@ int target_mprotect(abi_ulong start, abi_ulong len, int prot)
prot1 |= page_get_flags(addr); prot1 |= page_get_flags(addr);
} }
ret = mprotect(g2h_untagged(host_end - qemu_host_page_size), ret = mprotect(g2h_untagged(host_end - qemu_host_page_size),
qemu_host_page_size, prot1 & PAGE_BITS); qemu_host_page_size, prot1 & PAGE_RWX);
if (ret != 0) if (ret != 0)
goto error; goto error;
host_end -= qemu_host_page_size; host_end -= qemu_host_page_size;
@ -174,7 +175,7 @@ static int mmap_frag(abi_ulong real_start,
return -1; return -1;
prot1 = prot; prot1 = prot;
} }
prot1 &= PAGE_BITS; prot1 &= PAGE_RWX;
prot_new = prot | prot1; prot_new = prot | prot1;
if (fd != -1) { if (fd != -1) {

View File

@ -34,7 +34,9 @@ extern char **environ;
#include "target_os_signal.h" #include "target_os_signal.h"
#include "target.h" #include "target.h"
#include "exec/gdbstub.h" #include "exec/gdbstub.h"
#include "exec/page-protection.h"
#include "qemu/clang-tsa.h" #include "qemu/clang-tsa.h"
#include "accel/tcg/vcpu-state.h"
#include "qemu-os.h" #include "qemu-os.h"
/* /*
@ -75,7 +77,7 @@ struct emulated_sigtable {
/* /*
* NOTE: we force a big alignment so that the stack stored after is aligned too * NOTE: we force a big alignment so that the stack stored after is aligned too
*/ */
typedef struct TaskState { struct TaskState {
pid_t ts_tid; /* tid (or pid) of this task */ pid_t ts_tid; /* tid (or pid) of this task */
struct TaskState *next; struct TaskState *next;
@ -113,12 +115,7 @@ typedef struct TaskState {
/* This thread's sigaltstack, if it has one */ /* This thread's sigaltstack, if it has one */
struct target_sigaltstack sigaltstack_used; struct target_sigaltstack sigaltstack_used;
} __attribute__((aligned(16))) TaskState; } __attribute__((aligned(16)));
static inline TaskState *get_task_state(CPUState *cs)
{
return cs->opaque;
}
void stop_all_tasks(void); void stop_all_tasks(void);
extern const char *interp_prefix; extern const char *interp_prefix;

View File

@ -21,6 +21,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "qemu.h" #include "qemu.h"
#include "exec/page-protection.h"
#include "user/tswap-target.h" #include "user/tswap-target.h"
#include "gdbstub/user.h" #include "gdbstub/user.h"
#include "signal-common.h" #include "signal-common.h"

View File

@ -21,6 +21,7 @@
#include "qapi/error.h" #include "qapi/error.h"
#include "exec/target_page.h" #include "exec/target_page.h"
#include "exec/page-protection.h"
#include "hw/qdev-core.h" #include "hw/qdev-core.h"
#include "hw/qdev-properties.h" #include "hw/qdev-properties.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"

View File

@ -32,6 +32,7 @@
#include "exec/gdbstub.h" #include "exec/gdbstub.h"
#include "gdbstub/syscalls.h" #include "gdbstub/syscalls.h"
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
#include "accel/tcg/vcpu-state.h"
#include "gdbstub/user.h" #include "gdbstub/user.h"
#else #else
#include "hw/cpu/cluster.h" #include "hw/cpu/cluster.h"
@ -1661,7 +1662,7 @@ static void handle_query_supported(GArray *params, void *user_ctx)
#if defined(CONFIG_USER_ONLY) #if defined(CONFIG_USER_ONLY)
#if defined(CONFIG_LINUX) #if defined(CONFIG_LINUX)
if (gdbserver_state.c_cpu->opaque) { if (get_task_state(gdbserver_state.c_cpu)) {
g_string_append(gdbserver_state.str_buf, ";qXfer:auxv:read+"); g_string_append(gdbserver_state.str_buf, ";qXfer:auxv:read+");
} }
g_string_append(gdbserver_state.str_buf, ";QCatchSyscalls+"); g_string_append(gdbserver_state.str_buf, ";QCatchSyscalls+");

View File

@ -216,7 +216,7 @@ void gdb_handle_query_offsets(GArray *params, void *user_ctx)
{ {
TaskState *ts; TaskState *ts;
ts = gdbserver_state.c_cpu->opaque; ts = get_task_state(gdbserver_state.c_cpu);
g_string_printf(gdbserver_state.str_buf, g_string_printf(gdbserver_state.str_buf,
"Text=" TARGET_ABI_FMT_lx "Text=" TARGET_ABI_FMT_lx
";Data=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
@ -252,7 +252,7 @@ void gdb_handle_query_xfer_auxv(GArray *params, void *user_ctx)
offset = get_param(params, 0)->val_ul; offset = get_param(params, 0)->val_ul;
len = get_param(params, 1)->val_ul; len = get_param(params, 1)->val_ul;
ts = gdbserver_state.c_cpu->opaque; ts = get_task_state(gdbserver_state.c_cpu);
saved_auxv = ts->info->saved_auxv; saved_auxv = ts->info->saved_auxv;
auxv_len = ts->info->auxv_len; auxv_len = ts->info->auxv_len;

View File

@ -30,7 +30,9 @@
#include "hw/boards.h" #include "hw/boards.h"
#include "hw/qdev-properties.h" #include "hw/qdev-properties.h"
#include "trace.h" #include "trace.h"
#ifdef CONFIG_PLUGIN
#include "qemu/plugin.h" #include "qemu/plugin.h"
#endif
CPUState *cpu_by_arch_id(int64_t id) CPUState *cpu_by_arch_id(int64_t id)
{ {
@ -236,9 +238,11 @@ static void cpu_common_unrealizefn(DeviceState *dev)
CPUState *cpu = CPU(dev); CPUState *cpu = CPU(dev);
/* Call the plugin hook before clearing the cpu is fully unrealized */ /* Call the plugin hook before clearing the cpu is fully unrealized */
#ifdef CONFIG_PLUGIN
if (tcg_enabled()) { if (tcg_enabled()) {
qemu_plugin_vcpu_exit_hook(cpu); qemu_plugin_vcpu_exit_hook(cpu);
} }
#endif
/* NOTE: latest generic point before the cpu is fully unrealized */ /* NOTE: latest generic point before the cpu is fully unrealized */
cpu_exec_unrealizefn(cpu); cpu_exec_unrealizefn(cpu);

View File

@ -15,6 +15,7 @@
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/datadir.h" #include "qemu/datadir.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "exec/page-protection.h"
#include "net/net.h" #include "net/net.h"
#include "hw/pci/pci.h" #include "hw/pci/pci.h"
#include "hw/boards.h" #include "hw/boards.h"

View File

@ -21,6 +21,7 @@
#include "kvm_ppc.h" #include "kvm_ppc.h"
#include "sysemu/device_tree.h" #include "sysemu/device_tree.h"
#include "sysemu/block-backend.h" #include "sysemu/block-backend.h"
#include "exec/page-protection.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "elf.h" #include "elf.h"
#include "exec/memory.h" #include "exec/memory.h"

View File

@ -25,6 +25,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/datadir.h" #include "qemu/datadir.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "exec/page-protection.h"
#include "cpu.h" #include "cpu.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "hw/char/serial.h" #include "hw/char/serial.h"

View File

@ -74,14 +74,14 @@ typedef struct MapCache {
static MapCache *mapcache; static MapCache *mapcache;
static inline void mapcache_lock(void) static inline void mapcache_lock(MapCache *mc)
{ {
qemu_mutex_lock(&mapcache->lock); qemu_mutex_lock(&mc->lock);
} }
static inline void mapcache_unlock(void) static inline void mapcache_unlock(MapCache *mc)
{ {
qemu_mutex_unlock(&mapcache->lock); qemu_mutex_unlock(&mc->lock);
} }
static inline int test_bits(int nr, int size, const unsigned long *addr) static inline int test_bits(int nr, int size, const unsigned long *addr)
@ -93,23 +93,44 @@ static inline int test_bits(int nr, int size, const unsigned long *addr)
return 0; return 0;
} }
void xen_map_cache_init(phys_offset_to_gaddr_t f, void *opaque) static MapCache *xen_map_cache_init_single(phys_offset_to_gaddr_t f,
void *opaque,
unsigned long max_size)
{ {
unsigned long size; unsigned long size;
MapCache *mc;
mc = g_new0(MapCache, 1);
mc->phys_offset_to_gaddr = f;
mc->opaque = opaque;
qemu_mutex_init(&mc->lock);
QTAILQ_INIT(&mc->locked_entries);
mc->max_mcache_size = max_size;
mc->nr_buckets =
(((mc->max_mcache_size >> XC_PAGE_SHIFT) +
(1UL << (MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT)) - 1) >>
(MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT));
size = mc->nr_buckets * sizeof(MapCacheEntry);
size = (size + XC_PAGE_SIZE - 1) & ~(XC_PAGE_SIZE - 1);
trace_xen_map_cache_init(mc->nr_buckets, size);
mc->entry = g_malloc0(size);
return mc;
}
void xen_map_cache_init(phys_offset_to_gaddr_t f, void *opaque)
{
struct rlimit rlimit_as; struct rlimit rlimit_as;
unsigned long max_mcache_size;
mapcache = g_new0(MapCache, 1);
mapcache->phys_offset_to_gaddr = f;
mapcache->opaque = opaque;
qemu_mutex_init(&mapcache->lock);
QTAILQ_INIT(&mapcache->locked_entries);
if (geteuid() == 0) { if (geteuid() == 0) {
rlimit_as.rlim_cur = RLIM_INFINITY; rlimit_as.rlim_cur = RLIM_INFINITY;
rlimit_as.rlim_max = RLIM_INFINITY; rlimit_as.rlim_max = RLIM_INFINITY;
mapcache->max_mcache_size = MCACHE_MAX_SIZE; max_mcache_size = MCACHE_MAX_SIZE;
} else { } else {
getrlimit(RLIMIT_AS, &rlimit_as); getrlimit(RLIMIT_AS, &rlimit_as);
rlimit_as.rlim_cur = rlimit_as.rlim_max; rlimit_as.rlim_cur = rlimit_as.rlim_max;
@ -119,27 +140,18 @@ void xen_map_cache_init(phys_offset_to_gaddr_t f, void *opaque)
" memory is not infinity"); " memory is not infinity");
} }
if (rlimit_as.rlim_max < MCACHE_MAX_SIZE + NON_MCACHE_MEMORY_SIZE) { if (rlimit_as.rlim_max < MCACHE_MAX_SIZE + NON_MCACHE_MEMORY_SIZE) {
mapcache->max_mcache_size = rlimit_as.rlim_max - max_mcache_size = rlimit_as.rlim_max - NON_MCACHE_MEMORY_SIZE;
NON_MCACHE_MEMORY_SIZE;
} else { } else {
mapcache->max_mcache_size = MCACHE_MAX_SIZE; max_mcache_size = MCACHE_MAX_SIZE;
} }
} }
mapcache = xen_map_cache_init_single(f, opaque, max_mcache_size);
setrlimit(RLIMIT_AS, &rlimit_as); setrlimit(RLIMIT_AS, &rlimit_as);
mapcache->nr_buckets =
(((mapcache->max_mcache_size >> XC_PAGE_SHIFT) +
(1UL << (MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT)) - 1) >>
(MCACHE_BUCKET_SHIFT - XC_PAGE_SHIFT));
size = mapcache->nr_buckets * sizeof (MapCacheEntry);
size = (size + XC_PAGE_SIZE - 1) & ~(XC_PAGE_SIZE - 1);
trace_xen_map_cache_init(mapcache->nr_buckets, size);
mapcache->entry = g_malloc0(size);
} }
static void xen_remap_bucket(MapCacheEntry *entry, static void xen_remap_bucket(MapCache *mc,
MapCacheEntry *entry,
void *vaddr, void *vaddr,
hwaddr size, hwaddr size,
hwaddr address_index, hwaddr address_index,
@ -240,8 +252,9 @@ static void xen_remap_bucket(MapCacheEntry *entry,
g_free(err); g_free(err);
} }
static uint8_t *xen_map_cache_unlocked(hwaddr phys_addr, hwaddr size, static uint8_t *xen_map_cache_unlocked(MapCache *mc,
uint8_t lock, bool dma) hwaddr phys_addr, hwaddr size,
uint8_t lock, bool dma, bool is_write)
{ {
MapCacheEntry *entry, *pentry = NULL, MapCacheEntry *entry, *pentry = NULL,
*free_entry = NULL, *free_pentry = NULL; *free_entry = NULL, *free_pentry = NULL;
@ -269,16 +282,16 @@ tryagain:
test_bit_size = XC_PAGE_SIZE; test_bit_size = XC_PAGE_SIZE;
} }
if (mapcache->last_entry != NULL && if (mc->last_entry != NULL &&
mapcache->last_entry->paddr_index == address_index && mc->last_entry->paddr_index == address_index &&
!lock && !size && !lock && !size &&
test_bits(address_offset >> XC_PAGE_SHIFT, test_bits(address_offset >> XC_PAGE_SHIFT,
test_bit_size >> XC_PAGE_SHIFT, test_bit_size >> XC_PAGE_SHIFT,
mapcache->last_entry->valid_mapping)) { mc->last_entry->valid_mapping)) {
trace_xen_map_cache_return( trace_xen_map_cache_return(
mapcache->last_entry->vaddr_base + address_offset mc->last_entry->vaddr_base + address_offset
); );
return mapcache->last_entry->vaddr_base + address_offset; return mc->last_entry->vaddr_base + address_offset;
} }
/* size is always a multiple of MCACHE_BUCKET_SIZE */ /* size is always a multiple of MCACHE_BUCKET_SIZE */
@ -291,7 +304,7 @@ tryagain:
cache_size = MCACHE_BUCKET_SIZE; cache_size = MCACHE_BUCKET_SIZE;
} }
entry = &mapcache->entry[address_index % mapcache->nr_buckets]; entry = &mc->entry[address_index % mc->nr_buckets];
while (entry && (lock || entry->lock) && entry->vaddr_base && while (entry && (lock || entry->lock) && entry->vaddr_base &&
(entry->paddr_index != address_index || entry->size != cache_size || (entry->paddr_index != address_index || entry->size != cache_size ||
@ -312,24 +325,24 @@ tryagain:
if (!entry) { if (!entry) {
entry = g_new0(MapCacheEntry, 1); entry = g_new0(MapCacheEntry, 1);
pentry->next = entry; pentry->next = entry;
xen_remap_bucket(entry, NULL, cache_size, address_index, dummy); xen_remap_bucket(mc, entry, NULL, cache_size, address_index, dummy);
} else if (!entry->lock) { } else if (!entry->lock) {
if (!entry->vaddr_base || entry->paddr_index != address_index || if (!entry->vaddr_base || entry->paddr_index != address_index ||
entry->size != cache_size || entry->size != cache_size ||
!test_bits(address_offset >> XC_PAGE_SHIFT, !test_bits(address_offset >> XC_PAGE_SHIFT,
test_bit_size >> XC_PAGE_SHIFT, test_bit_size >> XC_PAGE_SHIFT,
entry->valid_mapping)) { entry->valid_mapping)) {
xen_remap_bucket(entry, NULL, cache_size, address_index, dummy); xen_remap_bucket(mc, entry, NULL, cache_size, address_index, dummy);
} }
} }
if(!test_bits(address_offset >> XC_PAGE_SHIFT, if(!test_bits(address_offset >> XC_PAGE_SHIFT,
test_bit_size >> XC_PAGE_SHIFT, test_bit_size >> XC_PAGE_SHIFT,
entry->valid_mapping)) { entry->valid_mapping)) {
mapcache->last_entry = NULL; mc->last_entry = NULL;
#ifdef XEN_COMPAT_PHYSMAP #ifdef XEN_COMPAT_PHYSMAP
if (!translated && mapcache->phys_offset_to_gaddr) { if (!translated && mc->phys_offset_to_gaddr) {
phys_addr = mapcache->phys_offset_to_gaddr(phys_addr, size); phys_addr = mc->phys_offset_to_gaddr(phys_addr, size);
translated = true; translated = true;
goto tryagain; goto tryagain;
} }
@ -342,7 +355,7 @@ tryagain:
return NULL; return NULL;
} }
mapcache->last_entry = entry; mc->last_entry = entry;
if (lock) { if (lock) {
MapCacheRev *reventry = g_new0(MapCacheRev, 1); MapCacheRev *reventry = g_new0(MapCacheRev, 1);
entry->lock++; entry->lock++;
@ -352,30 +365,32 @@ tryagain:
abort(); abort();
} }
reventry->dma = dma; reventry->dma = dma;
reventry->vaddr_req = mapcache->last_entry->vaddr_base + address_offset; reventry->vaddr_req = mc->last_entry->vaddr_base + address_offset;
reventry->paddr_index = mapcache->last_entry->paddr_index; reventry->paddr_index = mc->last_entry->paddr_index;
reventry->size = entry->size; reventry->size = entry->size;
QTAILQ_INSERT_HEAD(&mapcache->locked_entries, reventry, next); QTAILQ_INSERT_HEAD(&mc->locked_entries, reventry, next);
} }
trace_xen_map_cache_return( trace_xen_map_cache_return(
mapcache->last_entry->vaddr_base + address_offset mc->last_entry->vaddr_base + address_offset
); );
return mapcache->last_entry->vaddr_base + address_offset; return mc->last_entry->vaddr_base + address_offset;
} }
uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, uint8_t *xen_map_cache(MemoryRegion *mr,
uint8_t lock, bool dma) hwaddr phys_addr, hwaddr size,
uint8_t lock, bool dma,
bool is_write)
{ {
uint8_t *p; uint8_t *p;
mapcache_lock(); mapcache_lock(mapcache);
p = xen_map_cache_unlocked(phys_addr, size, lock, dma); p = xen_map_cache_unlocked(mapcache, phys_addr, size, lock, dma, is_write);
mapcache_unlock(); mapcache_unlock(mapcache);
return p; return p;
} }
ram_addr_t xen_ram_addr_from_mapcache(void *ptr) static ram_addr_t xen_ram_addr_from_mapcache_single(MapCache *mc, void *ptr)
{ {
MapCacheEntry *entry = NULL; MapCacheEntry *entry = NULL;
MapCacheRev *reventry; MapCacheRev *reventry;
@ -384,8 +399,8 @@ ram_addr_t xen_ram_addr_from_mapcache(void *ptr)
ram_addr_t raddr; ram_addr_t raddr;
int found = 0; int found = 0;
mapcache_lock(); mapcache_lock(mc);
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { QTAILQ_FOREACH(reventry, &mc->locked_entries, next) {
if (reventry->vaddr_req == ptr) { if (reventry->vaddr_req == ptr) {
paddr_index = reventry->paddr_index; paddr_index = reventry->paddr_index;
size = reventry->size; size = reventry->size;
@ -395,30 +410,32 @@ ram_addr_t xen_ram_addr_from_mapcache(void *ptr)
} }
if (!found) { if (!found) {
trace_xen_ram_addr_from_mapcache_not_found(ptr); trace_xen_ram_addr_from_mapcache_not_found(ptr);
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { mapcache_unlock(mc);
trace_xen_ram_addr_from_mapcache_found(reventry->paddr_index, return RAM_ADDR_INVALID;
reventry->vaddr_req);
}
abort();
return 0;
} }
entry = &mapcache->entry[paddr_index % mapcache->nr_buckets]; entry = &mc->entry[paddr_index % mc->nr_buckets];
while (entry && (entry->paddr_index != paddr_index || entry->size != size)) { while (entry && (entry->paddr_index != paddr_index || entry->size != size)) {
entry = entry->next; entry = entry->next;
} }
if (!entry) { if (!entry) {
trace_xen_ram_addr_from_mapcache_not_in_cache(ptr); trace_xen_ram_addr_from_mapcache_not_in_cache(ptr);
raddr = 0; raddr = RAM_ADDR_INVALID;
} else { } else {
raddr = (reventry->paddr_index << MCACHE_BUCKET_SHIFT) + raddr = (reventry->paddr_index << MCACHE_BUCKET_SHIFT) +
((unsigned long) ptr - (unsigned long) entry->vaddr_base); ((unsigned long) ptr - (unsigned long) entry->vaddr_base);
} }
mapcache_unlock(); mapcache_unlock(mc);
return raddr; return raddr;
} }
static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer) ram_addr_t xen_ram_addr_from_mapcache(void *ptr)
{
return xen_ram_addr_from_mapcache_single(mapcache, ptr);
}
static void xen_invalidate_map_cache_entry_unlocked(MapCache *mc,
uint8_t *buffer)
{ {
MapCacheEntry *entry = NULL, *pentry = NULL; MapCacheEntry *entry = NULL, *pentry = NULL;
MapCacheRev *reventry; MapCacheRev *reventry;
@ -426,7 +443,7 @@ static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer)
hwaddr size; hwaddr size;
int found = 0; int found = 0;
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { QTAILQ_FOREACH(reventry, &mc->locked_entries, next) {
if (reventry->vaddr_req == buffer) { if (reventry->vaddr_req == buffer) {
paddr_index = reventry->paddr_index; paddr_index = reventry->paddr_index;
size = reventry->size; size = reventry->size;
@ -436,7 +453,7 @@ static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer)
} }
if (!found) { if (!found) {
trace_xen_invalidate_map_cache_entry_unlocked_not_found(buffer); trace_xen_invalidate_map_cache_entry_unlocked_not_found(buffer);
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) { QTAILQ_FOREACH(reventry, &mc->locked_entries, next) {
trace_xen_invalidate_map_cache_entry_unlocked_found( trace_xen_invalidate_map_cache_entry_unlocked_found(
reventry->paddr_index, reventry->paddr_index,
reventry->vaddr_req reventry->vaddr_req
@ -444,15 +461,15 @@ static void xen_invalidate_map_cache_entry_unlocked(uint8_t *buffer)
} }
return; return;
} }
QTAILQ_REMOVE(&mapcache->locked_entries, reventry, next); QTAILQ_REMOVE(&mc->locked_entries, reventry, next);
g_free(reventry); g_free(reventry);
if (mapcache->last_entry != NULL && if (mc->last_entry != NULL &&
mapcache->last_entry->paddr_index == paddr_index) { mc->last_entry->paddr_index == paddr_index) {
mapcache->last_entry = NULL; mc->last_entry = NULL;
} }
entry = &mapcache->entry[paddr_index % mapcache->nr_buckets]; entry = &mc->entry[paddr_index % mc->nr_buckets];
while (entry && (entry->paddr_index != paddr_index || entry->size != size)) { while (entry && (entry->paddr_index != paddr_index || entry->size != size)) {
pentry = entry; pentry = entry;
entry = entry->next; entry = entry->next;
@ -485,9 +502,9 @@ static void xen_invalidate_map_cache_entry_bh(void *opaque)
{ {
XenMapCacheData *data = opaque; XenMapCacheData *data = opaque;
mapcache_lock(); mapcache_lock(mapcache);
xen_invalidate_map_cache_entry_unlocked(data->buffer); xen_invalidate_map_cache_entry_unlocked(mapcache, data->buffer);
mapcache_unlock(); mapcache_unlock(mapcache);
aio_co_wake(data->co); aio_co_wake(data->co);
} }
@ -503,23 +520,20 @@ void coroutine_mixed_fn xen_invalidate_map_cache_entry(uint8_t *buffer)
xen_invalidate_map_cache_entry_bh, &data); xen_invalidate_map_cache_entry_bh, &data);
qemu_coroutine_yield(); qemu_coroutine_yield();
} else { } else {
mapcache_lock(); mapcache_lock(mapcache);
xen_invalidate_map_cache_entry_unlocked(buffer); xen_invalidate_map_cache_entry_unlocked(mapcache, buffer);
mapcache_unlock(); mapcache_unlock(mapcache);
} }
} }
void xen_invalidate_map_cache(void) static void xen_invalidate_map_cache_single(MapCache *mc)
{ {
unsigned long i; unsigned long i;
MapCacheRev *reventry; MapCacheRev *reventry;
/* Flush pending AIO before destroying the mapcache */ mapcache_lock(mc);
bdrv_drain_all();
mapcache_lock(); QTAILQ_FOREACH(reventry, &mc->locked_entries, next) {
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) {
if (!reventry->dma) { if (!reventry->dma) {
continue; continue;
} }
@ -527,8 +541,8 @@ void xen_invalidate_map_cache(void)
reventry->vaddr_req); reventry->vaddr_req);
} }
for (i = 0; i < mapcache->nr_buckets; i++) { for (i = 0; i < mc->nr_buckets; i++) {
MapCacheEntry *entry = &mapcache->entry[i]; MapCacheEntry *entry = &mc->entry[i];
if (entry->vaddr_base == NULL) { if (entry->vaddr_base == NULL) {
continue; continue;
@ -549,12 +563,21 @@ void xen_invalidate_map_cache(void)
entry->valid_mapping = NULL; entry->valid_mapping = NULL;
} }
mapcache->last_entry = NULL; mc->last_entry = NULL;
mapcache_unlock(); mapcache_unlock(mc);
} }
static uint8_t *xen_replace_cache_entry_unlocked(hwaddr old_phys_addr, void xen_invalidate_map_cache(void)
{
/* Flush pending AIO before destroying the mapcache */
bdrv_drain_all();
xen_invalidate_map_cache_single(mapcache);
}
static uint8_t *xen_replace_cache_entry_unlocked(MapCache *mc,
hwaddr old_phys_addr,
hwaddr new_phys_addr, hwaddr new_phys_addr,
hwaddr size) hwaddr size)
{ {
@ -576,7 +599,7 @@ static uint8_t *xen_replace_cache_entry_unlocked(hwaddr old_phys_addr,
cache_size += MCACHE_BUCKET_SIZE - (cache_size % MCACHE_BUCKET_SIZE); cache_size += MCACHE_BUCKET_SIZE - (cache_size % MCACHE_BUCKET_SIZE);
} }
entry = &mapcache->entry[address_index % mapcache->nr_buckets]; entry = &mc->entry[address_index % mc->nr_buckets];
while (entry && !(entry->paddr_index == address_index && while (entry && !(entry->paddr_index == address_index &&
entry->size == cache_size)) { entry->size == cache_size)) {
entry = entry->next; entry = entry->next;
@ -591,7 +614,7 @@ static uint8_t *xen_replace_cache_entry_unlocked(hwaddr old_phys_addr,
trace_xen_replace_cache_entry_dummy(old_phys_addr, new_phys_addr); trace_xen_replace_cache_entry_dummy(old_phys_addr, new_phys_addr);
xen_remap_bucket(entry, entry->vaddr_base, xen_remap_bucket(mc, entry, entry->vaddr_base,
cache_size, address_index, false); cache_size, address_index, false);
if (!test_bits(address_offset >> XC_PAGE_SHIFT, if (!test_bits(address_offset >> XC_PAGE_SHIFT,
test_bit_size >> XC_PAGE_SHIFT, test_bit_size >> XC_PAGE_SHIFT,
@ -611,8 +634,9 @@ uint8_t *xen_replace_cache_entry(hwaddr old_phys_addr,
{ {
uint8_t *p; uint8_t *p;
mapcache_lock(); mapcache_lock(mapcache);
p = xen_replace_cache_entry_unlocked(old_phys_addr, new_phys_addr, size); p = xen_replace_cache_entry_unlocked(mapcache, old_phys_addr,
mapcache_unlock(); new_phys_addr, size);
mapcache_unlock(mapcache);
return p; return p;
} }

View File

@ -19,6 +19,7 @@
#ifndef CPU_ALL_H #ifndef CPU_ALL_H
#define CPU_ALL_H #define CPU_ALL_H
#include "exec/page-protection.h"
#include "exec/cpu-common.h" #include "exec/cpu-common.h"
#include "exec/memory.h" #include "exec/memory.h"
#include "exec/tswap.h" #include "exec/tswap.h"
@ -139,33 +140,24 @@ static inline void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val
#ifdef TARGET_PAGE_BITS_VARY #ifdef TARGET_PAGE_BITS_VARY
# include "exec/page-vary.h" # include "exec/page-vary.h"
extern const TargetPageBits target_page; extern const TargetPageBits target_page;
#ifdef CONFIG_DEBUG_TCG # ifdef CONFIG_DEBUG_TCG
#define TARGET_PAGE_BITS ({ assert(target_page.decided); target_page.bits; }) # define TARGET_PAGE_BITS ({ assert(target_page.decided); \
#define TARGET_PAGE_MASK ({ assert(target_page.decided); \ target_page.bits; })
(target_long)target_page.mask; }) # define TARGET_PAGE_MASK ({ assert(target_page.decided); \
(target_long)target_page.mask; })
# else
# define TARGET_PAGE_BITS target_page.bits
# define TARGET_PAGE_MASK ((target_long)target_page.mask)
# endif
# define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK)
#else #else
#define TARGET_PAGE_BITS target_page.bits # define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS
#define TARGET_PAGE_MASK ((target_long)target_page.mask) # define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
#endif # define TARGET_PAGE_MASK ((target_long)-1 << TARGET_PAGE_BITS)
#define TARGET_PAGE_SIZE (-(int)TARGET_PAGE_MASK)
#else
#define TARGET_PAGE_BITS_MIN TARGET_PAGE_BITS
#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
#define TARGET_PAGE_MASK ((target_long)-1 << TARGET_PAGE_BITS)
#endif #endif
#define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE) #define TARGET_PAGE_ALIGN(addr) ROUND_UP((addr), TARGET_PAGE_SIZE)
#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
/* FIXME: Code that sets/uses this is broken and needs to go away. */
#define PAGE_RESERVED 0x0100
#endif
/*
* For linux-user, indicates that the page is mapped with the same semantics
* in both guest and host.
*/
#define PAGE_PASSTHROUGH 0x0800
#if defined(CONFIG_USER_ONLY) #if defined(CONFIG_USER_ONLY)
void page_dump(FILE *f); void page_dump(FILE *f);

View File

@ -14,6 +14,7 @@
#endif #endif
#include "hw/core/cpu.h" #include "hw/core/cpu.h"
#include "tcg/debug-assert.h" #include "tcg/debug-assert.h"
#include "exec/page-protection.h"
#define EXCP_INTERRUPT 0x10000 /* async interruption */ #define EXCP_INTERRUPT 0x10000 /* async interruption */
#define EXCP_HLT 0x10001 /* hlt instruction reached */ #define EXCP_HLT 0x10001 /* hlt instruction reached */
@ -177,6 +178,13 @@ int cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
void list_cpus(void); void list_cpus(void);
#ifdef CONFIG_TCG #ifdef CONFIG_TCG
bool tcg_cflags_has(CPUState *cpu, uint32_t flags);
void tcg_cflags_set(CPUState *cpu, uint32_t flags);
/* current cflags for hashing/comparison */
uint32_t curr_cflags(CPUState *cpu);
/** /**
* cpu_unwind_state_data: * cpu_unwind_state_data:
* @cpu: the cpu context * @cpu: the cpu context
@ -208,36 +216,6 @@ G_NORETURN void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc);
G_NORETURN void cpu_loop_exit(CPUState *cpu); G_NORETURN void cpu_loop_exit(CPUState *cpu);
G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc); G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc);
/* same as PROT_xxx */
#define PAGE_READ 0x0001
#define PAGE_WRITE 0x0002
#define PAGE_EXEC 0x0004
#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
#define PAGE_VALID 0x0008
/*
* Original state of the write flag (used when tracking self-modifying code)
*/
#define PAGE_WRITE_ORG 0x0010
/*
* Invalidate the TLB entry immediately, helpful for s390x
* Low-Address-Protection. Used with PAGE_WRITE in tlb_set_page_with_attrs()
*/
#define PAGE_WRITE_INV 0x0020
/* For use with page_set_flags: page is being replaced; target_data cleared. */
#define PAGE_RESET 0x0040
/* For linux-user, indicates that the page is MAP_ANON. */
#define PAGE_ANON 0x0080
/* Target-specific bits that will be used via page_get_flags(). */
#define PAGE_TARGET_1 0x0200
#define PAGE_TARGET_2 0x0400
/*
* For linux-user, indicates that the page is mapped with the same semantics
* in both guest and host.
*/
#define PAGE_PASSTHROUGH 0x0800
/* accel/tcg/cpu-exec.c */ /* accel/tcg/cpu-exec.c */
int cpu_exec(CPUState *cpu); int cpu_exec(CPUState *cpu);

View File

@ -510,9 +510,6 @@ static inline void tb_set_page_addr1(TranslationBlock *tb,
#endif #endif
} }
/* current cflags for hashing/comparison */
uint32_t curr_cflags(CPUState *cpu);
/* TranslationBlock invalidate API */ /* TranslationBlock invalidate API */
void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr);
void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t last); void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t last);

View File

@ -0,0 +1,41 @@
/*
* QEMU page protection definitions.
*
* Copyright (c) 2003 Fabrice Bellard
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#ifndef EXEC_PAGE_PROT_COMMON_H
#define EXEC_PAGE_PROT_COMMON_H
/* same as PROT_xxx */
#define PAGE_READ 0x0001
#define PAGE_WRITE 0x0002
#define PAGE_EXEC 0x0004
#define PAGE_RWX (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
#define PAGE_VALID 0x0008
/*
* Original state of the write flag (used when tracking self-modifying code)
*/
#define PAGE_WRITE_ORG 0x0010
/*
* Invalidate the TLB entry immediately, helpful for s390x
* Low-Address-Protection. Used with PAGE_WRITE in tlb_set_page_with_attrs()
*/
#define PAGE_WRITE_INV 0x0020
/* For use with page_set_flags: page is being replaced; target_data cleared. */
#define PAGE_RESET 0x0040
/* For linux-user, indicates that the page is MAP_ANON. */
#define PAGE_ANON 0x0080
/* Target-specific bits that will be used via page_get_flags(). */
#define PAGE_TARGET_1 0x0200
#define PAGE_TARGET_2 0x0400
/*
* For linux-user, indicates that the page is mapped with the same semantics
* in both guest and host.
*/
#define PAGE_PASSTHROUGH 0x0800
#endif

View File

@ -345,12 +345,20 @@ typedef union IcountDecr {
} u16; } u16;
} IcountDecr; } IcountDecr;
/* /**
* Elements of CPUState most efficiently accessed from CPUArchState, * CPUNegativeOffsetState: Elements of CPUState most efficiently accessed
* via small negative offsets. * from CPUArchState, via small negative offsets.
* @can_do_io: True if memory-mapped IO is allowed.
* @plugin_mem_cbs: active plugin memory callbacks
*/ */
typedef struct CPUNegativeOffsetState { typedef struct CPUNegativeOffsetState {
CPUTLB tlb; CPUTLB tlb;
#ifdef CONFIG_PLUGIN
/*
* The callback pointer are accessed via TCG (see gen_empty_mem_helper).
*/
GArray *plugin_mem_cbs;
#endif
IcountDecr icount_decr; IcountDecr icount_decr;
bool can_do_io; bool can_do_io;
} CPUNegativeOffsetState; } CPUNegativeOffsetState;
@ -407,7 +415,6 @@ struct qemu_work_item;
* @crash_occurred: Indicates the OS reported a crash (panic) for this CPU * @crash_occurred: Indicates the OS reported a crash (panic) for this CPU
* @singlestep_enabled: Flags for single-stepping. * @singlestep_enabled: Flags for single-stepping.
* @icount_extra: Instructions until next timer event. * @icount_extra: Instructions until next timer event.
* @neg.can_do_io: True if memory-mapped IO is allowed.
* @cpu_ases: Pointer to array of CPUAddressSpaces (which define the * @cpu_ases: Pointer to array of CPUAddressSpaces (which define the
* AddressSpaces this CPU has) * AddressSpaces this CPU has)
* @num_ases: number of CPUAddressSpaces in @cpu_ases * @num_ases: number of CPUAddressSpaces in @cpu_ases
@ -423,7 +430,6 @@ struct qemu_work_item;
* @kvm_fd: vCPU file descriptor for KVM. * @kvm_fd: vCPU file descriptor for KVM.
* @work_mutex: Lock to prevent multiple access to @work_list. * @work_mutex: Lock to prevent multiple access to @work_list.
* @work_list: List of pending asynchronous work. * @work_list: List of pending asynchronous work.
* @plugin_mem_cbs: active plugin memory callbacks
* @plugin_state: per-CPU plugin state * @plugin_state: per-CPU plugin state
* @ignore_memory_transaction_failures: Cached copy of the MachineState * @ignore_memory_transaction_failures: Cached copy of the MachineState
* flag of the same name: allows the board to suppress calling of the * flag of the same name: allows the board to suppress calling of the
@ -518,11 +524,6 @@ struct CPUState {
QemuLockCnt in_ioctl_lock; QemuLockCnt in_ioctl_lock;
#ifdef CONFIG_PLUGIN #ifdef CONFIG_PLUGIN
/*
* The callback pointer stays in the main CPUState as it is
* accessed via TCG (see gen_empty_mem_helper).
*/
GArray *plugin_mem_cbs;
CPUPluginState *plugin_state; CPUPluginState *plugin_state;
#endif #endif
@ -1118,23 +1119,6 @@ void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint);
void cpu_watchpoint_remove_all(CPUState *cpu, int mask); void cpu_watchpoint_remove_all(CPUState *cpu, int mask);
#endif #endif
/**
* cpu_plugin_mem_cbs_enabled() - are plugin memory callbacks enabled?
* @cs: CPUState pointer
*
* The memory callbacks are installed if a plugin has instrumented an
* instruction for memory. This can be useful to know if you want to
* force a slow path for a series of memory accesses.
*/
static inline bool cpu_plugin_mem_cbs_enabled(const CPUState *cpu)
{
#ifdef CONFIG_PLUGIN
return !!cpu->plugin_mem_cbs;
#else
return false;
#endif
}
/** /**
* cpu_get_address_space: * cpu_get_address_space:
* @cpu: CPU to get address space from * @cpu: CPU to get address space from

View File

@ -180,7 +180,7 @@ void qemu_plugin_add_dyn_cb_arr(GArray *arr);
static inline void qemu_plugin_disable_mem_helpers(CPUState *cpu) static inline void qemu_plugin_disable_mem_helpers(CPUState *cpu)
{ {
cpu->plugin_mem_cbs = NULL; cpu->neg.plugin_mem_cbs = NULL;
} }
/** /**

View File

@ -110,6 +110,7 @@ typedef struct SHPCDevice SHPCDevice;
typedef struct SSIBus SSIBus; typedef struct SSIBus SSIBus;
typedef struct TCGCPUOps TCGCPUOps; typedef struct TCGCPUOps TCGCPUOps;
typedef struct TCGHelperInfo TCGHelperInfo; typedef struct TCGHelperInfo TCGHelperInfo;
typedef struct TaskState TaskState;
typedef struct TranslationBlock TranslationBlock; typedef struct TranslationBlock TranslationBlock;
typedef struct VirtIODevice VirtIODevice; typedef struct VirtIODevice VirtIODevice;
typedef struct Visitor Visitor; typedef struct Visitor Visitor;

View File

@ -17,6 +17,7 @@
#include "exec/cpu-common.h" #include "exec/cpu-common.h"
#include "exec/cpu-defs.h" #include "exec/cpu-defs.h"
#include "exec/tswap.h" #include "exec/tswap.h"
#include "exec/page-protection.h"
#define get_user_u64(val, addr) \ #define get_user_u64(val, addr) \
({ uint64_t val_ = 0; \ ({ uint64_t val_ = 0; \

View File

@ -18,8 +18,9 @@ typedef hwaddr (*phys_offset_to_gaddr_t)(hwaddr phys_offset,
void xen_map_cache_init(phys_offset_to_gaddr_t f, void xen_map_cache_init(phys_offset_to_gaddr_t f,
void *opaque); void *opaque);
uint8_t *xen_map_cache(hwaddr phys_addr, hwaddr size, uint8_t *xen_map_cache(MemoryRegion *mr, hwaddr phys_addr, hwaddr size,
uint8_t lock, bool dma); uint8_t lock, bool dma,
bool is_write);
ram_addr_t xen_ram_addr_from_mapcache(void *ptr); ram_addr_t xen_ram_addr_from_mapcache(void *ptr);
void xen_invalidate_map_cache_entry(uint8_t *buffer); void xen_invalidate_map_cache_entry(uint8_t *buffer);
void xen_invalidate_map_cache(void); void xen_invalidate_map_cache(void);
@ -33,10 +34,12 @@ static inline void xen_map_cache_init(phys_offset_to_gaddr_t f,
{ {
} }
static inline uint8_t *xen_map_cache(hwaddr phys_addr, static inline uint8_t *xen_map_cache(MemoryRegion *mr,
hwaddr phys_addr,
hwaddr size, hwaddr size,
uint8_t lock, uint8_t lock,
bool dma) bool dma,
bool is_write)
{ {
abort(); abort();
} }

View File

@ -24,6 +24,7 @@
#include "cpu_loop-common.h" #include "cpu_loop-common.h"
#include "signal-common.h" #include "signal-common.h"
#include "semihosting/common-semi.h" #include "semihosting/common-semi.h"
#include "exec/page-protection.h"
#include "target/arm/syndrome.h" #include "target/arm/syndrome.h"
#define get_user_code_u32(x, gaddr, env) \ #define get_user_code_u32(x, gaddr, env) \

View File

@ -8,6 +8,7 @@
#include "qemu.h" #include "qemu.h"
#include "user/tswap-target.h" #include "user/tswap-target.h"
#include "exec/page-protection.h"
#include "user/guest-base.h" #include "user/guest-base.h"
#include "user-internals.h" #include "user-internals.h"
#include "signal-common.h" #include "signal-common.h"
@ -2361,7 +2362,7 @@ static bool zero_bss(abi_ulong start_bss, abi_ulong end_bss,
if (start_bss < align_bss) { if (start_bss < align_bss) {
int flags = page_get_flags(start_bss); int flags = page_get_flags(start_bss);
if (!(flags & PAGE_BITS)) { if (!(flags & PAGE_RWX)) {
/* /*
* The whole address space of the executable was reserved * The whole address space of the executable was reserved
* at the start, therefore all pages will be VALID. * at the start, therefore all pages will be VALID.

View File

@ -20,6 +20,7 @@
#include <sys/shm.h> #include <sys/shm.h>
#include "trace.h" #include "trace.h"
#include "exec/log.h" #include "exec/log.h"
#include "exec/page-protection.h"
#include "qemu.h" #include "qemu.h"
#include "user-internals.h" #include "user-internals.h"
#include "user-mmap.h" #include "user-mmap.h"
@ -117,7 +118,7 @@ static void shm_region_rm_complete(abi_ptr start, abi_ptr last)
static int validate_prot_to_pageflags(int prot) static int validate_prot_to_pageflags(int prot)
{ {
int valid = PROT_READ | PROT_WRITE | PROT_EXEC | TARGET_PROT_SEM; int valid = PROT_READ | PROT_WRITE | PROT_EXEC | TARGET_PROT_SEM;
int page_flags = (prot & PAGE_BITS) | PAGE_VALID; int page_flags = (prot & PAGE_RWX) | PAGE_VALID;
#ifdef TARGET_AARCH64 #ifdef TARGET_AARCH64
{ {
@ -959,8 +960,8 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int target_prot,
*/ */
if (ret != -1 && (flags & MAP_TYPE) != MAP_PRIVATE) { if (ret != -1 && (flags & MAP_TYPE) != MAP_PRIVATE) {
CPUState *cpu = thread_cpu; CPUState *cpu = thread_cpu;
if (!(cpu->tcg_cflags & CF_PARALLEL)) { if (!tcg_cflags_has(cpu, CF_PARALLEL)) {
cpu->tcg_cflags |= CF_PARALLEL; tcg_cflags_set(cpu, CF_PARALLEL);
tb_flush(cpu); tb_flush(cpu);
} }
} }
@ -1399,8 +1400,8 @@ abi_ulong target_shmat(CPUArchState *cpu_env, int shmid,
* supported by the host -- anything that requires EXCP_ATOMIC will not * supported by the host -- anything that requires EXCP_ATOMIC will not
* be atomic with respect to an external process. * be atomic with respect to an external process.
*/ */
if (!(cpu->tcg_cflags & CF_PARALLEL)) { if (!tcg_cflags_has(cpu, CF_PARALLEL)) {
cpu->tcg_cflags |= CF_PARALLEL; tcg_cflags_set(cpu, CF_PARALLEL);
tb_flush(cpu); tb_flush(cpu);
} }

View File

@ -8,6 +8,7 @@
#include "syscall_defs.h" #include "syscall_defs.h"
#include "target_syscall.h" #include "target_syscall.h"
#include "accel/tcg/vcpu-state.h"
/* /*
* This is the size of the host kernel's sigset_t, needed where we make * This is the size of the host kernel's sigset_t, needed where we make
@ -95,7 +96,7 @@ struct emulated_sigtable {
target_siginfo_t info; target_siginfo_t info;
}; };
typedef struct TaskState { struct TaskState {
pid_t ts_tid; /* tid (or pid) of this task */ pid_t ts_tid; /* tid (or pid) of this task */
#ifdef TARGET_ARM #ifdef TARGET_ARM
# ifdef TARGET_ABI32 # ifdef TARGET_ABI32
@ -158,12 +159,7 @@ typedef struct TaskState {
/* Start time of task after system boot in clock ticks */ /* Start time of task after system boot in clock ticks */
uint64_t start_boottime; uint64_t start_boottime;
} TaskState; };
static inline TaskState *get_task_state(CPUState *cs)
{
return cs->opaque;
}
abi_long do_brk(abi_ulong new_brk); abi_long do_brk(abi_ulong new_brk);
int do_guest_openat(CPUArchState *cpu_env, int dirfd, const char *pathname, int do_guest_openat(CPUArchState *cpu_env, int dirfd, const char *pathname,

View File

@ -19,6 +19,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/bitops.h" #include "qemu/bitops.h"
#include "gdbstub/user.h" #include "gdbstub/user.h"
#include "exec/page-protection.h"
#include "hw/core/tcg-cpu-ops.h" #include "hw/core/tcg-cpu-ops.h"
#include <sys/ucontext.h> #include <sys/ucontext.h>

View File

@ -25,6 +25,7 @@
#include "qemu/plugin.h" #include "qemu/plugin.h"
#include "tcg/startup.h" #include "tcg/startup.h"
#include "target_mman.h" #include "target_mman.h"
#include "exec/page-protection.h"
#include <elf.h> #include <elf.h>
#include <endian.h> #include <endian.h>
#include <grp.h> #include <grp.h>
@ -6462,7 +6463,7 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
case PR_GET_TID_ADDRESS: case PR_GET_TID_ADDRESS:
{ {
TaskState *ts = env_cpu(env)->opaque; TaskState *ts = get_task_state(env_cpu(env));
return put_user_ual(ts->child_tidptr, arg2); return put_user_ual(ts->child_tidptr, arg2);
} }
@ -6582,8 +6583,8 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
* generate code for parallel execution and flush old translations. * generate code for parallel execution and flush old translations.
* Do this now so that the copy gets CF_PARALLEL too. * Do this now so that the copy gets CF_PARALLEL too.
*/ */
if (!(cpu->tcg_cflags & CF_PARALLEL)) { if (!tcg_cflags_has(cpu, CF_PARALLEL)) {
cpu->tcg_cflags |= CF_PARALLEL; tcg_cflags_set(cpu, CF_PARALLEL);
tb_flush(cpu); tb_flush(cpu);
} }
@ -8123,7 +8124,7 @@ static int open_self_maps_2(void *opaque, target_ulong guest_start,
static int open_self_maps_1(CPUArchState *env, int fd, bool smaps) static int open_self_maps_1(CPUArchState *env, int fd, bool smaps)
{ {
struct open_self_maps_data d = { struct open_self_maps_data d = {
.ts = env_cpu(env)->opaque, .ts = get_task_state(env_cpu(env)),
.host_maps = read_self_maps(), .host_maps = read_self_maps(),
.fd = fd, .fd = fd,
.smaps = smaps .smaps = smaps

View File

@ -533,7 +533,7 @@ void exec_inline_op(struct qemu_plugin_dyn_cb *cb, int cpu_index)
void qemu_plugin_vcpu_mem_cb(CPUState *cpu, uint64_t vaddr, void qemu_plugin_vcpu_mem_cb(CPUState *cpu, uint64_t vaddr,
MemOpIdx oi, enum qemu_plugin_mem_rw rw) MemOpIdx oi, enum qemu_plugin_mem_rw rw)
{ {
GArray *arr = cpu->plugin_mem_cbs; GArray *arr = cpu->neg.plugin_mem_cbs;
size_t i; size_t i;
if (arr == NULL) { if (arr == NULL) {

View File

@ -31,6 +31,7 @@
#endif /* CONFIG_TCG */ #endif /* CONFIG_TCG */
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/target_page.h" #include "exec/target_page.h"
#include "hw/qdev-core.h" #include "hw/qdev-core.h"
#include "hw/qdev-properties.h" #include "hw/qdev-properties.h"
@ -2188,43 +2189,28 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
} }
#endif /* !_WIN32 */ #endif /* !_WIN32 */
/* Return a host pointer to ram allocated with qemu_ram_alloc. /*
* This should not be used for general purpose DMA. Use address_space_map * Return a host pointer to guest's ram.
* or address_space_rw instead. For local memory (e.g. video ram) that the * For Xen, foreign mappings get created if they don't already exist.
* device owns, use memory_region_get_ram_ptr.
* *
* Called within RCU critical section. * @block: block for the RAM to lookup (optional and may be NULL).
*/ * @addr: address within the memory region.
void *qemu_map_ram_ptr(RAMBlock *block, ram_addr_t addr) * @size: pointer to requested size (optional and may be NULL).
{ * size may get modified and return a value smaller than
if (block == NULL) { * what was requested.
block = qemu_get_ram_block(addr); * @lock: wether to lock the mapping in xen-mapcache until invalidated.
addr -= block->offset; * @is_write: hint wether to map RW or RO in the xen-mapcache.
} * (optional and may always be set to true).
if (xen_enabled() && block->host == NULL) {
/* We need to check if the requested address is in the RAM
* because we don't want to map the entire memory in QEMU.
* In that case just map until the end of the page.
*/
if (block->offset == 0) {
return xen_map_cache(addr, 0, 0, false);
}
block->host = xen_map_cache(block->offset, block->max_length, 1, false);
}
return ramblock_ptr(block, addr);
}
/* Return a host pointer to guest's ram. Similar to qemu_map_ram_ptr
* but takes a size argument.
* *
* Called within RCU critical section. * Called within RCU critical section.
*/ */
static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr, static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
hwaddr *size, bool lock) hwaddr *size, bool lock,
bool is_write)
{ {
if (*size == 0) { hwaddr len = 0;
if (size && *size == 0) {
return NULL; return NULL;
} }
@ -2232,7 +2218,10 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
block = qemu_get_ram_block(addr); block = qemu_get_ram_block(addr);
addr -= block->offset; addr -= block->offset;
} }
*size = MIN(*size, block->max_length - addr); if (size) {
*size = MIN(*size, block->max_length - addr);
len = *size;
}
if (xen_enabled() && block->host == NULL) { if (xen_enabled() && block->host == NULL) {
/* We need to check if the requested address is in the RAM /* We need to check if the requested address is in the RAM
@ -2240,15 +2229,31 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
* In that case just map the requested area. * In that case just map the requested area.
*/ */
if (block->offset == 0) { if (block->offset == 0) {
return xen_map_cache(addr, *size, lock, lock); return xen_map_cache(block->mr, addr, len, lock, lock,
is_write);
} }
block->host = xen_map_cache(block->offset, block->max_length, 1, lock); block->host = xen_map_cache(block->mr, block->offset,
block->max_length, 1,
lock, is_write);
} }
return ramblock_ptr(block, addr); return ramblock_ptr(block, addr);
} }
/*
* Return a host pointer to ram allocated with qemu_ram_alloc.
* This should not be used for general purpose DMA. Use address_space_map
* or address_space_rw instead. For local memory (e.g. video ram) that the
* device owns, use memory_region_get_ram_ptr.
*
* Called within RCU critical section.
*/
void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
{
return qemu_ram_ptr_length(ram_block, addr, NULL, false, true);
}
/* Return the offset of a hostpointer within a ramblock */ /* Return the offset of a hostpointer within a ramblock */
ram_addr_t qemu_ram_block_host_offset(RAMBlock *rb, void *host) ram_addr_t qemu_ram_block_host_offset(RAMBlock *rb, void *host)
{ {
@ -2756,7 +2761,7 @@ static MemTxResult flatview_write_continue_step(MemTxAttrs attrs,
} else { } else {
/* RAM case */ /* RAM case */
uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l,
false); false, true);
memmove(ram_ptr, buf, *l); memmove(ram_ptr, buf, *l);
invalidate_and_set_dirty(mr, mr_addr, *l); invalidate_and_set_dirty(mr, mr_addr, *l);
@ -2849,7 +2854,7 @@ static MemTxResult flatview_read_continue_step(MemTxAttrs attrs, uint8_t *buf,
} else { } else {
/* RAM case */ /* RAM case */
uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l, uint8_t *ram_ptr = qemu_ram_ptr_length(mr->ram_block, mr_addr, l,
false); false, false);
memcpy(buf, ram_ptr, *l); memcpy(buf, ram_ptr, *l);
@ -3243,7 +3248,7 @@ void *address_space_map(AddressSpace *as,
*plen = flatview_extend_translation(fv, addr, len, mr, xlat, *plen = flatview_extend_translation(fv, addr, len, mr, xlat,
l, is_write, attrs); l, is_write, attrs);
fuzz_dma_read_cb(addr, *plen, mr); fuzz_dma_read_cb(addr, *plen, mr);
return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true); return qemu_ram_ptr_length(mr->ram_block, xlat, plen, true, is_write);
} }
/* Unmaps a memory region previously mapped by address_space_map(). /* Unmaps a memory region previously mapped by address_space_map().
@ -3339,7 +3344,8 @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
l = flatview_extend_translation(cache->fv, addr, len, mr, l = flatview_extend_translation(cache->fv, addr, len, mr,
cache->xlat, l, is_write, cache->xlat, l, is_write,
MEMTXATTRS_UNSPECIFIED); MEMTXATTRS_UNSPECIFIED);
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true); cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true,
is_write);
} else { } else {
cache->ptr = NULL; cache->ptr = NULL;
} }

View File

@ -21,6 +21,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "fpu/softfloat-types.h" #include "fpu/softfloat-types.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "qemu/qemu-print.h" #include "qemu/qemu-print.h"

View File

@ -1941,7 +1941,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
/* Use pc-relative instructions in system-mode */ /* Use pc-relative instructions in system-mode */
cs->tcg_cflags |= CF_PCREL; tcg_cflags_set(cs, CF_PCREL);
#endif #endif
/* If we needed to query the host kernel for the CPU features /* If we needed to query the host kernel for the CPU features

View File

@ -26,6 +26,7 @@
#include "cpu-qom.h" #include "cpu-qom.h"
#include "exec/cpu-defs.h" #include "exec/cpu-defs.h"
#include "exec/gdbstub.h" #include "exec/gdbstub.h"
#include "exec/page-protection.h"
#include "qapi/qapi-types-common.h" #include "qapi/qapi-types-common.h"
#include "target/arm/multiprocessing.h" #include "target/arm/multiprocessing.h"
#include "target/arm/gtimer.h" #include "target/arm/gtimer.h"

View File

@ -11,6 +11,7 @@
#include "qemu/range.h" #include "qemu/range.h"
#include "qemu/main-loop.h" #include "qemu/main-loop.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "cpu.h" #include "cpu.h"
#include "internals.h" #include "internals.h"
#include "cpu-features.h" #include "cpu-features.h"

View File

@ -16,6 +16,7 @@
#include "qemu/bitops.h" #include "qemu/bitops.h"
#include "qemu/log.h" #include "qemu/log.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#ifdef CONFIG_TCG #ifdef CONFIG_TCG
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "semihosting/common-semi.h" #include "semihosting/common-semi.h"

View File

@ -22,6 +22,7 @@
#include "cpu.h" #include "cpu.h"
#include "internals.h" #include "internals.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/ram_addr.h" #include "exec/ram_addr.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"

View File

@ -21,6 +21,7 @@
#include "cpu.h" #include "cpu.h"
#include "internals.h" #include "internals.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "tcg/tcg-gvec-desc.h" #include "tcg/tcg-gvec-desc.h"
#include "fpu/softfloat.h" #include "fpu/softfloat.h"

View File

@ -55,7 +55,7 @@ static int avr_cpu_mmu_index(CPUState *cs, bool ifetch)
static void avr_cpu_synchronize_from_tb(CPUState *cs, static void avr_cpu_synchronize_from_tb(CPUState *cs,
const TranslationBlock *tb) const TranslationBlock *tb)
{ {
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu_env(cs)->pc_w = tb->pc / 2; /* internally PC points to words */ cpu_env(cs)->pc_w = tb->pc / 2; /* internally PC points to words */
} }

View File

@ -24,6 +24,7 @@
#include "cpu.h" #include "cpu.h"
#include "hw/core/tcg-cpu-ops.h" #include "hw/core/tcg-cpu-ops.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"

View File

@ -21,6 +21,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "mmu.h" #include "mmu.h"
#ifdef DEBUG #ifdef DEBUG
@ -333,7 +334,7 @@ int cris_mmu_translate(struct cris_mmu_result *res,
if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) { if (!cris_mmu_enabled(env->sregs[SFR_RW_GC_CFG])) {
res->phy = vaddr; res->phy = vaddr;
res->prot = PAGE_BITS; res->prot = PAGE_RWX;
goto done; goto done;
} }
@ -344,7 +345,7 @@ int cris_mmu_translate(struct cris_mmu_result *res,
miss = 0; miss = 0;
base = cris_mmu_translate_seg(env, seg); base = cris_mmu_translate_seg(env, seg);
res->phy = base | (0x0fffffff & vaddr); res->phy = base | (0x0fffffff & vaddr);
res->prot = PAGE_BITS; res->prot = PAGE_RWX;
} else { } else {
miss = cris_mmu_translate_page(res, env, vaddr, access_type, miss = cris_mmu_translate_page(res, env, vaddr, access_type,
is_user, debug); is_user, debug);

View File

@ -257,7 +257,7 @@ static vaddr hexagon_cpu_get_pc(CPUState *cs)
static void hexagon_cpu_synchronize_from_tb(CPUState *cs, static void hexagon_cpu_synchronize_from_tb(CPUState *cs,
const TranslationBlock *tb) const TranslationBlock *tb)
{ {
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu_env(cs)->gpr[HEX_REG_PC] = tb->pc; cpu_env(cs)->gpr[HEX_REG_PC] = tb->pc;
} }

View File

@ -48,7 +48,7 @@ static void hppa_cpu_synchronize_from_tb(CPUState *cs,
{ {
HPPACPU *cpu = HPPA_CPU(cs); HPPACPU *cpu = HPPA_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
cpu->env.iaoq_f = tb->pc; cpu->env.iaoq_f = tb->pc;

View File

@ -21,6 +21,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "hw/core/cpu.h" #include "hw/core/cpu.h"
#include "trace.h" #include "trace.h"

View File

@ -22,6 +22,7 @@
#include "disas/disas.h" #include "disas/disas.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "tcg/tcg-op.h" #include "tcg/tcg-op.h"
#include "tcg/tcg-op-gvec.h" #include "tcg/tcg-op-gvec.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"

View File

@ -7382,7 +7382,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
/* Use pc-relative instructions in system-mode */ /* Use pc-relative instructions in system-mode */
cs->tcg_cflags |= CF_PCREL; tcg_cflags_set(cs, CF_PCREL);
#endif #endif
if (cpu->apic_id == UNASSIGNED_APIC_ID) { if (cpu->apic_id == UNASSIGNED_APIC_ID) {

View File

@ -523,7 +523,7 @@ static inline target_ulong get_memio_eip(CPUX86State *env)
} }
/* Per x86_restore_state_to_opc. */ /* Per x86_restore_state_to_opc. */
if (cs->tcg_cflags & CF_PCREL) { if (tcg_cflags_has(cs, CF_PCREL)) {
return (env->eip & TARGET_PAGE_MASK) | data[0]; return (env->eip & TARGET_PAGE_MASK) | data[0];
} else { } else {
return data[0] - env->segs[R_CS].base; return data[0] - env->segs[R_CS].base;

View File

@ -21,6 +21,7 @@
#include "cpu.h" #include "cpu.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "tcg/helper-tcg.h" #include "tcg/helper-tcg.h"
typedef struct TranslateParams { typedef struct TranslateParams {

View File

@ -336,7 +336,7 @@ static bool loongarch_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
static void loongarch_cpu_synchronize_from_tb(CPUState *cs, static void loongarch_cpu_synchronize_from_tb(CPUState *cs,
const TranslationBlock *tb) const TranslationBlock *tb)
{ {
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
set_pc(cpu_env(cs), tb->pc); set_pc(cpu_env(cs), tb->pc);
} }

View File

@ -13,6 +13,7 @@
#include "internals.h" #include "internals.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/log.h" #include "exec/log.h"
#include "cpu-csr.h" #include "cpu-csr.h"

View File

@ -21,6 +21,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/gdbstub.h" #include "exec/gdbstub.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "gdbstub/helpers.h" #include "gdbstub/helpers.h"

View File

@ -99,7 +99,7 @@ static void mb_cpu_synchronize_from_tb(CPUState *cs,
{ {
MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu->env.pc = tb->pc; cpu->env.pc = tb->pc;
cpu->env.iflags = tb->flags & IFLAGS_TB_MASK; cpu->env.iflags = tb->flags & IFLAGS_TB_MASK;
} }

View File

@ -21,6 +21,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "exec/log.h" #include "exec/log.h"
@ -51,7 +52,7 @@ bool mb_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
if (mmu_idx == MMU_NOMMU_IDX) { if (mmu_idx == MMU_NOMMU_IDX) {
/* MMU disabled or not available. */ /* MMU disabled or not available. */
address &= TARGET_PAGE_MASK; address &= TARGET_PAGE_MASK;
prot = PAGE_BITS; prot = PAGE_RWX;
tlb_set_page_with_attrs(cs, address, address, attrs, prot, mmu_idx, tlb_set_page_with_attrs(cs, address, address, attrs, prot, mmu_idx,
TARGET_PAGE_SIZE); TARGET_PAGE_SIZE);
return true; return true;

View File

@ -22,6 +22,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
static unsigned int tlb_decode_size(unsigned int f) static unsigned int tlb_decode_size(unsigned int f)
{ {

View File

@ -19,6 +19,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "../internal.h" #include "../internal.h"
static int is_seg_am_mapped(unsigned int am, bool eu, int mmu_idx) static int is_seg_am_mapped(unsigned int am, bool eu, int mmu_idx)

View File

@ -81,7 +81,7 @@ void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb)
{ {
CPUMIPSState *env = cpu_env(cs); CPUMIPSState *env = cpu_env(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
env->active_tc.PC = tb->pc; env->active_tc.PC = tb->pc;
env->hflags &= ~MIPS_HFLAG_BMASK; env->hflags &= ~MIPS_HFLAG_BMASK;
env->hflags |= tb->flags & MIPS_HFLAG_BMASK; env->hflags |= tb->flags & MIPS_HFLAG_BMASK;

View File

@ -93,7 +93,7 @@ bool mips_io_recompile_replay_branch(CPUState *cs, const TranslationBlock *tb)
CPUMIPSState *env = cpu_env(cs); CPUMIPSState *env = cpu_env(cs);
if ((env->hflags & MIPS_HFLAG_BMASK) != 0 if ((env->hflags & MIPS_HFLAG_BMASK) != 0
&& !(cs->tcg_cflags & CF_PCREL) && env->active_tc.PC != tb->pc) { && !tcg_cflags_has(cs, CF_PCREL) && env->active_tc.PC != tb->pc) {
env->active_tc.PC -= (env->hflags & MIPS_HFLAG_B16 ? 2 : 4); env->active_tc.PC -= (env->hflags & MIPS_HFLAG_B16 ? 2 : 4);
env->hflags &= ~MIPS_HFLAG_BMASK; env->hflags &= ~MIPS_HFLAG_BMASK;
return true; return true;

View File

@ -22,6 +22,7 @@
#include "cpu.h" #include "cpu.h"
#include "internal.h" #include "internal.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/log.h" #include "exec/log.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"

View File

@ -45,7 +45,7 @@ static void openrisc_cpu_synchronize_from_tb(CPUState *cs,
{ {
OpenRISCCPU *cpu = OPENRISC_CPU(cs); OpenRISCCPU *cpu = OPENRISC_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu->env.pc = tb->pc; cpu->env.pc = tb->pc;
} }

View File

@ -22,6 +22,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "gdbstub/helpers.h" #include "gdbstub/helpers.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "hw/loader.h" #include "hw/loader.h"

View File

@ -20,6 +20,7 @@
#include "exec/breakpoint.h" #include "exec/breakpoint.h"
#include "hw/registerfields.h" #include "hw/registerfields.h"
#include "exec/page-protection.h"
/* PM instructions */ /* PM instructions */
typedef enum { typedef enum {

View File

@ -21,6 +21,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "sysemu/kvm.h" #include "sysemu/kvm.h"
#include "kvm_ppc.h" #include "kvm_ppc.h"
#include "internal.h" #include "internal.h"

View File

@ -21,6 +21,7 @@
#include "qemu/units.h" #include "qemu/units.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qemu/qemu-print.h" #include "qemu/qemu-print.h"
#include "sysemu/hw_accel.h" #include "sysemu/hw_accel.h"

View File

@ -20,6 +20,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "sysemu/kvm.h" #include "sysemu/kvm.h"
#include "kvm_ppc.h" #include "kvm_ppc.h"

View File

@ -3,6 +3,8 @@
#ifndef CONFIG_USER_ONLY #ifndef CONFIG_USER_ONLY
#include "exec/page-protection.h"
/* Radix Quadrants */ /* Radix Quadrants */
#define R_EADDR_MASK 0x3FFFFFFFFFFFFFFF #define R_EADDR_MASK 0x3FFFFFFFFFFFFFFF
#define R_EADDR_VALID_MASK 0xC00FFFFFFFFFFFFF #define R_EADDR_VALID_MASK 0xC00FFFFFFFFFFFFF

View File

@ -25,6 +25,7 @@
#include "mmu-hash64.h" #include "mmu-hash64.h"
#include "mmu-hash32.h" #include "mmu-hash32.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/log.h" #include "exec/log.h"
#include "helper_regs.h" #include "helper_regs.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"

View File

@ -25,6 +25,7 @@
#include "mmu-hash64.h" #include "mmu-hash64.h"
#include "mmu-hash32.h" #include "mmu-hash32.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/log.h" #include "exec/log.h"
#include "helper_regs.h" #include "helper_regs.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"

View File

@ -24,6 +24,7 @@
#include "internals.h" #include "internals.h"
#include "pmu.h" #include "pmu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "instmap.h" #include "instmap.h"
#include "tcg/tcg-op.h" #include "tcg/tcg-op.h"
#include "trace.h" #include "trace.h"

View File

@ -25,6 +25,7 @@
#include "cpu.h" #include "cpu.h"
#include "trace.h" #include "trace.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
static bool pmp_write_cfg(CPURISCVState *env, uint32_t addr_index, static bool pmp_write_cfg(CPURISCVState *env, uint32_t addr_index,
uint8_t val); uint8_t val);

View File

@ -96,7 +96,7 @@ static void riscv_cpu_synchronize_from_tb(CPUState *cs,
CPURISCVState *env = &cpu->env; CPURISCVState *env = &cpu->env;
RISCVMXL xl = FIELD_EX32(tb->flags, TB_FLAGS, XL); RISCVMXL xl = FIELD_EX32(tb->flags, TB_FLAGS, XL);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
if (xl == MXL_RV32) { if (xl == MXL_RV32) {
env->pc = (int32_t) tb->pc; env->pc = (int32_t) tb->pc;
@ -890,7 +890,7 @@ static bool riscv_tcg_cpu_realize(CPUState *cs, Error **errp)
CPURISCVState *env = &cpu->env; CPURISCVState *env = &cpu->env;
Error *local_err = NULL; Error *local_err = NULL;
CPU(cs)->tcg_cflags |= CF_PCREL; tcg_cflags_set(CPU(cs), CF_PCREL);
if (cpu->cfg.ext_sstc) { if (cpu->cfg.ext_sstc) {
riscv_timer_init(cpu); riscv_timer_init(cpu);

View File

@ -23,6 +23,7 @@
#include "exec/memop.h" #include "exec/memop.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "exec/page-protection.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "fpu/softfloat.h" #include "fpu/softfloat.h"
#include "tcg/tcg-gvec-desc.h" #include "tcg/tcg-gvec-desc.h"

View File

@ -22,6 +22,7 @@
#include "cpu.h" #include "cpu.h"
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "fpu/softfloat.h" #include "fpu/softfloat.h"
#include "tcg/debug-assert.h" #include "tcg/debug-assert.h"
@ -45,7 +46,7 @@ static void rx_cpu_synchronize_from_tb(CPUState *cs,
{ {
RXCPU *cpu = RX_CPU(cs); RXCPU *cpu = RX_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu->env.pc = tb->pc; cpu->env.pc = tb->pc;
} }

View File

@ -24,6 +24,7 @@
#include "sysemu/kvm.h" #include "sysemu/kvm.h"
#include "sysemu/tcg.h" #include "sysemu/tcg.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "trace.h" #include "trace.h"
#include "hw/hw.h" #include "hw/hw.h"
#include "hw/s390x/storage-keys.h" #include "hw/s390x/storage-keys.h"

View File

@ -25,6 +25,7 @@
#include "tcg_s390x.h" #include "tcg_s390x.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "hw/core/tcg-cpu-ops.h" #include "hw/core/tcg-cpu-ops.h"
#include "qemu/int128.h" #include "qemu/int128.h"

View File

@ -47,7 +47,7 @@ static void superh_cpu_synchronize_from_tb(CPUState *cs,
{ {
SuperHCPU *cpu = SUPERH_CPU(cs); SuperHCPU *cpu = SUPERH_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu->env.pc = tb->pc; cpu->env.pc = tb->pc;
cpu->env.flags = tb->flags & TB_FLAG_ENVFLAGS_MASK; cpu->env.flags = tb->flags & TB_FLAG_ENVFLAGS_MASK;
} }
@ -74,7 +74,7 @@ static bool superh_io_recompile_replay_branch(CPUState *cs,
CPUSH4State *env = cpu_env(cs); CPUSH4State *env = cpu_env(cs);
if ((env->flags & (TB_FLAG_DELAY_SLOT | TB_FLAG_DELAY_SLOT_COND)) if ((env->flags & (TB_FLAG_DELAY_SLOT | TB_FLAG_DELAY_SLOT_COND))
&& !(cs->tcg_cflags & CF_PCREL) && env->pc != tb->pc) { && !tcg_cflags_has(cs, CF_PCREL) && env->pc != tb->pc) {
env->pc -= 2; env->pc -= 2;
env->flags &= ~(TB_FLAG_DELAY_SLOT | TB_FLAG_DELAY_SLOT_COND); env->flags &= ~(TB_FLAG_DELAY_SLOT | TB_FLAG_DELAY_SLOT_COND);
return true; return true;

View File

@ -21,6 +21,7 @@
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/log.h" #include "exec/log.h"
#if !defined(CONFIG_USER_ONLY) #if !defined(CONFIG_USER_ONLY)

View File

@ -702,7 +702,7 @@ static void sparc_cpu_synchronize_from_tb(CPUState *cs,
{ {
SPARCCPU *cpu = SPARC_CPU(cs); SPARCCPU *cpu = SPARC_CPU(cs);
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu->env.pc = tb->pc; cpu->env.pc = tb->pc;
cpu->env.npc = tb->cs_base; cpu->env.npc = tb->cs_base;
} }

View File

@ -23,6 +23,7 @@
#include "tcg/tcg.h" #include "tcg/tcg.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "exec/cpu_ldst.h" #include "exec/cpu_ldst.h"
#include "asi.h" #include "asi.h"

View File

@ -21,6 +21,7 @@
#include "qemu/log.h" #include "qemu/log.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "qemu/qemu-print.h" #include "qemu/qemu-print.h"
#include "trace.h" #include "trace.h"

View File

@ -47,7 +47,7 @@ static vaddr tricore_cpu_get_pc(CPUState *cs)
static void tricore_cpu_synchronize_from_tb(CPUState *cs, static void tricore_cpu_synchronize_from_tb(CPUState *cs,
const TranslationBlock *tb) const TranslationBlock *tb)
{ {
tcg_debug_assert(!(cs->tcg_cflags & CF_PCREL)); tcg_debug_assert(!tcg_cflags_has(cs, CF_PCREL));
cpu_env(cs)->PC = tb->pc; cpu_env(cs)->PC = tb->pc;
} }

View File

@ -20,6 +20,7 @@
#include "hw/registerfields.h" #include "hw/registerfields.h"
#include "cpu.h" #include "cpu.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#include "fpu/softfloat-helpers.h" #include "fpu/softfloat-helpers.h"
#include "qemu/qemu-print.h" #include "qemu/qemu-print.h"

View File

@ -33,6 +33,7 @@
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "exec/page-protection.h"
#define XTENSA_MPU_SEGMENT_MASK 0x0000001f #define XTENSA_MPU_SEGMENT_MASK 0x0000001f
#define XTENSA_MPU_ACC_RIGHTS_MASK 0x00000f00 #define XTENSA_MPU_ACC_RIGHTS_MASK 0x00000f00

View File

@ -28,6 +28,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "cpu.h" #include "cpu.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#include "exec/page-protection.h"
#include "qemu/host-utils.h" #include "qemu/host-utils.h"
#include "exec/exec-all.h" #include "exec/exec-all.h"
#include "qemu/atomic.h" #include "qemu/atomic.h"