mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
tcg: Remove TCG_OVERSIZED_GUEST
This is now prohibited in configuration. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
3a3b282879
commit
f441b4d19b
7 changed files with 8 additions and 97 deletions
|
@ -47,7 +47,6 @@
|
||||||
#include "qemu/plugin-memory.h"
|
#include "qemu/plugin-memory.h"
|
||||||
#endif
|
#endif
|
||||||
#include "tcg/tcg-ldst.h"
|
#include "tcg/tcg-ldst.h"
|
||||||
#include "tcg/oversized-guest.h"
|
|
||||||
|
|
||||||
/* DEBUG defines, enable DEBUG_TLB_LOG to log to the CPU_LOG_MMU target */
|
/* DEBUG defines, enable DEBUG_TLB_LOG to log to the CPU_LOG_MMU target */
|
||||||
/* #define DEBUG_TLB */
|
/* #define DEBUG_TLB */
|
||||||
|
@ -118,12 +117,8 @@ static inline uint64_t tlb_read_idx(const CPUTLBEntry *entry,
|
||||||
return qatomic_read(ptr);
|
return qatomic_read(ptr);
|
||||||
#else
|
#else
|
||||||
const uint64_t *ptr = &entry->addr_idx[access_type];
|
const uint64_t *ptr = &entry->addr_idx[access_type];
|
||||||
# if TCG_OVERSIZED_GUEST
|
|
||||||
return *ptr;
|
|
||||||
# else
|
|
||||||
/* ofs might correspond to .addr_write, so use qatomic_read */
|
/* ofs might correspond to .addr_write, so use qatomic_read */
|
||||||
return qatomic_read(ptr);
|
return qatomic_read(ptr);
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -908,8 +903,6 @@ static void tlb_reset_dirty_range_locked(CPUTLBEntry *tlb_entry,
|
||||||
uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write;
|
uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write;
|
||||||
ptr_write += HOST_BIG_ENDIAN;
|
ptr_write += HOST_BIG_ENDIAN;
|
||||||
qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY);
|
qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY);
|
||||||
#elif TCG_OVERSIZED_GUEST
|
|
||||||
tlb_entry->addr_write |= TLB_NOTDIRTY;
|
|
||||||
#else
|
#else
|
||||||
qatomic_set(&tlb_entry->addr_write,
|
qatomic_set(&tlb_entry->addr_write,
|
||||||
tlb_entry->addr_write | TLB_NOTDIRTY);
|
tlb_entry->addr_write | TLB_NOTDIRTY);
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include "exec/replay-core.h"
|
#include "exec/replay-core.h"
|
||||||
#include "system/cpu-timers.h"
|
#include "system/cpu-timers.h"
|
||||||
#include "tcg/startup.h"
|
#include "tcg/startup.h"
|
||||||
#include "tcg/oversized-guest.h"
|
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "qemu/accel.h"
|
#include "qemu/accel.h"
|
||||||
|
@ -41,6 +40,8 @@
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#endif
|
#endif
|
||||||
#include "internal-common.h"
|
#include "internal-common.h"
|
||||||
|
#include "cpu-param.h"
|
||||||
|
|
||||||
|
|
||||||
struct TCGState {
|
struct TCGState {
|
||||||
AccelState parent_obj;
|
AccelState parent_obj;
|
||||||
|
@ -72,7 +73,7 @@ DECLARE_INSTANCE_CHECKER(TCGState, TCG_STATE,
|
||||||
|
|
||||||
static bool default_mttcg_enabled(void)
|
static bool default_mttcg_enabled(void)
|
||||||
{
|
{
|
||||||
if (icount_enabled() || TCG_OVERSIZED_GUEST) {
|
if (icount_enabled()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#ifdef TARGET_SUPPORTS_MTTCG
|
#ifdef TARGET_SUPPORTS_MTTCG
|
||||||
|
@ -145,9 +146,7 @@ static void tcg_set_thread(Object *obj, const char *value, Error **errp)
|
||||||
TCGState *s = TCG_STATE(obj);
|
TCGState *s = TCG_STATE(obj);
|
||||||
|
|
||||||
if (strcmp(value, "multi") == 0) {
|
if (strcmp(value, "multi") == 0) {
|
||||||
if (TCG_OVERSIZED_GUEST) {
|
if (icount_enabled()) {
|
||||||
error_setg(errp, "No MTTCG when guest word size > hosts");
|
|
||||||
} else if (icount_enabled()) {
|
|
||||||
error_setg(errp, "No MTTCG when icount is enabled");
|
error_setg(errp, "No MTTCG when icount is enabled");
|
||||||
} else {
|
} else {
|
||||||
#ifndef TARGET_SUPPORTS_MTTCG
|
#ifndef TARGET_SUPPORTS_MTTCG
|
||||||
|
|
|
@ -37,7 +37,6 @@ if:
|
||||||
|
|
||||||
* forced by --accel tcg,thread=single
|
* forced by --accel tcg,thread=single
|
||||||
* enabling --icount mode
|
* enabling --icount mode
|
||||||
* 64 bit guests on 32 bit hosts (TCG_OVERSIZED_GUEST)
|
|
||||||
|
|
||||||
In the general case of running translated code there should be no
|
In the general case of running translated code there should be no
|
||||||
inter-vCPU dependencies and all vCPUs should be able to run at full
|
inter-vCPU dependencies and all vCPUs should be able to run at full
|
||||||
|
|
|
@ -56,25 +56,13 @@
|
||||||
*/
|
*/
|
||||||
#define signal_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
|
#define signal_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
/* Sanity check that the size of an atomic operation isn't "overly large".
|
/*
|
||||||
|
* Sanity check that the size of an atomic operation isn't "overly large".
|
||||||
* Despite the fact that e.g. i686 has 64-bit atomic operations, we do not
|
* Despite the fact that e.g. i686 has 64-bit atomic operations, we do not
|
||||||
* want to use them because we ought not need them, and this lets us do a
|
* want to use them because we ought not need them, and this lets us do a
|
||||||
* bit of sanity checking that other 32-bit hosts might build.
|
* bit of sanity checking that other 32-bit hosts might build.
|
||||||
*
|
|
||||||
* That said, we have a problem on 64-bit ILP32 hosts in that in order to
|
|
||||||
* sync with TCG_OVERSIZED_GUEST, this must match TCG_TARGET_REG_BITS.
|
|
||||||
* We'd prefer not want to pull in everything else TCG related, so handle
|
|
||||||
* those few cases by hand.
|
|
||||||
*
|
|
||||||
* Note that x32 is fully detected with __x86_64__ + _ILP32, and that for
|
|
||||||
* Sparc we always force the use of sparcv9 in configure. MIPS n32 (ILP32) &
|
|
||||||
* n64 (LP64) ABIs are both detected using __mips64.
|
|
||||||
*/
|
*/
|
||||||
#if defined(__x86_64__) || defined(__sparc__) || defined(__mips64)
|
#define ATOMIC_REG_SIZE sizeof(void *)
|
||||||
# define ATOMIC_REG_SIZE 8
|
|
||||||
#else
|
|
||||||
# define ATOMIC_REG_SIZE sizeof(void *)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Weak atomic operations prevent the compiler moving other
|
/* Weak atomic operations prevent the compiler moving other
|
||||||
* loads/stores past the atomic operation load/store. However there is
|
* loads/stores past the atomic operation load/store. However there is
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
/* SPDX-License-Identifier: MIT */
|
|
||||||
/*
|
|
||||||
* Define TCG_OVERSIZED_GUEST
|
|
||||||
* Copyright (c) 2008 Fabrice Bellard
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EXEC_TCG_OVERSIZED_GUEST_H
|
|
||||||
#define EXEC_TCG_OVERSIZED_GUEST_H
|
|
||||||
|
|
||||||
#include "tcg-target-reg-bits.h"
|
|
||||||
#include "cpu-param.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Oversized TCG guests make things like MTTCG hard
|
|
||||||
* as we can't use atomics for cputlb updates.
|
|
||||||
*/
|
|
||||||
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
|
|
||||||
#define TCG_OVERSIZED_GUEST 1
|
|
||||||
#else
|
|
||||||
#define TCG_OVERSIZED_GUEST 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -16,9 +16,6 @@
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
#include "cpu-features.h"
|
#include "cpu-features.h"
|
||||||
#include "idau.h"
|
#include "idau.h"
|
||||||
#ifdef CONFIG_TCG
|
|
||||||
# include "tcg/oversized-guest.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct S1Translate {
|
typedef struct S1Translate {
|
||||||
/*
|
/*
|
||||||
|
@ -840,7 +837,6 @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val,
|
||||||
ptw->out_rw = true;
|
ptw->out_rw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ATOMIC64
|
|
||||||
if (ptw->out_be) {
|
if (ptw->out_be) {
|
||||||
old_val = cpu_to_be64(old_val);
|
old_val = cpu_to_be64(old_val);
|
||||||
new_val = cpu_to_be64(new_val);
|
new_val = cpu_to_be64(new_val);
|
||||||
|
@ -852,36 +848,6 @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val,
|
||||||
cur_val = qatomic_cmpxchg__nocheck((uint64_t *)host, old_val, new_val);
|
cur_val = qatomic_cmpxchg__nocheck((uint64_t *)host, old_val, new_val);
|
||||||
cur_val = le64_to_cpu(cur_val);
|
cur_val = le64_to_cpu(cur_val);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* We can't support the full 64-bit atomic cmpxchg on the host.
|
|
||||||
* Because this is only used for FEAT_HAFDBS, which is only for AA64,
|
|
||||||
* we know that TCG_OVERSIZED_GUEST is set, which means that we are
|
|
||||||
* running in round-robin mode and could only race with dma i/o.
|
|
||||||
*/
|
|
||||||
#if !TCG_OVERSIZED_GUEST
|
|
||||||
# error "Unexpected configuration"
|
|
||||||
#endif
|
|
||||||
bool locked = bql_locked();
|
|
||||||
if (!locked) {
|
|
||||||
bql_lock();
|
|
||||||
}
|
|
||||||
if (ptw->out_be) {
|
|
||||||
cur_val = ldq_be_p(host);
|
|
||||||
if (cur_val == old_val) {
|
|
||||||
stq_be_p(host, new_val);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cur_val = ldq_le_p(host);
|
|
||||||
if (cur_val == old_val) {
|
|
||||||
stq_le_p(host, new_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!locked) {
|
|
||||||
bql_unlock();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return cur_val;
|
return cur_val;
|
||||||
#else
|
#else
|
||||||
/* AArch32 does not have FEAT_HADFS; non-TCG guests only use debug-mode. */
|
/* AArch32 does not have FEAT_HADFS; non-TCG guests only use debug-mode. */
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include "system/cpu-timers.h"
|
#include "system/cpu-timers.h"
|
||||||
#include "cpu_bits.h"
|
#include "cpu_bits.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "tcg/oversized-guest.h"
|
|
||||||
#include "pmp.h"
|
#include "pmp.h"
|
||||||
|
|
||||||
int riscv_env_mmu_index(CPURISCVState *env, bool ifetch)
|
int riscv_env_mmu_index(CPURISCVState *env, bool ifetch)
|
||||||
|
@ -1167,9 +1166,7 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
|
||||||
hwaddr pte_addr;
|
hwaddr pte_addr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#if !TCG_OVERSIZED_GUEST
|
restart:
|
||||||
restart:
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < levels; i++, ptshift -= ptidxbits) {
|
for (i = 0; i < levels; i++, ptshift -= ptidxbits) {
|
||||||
target_ulong idx;
|
target_ulong idx;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
|
@ -1388,13 +1385,6 @@ restart:
|
||||||
false, MEMTXATTRS_UNSPECIFIED);
|
false, MEMTXATTRS_UNSPECIFIED);
|
||||||
if (memory_region_is_ram(mr)) {
|
if (memory_region_is_ram(mr)) {
|
||||||
target_ulong *pte_pa = qemu_map_ram_ptr(mr->ram_block, addr1);
|
target_ulong *pte_pa = qemu_map_ram_ptr(mr->ram_block, addr1);
|
||||||
#if TCG_OVERSIZED_GUEST
|
|
||||||
/*
|
|
||||||
* MTTCG is not enabled on oversized TCG guests so
|
|
||||||
* page table updates do not need to be atomic
|
|
||||||
*/
|
|
||||||
*pte_pa = pte = updated_pte;
|
|
||||||
#else
|
|
||||||
target_ulong old_pte;
|
target_ulong old_pte;
|
||||||
if (riscv_cpu_sxl(env) == MXL_RV32) {
|
if (riscv_cpu_sxl(env) == MXL_RV32) {
|
||||||
old_pte = qatomic_cmpxchg((uint32_t *)pte_pa, pte, updated_pte);
|
old_pte = qatomic_cmpxchg((uint32_t *)pte_pa, pte, updated_pte);
|
||||||
|
@ -1405,7 +1395,6 @@ restart:
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
pte = updated_pte;
|
pte = updated_pte;
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Misconfigured PTE in ROM (AD bits are not preset) or
|
* Misconfigured PTE in ROM (AD bits are not preset) or
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue