mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
cpu: Turn cpu_get_phys_page_debug() into a CPUClass hook
Change breakpoint_invalidate() argument to CPUState alongside.
Since all targets now assign a softmmu-only field, we can drop helpers
cpu_class_set_{do_unassigned_access,vmsd}() and device_class_set_vmsd().
Prepares for changing cpu_memory_rw_debug() argument to CPUState.
Acked-by: Max Filippov <jcmvbkbc@gmail.com> (for xtensa)
Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
@@ -415,14 +415,14 @@ void cpu_exec_init(CPUArchState *env)
|
|||||||
|
|
||||||
#if defined(TARGET_HAS_ICE)
|
#if defined(TARGET_HAS_ICE)
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
static void breakpoint_invalidate(CPUArchState *env, target_ulong pc)
|
static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
|
||||||
{
|
{
|
||||||
tb_invalidate_phys_page_range(pc, pc + 1, 0);
|
tb_invalidate_phys_page_range(pc, pc + 1, 0);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void breakpoint_invalidate(CPUArchState *env, target_ulong pc)
|
static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
|
||||||
{
|
{
|
||||||
tb_invalidate_phys_addr(cpu_get_phys_page_debug(env, pc) |
|
tb_invalidate_phys_addr(cpu_get_phys_page_debug(cpu, pc) |
|
||||||
(pc & ~TARGET_PAGE_MASK));
|
(pc & ~TARGET_PAGE_MASK));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -525,15 +525,17 @@ int cpu_breakpoint_insert(CPUArchState *env, target_ulong pc, int flags,
|
|||||||
bp->flags = flags;
|
bp->flags = flags;
|
||||||
|
|
||||||
/* keep all GDB-injected breakpoints in front */
|
/* keep all GDB-injected breakpoints in front */
|
||||||
if (flags & BP_GDB)
|
if (flags & BP_GDB) {
|
||||||
QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
|
QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
|
||||||
else
|
} else {
|
||||||
QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
|
QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
|
||||||
|
}
|
||||||
|
|
||||||
breakpoint_invalidate(env, pc);
|
breakpoint_invalidate(ENV_GET_CPU(env), pc);
|
||||||
|
|
||||||
if (breakpoint)
|
if (breakpoint) {
|
||||||
*breakpoint = bp;
|
*breakpoint = bp;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
@@ -564,7 +566,7 @@ void cpu_breakpoint_remove_by_ref(CPUArchState *env, CPUBreakpoint *breakpoint)
|
|||||||
#if defined(TARGET_HAS_ICE)
|
#if defined(TARGET_HAS_ICE)
|
||||||
QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
|
QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
|
||||||
|
|
||||||
breakpoint_invalidate(env, breakpoint->pc);
|
breakpoint_invalidate(ENV_GET_CPU(env), breakpoint->pc);
|
||||||
|
|
||||||
g_free(breakpoint);
|
g_free(breakpoint);
|
||||||
#endif
|
#endif
|
||||||
@@ -2613,7 +2615,7 @@ int cpu_memory_rw_debug(CPUArchState *env, target_ulong addr,
|
|||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
page = addr & TARGET_PAGE_MASK;
|
page = addr & TARGET_PAGE_MASK;
|
||||||
phys_addr = cpu_get_phys_page_debug(env, page);
|
phys_addr = cpu_get_phys_page_debug(ENV_GET_CPU(env), page);
|
||||||
/* if no physical page mapped, return an error */
|
/* if no physical page mapped, return an error */
|
||||||
if (phys_addr == -1)
|
if (phys_addr == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
+4
-2
@@ -146,6 +146,7 @@ static void update_guest_rom_state(VAPICROMState *s)
|
|||||||
|
|
||||||
static int find_real_tpr_addr(VAPICROMState *s, CPUX86State *env)
|
static int find_real_tpr_addr(VAPICROMState *s, CPUX86State *env)
|
||||||
{
|
{
|
||||||
|
CPUState *cs = CPU(x86_env_get_cpu(env));
|
||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
target_ulong addr;
|
target_ulong addr;
|
||||||
|
|
||||||
@@ -158,7 +159,7 @@ static int find_real_tpr_addr(VAPICROMState *s, CPUX86State *env)
|
|||||||
* virtual address space for the APIC mapping.
|
* virtual address space for the APIC mapping.
|
||||||
*/
|
*/
|
||||||
for (addr = 0xfffff000; addr >= 0x80000000; addr -= TARGET_PAGE_SIZE) {
|
for (addr = 0xfffff000; addr >= 0x80000000; addr -= TARGET_PAGE_SIZE) {
|
||||||
paddr = cpu_get_phys_page_debug(env, addr);
|
paddr = cpu_get_phys_page_debug(cs, addr);
|
||||||
if (paddr != APIC_DEFAULT_ADDRESS) {
|
if (paddr != APIC_DEFAULT_ADDRESS) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -271,6 +272,7 @@ instruction_ok:
|
|||||||
|
|
||||||
static int update_rom_mapping(VAPICROMState *s, CPUX86State *env, target_ulong ip)
|
static int update_rom_mapping(VAPICROMState *s, CPUX86State *env, target_ulong ip)
|
||||||
{
|
{
|
||||||
|
CPUState *cs = CPU(x86_env_get_cpu(env));
|
||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
uint32_t rom_state_vaddr;
|
uint32_t rom_state_vaddr;
|
||||||
uint32_t pos, patch, offset;
|
uint32_t pos, patch, offset;
|
||||||
@@ -287,7 +289,7 @@ static int update_rom_mapping(VAPICROMState *s, CPUX86State *env, target_ulong i
|
|||||||
|
|
||||||
/* find out virtual address of the ROM */
|
/* find out virtual address of the ROM */
|
||||||
rom_state_vaddr = s->rom_state_paddr + (ip & 0xf0000000);
|
rom_state_vaddr = s->rom_state_paddr + (ip & 0xf0000000);
|
||||||
paddr = cpu_get_phys_page_debug(env, rom_state_vaddr);
|
paddr = cpu_get_phys_page_debug(cs, rom_state_vaddr);
|
||||||
if (paddr == -1) {
|
if (paddr == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,9 +144,11 @@ static void lx60_net_init(MemoryRegion *address_space,
|
|||||||
memory_region_add_subregion(address_space, buffers, ram);
|
memory_region_add_subregion(address_space, buffers, ram);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t translate_phys_addr(void *env, uint64_t addr)
|
static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
|
||||||
{
|
{
|
||||||
return cpu_get_phys_page_debug(env, addr);
|
XtensaCPU *cpu = opaque;
|
||||||
|
|
||||||
|
return cpu_get_phys_page_debug(CPU(cpu), addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lx60_reset(void *opaque)
|
static void lx60_reset(void *opaque)
|
||||||
@@ -252,7 +254,7 @@ static void lx_init(const LxBoardDesc *board, QEMUMachineInitArgs *args)
|
|||||||
}
|
}
|
||||||
uint64_t elf_entry;
|
uint64_t elf_entry;
|
||||||
uint64_t elf_lowaddr;
|
uint64_t elf_lowaddr;
|
||||||
int success = load_elf(kernel_filename, translate_phys_addr, env,
|
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
|
||||||
&elf_entry, &elf_lowaddr, NULL, be, ELF_MACHINE, 0);
|
&elf_entry, &elf_lowaddr, NULL, be, ELF_MACHINE, 0);
|
||||||
if (success > 0) {
|
if (success > 0) {
|
||||||
env->pc = elf_entry;
|
env->pc = elf_entry;
|
||||||
|
|||||||
@@ -32,9 +32,11 @@
|
|||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
|
|
||||||
static uint64_t translate_phys_addr(void *env, uint64_t addr)
|
static uint64_t translate_phys_addr(void *opaque, uint64_t addr)
|
||||||
{
|
{
|
||||||
return cpu_get_phys_page_debug(env, addr);
|
XtensaCPU *cpu = opaque;
|
||||||
|
|
||||||
|
return cpu_get_phys_page_debug(CPU(cpu), addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sim_reset(void *opaque)
|
static void sim_reset(void *opaque)
|
||||||
@@ -88,10 +90,10 @@ static void xtensa_sim_init(QEMUMachineInitArgs *args)
|
|||||||
uint64_t elf_entry;
|
uint64_t elf_entry;
|
||||||
uint64_t elf_lowaddr;
|
uint64_t elf_lowaddr;
|
||||||
#ifdef TARGET_WORDS_BIGENDIAN
|
#ifdef TARGET_WORDS_BIGENDIAN
|
||||||
int success = load_elf(kernel_filename, translate_phys_addr, env,
|
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
|
||||||
&elf_entry, &elf_lowaddr, NULL, 1, ELF_MACHINE, 0);
|
&elf_entry, &elf_lowaddr, NULL, 1, ELF_MACHINE, 0);
|
||||||
#else
|
#else
|
||||||
int success = load_elf(kernel_filename, translate_phys_addr, env,
|
int success = load_elf(kernel_filename, translate_phys_addr, cpu,
|
||||||
&elf_entry, &elf_lowaddr, NULL, 0, ELF_MACHINE, 0);
|
&elf_entry, &elf_lowaddr, NULL, 0, ELF_MACHINE, 0);
|
||||||
#endif
|
#endif
|
||||||
if (success > 0) {
|
if (success > 0) {
|
||||||
|
|||||||
@@ -430,11 +430,6 @@ void cpu_watchpoint_remove_all(CPUArchState *env, int mask);
|
|||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
/* Return the physical page corresponding to a virtual one. Use it
|
|
||||||
only for debugging because no protection checks are done. Return -1
|
|
||||||
if no page found. */
|
|
||||||
hwaddr cpu_get_phys_page_debug(CPUArchState *env, target_ulong addr);
|
|
||||||
|
|
||||||
/* memory API */
|
/* memory API */
|
||||||
|
|
||||||
extern ram_addr_t ram_size;
|
extern ram_addr_t ram_size;
|
||||||
|
|||||||
+21
-53
@@ -78,6 +78,7 @@ struct TranslationBlock;
|
|||||||
* @set_pc: Callback for setting the Program Counter register.
|
* @set_pc: Callback for setting the Program Counter register.
|
||||||
* @synchronize_from_tb: Callback for synchronizing state from a TCG
|
* @synchronize_from_tb: Callback for synchronizing state from a TCG
|
||||||
* #TranslationBlock.
|
* #TranslationBlock.
|
||||||
|
* @get_phys_page_debug: Callback for obtaining a physical address.
|
||||||
* @vmsd: State description for migration.
|
* @vmsd: State description for migration.
|
||||||
*
|
*
|
||||||
* Represents a CPU family or model.
|
* Represents a CPU family or model.
|
||||||
@@ -103,6 +104,7 @@ typedef struct CPUClass {
|
|||||||
Error **errp);
|
Error **errp);
|
||||||
void (*set_pc)(CPUState *cpu, vaddr value);
|
void (*set_pc)(CPUState *cpu, vaddr value);
|
||||||
void (*synchronize_from_tb)(CPUState *cpu, struct TranslationBlock *tb);
|
void (*synchronize_from_tb)(CPUState *cpu, struct TranslationBlock *tb);
|
||||||
|
hwaddr (*get_phys_page_debug)(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
const struct VMStateDescription *vmsd;
|
const struct VMStateDescription *vmsd;
|
||||||
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||||
@@ -280,6 +282,25 @@ void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
|
|||||||
void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
|
void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
/**
|
||||||
|
* cpu_get_phys_page_debug:
|
||||||
|
* @cpu: The CPU to obtain the physical page address for.
|
||||||
|
* @addr: The virtual address.
|
||||||
|
*
|
||||||
|
* Obtains the physical page corresponding to a virtual one.
|
||||||
|
* Use it only for debugging because no protection checks are done.
|
||||||
|
*
|
||||||
|
* Returns: Corresponding physical page address or -1 if no page found.
|
||||||
|
*/
|
||||||
|
static inline hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr)
|
||||||
|
{
|
||||||
|
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||||
|
|
||||||
|
return cc->get_phys_page_debug(cpu, addr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpu_reset:
|
* cpu_reset:
|
||||||
* @cpu: The CPU whose state is to be reset.
|
* @cpu: The CPU whose state is to be reset.
|
||||||
@@ -297,59 +318,6 @@ void cpu_reset(CPUState *cpu);
|
|||||||
*/
|
*/
|
||||||
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);
|
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);
|
||||||
|
|
||||||
/**
|
|
||||||
* cpu_class_set_vmsd:
|
|
||||||
* @cc: CPU class
|
|
||||||
* @value: Value to set. Unused for %CONFIG_USER_ONLY.
|
|
||||||
*
|
|
||||||
* Sets #VMStateDescription for @cc.
|
|
||||||
*
|
|
||||||
* The @value argument is intentionally discarded for the non-softmmu targets
|
|
||||||
* to avoid linker errors or excessive preprocessor usage. If this behavior
|
|
||||||
* is undesired, you should assign #CPUClass.vmsd directly instead.
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
static inline void cpu_class_set_vmsd(CPUClass *cc,
|
|
||||||
const struct VMStateDescription *value)
|
|
||||||
{
|
|
||||||
cc->vmsd = value;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define cpu_class_set_vmsd(cc, value) ((cc)->vmsd = NULL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
static inline void cpu_class_set_do_unassigned_access(CPUClass *cc,
|
|
||||||
CPUUnassignedAccess value)
|
|
||||||
{
|
|
||||||
cc->do_unassigned_access = value;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define cpu_class_set_do_unassigned_access(cc, value) \
|
|
||||||
((cc)->do_unassigned_access = NULL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* device_class_set_vmsd:
|
|
||||||
* @dc: Device class
|
|
||||||
* @value: Value to set. Unused for %CONFIG_USER_ONLY.
|
|
||||||
*
|
|
||||||
* Sets #VMStateDescription for @dc.
|
|
||||||
*
|
|
||||||
* The @value argument is intentionally discarded for the non-softmmu targets
|
|
||||||
* to avoid linker errors or excessive preprocessor usage. If this behavior
|
|
||||||
* is undesired, you should assign #DeviceClass.vmsd directly instead.
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
|
||||||
static inline void device_class_set_vmsd(DeviceClass *dc,
|
|
||||||
const struct VMStateDescription *value)
|
|
||||||
{
|
|
||||||
dc->vmsd = value;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define device_class_set_vmsd(dc, value) ((dc)->vmsd = NULL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qemu_cpu_has_work:
|
* qemu_cpu_has_work:
|
||||||
* @cpu: The vCPU to check.
|
* @cpu: The vCPU to check.
|
||||||
|
|||||||
@@ -81,5 +81,6 @@ extern const struct VMStateDescription vmstate_alpha_cpu;
|
|||||||
void alpha_cpu_do_interrupt(CPUState *cpu);
|
void alpha_cpu_do_interrupt(CPUState *cpu);
|
||||||
void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
hwaddr alpha_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+5
-2
@@ -270,9 +270,12 @@ static void alpha_cpu_class_init(ObjectClass *oc, void *data)
|
|||||||
cc->class_by_name = alpha_cpu_class_by_name;
|
cc->class_by_name = alpha_cpu_class_by_name;
|
||||||
cc->do_interrupt = alpha_cpu_do_interrupt;
|
cc->do_interrupt = alpha_cpu_do_interrupt;
|
||||||
cc->dump_state = alpha_cpu_dump_state;
|
cc->dump_state = alpha_cpu_dump_state;
|
||||||
cpu_class_set_do_unassigned_access(cc, alpha_cpu_unassigned_access);
|
|
||||||
cc->set_pc = alpha_cpu_set_pc;
|
cc->set_pc = alpha_cpu_set_pc;
|
||||||
device_class_set_vmsd(dc, &vmstate_alpha_cpu);
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
cc->do_unassigned_access = alpha_cpu_unassigned_access;
|
||||||
|
cc->get_phys_page_debug = alpha_cpu_get_phys_page_debug;
|
||||||
|
dc->vmsd = &vmstate_alpha_cpu;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo alpha_cpu_type_info = {
|
static const TypeInfo alpha_cpu_type_info = {
|
||||||
|
|||||||
@@ -315,12 +315,13 @@ static int get_physical_address(CPUAlphaState *env, target_ulong addr,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
hwaddr cpu_get_phys_page_debug(CPUAlphaState *env, target_ulong addr)
|
hwaddr alpha_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
||||||
{
|
{
|
||||||
|
AlphaCPU *cpu = ALPHA_CPU(cs);
|
||||||
target_ulong phys;
|
target_ulong phys;
|
||||||
int prot, fail;
|
int prot, fail;
|
||||||
|
|
||||||
fail = get_physical_address(env, addr, 0, 0, &phys, &prot);
|
fail = get_physical_address(&cpu->env, addr, 0, 0, &phys, &prot);
|
||||||
return (fail >= 0 ? -1 : phys);
|
return (fail >= 0 ? -1 : phys);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -147,4 +147,6 @@ void arm_v7m_cpu_do_interrupt(CPUState *cpu);
|
|||||||
void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
|
hwaddr arm_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+4
-1
@@ -824,7 +824,10 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
|
|||||||
cc->do_interrupt = arm_cpu_do_interrupt;
|
cc->do_interrupt = arm_cpu_do_interrupt;
|
||||||
cc->dump_state = arm_cpu_dump_state;
|
cc->dump_state = arm_cpu_dump_state;
|
||||||
cc->set_pc = arm_cpu_set_pc;
|
cc->set_pc = arm_cpu_set_pc;
|
||||||
cpu_class_set_vmsd(cc, &vmstate_arm_cpu);
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
cc->get_phys_page_debug = arm_cpu_get_phys_page_debug;
|
||||||
|
cc->vmsd = &vmstate_arm_cpu;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_register(const ARMCPUInfo *info)
|
static void cpu_register(const ARMCPUInfo *info)
|
||||||
|
|||||||
+5
-3
@@ -2762,17 +2762,19 @@ int cpu_arm_handle_mmu_fault (CPUARMState *env, target_ulong address,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hwaddr cpu_get_phys_page_debug(CPUARMState *env, target_ulong addr)
|
hwaddr arm_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
||||||
{
|
{
|
||||||
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
hwaddr phys_addr;
|
hwaddr phys_addr;
|
||||||
target_ulong page_size;
|
target_ulong page_size;
|
||||||
int prot;
|
int prot;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = get_phys_addr(env, addr, 0, 0, &phys_addr, &prot, &page_size);
|
ret = get_phys_addr(&cpu->env, addr, 0, 0, &phys_addr, &prot, &page_size);
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return phys_addr;
|
return phys_addr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,4 +79,6 @@ void crisv10_cpu_do_interrupt(CPUState *cpu);
|
|||||||
void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
|
hwaddr cris_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -255,6 +255,9 @@ static void cris_cpu_class_init(ObjectClass *oc, void *data)
|
|||||||
cc->do_interrupt = cris_cpu_do_interrupt;
|
cc->do_interrupt = cris_cpu_do_interrupt;
|
||||||
cc->dump_state = cris_cpu_dump_state;
|
cc->dump_state = cris_cpu_dump_state;
|
||||||
cc->set_pc = cris_cpu_set_pc;
|
cc->set_pc = cris_cpu_set_pc;
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
cc->get_phys_page_debug = cris_cpu_get_phys_page_debug;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo cris_cpu_type_info = {
|
static const TypeInfo cris_cpu_type_info = {
|
||||||
|
|||||||
@@ -255,16 +255,17 @@ void cris_cpu_do_interrupt(CPUState *cs)
|
|||||||
env->pregs[PR_ERP]);
|
env->pregs[PR_ERP]);
|
||||||
}
|
}
|
||||||
|
|
||||||
hwaddr cpu_get_phys_page_debug(CPUCRISState * env, target_ulong addr)
|
hwaddr cris_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
||||||
{
|
{
|
||||||
|
CRISCPU *cpu = CRIS_CPU(cs);
|
||||||
uint32_t phy = addr;
|
uint32_t phy = addr;
|
||||||
struct cris_mmu_result res;
|
struct cris_mmu_result res;
|
||||||
int miss;
|
int miss;
|
||||||
|
|
||||||
miss = cris_mmu_translate(&res, env, addr, 0, 0, 1);
|
miss = cris_mmu_translate(&res, &cpu->env, addr, 0, 0, 1);
|
||||||
/* If D TLB misses, try I TLB. */
|
/* If D TLB misses, try I TLB. */
|
||||||
if (miss) {
|
if (miss) {
|
||||||
miss = cris_mmu_translate(&res, env, addr, 2, 0, 1);
|
miss = cris_mmu_translate(&res, &cpu->env, addr, 2, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!miss) {
|
if (!miss) {
|
||||||
|
|||||||
@@ -104,4 +104,6 @@ void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list,
|
|||||||
void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
|
||||||
|
hwaddr x86_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-1
@@ -2542,12 +2542,13 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
|
|||||||
cc->get_paging_enabled = x86_cpu_get_paging_enabled;
|
cc->get_paging_enabled = x86_cpu_get_paging_enabled;
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
cc->get_memory_mapping = x86_cpu_get_memory_mapping;
|
cc->get_memory_mapping = x86_cpu_get_memory_mapping;
|
||||||
|
cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
|
||||||
cc->write_elf64_note = x86_cpu_write_elf64_note;
|
cc->write_elf64_note = x86_cpu_write_elf64_note;
|
||||||
cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
|
cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
|
||||||
cc->write_elf32_note = x86_cpu_write_elf32_note;
|
cc->write_elf32_note = x86_cpu_write_elf32_note;
|
||||||
cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
|
cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
|
||||||
|
cc->vmsd = &vmstate_x86_cpu;
|
||||||
#endif
|
#endif
|
||||||
cpu_class_set_vmsd(cc, &vmstate_x86_cpu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo x86_cpu_type_info = {
|
static const TypeInfo x86_cpu_type_info = {
|
||||||
|
|||||||
@@ -884,8 +884,10 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hwaddr cpu_get_phys_page_debug(CPUX86State *env, target_ulong addr)
|
hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
|
||||||
{
|
{
|
||||||
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
|
CPUX86State *env = &cpu->env;
|
||||||
target_ulong pde_addr, pte_addr;
|
target_ulong pde_addr, pte_addr;
|
||||||
uint64_t pte;
|
uint64_t pte;
|
||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
|
|||||||
@@ -78,5 +78,6 @@ extern const struct VMStateDescription vmstate_lm32_cpu;
|
|||||||
void lm32_cpu_do_interrupt(CPUState *cpu);
|
void lm32_cpu_do_interrupt(CPUState *cpu);
|
||||||
void lm32_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
|
void lm32_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
|
||||||
int flags);
|
int flags);
|
||||||
|
hwaddr lm32_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+4
-1
@@ -87,7 +87,10 @@ static void lm32_cpu_class_init(ObjectClass *oc, void *data)
|
|||||||
cc->do_interrupt = lm32_cpu_do_interrupt;
|
cc->do_interrupt = lm32_cpu_do_interrupt;
|
||||||
cc->dump_state = lm32_cpu_dump_state;
|
cc->dump_state = lm32_cpu_dump_state;
|
||||||
cc->set_pc = lm32_cpu_set_pc;
|
cc->set_pc = lm32_cpu_set_pc;
|
||||||
cpu_class_set_vmsd(cc, &vmstate_lm32_cpu);
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
cc->get_phys_page_debug = lm32_cpu_get_phys_page_debug;
|
||||||
|
cc->vmsd = &vmstate_lm32_cpu;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo lm32_cpu_type_info = {
|
static const TypeInfo lm32_cpu_type_info = {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user