mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-misc-20250924' of https://gitlab.com/rth7680/qemu into staging
hw/pci-host/{dino,astro}: Don't call pci_register_root_bus() in init
target/sparc: Loosen various decode for v7
linux-user: Add syscall dispatch support
tcg/optimize: Fix folding of vector bitsel
include/hw/core/cpu: Introduce MMUIdxMap
include/hw/core/cpu: Introduce cpu_tlb_fast
include/hw/core/cpu: Invert the indexing into CPUTLBDescFast
accel/tcg: Remove dead mmap_unlock() call in invalidate_phys_page_range
accel/tcg: Remove cpu_loop_exit_restore() stub
accel/tcg: Properly unlink a TB linked to itself
accel/tcg: Introduce and use tb_flush__exclusive_or_serial
# -----BEGIN PGP SIGNATURE-----
#
# iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmjUP5MdHHJpY2hhcmQu
# aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV/qEwgAt6uSXMVTXykr6uxW
# 321nMEMEB2Av5LHQwvgRW/BOAWCKDNtxHHn3tcfvOLKcFHR+agZqTHBvOKGgPGSo
# fPkoHRMlcb3pKxhttX66qZhDiaMNRALtajVNkelKUso4BtESkW1v4yQVNLr1Rk6+
# f/xg4noX2gSh56VDMGLgcTR5wvTNycTIq3909zPmO4YPVQjwUPSYkB227LyBRLYg
# R6EQOzn45oQuFfMYukjNQczibkZ7NV8mW7XmbfiMXwvK1yA/F75eN+B9sJKqS44d
# ww/rurQdIYZFwPPPqz3XZmztg0n9syE9VHkliYmAoJRtbgc0obQHt9M7UfLwW2TM
# NXYlNw==
# =HVcw
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed 24 Sep 2025 11:59:31 AM PDT
# gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F
# gpg: issuer "richard.henderson@linaro.org"
# gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [ultimate]
* tag 'pull-misc-20250924' of https://gitlab.com/rth7680/qemu: (32 commits)
accel/tcg: Remove cpu_loop_exit_restore() stub
accel/tcg: Remove dead mmap_unlock() call in invalidate_phys_page_range
accel/tcg: Improve buffer overflow in tb_gen_code
accel/tcg: Create queue_tb_flush from tb_flush
linux-user: Split out begin_parallel_context
plugins: Use tb_flush__exclusive_or_serial
accel/tcg: Move post-load tb_flush to vm_change_state hook
accel/tcg: Split out tb_flush__exclusive_or_serial
hw/ppc/spapr: Use tb_invalidate_phys_range in h_page_init
target/riscv: Record misa_ext in TCGTBCPUState.cs_base
target/alpha: Simplify call_pal implementation
gdbstub: Remove tb_flush uses
tests/tcg/multiarch: Add tb-link test
accel/tcg: Properly unlink a TB linked to itself
target/hppa: Adjust mmu indexes to begin with 0
include/hw/core/cpu: Invert the indexing into CPUTLBDescFast
include/hw/core/cpu: Introduce cpu_tlb_fast
include/hw/core/cpu: Introduce MMUIdxMap
tcg/optimize: Fix folding of vector bitsel
hw/pci-host/astro: Don't call pci_regsiter_root_bus() in init
...
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
@@ -17,8 +17,3 @@ G_NORETURN void cpu_loop_exit(CPUState *cpu)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
+23
-23
@@ -129,7 +129,7 @@ static inline uint64_t tlb_addr_write(const CPUTLBEntry *entry)
|
||||
static inline uintptr_t tlb_index(CPUState *cpu, uintptr_t mmu_idx,
|
||||
vaddr addr)
|
||||
{
|
||||
uintptr_t size_mask = cpu->neg.tlb.f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS;
|
||||
uintptr_t size_mask = cpu_tlb_fast(cpu, mmu_idx)->mask >> CPU_TLB_ENTRY_BITS;
|
||||
|
||||
return (addr >> TARGET_PAGE_BITS) & size_mask;
|
||||
}
|
||||
@@ -138,7 +138,7 @@ static inline uintptr_t tlb_index(CPUState *cpu, uintptr_t mmu_idx,
|
||||
static inline CPUTLBEntry *tlb_entry(CPUState *cpu, uintptr_t mmu_idx,
|
||||
vaddr addr)
|
||||
{
|
||||
return &cpu->neg.tlb.f[mmu_idx].table[tlb_index(cpu, mmu_idx, addr)];
|
||||
return &cpu_tlb_fast(cpu, mmu_idx)->table[tlb_index(cpu, mmu_idx, addr)];
|
||||
}
|
||||
|
||||
static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns,
|
||||
@@ -292,7 +292,7 @@ static void tlb_flush_one_mmuidx_locked(CPUState *cpu, int mmu_idx,
|
||||
int64_t now)
|
||||
{
|
||||
CPUTLBDesc *desc = &cpu->neg.tlb.d[mmu_idx];
|
||||
CPUTLBDescFast *fast = &cpu->neg.tlb.f[mmu_idx];
|
||||
CPUTLBDescFast *fast = cpu_tlb_fast(cpu, mmu_idx);
|
||||
|
||||
tlb_mmu_resize_locked(desc, fast, now);
|
||||
tlb_mmu_flush_locked(desc, fast);
|
||||
@@ -331,7 +331,7 @@ void tlb_init(CPUState *cpu)
|
||||
cpu->neg.tlb.c.dirty = 0;
|
||||
|
||||
for (i = 0; i < NB_MMU_MODES; i++) {
|
||||
tlb_mmu_init(&cpu->neg.tlb.d[i], &cpu->neg.tlb.f[i], now);
|
||||
tlb_mmu_init(&cpu->neg.tlb.d[i], cpu_tlb_fast(cpu, i), now);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,7 +342,7 @@ void tlb_destroy(CPUState *cpu)
|
||||
qemu_spin_destroy(&cpu->neg.tlb.c.lock);
|
||||
for (i = 0; i < NB_MMU_MODES; i++) {
|
||||
CPUTLBDesc *desc = &cpu->neg.tlb.d[i];
|
||||
CPUTLBDescFast *fast = &cpu->neg.tlb.f[i];
|
||||
CPUTLBDescFast *fast = cpu_tlb_fast(cpu, i);
|
||||
|
||||
g_free(fast->table);
|
||||
g_free(desc->fulltlb);
|
||||
@@ -370,8 +370,8 @@ static void flush_all_helper(CPUState *src, run_on_cpu_func fn,
|
||||
|
||||
static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
|
||||
{
|
||||
uint16_t asked = data.host_int;
|
||||
uint16_t all_dirty, work, to_clean;
|
||||
MMUIdxMap asked = data.host_int;
|
||||
MMUIdxMap all_dirty, work, to_clean;
|
||||
int64_t now = get_clock_realtime();
|
||||
|
||||
assert_cpu_is_self(cpu);
|
||||
@@ -408,7 +408,7 @@ static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
|
||||
}
|
||||
}
|
||||
|
||||
void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
|
||||
void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap)
|
||||
{
|
||||
tlb_debug("mmu_idx: 0x%" PRIx16 "\n", idxmap);
|
||||
|
||||
@@ -422,7 +422,7 @@ void tlb_flush(CPUState *cpu)
|
||||
tlb_flush_by_mmuidx(cpu, ALL_MMUIDX_BITS);
|
||||
}
|
||||
|
||||
void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *src_cpu, uint16_t idxmap)
|
||||
void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *src_cpu, MMUIdxMap idxmap)
|
||||
{
|
||||
const run_on_cpu_func fn = tlb_flush_by_mmuidx_async_work;
|
||||
|
||||
@@ -531,7 +531,7 @@ static void tlb_flush_page_locked(CPUState *cpu, int midx, vaddr page)
|
||||
*/
|
||||
static void tlb_flush_page_by_mmuidx_async_0(CPUState *cpu,
|
||||
vaddr addr,
|
||||
uint16_t idxmap)
|
||||
MMUIdxMap idxmap)
|
||||
{
|
||||
int mmu_idx;
|
||||
|
||||
@@ -570,14 +570,14 @@ static void tlb_flush_page_by_mmuidx_async_1(CPUState *cpu,
|
||||
{
|
||||
vaddr addr_and_idxmap = data.target_ptr;
|
||||
vaddr addr = addr_and_idxmap & TARGET_PAGE_MASK;
|
||||
uint16_t idxmap = addr_and_idxmap & ~TARGET_PAGE_MASK;
|
||||
MMUIdxMap idxmap = addr_and_idxmap & ~TARGET_PAGE_MASK;
|
||||
|
||||
tlb_flush_page_by_mmuidx_async_0(cpu, addr, idxmap);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
vaddr addr;
|
||||
uint16_t idxmap;
|
||||
MMUIdxMap idxmap;
|
||||
} TLBFlushPageByMMUIdxData;
|
||||
|
||||
/**
|
||||
@@ -599,7 +599,7 @@ static void tlb_flush_page_by_mmuidx_async_2(CPUState *cpu,
|
||||
g_free(d);
|
||||
}
|
||||
|
||||
void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, uint16_t idxmap)
|
||||
void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr, MMUIdxMap idxmap)
|
||||
{
|
||||
tlb_debug("addr: %016" VADDR_PRIx " mmu_idx:%" PRIx16 "\n", addr, idxmap);
|
||||
|
||||
@@ -618,7 +618,7 @@ void tlb_flush_page(CPUState *cpu, vaddr addr)
|
||||
|
||||
void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
|
||||
vaddr addr,
|
||||
uint16_t idxmap)
|
||||
MMUIdxMap idxmap)
|
||||
{
|
||||
tlb_debug("addr: %016" VADDR_PRIx " mmu_idx:%"PRIx16"\n", addr, idxmap);
|
||||
|
||||
@@ -667,7 +667,7 @@ static void tlb_flush_range_locked(CPUState *cpu, int midx,
|
||||
unsigned bits)
|
||||
{
|
||||
CPUTLBDesc *d = &cpu->neg.tlb.d[midx];
|
||||
CPUTLBDescFast *f = &cpu->neg.tlb.f[midx];
|
||||
CPUTLBDescFast *f = cpu_tlb_fast(cpu, midx);
|
||||
vaddr mask = MAKE_64BIT_MASK(0, bits);
|
||||
|
||||
/*
|
||||
@@ -715,8 +715,8 @@ static void tlb_flush_range_locked(CPUState *cpu, int midx,
|
||||
typedef struct {
|
||||
vaddr addr;
|
||||
vaddr len;
|
||||
uint16_t idxmap;
|
||||
uint16_t bits;
|
||||
MMUIdxMap idxmap;
|
||||
unsigned bits;
|
||||
} TLBFlushRangeData;
|
||||
|
||||
static void tlb_flush_range_by_mmuidx_async_0(CPUState *cpu,
|
||||
@@ -766,7 +766,7 @@ static void tlb_flush_range_by_mmuidx_async_1(CPUState *cpu,
|
||||
}
|
||||
|
||||
void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
vaddr len, uint16_t idxmap,
|
||||
vaddr len, MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
TLBFlushRangeData d;
|
||||
@@ -797,7 +797,7 @@ void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
}
|
||||
|
||||
void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap, unsigned bits)
|
||||
MMUIdxMap idxmap, unsigned bits)
|
||||
{
|
||||
tlb_flush_range_by_mmuidx(cpu, addr, TARGET_PAGE_SIZE, idxmap, bits);
|
||||
}
|
||||
@@ -805,7 +805,7 @@ void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
|
||||
vaddr addr,
|
||||
vaddr len,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
TLBFlushRangeData d, *p;
|
||||
@@ -847,7 +847,7 @@ void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
|
||||
|
||||
void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
|
||||
vaddr addr,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
tlb_flush_range_by_mmuidx_all_cpus_synced(src_cpu, addr, TARGET_PAGE_SIZE,
|
||||
@@ -923,7 +923,7 @@ void tlb_reset_dirty(CPUState *cpu, uintptr_t start, uintptr_t length)
|
||||
qemu_spin_lock(&cpu->neg.tlb.c.lock);
|
||||
for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
|
||||
CPUTLBDesc *desc = &cpu->neg.tlb.d[mmu_idx];
|
||||
CPUTLBDescFast *fast = &cpu->neg.tlb.f[mmu_idx];
|
||||
CPUTLBDescFast *fast = cpu_tlb_fast(cpu, mmu_idx);
|
||||
unsigned int n = tlb_n_entries(fast);
|
||||
unsigned int i;
|
||||
|
||||
@@ -1316,7 +1316,7 @@ static bool victim_tlb_hit(CPUState *cpu, size_t mmu_idx, size_t index,
|
||||
|
||||
if (cmp == page) {
|
||||
/* Found entry in victim tlb, swap tlb and iotlb. */
|
||||
CPUTLBEntry tmptlb, *tlb = &cpu->neg.tlb.f[mmu_idx].table[index];
|
||||
CPUTLBEntry tmptlb, *tlb = &cpu_tlb_fast(cpu, mmu_idx)->table[index];
|
||||
|
||||
qemu_spin_lock(&cpu->neg.tlb.c.lock);
|
||||
copy_tlb_helper_locked(&tmptlb, tlb);
|
||||
|
||||
@@ -102,8 +102,8 @@ static TCGv_i32 gen_cpu_index(void)
|
||||
/*
|
||||
* Optimize when we run with a single vcpu. All values using cpu_index,
|
||||
* including scoreboard index, will be optimized out.
|
||||
* User-mode calls tb_flush when setting this flag. In system-mode, all
|
||||
* vcpus are created before generating code.
|
||||
* User-mode flushes all TBs when setting this flag.
|
||||
* In system-mode, all vcpus are created before generating code.
|
||||
*/
|
||||
if (!tcg_cflags_has(current_cpu, CF_PARALLEL)) {
|
||||
return tcg_constant_i32(current_cpu->cpu_index);
|
||||
|
||||
+36
-23
@@ -36,6 +36,9 @@
|
||||
#include "internal-common.h"
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
#include "user/page-protection.h"
|
||||
#define runstate_is_running() true
|
||||
#else
|
||||
#include "system/runstate.h"
|
||||
#endif
|
||||
|
||||
|
||||
@@ -88,7 +91,10 @@ static IntervalTreeRoot tb_root;
|
||||
|
||||
static void tb_remove_all(void)
|
||||
{
|
||||
assert_memory_lock();
|
||||
/*
|
||||
* Only called from tb_flush__exclusive_or_serial, where we have already
|
||||
* asserted that we're in an exclusive state.
|
||||
*/
|
||||
memset(&tb_root, 0, sizeof(tb_root));
|
||||
}
|
||||
|
||||
@@ -756,17 +762,19 @@ static void tb_remove(TranslationBlock *tb)
|
||||
}
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
|
||||
/* flush all the translation blocks */
|
||||
static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count)
|
||||
/*
|
||||
* Flush all the translation blocks.
|
||||
* Must be called from a context in which no cpus are running,
|
||||
* e.g. start_exclusive() or vm_stop().
|
||||
*/
|
||||
void tb_flush__exclusive_or_serial(void)
|
||||
{
|
||||
bool did_flush = false;
|
||||
CPUState *cpu;
|
||||
|
||||
mmap_lock();
|
||||
/* If it is already been done on request of another CPU, just retry. */
|
||||
if (tb_ctx.tb_flush_count != tb_flush_count.host_int) {
|
||||
goto done;
|
||||
}
|
||||
did_flush = true;
|
||||
assert(tcg_enabled());
|
||||
/* Note that cpu_in_serial_context checks cpu_in_exclusive_context. */
|
||||
assert(!runstate_is_running() ||
|
||||
(current_cpu && cpu_in_serial_context(current_cpu)));
|
||||
|
||||
CPU_FOREACH(cpu) {
|
||||
tcg_flush_jmp_cache(cpu);
|
||||
@@ -778,25 +786,23 @@ static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count)
|
||||
tcg_region_reset_all();
|
||||
/* XXX: flush processor icache at this point if cache flush is expensive */
|
||||
qatomic_inc(&tb_ctx.tb_flush_count);
|
||||
qemu_plugin_flush_cb();
|
||||
}
|
||||
|
||||
done:
|
||||
mmap_unlock();
|
||||
if (did_flush) {
|
||||
qemu_plugin_flush_cb();
|
||||
static void do_tb_flush(CPUState *cpu, run_on_cpu_data tb_flush_count)
|
||||
{
|
||||
/* If it is already been done on request of another CPU, just retry. */
|
||||
if (tb_ctx.tb_flush_count == tb_flush_count.host_int) {
|
||||
tb_flush__exclusive_or_serial();
|
||||
}
|
||||
}
|
||||
|
||||
void tb_flush(CPUState *cpu)
|
||||
void queue_tb_flush(CPUState *cs)
|
||||
{
|
||||
if (tcg_enabled()) {
|
||||
unsigned tb_flush_count = qatomic_read(&tb_ctx.tb_flush_count);
|
||||
|
||||
if (cpu_in_serial_context(cpu)) {
|
||||
do_tb_flush(cpu, RUN_ON_CPU_HOST_INT(tb_flush_count));
|
||||
} else {
|
||||
async_safe_run_on_cpu(cpu, do_tb_flush,
|
||||
RUN_ON_CPU_HOST_INT(tb_flush_count));
|
||||
}
|
||||
async_safe_run_on_cpu(cs, do_tb_flush,
|
||||
RUN_ON_CPU_HOST_INT(tb_flush_count));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -836,6 +842,14 @@ static inline void tb_remove_from_jmp_list(TranslationBlock *orig, int n_orig)
|
||||
* We first acquired the lock, and since the destination pointer matches,
|
||||
* we know for sure that @orig is in the jmp list.
|
||||
*/
|
||||
if (dest == orig) {
|
||||
/*
|
||||
* In the case of a TB that links to itself, removing the entry
|
||||
* from the list means that it won't be present later during
|
||||
* tb_jmp_unlink -- unlink now.
|
||||
*/
|
||||
tb_reset_jump(orig, n_orig);
|
||||
}
|
||||
pprev = &dest->jmp_list_head;
|
||||
TB_FOR_EACH_JMP(dest, tb, n) {
|
||||
if (tb == orig && n == n_orig) {
|
||||
@@ -1154,7 +1168,6 @@ tb_invalidate_phys_page_range__locked(CPUState *cpu,
|
||||
page_collection_unlock(pages);
|
||||
/* Force execution of one insn next time. */
|
||||
cpu->cflags_next_tb = 1 | CF_NOIRQ | curr_cflags(cpu);
|
||||
mmap_unlock();
|
||||
cpu_loop_exit_noexc(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
#include "qemu/target-info.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include "hw/boards.h"
|
||||
#include "exec/tb-flush.h"
|
||||
#include "system/runstate.h"
|
||||
#endif
|
||||
#include "accel/accel-ops.h"
|
||||
#include "accel/accel-cpu-ops.h"
|
||||
@@ -82,6 +84,23 @@ static void tcg_accel_instance_init(Object *obj)
|
||||
|
||||
bool one_insn_per_tb;
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static void tcg_vm_change_state(void *opaque, bool running, RunState state)
|
||||
{
|
||||
if (state == RUN_STATE_RESTORE_VM) {
|
||||
/*
|
||||
* loadvm will update the content of RAM, bypassing the usual
|
||||
* mechanisms that ensure we flush TBs for writes to memory
|
||||
* we've translated code from, so we must flush all TBs.
|
||||
*
|
||||
* vm_stop() has just stopped all cpus, so we are exclusive.
|
||||
*/
|
||||
assert(!running);
|
||||
tb_flush__exclusive_or_serial();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int tcg_init_machine(AccelState *as, MachineState *ms)
|
||||
{
|
||||
TCGState *s = TCG_STATE(as);
|
||||
@@ -124,6 +143,8 @@ static int tcg_init_machine(AccelState *as, MachineState *ms)
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
qemu_add_vm_change_state_handler(tcg_vm_change_state, NULL);
|
||||
#endif
|
||||
|
||||
tcg_allowed = true;
|
||||
|
||||
@@ -289,7 +289,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu, TCGTBCPUState s)
|
||||
tb = tcg_tb_alloc(tcg_ctx);
|
||||
if (unlikely(!tb)) {
|
||||
/* flush must be done */
|
||||
tb_flush(cpu);
|
||||
if (cpu_in_serial_context(cpu)) {
|
||||
tb_flush__exclusive_or_serial();
|
||||
goto buffer_overflow;
|
||||
}
|
||||
queue_tb_flush(cpu);
|
||||
mmap_unlock();
|
||||
/* Make the execution loop process the flush as soon as possible. */
|
||||
cpu->exception_index = EXCP_INTERRUPT;
|
||||
|
||||
@@ -18,13 +18,11 @@
|
||||
#include "gdbstub/syscalls.h"
|
||||
#include "gdbstub/commands.h"
|
||||
#include "exec/hwaddr.h"
|
||||
#include "exec/tb-flush.h"
|
||||
#include "accel/accel-ops.h"
|
||||
#include "accel/accel-cpu-ops.h"
|
||||
#include "system/cpus.h"
|
||||
#include "system/runstate.h"
|
||||
#include "system/replay.h"
|
||||
#include "system/tcg.h"
|
||||
#include "hw/core/cpu.h"
|
||||
#include "hw/cpu/cluster.h"
|
||||
#include "hw/boards.h"
|
||||
@@ -174,9 +172,6 @@ static void gdb_vm_state_change(void *opaque, bool running, RunState state)
|
||||
} else {
|
||||
trace_gdbstub_hit_break();
|
||||
}
|
||||
if (tcg_enabled()) {
|
||||
tb_flush(cpu);
|
||||
}
|
||||
ret = GDB_SIGNAL_TRAP;
|
||||
break;
|
||||
case RUN_STATE_PAUSED:
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include "qemu/sockets.h"
|
||||
#include "qapi/error.h"
|
||||
#include "exec/hwaddr.h"
|
||||
#include "exec/tb-flush.h"
|
||||
#include "exec/gdbstub.h"
|
||||
#include "gdbstub/commands.h"
|
||||
#include "gdbstub/syscalls.h"
|
||||
@@ -220,7 +219,6 @@ int gdb_handlesig(CPUState *cpu, int sig, const char *reason, void *siginfo,
|
||||
|
||||
/* disable single step if it was enabled */
|
||||
cpu_single_step(cpu, 0);
|
||||
tb_flush(cpu);
|
||||
|
||||
if (sig != 0) {
|
||||
gdb_set_stop_cpu(cpu);
|
||||
@@ -539,7 +537,6 @@ static void disable_gdbstub(CPUState *thread_cpu)
|
||||
/* no cpu_watchpoint_remove_all for user-mode */
|
||||
cpu_single_step(cpu, 0);
|
||||
}
|
||||
tb_flush(thread_cpu);
|
||||
}
|
||||
|
||||
void gdbserver_fork_end(CPUState *cpu, pid_t pid)
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "system/address-spaces.h"
|
||||
#include "exec/cputlb.h"
|
||||
#include "system/memory.h"
|
||||
#include "exec/tb-flush.h"
|
||||
#include "qemu/target-info.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
@@ -207,14 +206,6 @@ static int cpu_common_post_load(void *opaque, int version_id)
|
||||
cpu_reset_interrupt(cpu, 0x01);
|
||||
|
||||
tlb_flush(cpu);
|
||||
|
||||
/*
|
||||
* loadvm has just updated the content of RAM, bypassing the
|
||||
* usual mechanisms that ensure we flush TBs for writes to
|
||||
* memory we've translated code from. So we must flush all TBs,
|
||||
* which will now be stale.
|
||||
*/
|
||||
tb_flush(cpu);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+14
-13
@@ -424,22 +424,23 @@ static void elroy_reset(DeviceState *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void elroy_pcihost_init(Object *obj)
|
||||
static void elroy_pcihost_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ElroyState *s = ELROY_PCI_HOST_BRIDGE(obj);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
ElroyState *s = ELROY_PCI_HOST_BRIDGE(dev);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(dev);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
Object *obj = OBJECT(s);
|
||||
|
||||
/* Elroy config access from CPU. */
|
||||
memory_region_init_io(&s->this_mem, OBJECT(s), &elroy_chip_ops,
|
||||
memory_region_init_io(&s->this_mem, obj, &elroy_chip_ops,
|
||||
s, "elroy", 0x2000);
|
||||
|
||||
/* Elroy PCI config. */
|
||||
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
|
||||
&elroy_config_addr_ops, DEVICE(s),
|
||||
memory_region_init_io(&phb->conf_mem, obj,
|
||||
&elroy_config_addr_ops, dev,
|
||||
"pci-conf-idx", 8);
|
||||
memory_region_init_io(&phb->data_mem, OBJECT(phb),
|
||||
&elroy_config_data_ops, DEVICE(s),
|
||||
memory_region_init_io(&phb->data_mem, obj,
|
||||
&elroy_config_data_ops, dev,
|
||||
"pci-conf-data", 8);
|
||||
memory_region_add_subregion(&s->this_mem, 0x40,
|
||||
&phb->conf_mem);
|
||||
@@ -447,8 +448,8 @@ static void elroy_pcihost_init(Object *obj)
|
||||
&phb->data_mem);
|
||||
|
||||
/* Elroy PCI bus memory. */
|
||||
memory_region_init(&s->pci_mmio, OBJECT(s), "pci-mmio", UINT64_MAX);
|
||||
memory_region_init_io(&s->pci_io, OBJECT(s), &unassigned_io_ops, obj,
|
||||
memory_region_init(&s->pci_mmio, obj, "pci-mmio", UINT64_MAX);
|
||||
memory_region_init_io(&s->pci_io, obj, &unassigned_io_ops, obj,
|
||||
"pci-isa-mmio",
|
||||
((uint32_t) IOS_DIST_BASE_SIZE) / ROPES_PER_IOC);
|
||||
|
||||
@@ -459,7 +460,7 @@ static void elroy_pcihost_init(Object *obj)
|
||||
|
||||
sysbus_init_mmio(sbd, &s->this_mem);
|
||||
|
||||
qdev_init_gpio_in(DEVICE(obj), elroy_set_irq, ELROY_IRQS);
|
||||
qdev_init_gpio_in(dev, elroy_set_irq, ELROY_IRQS);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_elroy = {
|
||||
@@ -487,6 +488,7 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
device_class_set_legacy_reset(dc, elroy_reset);
|
||||
dc->realize = elroy_pcihost_realize;
|
||||
dc->vmsd = &vmstate_elroy;
|
||||
dc->user_creatable = false;
|
||||
}
|
||||
@@ -494,7 +496,6 @@ static void elroy_pcihost_class_init(ObjectClass *klass, const void *data)
|
||||
static const TypeInfo elroy_pcihost_info = {
|
||||
.name = TYPE_ELROY_PCI_HOST_BRIDGE,
|
||||
.parent = TYPE_PCI_HOST_BRIDGE,
|
||||
.instance_init = elroy_pcihost_init,
|
||||
.instance_size = sizeof(ElroyState),
|
||||
.class_init = elroy_pcihost_class_init,
|
||||
};
|
||||
|
||||
+41
-49
@@ -413,6 +413,47 @@ static void dino_pcihost_reset(DeviceState *dev)
|
||||
static void dino_pcihost_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
DinoState *s = DINO_PCI_HOST_BRIDGE(dev);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(dev);
|
||||
|
||||
/* Dino PCI access from main memory. */
|
||||
memory_region_init_io(&s->this_mem, OBJECT(s), &dino_chip_ops,
|
||||
s, "dino", 4096);
|
||||
|
||||
/* Dino PCI config. */
|
||||
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
|
||||
&dino_config_addr_ops, DEVICE(s),
|
||||
"pci-conf-idx", 4);
|
||||
memory_region_init_io(&phb->data_mem, OBJECT(phb),
|
||||
&dino_config_data_ops, DEVICE(s),
|
||||
"pci-conf-data", 4);
|
||||
memory_region_add_subregion(&s->this_mem, DINO_PCI_CONFIG_ADDR,
|
||||
&phb->conf_mem);
|
||||
memory_region_add_subregion(&s->this_mem, DINO_CONFIG_DATA,
|
||||
&phb->data_mem);
|
||||
|
||||
/* Dino PCI bus memory. */
|
||||
memory_region_init(&s->pci_mem, OBJECT(s), "pci-memory", 4 * GiB);
|
||||
|
||||
phb->bus = pci_register_root_bus(DEVICE(s), "pci",
|
||||
dino_set_irq, dino_pci_map_irq, s,
|
||||
&s->pci_mem, get_system_io(),
|
||||
PCI_DEVFN(0, 0), 32, TYPE_PCI_BUS);
|
||||
|
||||
/* Set up windows into PCI bus memory. */
|
||||
for (int i = 1; i < 31; i++) {
|
||||
uint32_t addr = 0xf0000000 + i * DINO_MEM_CHUNK_SIZE;
|
||||
char *name = g_strdup_printf("PCI Outbound Window %d", i);
|
||||
memory_region_init_alias(&s->pci_mem_alias[i], OBJECT(s),
|
||||
name, &s->pci_mem, addr,
|
||||
DINO_MEM_CHUNK_SIZE);
|
||||
g_free(name);
|
||||
}
|
||||
|
||||
pci_setup_iommu(phb->bus, &dino_iommu_ops, s);
|
||||
|
||||
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->this_mem);
|
||||
|
||||
qdev_init_gpio_in(dev, dino_set_irq, DINO_IRQS);
|
||||
|
||||
/* Set up PCI view of memory: Bus master address space. */
|
||||
memory_region_init(&s->bm, OBJECT(s), "bm-dino", 4 * GiB);
|
||||
@@ -444,54 +485,6 @@ static void dino_pcihost_unrealize(DeviceState *dev)
|
||||
address_space_destroy(&s->bm_as);
|
||||
}
|
||||
|
||||
static void dino_pcihost_init(Object *obj)
|
||||
{
|
||||
DinoState *s = DINO_PCI_HOST_BRIDGE(obj);
|
||||
PCIHostState *phb = PCI_HOST_BRIDGE(obj);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
||||
int i;
|
||||
|
||||
/* Dino PCI access from main memory. */
|
||||
memory_region_init_io(&s->this_mem, OBJECT(s), &dino_chip_ops,
|
||||
s, "dino", 4096);
|
||||
|
||||
/* Dino PCI config. */
|
||||
memory_region_init_io(&phb->conf_mem, OBJECT(phb),
|
||||
&dino_config_addr_ops, DEVICE(s),
|
||||
"pci-conf-idx", 4);
|
||||
memory_region_init_io(&phb->data_mem, OBJECT(phb),
|
||||
&dino_config_data_ops, DEVICE(s),
|
||||
"pci-conf-data", 4);
|
||||
memory_region_add_subregion(&s->this_mem, DINO_PCI_CONFIG_ADDR,
|
||||
&phb->conf_mem);
|
||||
memory_region_add_subregion(&s->this_mem, DINO_CONFIG_DATA,
|
||||
&phb->data_mem);
|
||||
|
||||
/* Dino PCI bus memory. */
|
||||
memory_region_init(&s->pci_mem, OBJECT(s), "pci-memory", 4 * GiB);
|
||||
|
||||
phb->bus = pci_register_root_bus(DEVICE(s), "pci",
|
||||
dino_set_irq, dino_pci_map_irq, s,
|
||||
&s->pci_mem, get_system_io(),
|
||||
PCI_DEVFN(0, 0), 32, TYPE_PCI_BUS);
|
||||
|
||||
/* Set up windows into PCI bus memory. */
|
||||
for (i = 1; i < 31; i++) {
|
||||
uint32_t addr = 0xf0000000 + i * DINO_MEM_CHUNK_SIZE;
|
||||
char *name = g_strdup_printf("PCI Outbound Window %d", i);
|
||||
memory_region_init_alias(&s->pci_mem_alias[i], OBJECT(s),
|
||||
name, &s->pci_mem, addr,
|
||||
DINO_MEM_CHUNK_SIZE);
|
||||
g_free(name);
|
||||
}
|
||||
|
||||
pci_setup_iommu(phb->bus, &dino_iommu_ops, s);
|
||||
|
||||
sysbus_init_mmio(sbd, &s->this_mem);
|
||||
|
||||
qdev_init_gpio_in(DEVICE(obj), dino_set_irq, DINO_IRQS);
|
||||
}
|
||||
|
||||
static const Property dino_pcihost_properties[] = {
|
||||
DEFINE_PROP_LINK("memory-as", DinoState, memory_as, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
@@ -511,7 +504,6 @@ static void dino_pcihost_class_init(ObjectClass *klass, const void *data)
|
||||
static const TypeInfo dino_pcihost_info = {
|
||||
.name = TYPE_DINO_PCI_HOST_BRIDGE,
|
||||
.parent = TYPE_PCI_HOST_BRIDGE,
|
||||
.instance_init = dino_pcihost_init,
|
||||
.instance_size = sizeof(DinoState),
|
||||
.class_init = dino_pcihost_class_init,
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "exec/tb-flush.h"
|
||||
#include "exec/translation-block.h"
|
||||
#include "exec/target_page.h"
|
||||
#include "helper_regs.h"
|
||||
#include "hw/ppc/ppc.h"
|
||||
@@ -301,7 +301,7 @@ static target_ulong h_page_init(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
if (kvm_enabled()) {
|
||||
kvmppc_icbi_range(cpu, pdst, len);
|
||||
} else if (tcg_enabled()) {
|
||||
tb_flush(CPU(cpu));
|
||||
tb_invalidate_phys_range(CPU(cpu), dst, dst + len - 1);
|
||||
} else {
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
@@ -221,9 +221,9 @@ static inline bool cpu_loop_exit_requested(CPUState *cpu)
|
||||
|
||||
G_NORETURN void cpu_loop_exit_noexc(CPUState *cpu);
|
||||
G_NORETURN void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc);
|
||||
G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc);
|
||||
#endif /* CONFIG_TCG */
|
||||
G_NORETURN void cpu_loop_exit(CPUState *cpu);
|
||||
G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc);
|
||||
|
||||
/* accel/tcg/cpu-exec.c */
|
||||
int cpu_exec(CPUState *cpu);
|
||||
|
||||
+16
-16
@@ -150,7 +150,7 @@ void tlb_flush_all_cpus_synced(CPUState *src_cpu);
|
||||
* MMU indexes.
|
||||
*/
|
||||
void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap);
|
||||
MMUIdxMap idxmap);
|
||||
|
||||
/**
|
||||
* tlb_flush_page_by_mmuidx_all_cpus_synced:
|
||||
@@ -165,7 +165,7 @@ void tlb_flush_page_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
* translations using the flushed TLBs.
|
||||
*/
|
||||
void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap);
|
||||
MMUIdxMap idxmap);
|
||||
|
||||
/**
|
||||
* tlb_flush_by_mmuidx:
|
||||
@@ -176,7 +176,7 @@ void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr,
|
||||
* Flush all entries from the TLB of the specified CPU, for the specified
|
||||
* MMU indexes.
|
||||
*/
|
||||
void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap);
|
||||
void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap);
|
||||
|
||||
/**
|
||||
* tlb_flush_by_mmuidx_all_cpus_synced:
|
||||
@@ -189,7 +189,7 @@ void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap);
|
||||
* When this function returns, no CPUs will subsequently perform
|
||||
* translations using the flushed TLBs.
|
||||
*/
|
||||
void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, uint16_t idxmap);
|
||||
void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, MMUIdxMap idxmap);
|
||||
|
||||
/**
|
||||
* tlb_flush_page_bits_by_mmuidx
|
||||
@@ -201,11 +201,11 @@ void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu, uint16_t idxmap);
|
||||
* Similar to tlb_flush_page_mask, but with a bitmap of indexes.
|
||||
*/
|
||||
void tlb_flush_page_bits_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap, unsigned bits);
|
||||
MMUIdxMap idxmap, unsigned bits);
|
||||
|
||||
/* Similarly, with broadcast and syncing. */
|
||||
void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits);
|
||||
|
||||
/**
|
||||
@@ -220,14 +220,14 @@ void tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr,
|
||||
* comparing only the low @bits worth of each virtual page.
|
||||
*/
|
||||
void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
vaddr len, uint16_t idxmap,
|
||||
vaddr len, MMUIdxMap idxmap,
|
||||
unsigned bits);
|
||||
|
||||
/* Similarly, with broadcast and syncing. */
|
||||
void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *cpu,
|
||||
vaddr addr,
|
||||
vaddr len,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits);
|
||||
#else
|
||||
static inline void tlb_flush_page(CPUState *cpu, vaddr addr)
|
||||
@@ -243,42 +243,42 @@ static inline void tlb_flush_all_cpus_synced(CPUState *src_cpu)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_page_by_mmuidx(CPUState *cpu,
|
||||
vaddr addr, uint16_t idxmap)
|
||||
vaddr addr, MMUIdxMap idxmap)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void tlb_flush_by_mmuidx(CPUState *cpu, uint16_t idxmap)
|
||||
static inline void tlb_flush_by_mmuidx(CPUState *cpu, MMUIdxMap idxmap)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *cpu,
|
||||
vaddr addr,
|
||||
uint16_t idxmap)
|
||||
MMUIdxMap idxmap)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
|
||||
uint16_t idxmap)
|
||||
MMUIdxMap idxmap)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_page_bits_by_mmuidx(CPUState *cpu,
|
||||
vaddr addr,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
}
|
||||
static inline void
|
||||
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(CPUState *cpu, vaddr addr,
|
||||
uint16_t idxmap, unsigned bits)
|
||||
MMUIdxMap idxmap, unsigned bits)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_range_by_mmuidx(CPUState *cpu, vaddr addr,
|
||||
vaddr len, uint16_t idxmap,
|
||||
vaddr len, MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
}
|
||||
static inline void tlb_flush_range_by_mmuidx_all_cpus_synced(CPUState *cpu,
|
||||
vaddr addr,
|
||||
vaddr len,
|
||||
uint16_t idxmap,
|
||||
MMUIdxMap idxmap,
|
||||
unsigned bits)
|
||||
{
|
||||
}
|
||||
|
||||
+20
-10
@@ -9,19 +9,29 @@
|
||||
#define _TB_FLUSH_H_
|
||||
|
||||
/**
|
||||
* tb_flush() - flush all translation blocks
|
||||
* @cs: CPUState (must be valid, but treated as anonymous pointer)
|
||||
* tb_flush__exclusive_or_serial()
|
||||
*
|
||||
* Used to flush all the translation blocks in the system. Sometimes
|
||||
* it is simpler to flush everything than work out which individual
|
||||
* translations are now invalid and ensure they are not called
|
||||
* anymore.
|
||||
* Used to flush all the translation blocks in the system. Mostly this is
|
||||
* used to empty the code generation buffer after it is full. Sometimes it
|
||||
* is used when it is simpler to flush everything than work out which
|
||||
* individual translations are now invalid.
|
||||
*
|
||||
* tb_flush() takes care of running the flush in an exclusive context
|
||||
* if it is not already running in one. This means no guest code will
|
||||
* run until this complete.
|
||||
* Must be called from an exclusive or serial context, e.g. start_exclusive,
|
||||
* vm_stop, or when there is only one vcpu. Note that start_exclusive cannot
|
||||
* be called from within the cpu run loop, so this cannot be called from
|
||||
* within target code.
|
||||
*/
|
||||
void tb_flush(CPUState *cs);
|
||||
void tb_flush__exclusive_or_serial(void);
|
||||
|
||||
/**
|
||||
* queue_tb_flush() - add flush to the cpu work queue
|
||||
* @cs: CPUState
|
||||
*
|
||||
* Flush all translation blocks the next time @cs processes the work queue.
|
||||
* This should generally be followed by cpu_loop_exit(), so that the work
|
||||
* queue is processed promptly.
|
||||
*/
|
||||
void queue_tb_flush(CPUState *cs);
|
||||
|
||||
void tcg_flush_jmp_cache(CPUState *cs);
|
||||
|
||||
|
||||
+19
-3
@@ -198,10 +198,10 @@ struct CPUClass {
|
||||
};
|
||||
|
||||
/*
|
||||
* Fix the number of mmu modes to 16, which is also the maximum
|
||||
* supported by the softmmu tlb api.
|
||||
* Fix the number of mmu modes to 16.
|
||||
*/
|
||||
#define NB_MMU_MODES 16
|
||||
typedef uint16_t MMUIdxMap;
|
||||
|
||||
/* Use a fully associative victim tlb of 8 entries. */
|
||||
#define CPU_VTLB_SIZE 8
|
||||
@@ -306,7 +306,7 @@ typedef struct CPUTLBCommon {
|
||||
* mmu_idx N since the last time that mmu_idx was flushed.
|
||||
* Protected by tlb_c.lock.
|
||||
*/
|
||||
uint16_t dirty;
|
||||
MMUIdxMap dirty;
|
||||
/*
|
||||
* Statistics. These are not lock protected, but are read and
|
||||
* written atomically. This allows the monitor to print a snapshot
|
||||
@@ -602,6 +602,22 @@ static inline CPUArchState *cpu_env(CPUState *cpu)
|
||||
return (CPUArchState *)(cpu + 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TCG
|
||||
/*
|
||||
* Invert the index order of the CPUTLBDescFast array so that lower
|
||||
* mmu_idx have offsets from env with smaller magnitude.
|
||||
*/
|
||||
static inline int mmuidx_to_fast_index(int mmu_idx)
|
||||
{
|
||||
return NB_MMU_MODES - 1 - mmu_idx;
|
||||
}
|
||||
|
||||
static inline CPUTLBDescFast *cpu_tlb_fast(CPUState *cpu, int mmu_idx)
|
||||
{
|
||||
return &cpu->neg.tlb.f[mmuidx_to_fast_index(mmu_idx)];
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef QTAILQ_HEAD(CPUTailQ, CPUState) CPUTailQ;
|
||||
extern CPUTailQ cpus_queue;
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -71,5 +71,7 @@ vdso_syscall __kernel_clock_getres, __NR_clock_getres
|
||||
__kernel_rt_sigreturn:
|
||||
/* No BTI C insn here -- we arrive via RET. */
|
||||
mov x8, #__NR_rt_sigreturn
|
||||
sigreturn_region_start:
|
||||
svc #0
|
||||
sigreturn_region_end:
|
||||
endf __kernel_rt_sigreturn
|
||||
|
||||
@@ -94,11 +94,6 @@ void cpu_loop(CPUAlphaState *env)
|
||||
break;
|
||||
case 0x86:
|
||||
/* IMB */
|
||||
/* ??? We can probably elide the code using page_unprotect
|
||||
that is checking for self-modifying code. Instead we
|
||||
could simply call tb_flush here. Until we work out the
|
||||
changes required to turn off the extra write protection,
|
||||
this can be a no-op. */
|
||||
break;
|
||||
case 0x9E:
|
||||
/* RDUNIQUE */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user