mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
Fix unassigned memory access handling
cea5f9a28f
exposed bugs in unassigned memory
access handling. Fix them by always passing CPUState to the handlers.
Reported-by: Hervé Poussineau <hpoussin@reactos.org>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
21673cdecb
commit
b14ef7c9ab
10 changed files with 48 additions and 35 deletions
|
@ -510,8 +510,8 @@ static inline int tlb_compare_context(const SparcTLBEntry *tlb,
|
|||
|
||||
/* cpu-exec.c */
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
|
||||
int is_asi, int size);
|
||||
void cpu_unassigned_access(CPUState *env1, target_phys_addr_t addr,
|
||||
int is_write, int is_exec, int is_asi, int size);
|
||||
target_phys_addr_t cpu_get_phys_page_nofault(CPUState *env, target_ulong addr,
|
||||
int mmu_idx);
|
||||
|
||||
|
|
|
@ -79,9 +79,14 @@
|
|||
#define CACHE_CTRL_FD (1 << 22) /* Flush Data cache (Write only) */
|
||||
#define CACHE_CTRL_DS (1 << 23) /* Data cache snoop enable */
|
||||
|
||||
#if defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
static void do_unassigned_access(target_phys_addr_t addr, int is_write,
|
||||
int is_exec, int is_asi, int size);
|
||||
#else
|
||||
#ifdef TARGET_SPARC64
|
||||
static void do_unassigned_access(target_ulong addr, int is_write, int is_exec,
|
||||
int is_asi, int size);
|
||||
int is_asi, int size);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY)
|
||||
|
@ -4235,8 +4240,8 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
|||
|
||||
#ifndef TARGET_SPARC64
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
|
||||
int is_asi, int size)
|
||||
static void do_unassigned_access(target_phys_addr_t addr, int is_write,
|
||||
int is_exec, int is_asi, int size)
|
||||
{
|
||||
CPUState *saved_env;
|
||||
int fault_type;
|
||||
|
@ -4301,8 +4306,8 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
|
|||
static void do_unassigned_access(target_ulong addr, int is_write, int is_exec,
|
||||
int is_asi, int size)
|
||||
#else
|
||||
void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
|
||||
int is_asi, int size)
|
||||
static void do_unassigned_access(target_phys_addr_t addr, int is_write,
|
||||
int is_exec, int is_asi, int size)
|
||||
#endif
|
||||
{
|
||||
CPUState *saved_env;
|
||||
|
@ -4351,3 +4356,12 @@ void helper_tick_set_limit(void *opaque, uint64_t limit)
|
|||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void cpu_unassigned_access(CPUState *env1, target_phys_addr_t addr,
|
||||
int is_write, int is_exec, int is_asi, int size)
|
||||
{
|
||||
env = env1;
|
||||
do_unassigned_access(addr, is_write, is_exec, is_asi, size);
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue