Skip to content

Commit

Permalink
linux-user: fix segmentation fault passing with h2g(x) != x
Browse files Browse the repository at this point in the history
When forwarding a segmentation fault into the guest process, we were passing
the host's address directly into the guest process's signal descriptor.

That obviously confused the guest process, since it didn't know what to make
of the (usually 32-bit truncated) address. Passing in h2g(address) makes the
guest process a lot happier.

To make the code more obvious, introduce a h2g_nocheck() macro that does the
same as h2g(), but allows us to convert addresses that may be outside of guest
mapped range into the guest's view of address space.

This fixes java running in arm-linux-user for me.

Signed-off-by: Alexander Graf <[email protected]>
Signed-off-by: Riku Voipio <[email protected]>
  • Loading branch information
agraf authored and Riku Voipio committed Jul 23, 2013
1 parent 82f05b6 commit 732f9e8
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
8 changes: 6 additions & 2 deletions include/exec/cpu-all.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,15 @@ extern unsigned long reserved_va;
})
#endif

#define h2g(x) ({ \
#define h2g_nocheck(x) ({ \
unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
(abi_ulong)__ret; \
})

#define h2g(x) ({ \
/* Check if given address fits target address space */ \
assert(h2g_valid(x)); \
(abi_ulong)__ret; \
h2g_nocheck(x); \
})

#define saddr(x) g2h(x)
Expand Down
4 changes: 4 additions & 0 deletions user-exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
return 1;
}

/* Convert forcefully to guest address space, invalid addresses
are still valid segv ones */
address = h2g_nocheck(address);

env = current_cpu->env_ptr;
/* see if it is an MMU fault */
ret = cpu_handle_mmu_fault(env, address, is_write, MMU_USER_IDX);
Expand Down

0 comments on commit 732f9e8

Please sign in to comment.